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. 64<br />
11 Mehr über Interrupts<br />
Bevor man seine ersten Programme mit Interrupt-Steuerung programmiert, sollte man das hier alles<br />
gelesen, verstan<strong>de</strong>n und verinnerlicht haben. Auch wenn das einigen Aufwand be<strong>de</strong>utet: es zahlt<br />
sich schnell aus, weil es viel Frust vermei<strong>de</strong>t.<br />
11.1 Überlegungen zum Interrupt-Betrieb<br />
Einfachste Projekte kommen ohne Interrupt aus. Wenn allerdings <strong>de</strong>r Strombedarf minimiert wer<strong>de</strong>n<br />
soll, dann auch dann nicht. Es ist daher bei fast allen Projekten die Regel, dass eine Interruptsteuerung<br />
nötig ist. Und die will sorgfältig geplant sein.<br />
Grundanfor<strong>de</strong>rungen <strong>de</strong>s Interrupt-Betriebs<br />
Falls es nicht mehr parat ist, hier ein paar Grundregeln:<br />
Interrupts ermöglichen:<br />
• Interruptbetrieb erfor<strong>de</strong>rt einen eingerichteten SRAM-Stapel! ==> SPH:SPL sind zu Beginn<br />
auf RAMEND gesetzt, <strong>de</strong>r obere Teil <strong>de</strong>s SRAM (je nach Komplexität und an<strong>de</strong>rweitigem<br />
Stapeleinsatz 8 bis x Byte) bleibt dafür freigehalten!<br />
• Je<strong>de</strong> Komponente (z.B. Timer) und je<strong>de</strong> Bedingung (z.B. ein Overflow), die einen Interrupt<br />
auslösen soll, wird durch Setzen <strong>de</strong>s entsprechen<strong>de</strong>n Interrupt-Enable-Bits in seinen Steuerregistern<br />
dazu ermutigt, dies zu tun.<br />
• Das I-Flag im Statusregister SREG wird zu Beginn gesetzt und bleibt möglichst<br />
während <strong>de</strong>s gesamten Betriebs gesetzt. Ist es bei einer Operation nötig, Interrupts zu<br />
unterbin<strong>de</strong>n, wird das I-Flag kurz zurückgesetzt und binnen weniger Befehlsworte<br />
wie<strong>de</strong>r gesetzt.<br />
• Interrupt-Service-Tabelle:<br />
• Je<strong>de</strong>r Komponente und je<strong>de</strong>r gesetzten Interruptbedingung ist eine Interrupt-Service-Routine<br />
zugeordnet, die an einer ganz bestimmten Addresse im Flash-Speicher beginnt. Die Speicherstelle<br />
erfor<strong>de</strong>rt an dieser Stelle einen Ein-Wort-Sprung in die eigentliche Service-Routine<br />
(RJMP; bei sehr großen ATmega sind Zwei-Wort-Sprünge - JMP - vorgesehen).<br />
• Die ISR-Addressen sind prozessortyp-spezifisch angeordnet! Beim Portieren zu einem an<strong>de</strong>ren<br />
Prozessortyp sind diese Adressen entsprechend anzupassen.<br />
• Je<strong>de</strong> im Programm nicht verwen<strong>de</strong>te ISR-Adresse wird mit einem RETI abgeschlossen, damit<br />
versehentlich eingeschaltete Enable-Bits von Komponenten <strong>de</strong>finiert abgeschlossen sind<br />
und keinen Scha<strong>de</strong>n anrichten könen. Die Verwendung <strong>de</strong>r .ORG-Direktive zum Einstellen<br />
<strong>de</strong>r ISR-Addresse ist KEIN <strong>de</strong>finierter Abschluss!<br />
• Beim Vorliegen <strong>de</strong>r Interrupt-Bedingung wird in <strong>de</strong>n Steuerregistern <strong>de</strong>r entsprechen<strong>de</strong>n<br />
Komponente ein Flag gesetzt, das im Allgemeinen nach <strong>de</strong>m Anspringen <strong>de</strong>r Interrupt-Service-Tabelle<br />
automatisch wie<strong>de</strong>r gelöscht wird. In wenigen Ausnahmefällen kann es nötig<br />
sein (z.B. beim TX-Buffer-Empty-Interrupt <strong>de</strong>r SIO, wenn kein weiteres Zeichen gesen<strong>de</strong>t<br />
wer<strong>de</strong>n soll), <strong>de</strong>n Interrupt-Enable abzuschalten und das bereits erneut gesetzte Flag zu löschen.<br />
• Bei gleichzeitig eintreffen<strong>de</strong>n Interrupt-Service-Anfor<strong>de</strong>rungen sind die ISR-Addressen<br />
nach Prioritäten geordnet: die ISR mit <strong>de</strong>r niedrigsten Addresse in <strong>de</strong>r Tabelle wird bevorzugt<br />
ausgeführt.<br />
• Interrupt-Service-Routinen:<br />
• Je<strong>de</strong> Service-Routine beginnt mit <strong>de</strong>r Sicherung <strong>de</strong>s Prozessor- Statusregisters in einem für<br />
diesen Zweck reservierten Register und en<strong>de</strong>t mit <strong>de</strong>r Wie<strong>de</strong>rherstellung <strong>de</strong>s Status. Da die