Hallo und Guten Abend, ich versuche mittels des Z-Pointers (R30,R31) auf die Daten im SRAM zuzugreifen. Laut Doku hat das SRAM einen Offset von 0x0060. Also initalisiere ich die beiden Register folgendermaßen: ldi r31, hi8(Table + 0x0060) ldi r30, lo8(Table + 0x0060) Die Daten sind im MemoryWindow (Data) herrlich anzusehen, nur wenn ich mittels lpm das Register 0 geladen wird, steht da leider nicht der erwartete Wert. Benutzte ich den falschen Offset? Danke Gruß Boris
per lpm lädst du aus dem Programmspeicher, also vom Programmcode (Load Programm Memory). Aus dem SRAM lädst Du mittels ld, ldd. In den SRAM schreibst Du mit st std Andreas
hallo boris, du kannst mit dem befehl lpm üer das register 0 nur aus dem flash lesen, du must den befehl ld oder lds verwenden. ich hoffe es hilft dir weiter ?? gruss boris
hey! würde gerne das 1k internal sram vom atmega8 nutzen, hab aber wenig (bis keine ahnung von asm)... könntet ihr mir 2 routinen zum schreiben und lesen ins intere sram vom mega8 mailen, wenn möglich in c (für den gcc, winavr2006) ? wenn asm, bitte dazusagen wo welche adressen einzutragen sind? vielen dank&gruss, peter
...bedeutet das, dass ich, wenn ich ganz normale variablen verwende (bzw. arrays) schon das interne sram nutze? schade. hatte gehofft, noch ca 900 chars irgendwo ablegen zu können... der mega8 hängt sich nämlich bei (sonst kleinem programm) bei einem char-array von ca 500 werten auf. das heisst, ich muss auf die etwas umständliche lösung eines ext. rams zurückgreifen, oder? aber danke, peter
Der Mega8 hat neben seinen 32 Registern 1024 Bytes SRAM (das ist schon recht viel). Da du in C programmierst, werden alle deine Variablen im SRAM abgelegt. Jedes Char braucht ein Byte, jedes Int zwei Bytes, bei Arrays schlägt es richtig zu. Dann gibt es noch den Stack, der natürlich auch im SRAM liegt und bei jedem Interrupt oder Funktionsaufruf Platz braucht. Und wenn ich mich nicht irre, dann führt C noch einen weiteren Stack zur Parameterübergabe bei Funktionsaufrufen. Auch das braucht SRAM. Ich würde mal sagen, dass dein SRAM knapp wird und daher dein Stack in den Variablenbereich wächst, was natürlich zu undefiniertem Verhalten des Controllers führt. Ein AVR ist kein PC mit unendlichen Ressourcen, man sollte also effizient mit den wenigen vorhandenen Ressourcen umgehen und die Programme so schreiben, dass sie nicht mehr Speicher brauchen als zur Verfügung steht. Du suchst noch Platz für Chars. Was soll das werden? Sind das Konstanten (die sich zur Laufzeit nicht ändern, z.B. Menütexte)? Dann kann man diese im Flash ablegen, das spart SRAM. ...
Ja, ganz normale Variablen werden im internen SRAM abgespeichert. Die Lösung mit dem externen RAM ist sehr umständlich. Nimm einfach den nächstgrößeren Atmel, dann hast Du Platz :-) viele Grüße Andreas
> oder ins EEPROM...
Richtig...
Nur ist mir dieses im allgemeinen etwas zu schade für Konstanten, die
zur Laufzeit nicht verändert werden. Das nutze ich dann lieber für
Variablen, die auch ein Ausschalten überleben sollen (änderbare
Parameter).
...
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.