Register beim AVR

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 14 7 2026  21:20:56      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Register beim AVR

    







BID = 411294

elektroluchs

Gesprächig



Beiträge: 194
Wohnort: Austria
 

  


Hallo!

Ich hätte einmal eine Frage an diejenigen, die ihre AVRs in Assembler programmieren. Wozu benutzt ihr die "unteren" Register (r0-r15 beim ATmega8 z.B.) eurer μCs denn so. Mit diesen kann man ja nicht alle Assembler-Befehle nutzen und daher ist man ja ein wenig eingeschränkt damit.

Mich würde das Dasein dieser Register wirklich brennend interessieren, was ich so gesehen habe wird ja meist mit den Registern von r16 aufwärts gearbeitet.

mfg
elektroluchs

BID = 411303

Benedikt

Inventar

Beiträge: 6241

 

  

Ich nutze die für häufig genutzte Konstanten falls es schnell gehen muss. Dann spare ich mir das ldi r16, wert und kann direkt mit out IO, r2 den Wert ausgeben.
Oder ich verwende diese als kurzzeitiger Speicher (z.B. das SREG im Interrupt wird meist in r6 gesichert.)
Eiegntlich sind die Register aber überflüssig. Der GCC Compiler nutzt diese auch nicht.

BID = 411345

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Moin,


Das niedrigste Register r0 wird bei Controllern, die den einfachen lpm-Befehl kennen, dazu benutzt, die Daten, die durch den Z-Zeiger adressiert wurden, zu laden.
Wenn man also die gewünschte Adresse im Flash-Speicher in den Z-Zeiger geladen hat und lpm aufruft, dann flutsch das adressierte Byte nach r0.

Mittlerweile können aber die etwas größeren AVRs (z.b. 8535, 32, 16 etc.) den erweiterten Befehl lpm Register, Z (Z+; Z-).

Außerdem werden die untersten beiden Register benutzt, wenn ein Word ins Flashrom geschrieben wird. (z.b. wenn ein Bootloader den Flashbereich aktualisiert.)

Sie sind also nicht nutzlos, sondern können gezielt als Puffer oder als Sicherungsregister für andere benutzt werden, wenn man den SRAM für andere Sachen benutzt.

So geht es z.B. schneller, wenn ich das Register r16 sichern will:

mov r2, r16
;mach was mit r16
mov r16, r2

als wenn ich es über das SRAM mache:

push r16
;mach was mit r16
pop r16


Außerdem kann man Register ganz normal adressieren, daher kann man recht schnelle Prozeduren schreiben, die r3-r15 als Puffer benutzen.


Man sollte aber immer sicher sein, dass diese Register dann keine ungültigen Werte durch andere Zugriffe erhalten.

_________________

BID = 411378

SIGINT

Stammposter



Beiträge: 381
Wohnort: Mönchengladbach


Zitat :
DonComi hat am  4 Mär 2007 14:31 geschrieben :

So geht es z.B. schneller, wenn ich das Register r16 sichern will:

mov r2, r16
;mach was mit r16
mov r16, r2


So kann man sich aber auch schnell einen Fehler einhandeln,wenn man nicht aufpasst... da find ich nen Stack doch praktischer. Hätten die die unteren Register noch als weitere Stackpointer verwendet, wären die sinnvoller.

Gruß,
SIGINT

BID = 411387

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Nuja, Assembler ist i.d.R. fehleranfällig, und wenn man Programe mit einigen tausend Zeilen hat (hatte ich schon), dann sollte man Register definieren und nicht direkt deren Bezeichnungen verwenden.
Man hat quasi Variablen, die man genauso, nur eben auf Assemblerart, wie in anderen Sprachen verwenden kann.

Daneben hat man dann noch die Variablen im RAM und man arbeitet natürlich viel mit Makros.

Sicher, kompliziert isses, aber es macht auch Spaß, wenn man nach dem Assemblieren den kompletten Programmkode anschaut, indem dann alle Sachen an den richtigen Stellen stehen, aus "variablen" Konstanten wie "ldi r16, (1<<bit0|0b11<<bit4|0xF<<bit5)" ordentliche Hex-Werte werden und Makros eingebunden wurden.

Aber stimmt schon, man sollte deswegen nicht so große Klimmzüge machen, denn wenn man das gleiche mit dem Stack lößt, dann braucht man nur zwei Taktzyklen mehr und es bleibt übersichtlicher.



_________________

BID = 411687

elektroluchs

Gesprächig



Beiträge: 194
Wohnort: Austria

Ich kann es fast nicht glauben, dass so eine Menge Register so wenig zu gebrauchen sind.

Naja, irgendwas müssen sich die Entwickler ja dabei gedacht haben, vielleicht weiß es ja jemand.

mfg

BID = 411696

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Da ein Befehl mit Ausnahmen* nur ein Wort groß ist, muss man sich Gedanken über die Kodierung

a) Der eventuellen Konstanten
b) Der Register und
c) Der Mnemonics selbst machen.

Ich glaube einfach, dass bei vielen Befehlen in einem Wort kein Platz mehr war und man nur die Register r16-r31 kodieren konnte.

Wobei der Befehl clr bei allen Registern funktioniert.

* AVRs mit größerem Speicherbereich unterstützen i.d.R. die Befehle jmp und call.
Diese werden als Doppelwort im ROM abgelegt, indem neben dem Befehl auch die Adresse des Labels kodiert ist. Diese kann 2 Bytes lang sein.

Edit:
Ein Wort: 2 Bytes

Rechtsschreibfehler entfernt...

_________________


[ Diese Nachricht wurde geändert von: DonComi am  5 Mär 2007 20:38 ]


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 7 Beiträge im Durchschnitt pro Tag       heute wurden bisher 6 Beiträge verfasst
© x sparkkelsputz        Besucher : 192383684   Heute : 4107    Gestern : 4606    Online : 767        14.7.2026    21:20
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0231831073761