mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicherverwaltung AVR


Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt anschauen, steht alles drin!

Autor: Heinz Ketchup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ab 0x60 ist das RAM frei.

Autor: Santa Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harald Koch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.