Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Register initialisieren? (AVR)

Postby lotadac » Thu Oct 21, 2010 12:00 am

Hallo,
in nahezu allen Assembler-Tutorials wird explizit darauf hingewiesen, daß der Stackpointer eingerichtet werden muß (auf Ramend setzen). zT wird auch empfohlen, alle verwendeten "Hardware"-Register (I/O-Register oder auch SpezialFunction-Register) zu initialisieren.
Meine Frage bezieht sich jetzt speziell auf den (hier auch im ATM18-Projekt verwendeten) ATmega88. Warum?
-Laut Datenblatt des Mega88 (S.44 10.1) werden nach einem Reset alle I/O-Register mit ihrem jeweiligen initial value geladen, bevor der Sprung zum Resetvektor erfolgt.
-der Stackpointer liegt mit 0x3E und 0x3D im I/O-Memory, und hat als initial value den Wert Ramend (S.13 6.6.1)
Somit sollte der doch nach jedem Reset bereits gesetzt sein, die ganzen I/O-Register ebenso.
Hat jemand 'ne Erklärung?
Danke
lotadac
 
Posts: 12
Joined: Fri Jan 03, 2014 1:49 pm

Postby wkrug » Sun Nov 21, 2010 12:00 am

Ich kann Dir aus meiner Erfahrung mit Assembler berichten, das man den Stackpointer auf jeden Fall initialisieren muß.
Ob das auch beim ATMEGA88 notwendig ist weiß ich nicht, beim AT90S2313 wars auf jeden Fall so.

Weiterhin sinnvoll ist die Belegung der Interruptvektoren.
Entweder mit einer gültigen Einsprungadresse oder einem "RETI".
Man kann diesen Bereich auch freilassen und den Bereich hinter dem Interruptvektorbereich mit .ORG angeben, die freien Plätze in der Interruptvektortabelle haben jedoch das Potential für einen Controllerabsturz, falls doch mal während des Testens ein Interrupt aktiv wird.

Rein theoretisch könnte man den Interruptvektor Bereich auch für Programmcode verwenden, wenn man keine Interrupts braucht, machen würde ich persönlich das aber nie.

Alle restlichen Register brauchen prinzipiell nicht initialisiert werden, die Defaultwerte passen da eigentlich.
Natürlich müssen die Register der Hardware die man verwenden will initialisiert werden.

Mit den Clock Kalibrierungsregistern hab ich noch nicht gearbeitet.
Ich nutze den internen Taktgenerator nur für Aufgaben die nicht von einer genauen Zeitbasis abhängig sind.
Ansonsten nehm ich Quarze oder Keramikresonatoren als Taktquelle, auch wenn ich nur einen USART befeuern will.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm


Return to Elektor-Mikrocontroller-Forum

Who is online

Users browsing this forum: No registered users and 1 guest