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. 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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!