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. 66<br />
und dienen nur <strong>de</strong>r Verwirrung <strong>de</strong>s unkundigen Publikums. Wir kommen auf die zwei Worte aber<br />
noch ausführlich zurück.<br />
Stellen Sie sich einfach vor, dass je<strong>de</strong>s Gerät im AVR für je<strong>de</strong> Aufgabe, die einer Unterbrechung <strong>de</strong>s<br />
Prozessors würdig ist, eine feste Adresse hat, zu <strong>de</strong>r sie <strong>de</strong>n Prozessor zwingt hinzuspringen, wenn<br />
das entsprechen<strong>de</strong> Ereignis eintritt (also z.B. <strong>de</strong>r Pegel an einem INT0-Eingang wechselt o<strong>de</strong>r wenn<br />
<strong>de</strong>r Timer gera<strong>de</strong> eben übergelaufen ist). Der Sprung an genau diese eine Adresse ist in je<strong>de</strong>m AVR<br />
für je<strong>de</strong>s Gerät und je<strong>de</strong>s Ereignis festgenagelt. Welche Adresse mit welchem Gerät und Ereignis<br />
verknüpft ist, steht im Handbuch für <strong>de</strong>n jeweiligen AVR-Typ. O<strong>de</strong>r ist in <strong>de</strong>n Tabellen am En<strong>de</strong><br />
dieses Kapitels aufgelistet.<br />
Alle Interrupt-Sprungziele sind am Anfang <strong>de</strong>s Programmspeichers, beginnend bei <strong>de</strong>r Adresse<br />
0000 (mit <strong>de</strong>m Reset), einfach aufgereiht. Es sieht fast aus wie eine Tabelle, es ist aber gar keine<br />
wirkliche. Eine Tabelle wäre, wenn an dieser Adresse tatsächlich das eigentliche Sprungziel selbst<br />
stün<strong>de</strong>, z.B. eine Adresse, zu <strong>de</strong>r jetzt weiter verzweigt wer<strong>de</strong>n soll. Der Prozessor täte diese dort<br />
abholen und <strong>de</strong>n aus <strong>de</strong>r Tabelle ausgelesenen Wert in seinen Programmzähler la<strong>de</strong>n. Wir hätten<br />
dann eine echte Liste mit Adressen vor uns, eine echte Tabelle.<br />
Beim AVR gibt es aber gar keine solche Tabelle mit Adresswerten. Statt<strong>de</strong>ssen stehen in unserer sogenannten<br />
Tabelle Sprungbefehle wie RJMP herum. Der AVR ist also noch viel einfacher gestrickt:<br />
wenn ein INT0-Interrupt auftritt, lädt er einfach die Adresse 0001 in seinen Programmspeicher und<br />
führt die dort stehen<strong>de</strong> Instruktion aus. Und das MUSS dann eben ein Sprungbefehl an die echte<br />
Adresse sein, an <strong>de</strong>r auf <strong>de</strong>n Interrupt reagiert wird, die Interrupt-Service-Routine (ISR). Also nix<br />
Tabelle, son<strong>de</strong>rn Auflistung <strong>de</strong>r Sprunginstruktionen zu <strong>de</strong>n Serviceroutinen.<br />
Jetzt haben wir noch die Sache mit <strong>de</strong>m Vektor zu klären. Auch dieses Wort ist Käse und hat mit<br />
<strong>de</strong>n AVRs rein gar nix zu tun. Als man noch Riesen-Mikrocomputer baute mit etlichen 40-poligen<br />
ICs, die als Timer, UARTs und I/O-Ports nach außen hin die Schnittstellenarbeit verrichteten, fand<br />
man es eine gute I<strong>de</strong>e, wenn diese selbst darüber bestimmen könnten, wo ihre Service-Routine im<br />
Programmspeicher zu fin<strong>de</strong>n ist. Sie gaben dazu bei einem Interrupt einen Wert an <strong>de</strong>n Prozessor,<br />
<strong>de</strong>r dann diesen zu einer Tabellen-Anfangsadresse addierte und die Adresse <strong>de</strong>r Service-Routine<br />
von dieser Adresse holte. Das war sehr flexibel, weil man sowohl die Tabelle als auch die vom<br />
Schnittstellenbaustein zurückgegebenen Werte je<strong>de</strong>rzeit im Programm manipulieren konnte und so<br />
flugs die ganze Tabelle o<strong>de</strong>r die Interrupt-Service-Routine wechseln konnte. Der zu <strong>de</strong>r Tabellenadresse<br />
zu zählen<strong>de</strong> Wert wur<strong>de</strong> als Vektor o<strong>de</strong>r Displacement (Verschiebung) bezeichnet. Und jetzt<br />
wissen wir, wie es zu <strong>de</strong>m Wort Vektortabelle kam, und dass es mit <strong>de</strong>n AVR rein gar nix zu tun hat,<br />
weil wir es we<strong>de</strong>r mit einer Tabelle noch mit Vektoren zu tun haben.<br />
Unsere Sprungziele sind im AVR fest verdrahtet, es wird auch nix zu einer Anfangsadresse einer Tabelle<br />
addiert und schon gar nicht sind irgendwelche Service-Routinen austauschbar. Warum verwen<strong>de</strong>n<br />
wir diese Worte überhaupt? Gute Frage. Weil es alle tun, weil es sich doll anhört und weil es<br />
Anfänger eine Weile davon abhält zu kapieren worum es wirklich geht.<br />
Aussehen bei kleinen AVR<br />
Eine Reset- und Interrupt-Vektor-Tabelle sieht bei einem kleineren AVR folgen<strong>de</strong>rmaßen aus:<br />
rjmp Main ; Reset, Sprung zur Initiierung<br />
rjmp Int0Sr ; Externer Interrupt an INT0, Sprung zur Service-Routine<br />
reti ; Irgen<strong>de</strong>in an<strong>de</strong>rer Interrupt, nicht benutzt<br />
rjmp IntTc0OvflwSr ; Überlauf Timer 0, Behandlungsroutine<br />
reti ; Irgendwelche an<strong>de</strong>ren Interrupts, nicht benutzt<br />
reti ; Und noch mehr Interrupts, auch nicht benutzt<br />
Merke: