02.05.2013 Aufrufe

beginner_de

beginner_de

beginner_de

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!