PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRAM Ansteuerung



stani
21.04.2011, 21:49
Hallo und schönen Abend,
ich würde gerne versuchen einen SRAM an einen Atmega8 oder 16 anzuschließen,da ich versuche ein 320x240 GLCD an den Controller anzuschließen,jedoch nicht ganz verstehe wie das ganze Funktioniert.

Ich hab gelesen,dass man immer Addressports hat,die an den MCU kommen,und die I/O Ports ,die als "Ausgänge " dienen.

Diese Addressports gehen zu einem Art Raster ,dass mit dem Clock Pin immer einen schritt weiter geschoben wird.

Ich hab jetzt keine Ahnung was die Addressports könnnen bzw. wie man sie anschließt und mit Bascom ansteuert.

Ich Danke für jede Hilfe

Vitis
22.04.2011, 08:17
sorry, unverständliche Frage.

Willst Du nun ein GLCD oer ein SRAM anschließen?

Und welches Bauteil solls denn genau sein? Immer die exakte Bauteilbezeichung oder besser noch nen Link zum Datenblatt mit
angeben, dann kann man auch effektiv helfen ohne lange herumraten zu müssen.

stani
22.04.2011, 10:02
Danke erstmal für die Inrteresse.
Eigendlich möchte ich erstmal wissen wie ein RAM bzw ein SRAM Funktioniert,damit ich dan ein GLCD anschließen kann.

Der Ram hat die Bezeichnung CY6264-70SC Datenblatt: http://www.datasheetcatalog.org/datasheets/270/178789_DS.pdf

Das ist ein 8K x 8 SRAM

PICture
22.04.2011, 10:56
Hallo stani!

Dein SRAM ist statischer Speicher in/von man unter gewählter Adresse (A12 ... A0) Daten (I/O7 ... I/O0) ablegen/auslesen kann, wobei die Richtung des Datentransferns von/in I/O Pins durch Pegel am /WE Pin festgelegt wird. :)

stani
22.04.2011, 11:29
Aber wie soll ich mit diesen Addressports umgehen??
Wenn ich z.b jetzt an A0 ein bit senden will und es soll in 5 Secunden bei I/O 0 wieder rauskommen,wie soll ich das manchen.

Das Problemm ist ,dass ich keine Ahnung habe wie diese Addressports funktionieren.

Ah ja und einen schönen Karfreitag

PICture
22.04.2011, 11:46
Wenn ich z.b jetzt an A0 ein bit senden will und es soll in 5 Secunden bei I/O 0 wieder rauskommen,wie soll ich das manchen.

Beim SRAM wird nix gesendet, sondern unter bestimmter Adresse byteweise nur "abgelegt" bzw. "genommen", genauso wie am Bahnhoff das Gepäckfach. Du könntest nur ein ganzes Byte in gwünschte Adresse schreiben und z.B. nach 5 Sekunden bei gleicher Adresse auslesen.


Das Problemm ist ,dass ich keine Ahnung habe wie diese Addressports funktionieren.

Sie funktionieren genauso, bloss bidirektional, wie bei Post. Man brigt ein z.B. Päckchen mit einer Adresse und es wurde ensprechend (Inhalt ist egal) an diese Adresse zugestellt. Bei der Post könnte man sich leider kein Päckchen wünschen, wenn man eine Adresse angibt. :(

stani
22.04.2011, 12:21
wie spricht man den in Bascom oder in C diese Andressen an?Ich denk mal man muss eine oder mehrere 8bit Variablen erstellen und Ports für die Adressen Definieren.

Kann mir jemand ein kleines Beispiel posten??
ICh kenn das jetzt nur mit den Registern.

EDIT: Hat das Ablegeben der Bytes mit dne 8 Ausgängen zu tun??Ich kenn nähmlich ein 16K x 1 SRAM und der hat nur ein Ausgang,also müsste man da jewals 1 bit ablagern können.

Danke

PICture
22.04.2011, 12:39
Beim SRAM müssen alle Adressbits gleichzeitig anliegen. Wenn ein µC genug I/O Ports hat, könnte man für bis zu 16-bittige Adresse 2 Ports verwenden. Ich kenne AVR's nur gering und kann dir leider bei der Software nicht helfen. :(

Das in deinem Edit stimmt. :)

Übrigens, für sequenzielles Bitschieben, je nach nötige Anzahl, würde ich eventuell kaskadierte Schieberegister nehmen, wofür keine Adresse nötig ist. ;)

stani
22.04.2011, 13:28
Danke jetzt versteh ich das langsam.
Falls mir jemand ein kleines Beispiel zeigen könnte ,währ ich sehr dankbar.

Ich glaube man zählt die Adressen als Hexcode wie z.b 0x0000,0x0001,0x0002 ich denke man schiebt dan eine 8bit variable dort rein.

typedef signed char int8_t;
int8_t i;
i=232;
0x0000=i;

Jedoch weiß ihc nicht wie man jetzt die Adressen anspricht,wenn man die an den MCU anschließt.

EDIT:Woher weiß man eigendlich von wo bis wo die Adressen gehen?? ich glaube das Ende ist immer 0xFFFF

nanoBean
22.04.2011, 19:39
0x0000=i;


Jein. 0x0000 kann kein Ziel deiner Zuweisung (von i) sein.
Soll heißen: Das Prinzip ist richtig, aber die Umsetzung nicht.

Stell dir ein Süßigkeiten/Getränke oder Zigarettenautomat vor. Diese Teile haben Fächer, in denen die Ware liegt. Um nun die Ware zu wählen, gibst du die Nummer von dem Fach an, aus welchem du deine Ware haben möchtest (z.B. 12) und die Ware aus Fach 12 wird dann ausgegeben.

Dieses Fach entspricht nun deiner Speicheradresse. Um dem SDRAM nun mitzuteilen, welches Fach (bzw Adresse) du haben möchtest, musst du die Pins A0-A12 vom SDRam mit Outputpins deines µC verbinden. Mit 13 Bit (A0-A12) kannst du nun 2^13 Byte addressieren, was 8 KiloByte entspricht (Wie man die vollen 64kb anspricht,ist mir aber auch ein Rätsel). Somit stehen dir die Adressen 0x0 - 0x1FFF (oder 0-8191 dezimal) zur Verfügung. Möchtest du nun das Byte von der Adresse 72dezimal (bzw 0x48 hex) auslesen, musst du nun deine µC Ports (die du mit A0-A12 verbunden hast) so belegen, dass an den Pins A0-A12 das bitmuster 1001000 (=72 binär) anliegt.

Zudem musst du nun die Pins I/O 0 - 7 mit deinem µC verbinden. Möchtest du ein Byte der Adresse lesen, liest du die entsprechenden Bits an deinem µC aus. Wenn du ein Byte an Addresse 72dez schreiben willst, setzt du die Pin's an deinem µC so, dass du den gewünschten Wert via I/O 0-7 überträgst.

Ob du lesen oder schreiben willst, musst du ensprechend über /WE und co. setzten (also auch mit dem µC verbinden)

Guck dir aber auch mal das Timing-Diagramm im Datenblatt an. Es dauert etwas, bis die entspr. Werte gelesen werden. Also Speicher Adressieren, dem SDRAM mitteilen, ob du lesen oder schreiben willst, etwas warten und dann das Byte auslesen.

stani
22.04.2011, 22:32
also müsste ich quasie sowas hier machen:

#define SRAMROW PORTA //das sind die adresspins für die rows
#define A0 1 // Zeile 1 des Rasters
#define A9 0
#define A10 0
#define A11 0
#define A12 0

#define SRAMIO PORTC // das sind die I/O pins

int main()
{

unsigned char i="hallo";
SRAMROW = 0x0;
//Jetzt muss man irgendein pin auf h oder l setzten zum schreiben und dan in die I/O Ports i einschicken
Ich hab mich immer gewundert wieso i/O und nicht nur O ,weil ich dachte das ist immer output und durch die adressepins kommen die daten rein
SRAMIO=i;

return 0;
}

Vitis
23.04.2011, 07:34
gockel 2 Sekunden:

http://de.wikipedia.org/wiki/Static_Random_Access_Memory

Vitis
23.04.2011, 07:37
adressepins kommen die daten rein

Jau, die Adresse schriebst Du innen in den Briefumschlag und den Text außen drauf?

stani
23.04.2011, 09:53
Jau, die Adresse schriebst Du innen in den Briefumschlag und den Text außen drauf?

Wie soll das den gehen??Muss ich erstmal die Adresse aufrufen und dan was reinschreiben:

SRAMROW = 0x0;
0x0=i;

??

Michael
23.04.2011, 10:33
Hallo stani,

mal was grundsätzliches: Xram an einem AVR ohne herausgeführten Adressbus anzuschließen ist nicht besonders klug.
Man nimmt normalerweise einen AVR, der dafür vorgesehen ist, Atmega8515/162 oder Atmega64/128 aufwärts.
Schaltungen dafür gibt es im Prinzip nur eine:
http://www.mikrocontroller.net/topic/96205 3.Beitrag von hinten.

Gruß, Michael

stani
23.04.2011, 11:01
mal was grundsätzliches: Xram an einem AVR ohne herausgeführten Adressbus anzuschließen ist nicht besonders klug.
Man nimmt normalerweise einen AVR, der dafür vorgesehen ist, Atmega8515/162 oder Atmega64/128 aufwärts.
Schaltungen dafür gibt es im Prinzip nur eine:
http://www.mikrocontroller.net/topic/96205 3.Beitrag von hinten.Ja das kenn ich schon nur ich wollte halt wissen wie so ein Ram angesteuert wird.

Michael
23.04.2011, 11:48
Hallo stani,


Ja das kenn ich schon nur ich wollte halt wissen wie so ein Ram angesteuert wird.

In Basic?

Dim Variable(512) as Xram Word
Dim Bytevariable as Xram Byte

und dann ganz normal im Programm als Variable verwenden.

In C ist es ähnlich einfach, das initialisieren mußt du aber selbst machen.
Google Stichwort xram avr c

Gruß, Michael

stani
23.04.2011, 11:59
Danke für den Basic Code Abschnitt.Ich werde mir jetzt einfach mal ein Atmega8515 + 74AC573 holen und dan den Ram dadran anschließen.
Man müsste also so anschließen:http://www.google.de/imgres?imgurl=http://www.mikrocontroller.net/attachment/5116/sram.png&imgrefurl=http://www.mikrocontroller.net/topic/15889&usg=__HE7dds393Slq6idkqHELqAHbD7s=&h=793&w=561&sz=9&hl=de&start=15&zoom=1&um=1&itbs=1&tbnid=eTQWzIB9dpuYHM:&tbnh=143&tbnw=101&prev=/search%3Fq%3DAtmega162%2BSRAM%26um%3D1%26hl%3Dde%2 6tbm%3Disch&ei=4qOyTZHkIciCOtza5PgI

nur eben ohne die pine A13-A18,weil ich die nicht besitze.
Dan müsste ich doch bei Bascom eingeben:
Dim Variable(1024) as Xram Word //ich denke 1024 weil das ja 8Kbit sind und man das durch 8 teilen muss für bytes
Dim Bytevariable as Xram Byte
und dan??

EDIT: Da sind auch noch die Pins WE,OE und diese CE1 und CE2

Michael
23.04.2011, 12:26
Hallo stani,

nein, du verstehst da was falsch, das Beispiel war wohl nicht ganz korrekt.
Ich versuche es nochmal neu:

$regfile = "m128def.dat"
$crystal = 16000000

