02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!