Forum: Mikrocontroller und Digitale Elektronik sram benutzen, aber wie?


von Stefan (Gast)


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

von Fino (Gast)


Lesenswert?

Die Adressen sowie die Größe des SRAMs findest Du im Datenblatt im
Kapitel "SRAM Data Memory". Für die Verwendung es SRAMs dürfte
http://www.avr-asm-tutorial.net/avr_de/beginner/sram.html ganz
hilfreich sein.

Fino

von Stefan (Gast)


Lesenswert?

Danke, genau sowas suchte ich, noch eine Frage, was ist an den Registern
1-15 speziell? Kann ich die nicht normal als Speicherstellen verwenden?

von Fino (Gast)


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.

von Alexthbe (Gast)


Lesenswert?

wieso nicht einfach den stack dazu bentzen? WÜrd ich jetzt mal sagen ...
is auch das SRAM, braucht man aber net immer nach den adressen zu
schaun ...

von Stefan (Gast)


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??

von Andreas Schwarz (Gast)


Lesenswert?

Genau so, siehe auch Kapitel 3 und 4 im Tutorial.

von Stefan (Gast)


Lesenswert?

Thanks!!

von el gig (Gast)


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

von Rolf Magnus (Gast)


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.

von Thomas O. (Gast)


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)

von Peter D. (peda)


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

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
Noch kein Account? Hier anmelden.