$hwstack = 64
$swstack = 32
$framesize = 80

$xramsize = &H2000

Config XRAM = Enabled

Dim blabla as Xram Byte
Dim V2 as Xram Word
Dim Bla_S As Xram Single
Dim Str_v As Xram String * 4
u.s.w.

Du kannst so viele Variablen benutzen, wie du Xram-Platz hast, abzüglich der Registeradressen, weil sich die Überschneiden.
Du kannst aber bei 8kB auch den CS vom Speicher an eine Adresse anschließen und damit deinen Speicherbereich auswählen.

Gruß, Michael

Gock
23.04.2011, 14:19
Und noch mal zu Deinem Eingangspost. Willst Du den RAM nur um das Display anzusteuern?
Jedes Display hat zur Darstellung der Pixel schließlich sein eigenes "RAM", in das Du die Daten einfach nur reinschreiben musst. Falls Du überprüfen musst, was dort drinnen steht, bieten die meisten Displays auch die Funktion, den internen RAM auszulesen. Damit hast Du praktisch Deinen gesuchten ExternenRAM im Display drin.
Allerdings hast Du dann natürlich die gleichen Probleme.
Der Vorgang ist aber fast immer der GLeiche:
1 .Verbindung Deiner individuellen Pins des µC mit den Adresspins, den DatenPins und den SteuerPins (Read/Write, Enable usw.) mit dem RAM/Display.
2. Anlegen der gewünschten Adresse für ein bestimmtes Byte (0-xkB)
3. Einstellung der Steuerpins (zB Read, usw)
4. Setzen der Daten durch einen Taktpuls an CS oder wie auch immer bezeichnet.
Wenn man wenige Pins hat, benutzt man zusätzliche "Zwischenspeicher" (Octal Buffer), die zB ein ganzes Byte an AddressLow "halten" während man ein anderes an AddressHigh schreibt.
So kann man den Datenbus auf 8Bit reduzieren, benötigt dann aber für jeden der Buffer ein weiteres Bit oder aber 2 Bit zur Ansteuerung eines Multiplexers, der es einem ermöglichst 4 Buffer (zB 74hc540) anzusteuern.
Dazu gibt es soweit ich weiß auch was im RN Wissen!
Gruß

stani
23.04.2011, 14:53
Ja eigendlich versuche ich ein Display (dieses hier : http://www.pollin.de/shop/dt/Mzk0OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_WINTEK_WD_H3224V.html) anzusteuern.Ich hab bei microcontroller.net oder so gesehen,dass man für Bilder und eigenddefinierte zeichen einen zwischenram braucht,da der atmega das nicht schaft.

Jetzt versuch ich halt zu verstehen wie das ganze funktioniert,deshalb fang ich beim ram an.

Michael:
Jetzt versteh ich das.Danke
Man definiert sich quasie nicht z.b Words in dem MCU sondern auf den ram oder?
Ich könnte jetzt also sowas wie eine kleine Speicherstelle machen,wo man jetzt die Variable X und Y abspeichert.

Danke an alle ,das hat mir jetzt die augen bezühlich des SRAMs geöffnet:D
EDIT:Ich will gerade bestellen,und wollte fragen ob ohr mir sagen könnt,was ich sonst so dafür brauchen könnte:D

EDIT2:Im Datenblatt steht jetzt,dass der pin CE1 für chip LOW ist,CE2 für chip HIGH und OE für chip Output LOW ist.Die sind also dafür da ,dass man den chip bzw. den output auf low setzen kann oder??

PICture
23.04.2011, 15:31
Hallo stani!

Diese o.g. Signale dienen zum Auswahl eines SRAMs von mehreren mit paralell geshalteten Adress- und Aus- Eingangspins. Damit wird ein Chip ausgewählt, in/aus dem Daten transferiert werden. ;)

