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
>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)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.