beginner_de
beginner_de
beginner_de
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Avr-Asm-Tutorial S. 48<br />
9 Steuerung <strong>de</strong>s Programmablaufes in AVR Assembler<br />
Hier wer<strong>de</strong>n alle Vorgänge erläutert, die mit <strong>de</strong>m Programmablauf zu tun haben und diesen beeinflussen,<br />
also die Vorgänge beim Starten <strong>de</strong>s Prozessors, Sprünge und Verzweigungen, Unterbrechungen,<br />
etc.<br />
9.1 Was passiert beim Reset?<br />
Beim Anlegen <strong>de</strong>r Betriebsspannung, also beim Start <strong>de</strong>s Prozessors, wird über die Hardware <strong>de</strong>s<br />
Prozessors ein sogenannter Reset ausgelöst. Dabei wird <strong>de</strong>r Zähler für die Programmschritte auf<br />
Null gesetzt. An dieser Stelle <strong>de</strong>s Programmes wird die Verarbeitung also immer begonnen. Ab hier<br />
muss <strong>de</strong>r Programm-Co<strong>de</strong> stehen, <strong>de</strong>r ausgeführt wer<strong>de</strong>n soll. Aber nicht nur beim Start wird <strong>de</strong>r<br />
Zähler auf diese Adresse zurückgesetzt, son<strong>de</strong>rn auch bei<br />
• externem Rücksetzen am Eingangs-Pin Reset durch die Hardware,<br />
• Ablauf <strong>de</strong>r Wachhund-Zeit (Watchdog-Reset), einer internen Überwachungsuhr,<br />
• direkten Sprüngen an die Adresse Null (Sprünge siehe unten).<br />
Die dritte Möglichkeit ist aber gar kein richtiger Reset, <strong>de</strong>nn das beim Reset automatisch ablaufen<strong>de</strong><br />
Rücksetzen von Register- und Port-Werten auf <strong>de</strong>n jeweils <strong>de</strong>finierten Standardwert (Default)<br />
wird hierbei nicht durchgeführt. Vergessen wir also besser die 3.Möglichkeit, sie ist unzuverlässig.<br />
Die zweite Möglichkeit, nämlich <strong>de</strong>r eingebaute Wachhund, muss erst explizit von <strong>de</strong>r Leine gelassen<br />
wer<strong>de</strong>n, durch Setzen seiner entsprechen<strong>de</strong>n Port-Bits. Wenn er dann nicht gelegentlich mit Hilfe<br />
<strong>de</strong>r Instruktion<br />
WDR ; Watchdog Reset<br />
zurückgepfiffen wird, dann geht er davon aus, dass Herrchen AVR eingeschlafen ist und weckt ihn<br />
mit einem brutalen Reset.<br />
Ab <strong>de</strong>m Reset wird also <strong>de</strong>r an Adresse 0x000000 stehen<strong>de</strong> Co<strong>de</strong> wortweise in die Ausführungsmimik<br />
<strong>de</strong>s Prozessors gela<strong>de</strong>n und ausgeführt. Während <strong>de</strong>r Ausführung wird die Adresse um 1 erhöht<br />
und schon mal die nächste Instruktion aus <strong>de</strong>m Programmspeicher geholt (Fetch during Execution).<br />
Wenn die erste Instruktion keine Verzweigung <strong>de</strong>s Programmes auslöst, kann die zweite Instruktion<br />
also direkt nach <strong>de</strong>r ersten ausgeführt wer<strong>de</strong>n. Je<strong>de</strong>r Taktzyklus am Takteingang <strong>de</strong>s Prozessors entspricht<br />
daher einem ausgeführten Instruktion (wenn nichts dazwischenkommt).<br />
Die erste Instruktion <strong>de</strong>s ausführbaren Programmes muss immer bei Adresse 0000 stehen. Um <strong>de</strong>m<br />
Assembler mitzuteilen, dass er nach irgendwelchen Vorwörtern wie Definitionen o<strong>de</strong>r Konstanten<br />
nun bitte mit <strong>de</strong>r ersten Zeile Programmco<strong>de</strong> beginnen möge, gibt es folgen<strong>de</strong> Direktiven:<br />
.CSEG<br />
.ORG 0000<br />
Die erste Direktive teilt <strong>de</strong>m Assembler mit, dass ab jetzt in das Co<strong>de</strong>-Segment zu assemblieren ist.<br />
Ein an<strong>de</strong>res Segment wäre z.B. das EEPROM, das ebenfalls im Assembler-Quelltext auf bestimmte<br />
Werte eingestellt wer<strong>de</strong>n könnte. Die entsprechen<strong>de</strong> Assembler-Direktive hierfür wür<strong>de</strong> dann natürlich<br />
lauten:<br />
.ESEG<br />
Die zweite Assembler-Direktive oben stellt <strong>de</strong>n Programmzähler beim Assemblieren auf die Adresse<br />
0000 ein. ORG ist die Abkürzung für Origin, also Ursprung. Wir könnten auch bei 0100 mit <strong>de</strong>m<br />
Programm beginnen, aber das wäre ziemlich sinnlos (siehe oben). Da die bei<strong>de</strong>n Angaben CSEG