Beispielweise für 16-bittiges Word werden zwei 8-bittige SRAMs paralell geschaltet. Beim Lesen jedes Words wird auf beide SRAMs gleiche Adressen gelegt und an paralell verbundenen Ausgängen durch Umschalten von z.B. /OE abwechselndes hochwertiges ("high byte") und niederwertiges ("low byte") Byte ausgelesen.

stani
23.04.2011, 16:31
d.h ich brauche nur den WE pin oder?
Ich glaube ich stell gleich mal ein schlatplan rein,wie ich das vorhab.

PICture
23.04.2011, 16:39
Wenn du nur einzelner SRAM benutzen möchtest, brauchst du leider sowohl /WE als auch /OE Pin. Mit dem /WE kannstu du zwar Lesen/Schreiben wählen, aber beim Schreiben müssen die Ausgänge mit /OE gesperrt sein. :(

stani
23.04.2011, 16:41
Ok das ist ja kein Problemm(hoff ich:D)

EDIT: Im datenblatt steht ,dass A1-A8 die Row und A0,A9-A12 die anderen sind,soll man dan wie gehabt A0-A7 und A8-A12 anschließen oder A1-A8 und dan A0 als A9,A9 als A10...

Gock
23.04.2011, 17:04
Achtung!
Bestell das nur, wenn Du auch wirklich ein Datenblatt hast. Die ersten paar Treffer in Google suchen nämlich genau das, anstelle es anzubieten. Fehlende Datenblätter sind meist der Grund, warum bei Pollin und Konsorten die Dinge so spott billig sind!
Ok, hab eines gefunden, denke ich...

Gruß

stani
23.04.2011, 17:11
Gock:
Was meinst du ??
Ich wollte eigendlich bei reichelt einen neuen Lötkolben bestellen und da mich das mit dem Ram gerade so interessiert,wollte ich direkt mal nen Atmega8515 und einen Latch bestellen usw. ,damit ich das ausprobieren kann.

PICture
23.04.2011, 17:33
Ich verstehe deine Frage leider nicht ganz, jedenfalls du musst die ganze Adresse (z.B. A0 ... A11) auf zwei 8-bittige I/O Ports belibig permanent zuordnen (z.B. A11 ... A8 auf Port B und A7 ... A0 auf Port A). ;)

stani
23.04.2011, 17:47
Ich dachte nur ,da im Datensheet steht,dass die Adressen A1-A8 für die Spalten sind und die Adressen A0(!) A9-A12 für die Zeilen,dass iwie die 8 Spaltenbitleitungen durch den latch kommen(also A1-A8) und die Leitungen A0,A9-A12 an die anderen Pins
Oder muss ich einfach wie bei allen anderen A0-A7 und A8-A12 nhemen

PICture
23.04.2011, 17:55
Die interne Unterteilung von SRAMs Adressen auf Zeilen und Spalten sollte dich gar nicht interressieren, falls du kein Wissenschaftler bist. :)

Gock
23.04.2011, 17:58
Ich hatte zunächst das Datenblatt des Displays nicht gefunden. Und weil ich schon bei Pollin Dinge gekauft habe, für die es kein Datenblatt gab, wollte ich Dich davor warnen, denn ohne Datenblatt sieht es düster aus.
Aber dann habe ich es gefunden (http://www.mikrocontroller.net/attachment/22181/WM-G3224Z-1WLWaV2.pdf) und eines zum integrierten Controller (NT7701: http://pdf1.alldatasheet.com/datasheet-pdf/view/93869/ETC/NT7701.html) auch.
Du brauchst beide, denn der Display hersteller ahat schon einstellungen getroffen, zB den 4Bit Übertragungsmodus.
Gruß

stani
23.04.2011, 18:36
hehe vielleicht:D
Ne
Eine frage zu dem GLCD.Es hat ja ein 4bit Bus und 2 pine wo man 1 zeile und 1 spalte weitermachen kann.Gelten die spalten und zeilen als Pixel??ich meine 1 Pixel weiter und ein Pixel nach unten und so

EDIT:Wie ich das jetzt aus dem Datenblatt sehe(danke Gock),werden pro zeile und spalte immer diese 4 Pixel(D0-D3) geschrieben und mit den Steuerpins eine zeile oder spalte weitergeschoben

Vitis
24.04.2011, 07:10
nein, pixelweise wird das Ding bestimmt nicht angesprochen, gängig ist ein Byte zu schreiben, dass dann 8 Pixel vertikal entspricht.
Bei 4-Bit-Ansteuerung ist häufig die Ansteuerung in 2 Nibbles aufgeteilt, was wieder 8 Bit ergibt (2 * 4 Bit)

Aber mal ehrlich, ich halte es für ein fruchtloses Unterfangen, dass Du da vor hast.
1. Hast Du keinen Plan von µC geschweige denn Elektronik (jeder hat mal angefangen, klar)
2. Ist das Display nur sehr dürftig dokumentiert.

Fang mit was leichterem an, LED blinken lassen, dann die gängigen 08/15 Display (KS0108 kompatibel z.B.) und arbeite Dich dann vorwärts.

stani
24.04.2011, 09:21
Vitis,ich denk mal ich kenn mich in Elektronik aus,nur fang ich mit AVR erst an,deshalb muss ich erstmal das Grundlegene verstehen.
Ich hab schon etwas mit AVR gemacht,wie z.b ein einfaches 2*16 LCD anzuschließen,ADC,DAC und einen GLCD,der aber einen Controller hatte.

Das Problemm war,dass ich mir nicht vorstellen konnte ,wie ein RAM mit den Adressen und den I/O Pinen funktionieren soll.

PICture
24.04.2011, 19:09
Hallo!

So wie der Vitis schon schrieb, werden die meisten LCD's mit 8 Bits gesteuert. Im 4-bit Modus werden sie in zwei nacheinander folgenden Nibbles (jewels 4 Bit) gesendet: zuerst "high nibble" (D7 ... D4) und danach "low nibble" (D3 ... D0). Somit werden die insgesamt 8 Bits immer in zwei "Raten" in den Displaycontroller übertragen. ;)

stani
25.04.2011, 10:30
D.h also,dass man für einen Zeichensatz von 10x8 immer 3 Takte für eine Zeile(also ein pixel breit),da man bei den high nibbles 4 pixel setzt und bei den low nibbles 4 pixel und dan wieder 2 bei den high.

PICture
25.04.2011, 10:43
Nein, für 8 Pixel, die auf dem Display gleichzeitig erscheinen, setzt man zuerst "high nibble" und asnschliessend "low nibble". Fertig.

Für 10x8 Pixel muss man das ganze 10 mal wiederholen, insgesamt 20x4 Bits, also 20 Nibbles an Display schicken. :)

stani
25.04.2011, 10:54
wie unterscheidet man den zwischen high und low nibbles?Ich meine wenn ich jetzt die high nibbles - 4bit per datenbus sende,muss ich danach irgendein takt senden um die low nibbles zu schicken oder?

Danke

PICture
25.04.2011, 11:06
Bei normalen GLCD's sieht es so aus, beim RS =1 (Data):

- high1
- Enable
- low1
- Enable
- high2
- Enable
- low2
- Enable
.........
- high 10
- Enable
- low 10
- Enable

Fertig sind die 10 x 8 Pixel. ;)

Wenn man 8 Pixel an bestimmte Adresse schicken möchte, muss man vor jedem Byte (8 Pixel) entsprechende Adressen (Zeile und Spalte) setzen.

stani
25.04.2011, 11:29
Ok danke,ich müsste also den Pin Frame(alles auf 0 setzen) ansprechen,M (wiederholrate) sagen wir mal auf 100Hz stellen.Danach müsste man zuerst für eine Zeile 0xFF senden und dan nochmal 0xFF ,damit alle 8 Pixel schwarz sind