sram benutzen, aber wie?

Gast #38724
Lesenswert?

Hallo!

Um eines vorweg zu nehmen, ich habe bereits gesucht in anderen Threads
bin aber leider zu doof um das alles zu verstehen. Mir reichen die
Register 16-31 bei meinem Atmega nicht mehr aus, brauche aber noch
einpaar Speicherstellen um die Daten welche ich in einem Unterprogramm
ermittelte im Hauptprogramm wieder ins Spiel zu bringen. Da dachte ich,
dass sram würde sich hier vielleicht noch gut machen. Oder was ist mit
den Reg. 1-15??
Also wieder zum sram: der Anfang kann ich nicht gebrauchen, da dort
Register r1-r31 und die I/O-Register schon vergeben sind, dann kommte
der Bereich den ich nutzen kann. Bis wohin geht der bei einem ATmega8?
Zweite Frage: Ich habe gelesen, dass man die sram Adresse in den
Z-Pointer laden muss und dann weiss ich nicht weiter. Wie lautet der
Befehl um etwas dort anzulegen und wie lautet der Befehl um es wieder
zu holen?


Danke für eure Hilfe!!!

Grüsse
Gast #38727
Lesenswert?

Du kannst r0 bis r15 genau wie r16 bis r31 benutzen, abgesehen von
einigen wenigen Befehlen wie ANDI, ORI usw, bei denen mit Konstanten
gearbeitet wird; diese sind nur für r16 bis r31 verwendbar.
Gast #38729
Lesenswert?

Wie funzt das mit dem Stack, wenn ich im Hauptprogramm in r16 etwas habe
und das nicht verlieren will, wenn ein Interrupt kommt in welchem auch
auf r16 etwas geschrieben wird, dann kann ich am anfang der
Interruptroutine mit push r16 das in den Stack tun und vor reti wieder
pop r16. Funzt das so??
Gast #38732
Lesenswert?

hey!

kann mir jemand den zugraff aufs interne 1k sram des mega8 mit c
mailen? verwende gcc (winavr 2006) und fange mit den asm routinen oben
nix an. wie schreib ich ein byte (aus einer char-variable) ins sram und
wie krieg ichs wieder raus? (in c!)

danke und gruss,
peter
Gast #38733
Lesenswert?

> kann mir jemand den zugraff aufs interne 1k sram des mega8 mit c
> mailen?

Beispiel:

x = 5;

> wie schreib ich ein byte (aus einer char-variable) ins sram

Indem du eine weitere char-Variable anlegst und den Wert einfach in die
Variable schreibst.

> und wie krieg ichs wieder raus? (in c!)

Indem du den Wert einfach wieder aus der Variable liest.
Variablen sind nichts weiter als Speicherstellen im internen SRAM. Die
Adressvergabe passiert automatisch.
In einigen Fällen können sie durch Optimierungen durch Register ersetzt
werden oder gar ganz wegfallen.
Gast #38734
Lesenswert?

Für Variablen in ASM mach ich das so, ich muss mich dann garnicht drum
kümmern wo das ganze im SRAM liegt, für ein Array müsste man das aber
mit den Pointern machen.

.DSEG                     ;Reserve jeweils 1 Byte / Variable im SRAM
Steuerbyte1:    .byte 1
Steuerbyte2:    .byte 1
Temperatur:     .byte 1
....
....

.CSEG
.ORG  0x00
Reset:
lds temp, Steuerbyte1     ;Lade Steuerbyte1(SRAM) nach temp
sts Steuerbyte1, temp     ;Speichere temp ins Steuerbyte1(SRAM)
#38735
Lesenswert?

> kann mir jemand den zugraff aufs interne 1k sram des mega8 mit c
> mailen? verwende gcc


Unter C geht Dich das überhaupt nichts an, das ist nämlich Sache des
Linkers. Und der wird sehr ärgerlich, wenn man ihm ins Handwerk
pfuscht.


Jede Variable wird allein über ihren Namen referenziert.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren