beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 65<br />
Unterbrechung zu je<strong>de</strong>r Zeit erfolgen kann, - also auch zu einer Zeit, in <strong>de</strong>r <strong>de</strong>r Prozessor<br />
mit Routinen <strong>de</strong>s Hauptprogramms beschäftigt ist, die das Statusregister verwen<strong>de</strong>n, - kann<br />
eine Störung dieses Registers unvorhersehbare Folgen haben.<br />
• Beim Ansprung <strong>de</strong>r ISR wird die Rücksprungaddresse auf <strong>de</strong>m Stapel abgelegt, <strong>de</strong>r dadurch<br />
nach niedrigeren Addressen hin wächst. Der Interrupt und das Anspringen einer Interrupt-<br />
Service-Tabelle schaltet die Ausführung weiterer anstehen<strong>de</strong>r Interrupts zunächst ab. Je<strong>de</strong><br />
Interrupt-Service-Routine en<strong>de</strong>t daher mit <strong>de</strong>r Instruktion RETI, die <strong>de</strong>n Stapel wie<strong>de</strong>r in<br />
Ordnung bringt und die Interrupts wie<strong>de</strong>r zulässt.<br />
• Da je<strong>de</strong> Interrupt-Service-Routine anstehen<strong>de</strong> weitere Interrupts solange blockiert, wie sie<br />
selbst zu ihrer Ausführung benötigt, hat je<strong>de</strong> Interrupt-Service-Routine so kurz wie nur irgend<br />
möglich zu sein und sich auf die zeitkritischen Operationen zu beschränken.<br />
• Da auch Interrupts mit höherer Priorität blockiert wer<strong>de</strong>n, sollte bei zeitkritischen Operationen<br />
niedriger prioritäre Ints beson<strong>de</strong>rs kurz sein.<br />
• Da eine erneute Unterbrechung während <strong>de</strong>r Verarbeitung einer Service-Routine nicht vorkommen<br />
kann, können in <strong>de</strong>n verschie<strong>de</strong>nen ISR-Routinen die gleichen temporären Register<br />
verwen<strong>de</strong>t wer<strong>de</strong>n.<br />
• Schnittstelle Interrupt-Routine und Hauptprogramm:<br />
• Die Kommunikation zwischen <strong>de</strong>r Interruptroutine und <strong>de</strong>m Hauptprogramm erfolgt über<br />
einzelne Flaggen, die in <strong>de</strong>r ISR gesetzt und im Hauptprogramm wie<strong>de</strong>r zurückgesetzt wer<strong>de</strong>n.<br />
Zum Rücksetzen <strong>de</strong>r Flaggen kommen ausschließlich Ein-Wort-Instruktionen zum Einsatz<br />
o<strong>de</strong>r Interrupts wer<strong>de</strong>n vorübergehend blockiert, damit während <strong>de</strong>s Rücksetzvorgangs<br />
diese o<strong>de</strong>r an<strong>de</strong>re Flaggen im Register bzw. im SRAM nicht fälschlich überschrieben wer<strong>de</strong>n.<br />
• Werte aus <strong>de</strong>r Service-Routine wer<strong>de</strong>n in <strong>de</strong>zidierten Registern o<strong>de</strong>r SRAM-Speicherzellen<br />
übergeben. Je<strong>de</strong> Än<strong>de</strong>rung von Register- o<strong>de</strong>r SRAM-Werten innerhalb <strong>de</strong>r Service-Routine,<br />
die außerhalb <strong>de</strong>s Interrupts weiterverarbeitet wer<strong>de</strong>n, ist daraufhin zu prüfen, ob bei <strong>de</strong>r<br />
Übergabe durch weitere Interrupts Fehler möglich sind. Die Übergabe und Weiterverabeitung<br />
von Ein-Byte-Werten ist unproblematisch, bei Übergabe von zwei und mehr Bytes ist<br />
ein ein<strong>de</strong>utiger Übergabemechanismus zwingend (Interrupt Disable beim Kopieren <strong>de</strong>r Daten<br />
in <strong>de</strong>r Hauptprogramm-Schleife, Flag-Setzen/-Auswerten/-Rücksetzen, o.ä.)! Als Beispiel<br />
sei <strong>de</strong>r Übergabemechanismus eines 16-Bit-Wertes von einem Timer/Counter an die<br />
Auswerteroutine beschrieben. Der Timer schreibt die bei<strong>de</strong>n Bytes in zwei Register und<br />
setzt ein Flag in einem an<strong>de</strong>ren Register, dass Werte zur Weiterverarbeitung bereitstehen. Im<br />
Hauptprogramm wird dieses Flag ausgewertet, zurückgesetzt und die Übergabe <strong>de</strong>s Wertes<br />
gestartet. Wenn nun das erste Byte kopiert ist und erneut ein Interrupt <strong>de</strong>s Timers/Counters<br />
zuschlägt, gehören anschließend Byte 1 und Byte 2 nicht zum gleichen Wertepaar. Das gilt<br />
es durch <strong>de</strong>finierte Übergabemechanismen zu verhin<strong>de</strong>rn!<br />
• Die Hauptprogramm-Routinen:<br />
• Im Hauptprogramm legt ein Loop <strong>de</strong>n Prozessor schlafen, wobei <strong>de</strong>r Schlafmodus "Idle"<br />
eingestellt sein muss. Je<strong>de</strong>r Interrupt weckt <strong>de</strong>n Prozessor auf, verzweigt zur Service-Routine<br />
und setzt nach <strong>de</strong>ren Beendigung die Verarbeitung fort. Es macht Sinn, nun die Flags darauf<br />
zu überprüfen, ob eine o<strong>de</strong>r mehrere <strong>de</strong>r Service-Routinen Bedarf an Weiterverarbeitung<br />
signalisiert hat. Wenn ja, wird entsprechend dorthin verzweigt. Nach<strong>de</strong>m alle Wünsche <strong>de</strong>r<br />
ISRs erfüllt sind, wird <strong>de</strong>r Prozessor wie<strong>de</strong>r schlafen gelegt.<br />
11.2 Die Interrupt-Vektoren-Tabelle<br />
Hier kommt alles über die Reset- und Interrupt-Vektoren-Tabelle, und was man bei ihr richtig und<br />
falsch machen kann.<br />
Vergessen Sie für eine Weile mal die Worte Vektor und Tabelle, sie haben hier erst mal nix zu sagen