Hallo, ich weis das dieses Thema hier schon ein paar mal behandelt worden ist. Allerdings werde ich daraus nicht schlau bzw sind dort keine Information die meine Fragen beantworten. Ich habe vor ein 8Mbit Sram an einem ATmega1281 zu betreiben. Da ich mich noch nicht so gut auskennen, wollte ich mal klein anfangen und einfach mal daten raufschreiben und diese dann vergleichen. Hier ist der code den ich geschrieben habe. Allerdings funktionier es nicht ganz: unsigned int j; unsigned int data = 0xffff; unsigned int *sram_ptr = 0x100; PORTF = (PORTF | 0x0C); data = 0xFFFF; sram_ptr = (unsigned int*)0x200; for (j = 0x200; j <= 0x300; j++) { *sram_ptr = data; sram_ptr++; data--; } sram_ptr = (unsigned int*)0x200; data = 0xFFFF; for (j = 0x200; j <= 0x300; j++) { if (*sram_ptr != data) { PORTF = PORTF & ~0x08; } if (*sram_ptr == data) { PORTF = PORTF & ~0x04; } } Nun blinken allerdings beide led's wie verrückt. Ich programmier mit Codevision und simulier mit Avr studio. Da haut es hin. Nur am µC nicht mehr :S Jede Art von Hilfe ist Willkommen =) Greetings, Alex
Alex wrote:
> Jede Art von Hilfe ist Willkommen =)
OK. Ich schiebs einfach mal von der Codesammlung ins richtige Forum. Ist
zwar nur eine kleine Hilfe, aber was solls.
Und nächstes mal wird eine Anfrage in der Codesammlung sang und klanglos
gelöscht!
Hallo, da wäre mal die frage wie du das ram angeschlossen hast. An das XMEM Interface? Wenn ja, was hast du mit den restlichen Pins des SRAM gemacht, liegen die vernünftig Potential? Ich hatte das Problem auch. Habe ewig den Fehler gesucht und das irgendwann mal raus bekommen, das die nicht benutzten Pins nicht in der Luft hängen sollten, sonst haben die ständig irgend einen zustand der ständig wechselt und nur Fehler verursacht. CA Dirk
Schaltplan kann ich im Moment nicht anhängen da der am Laptop ist und ich diesen in der Schule vergessen hab. Kann ich erst Montag holen -.- Alle Leitungen hängen auf einem Potential. Keine ist undefiniert. Was vielleicht noch wichtig wäre ist, ich benutzte ein STK501 für den ATmega128 und die Ports A,C,F,G. Als Adresslatch benutz ich einen 74HC373D, als Inverter einen LM5111-3M. Der Sram Chip is von Cypress Semiconductors, 62157E. Greetings, Alex
Versuch doch einmal ein "FRAM" mit I2C. FM24C246 mit 32 KBYTE ohne Statusabfrage zu schreiben und lesen bis zu einer Taktfrequenz von 1MHz. Das Datenblatt ist sehr hilfreich. Ablauf lesen: I2C initialisieren, Slaveaddresse schreiben, Hi Addr.,Lo Addr., Neustart, lesen ohne ack=1 byte, mit ack mehrfach. Adresse incrementiert automatisch bei wiederholtem schreiben oder lesen. Datenblatt : www.ramtron.com. Funktioniert auch bei 100 und 400 KHz. Daten bleiben bis zu 45 Jahre ohne Versorgung erhalten. Haelt bis zu 10 Milliarden Zyklen aus. Slaveadresse kann an den Eingaengen mit Bruecken auf 5V eingestellt werden. Vorteil:nur zwei Leitungen vom MCU belegt. Gehaeuse= 8-SOIC. Hubert G.
Das Problem ist die größe. Ich brauch mindestens 512kbyte und eine gewisse Geschwindigkeit. Ich will später Daten von einem G-Sensor und GPS mitloggen. Das am besten ein paar mal in der Sekunde, und diese Daten bei einem gewissen Ereignis auf eine SD-Karte schreiben, wo sozusagen jede sekunde zählt. Und sind FeRAM nicht noch immer sehr teuer? Hab vor geraumer Zeit mal nach einem passendem gesucht aber keinen gefunden der auch Preislich tragbar war. Greetings, Alex
@Alex, ich sehe gerade das du mit den pointer im internen RAM 0x200 bis 0x300 arbeitest, ist das mit Absicht? Hast du des RAM-Interface aktiv? Wenn nicht benutzten Adresspin an den Ports vom ATmega hängen sollten die Ports als Ausgang definiert sein. Ich habe den RAM-Test so gemacht.
1 | // externes RAM-Interface freigeben
|
2 | XMCRA |= ( 1<<SRE ) ; |
3 | // A16 freigeben, hängt an PD7, damit der RAM funktioniert, wenn dies nicht gemacht wird, ist A16 tristate und der RAM macht komische sachen :-)
|
4 | DDRD |= ( 1<<PD7 ); |
5 | PORTD |= ( 1<<PD7 ); |
6 | |
7 | unsigned char * p = (unsigned char *) 0x2200; |
8 | |
9 | unsigned char data = 0; |
10 | unsigned long fehler = 0; |
11 | unsigned int i,a; |
12 | |
13 | // Schleife für Speicherzelle Byteweise
|
14 | for( i = 0x2200 ; i<0xffff ; i++ ) |
15 | {
|
16 | p++; |
17 | |
18 | data=1; |
19 | |
20 | // Schleife für Speicherzelle Bitweise in der aktuellen Speicherzelle Byteweise
|
21 | for( a = 0 ; a < 8 ; a++ ) |
22 | {
|
23 | data = 1<<a; |
24 | *p = data; |
25 | if ( *p != data ) |
26 | {
|
27 | fehler++; |
28 | break; |
29 | }
|
30 | }
|
31 | *p = 0x00; |
32 | }
|
33 | |
34 | if ( fehler == 0 ) LED_1_ON(); |
35 | else while(1); |
Wichtig ist das der Pointer p mit der ersten Adresse im externen RAM geladen wird, beim ATmega2561 ist das 0x2200. Das Beispiel testet alle Speicherstellen bitweise durch uns zählt die Fehler mit. CA Dirk
Hi Alex, will dir nichts verkaufen, aber "FM25H20" kostet bei onlinecomponents.com USD17.89 und ist nur 5x6 mm (TDFN-8 Gehaeuse). Mit SPI bis 40MHz taktbar. 2Megabit (512Kbyte). Hat auch chipselect fuer Erweiterung. Der Online-Laden ist verlaesslich, kaufe da manchmal. Ansteuerung ist relativ einfach. Gruss Hubert
@Dirk: Großes Danke, das hat mir viel geholfen. Das heist ich hab die ganze Zeit in den falschen Adressbereich geschrieben. Beim ATmega128 fangt der externe erst bei 0x1100 an. Ich wusste nicht das ich das externe Ram erst aktivieren muss. Ich dachte das reicht wenn ich das beim erstellen eines Neuen Projektes, Codevision, angebe. Dem war wohl nicht so. Aber positiv ist das mein kleines Programm, an dem ich schon mal ein ganzes Zeiterl gesessen bin, nicht grundlegend falsch war. @Hubert: Danke, werd ich mir merken. Aber im Moment hab ich 5 von den Cypress Sram zuhause und will dann doch das diese funktionieren. Anbei nun endlich der Schaltplan. Ich benutzte Eagle 5.4.0 Freeware. Hab noch nicht herausgefunden wie ich dort nen Bus machen kann. Deswegen entschuldigt die etwas unübersichtlichkeit ^^ Greetings, Alex
Muss ich irgendwo die größe des Sram's definieren? Oder ist das egal und ich schreib nur in einem gewissem Adressbereich? Greetings, Alex
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.