Forum: Mikrocontroller und Digitale Elektronik Speicherverwaltung AVR


von Joe (Gast)


Lesenswert?

Hi Leute,

ich bin grad dabei mir die Speicherverwaltung des AVR anzueigen.
Im Moment verwende ich eine ATMega16 und ich hab folgende Frage.
Wenn ich mit dem Befehl "sts" etwas in den RAM schreiben möchte, bei
welcher Adresse darf ich anfangen ohne das ich mir was überschreibe?
Klar am Anfang kommen die Register 1...32 und vom RAMEND wächst der
Stack in entgegengesetzte Richtung, soviel hab ich verstanden. Aba
kommt nach R32 nochwas? oder wars das schon?

thx Joe

von Christof Krüger (Gast)


Lesenswert?

Datenblatt anschauen, steht alles drin!

von Heinz Ketchup (Gast)


Lesenswert?

ab 0x60 ist das RAM frei.

von Santa Klaus (Gast)


Lesenswert?

>ich bin grad dabei mir die Speicherverwaltung des AVR anzueigen.

Du meinst die Speicherorganisiation.

>Wenn ich mit dem Befehl "sts" etwas in den RAM schreiben möchte,
bei
>welcher Adresse darf ich anfangen ohne das ich mir was überschreibe?

Von 0x60 (dezimal 96) ab aufwärts

>Klar am Anfang kommen die Register 1...32

Nein, dort kommen die Register 0 bis 31.

Hier eine Übersicht:

RAM-Adresse
00 bis 31         --> Register r0...r31
(0x00 bis 0x1F)

32 bis 95         --> I/O-Bereich
(0x20 bis 0x5F)       (mit den Befehlen in, out, sbi, cbi
                      anzusprechen unter 0x00 bis 0x3F!)

96 bis RAMEND     --> SRAM-Speicher
(0x60 bis RAMEND)

von Andi (Gast)


Lesenswert?

Am einfachsten machst Du dir im Data-Segment (.dseg = SRAM) Marken wobei
diese Marken gleich als Variablennamen zu verstehen sind:

.cseg ;Code-Segment
 ldi r16,1      ;1 in VAR1 schreiben
 sts VAR1,r16
 ldi r16,2      ;2 in VAR2 schreiben
 sts VAR1,r16
 ldi r16,3      ;3 in VAR3 schreiben
 sts VAR1,r16

 lds r16,VAR1   ;Aus VAR1 nach r16 lesen
 lds r17,VAR2   ;Aus VAR2 nach r17 lesen
 lds r18,VAR3   ;Aus VAR3 nach r18 lesen

.dseg ;Data-Segment/SRAM
VAR1: .byte 1 ;1 Byte für VAR1 reservieren
VAR2: .byte 1 ;1 Byte für VAR2 reservieren
VAR3: .byte 1 ;1 Byte für VAR3 reservieren

Bei größeren Variablen oder Blöcken mit mehr als 3 Byte geht das mit
std oder ldd (Store/Load with Displacement) wesentlich sparsammer da
sts/lds 2 Words benötigt und std/ldd nur 1 Word.
Nachteil: es muß vorher ein Pointer Y oder Z auf den Anfang eines
Variablenblocks gesetzt werden und lohnt sich wirklich erst ab 3 Bytes
um damit im SRAM zu schreiben oder zu lesen.
Ausserdem hat man nur über 64 Bytes (0 - 63) einen direkten Zugriff:

 ldi yl,low(VAR1) ;Pointer Y auf VAR1 setzen
 ldi yh,high(VAR1)
 ldi r16,1      ;1 in VAR1 schreiben
 std Y+VAR1-VAR1,r16  ;Y+0
 ldi r16,2      ;2 in VAR2 schreiben
 std y+VAR2-VAR1,r16  ;Y+1
 ldi r16,3      ;3 in VAR3 schreiben
 std Y+VAR3-VAR3,r16  ;Y+2

Ich hoffe, das war jetzt nicht zu viel auf einmal, wollte nur die
Möglichkeiten aufzeigen.

MfG
Andi

von Andi (Gast)


Lesenswert?

Vermaledeites copy/paste-getue!
So muß das erste aussehen:

.cseg ;Code-Segment
 ldi r16,1      ;1 in VAR1 schreiben
 sts VAR1,r16
 ldi r16,2      ;2 in VAR2 schreiben
 sts VAR2,r16
 ldi r16,3      ;3 in VAR3 schreiben
 sts VAR3,r16

MfG
Andi

von Harald Koch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Joe,
hatte letztes Jahr das gleiche Problem wie Du, sprich : Einarbeitung in
die Welt der Atmel-Controller.- Um das mühsam angeeignete Wissen nicht
zu verlieren, hab ich mir dann ein Schema in EXCEL gemacht, welches ich
Dir hier mal mitschicke.- Hoffe, es hilft.
Gruß  Harald

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.