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. 72<br />

Salat. Das passiert vielleicht nur alle paar Minuten mal, ein schwer zu diagnostizieren<strong>de</strong>r Fehler.<br />

Wir müssten dann schon vor <strong>de</strong>r Ablage auf <strong>de</strong>m Stapel alle Interrupts mit CLI abschalten und nach<br />

<strong>de</strong>r Verwendung und Wie<strong>de</strong>rherstellung <strong>de</strong>s Registers die Interrupts wie<strong>de</strong>r mit SEI zulassen. Liegen<br />

zwischen Ab- und Anschalten <strong>de</strong>r Interrupts viele Hun<strong>de</strong>rt Instruktionen, dann stauen sich die<br />

zwischenzeitlich aufgelaufenen Interrupts und können verhungern. Wenn zwischendurch <strong>de</strong>r Zähler<br />

zwei mal übergelaufen ist, dann geht unsere Uhr danach etwas verkehrt, weil aus <strong>de</strong>n zwei Ereignissen<br />

nur ein Interrupt gewor<strong>de</strong>n ist.<br />

Innerhalb einer an<strong>de</strong>ren Interrupt-Service-Routine können wir rCnt auf diese Weise (also mit PUSH<br />

und POP) verwen<strong>de</strong>n, weil diese nicht durch an<strong>de</strong>re Interrupts unterbrochen wer<strong>de</strong>n kann. Allerdings<br />

sollte man sich bewusst sein, dass je<strong>de</strong>s PUSH- und POP-Pärchen vier weitere Taktimpulse<br />

verschwen<strong>de</strong>t. Wer also satt Zeit hat, hat auch Register en masse. Wer keine Register übrig hat,<br />

kommt um so was vielleicht nicht herum.<br />

Manchmal MUSS auf ein Register o<strong>de</strong>r auf einen Teil eines Registers (z.B. ein Bit) sowohl von innerhalb<br />

als auch von außerhalb einer Interrupt-Service-Routine zugegriffen wer<strong>de</strong>n, z.B. weil die<br />

ISR <strong>de</strong>m Hauptprogramm-Loop etwas mitzuteilen hat. In diesen Fällen muss man sich ein klares<br />

Bild vom Ablauf verschaffen. Es muss klar sein, dass Schreibzugriffe sich nicht gegenseitig stören<br />

o<strong>de</strong>r blockieren.<br />

Es muss dann auch klar sein, dass dasselbe Register bei zwei nachein<strong>de</strong>r folgen<strong>de</strong>n Lesevorgängen<br />

bereits von einem weiteren Interrupt verän<strong>de</strong>rt wor<strong>de</strong>n sein kann. Liegen die zwei Zeitpunkte längere<br />

Zeit auseinan<strong>de</strong>r, dann ist es je nach <strong>de</strong>m Timing <strong>de</strong>s Gesamtablaufes fast zwingend, dass irgendwann<br />

ein Konflikt auftritt.<br />

An einem Beispiel: sowohl <strong>de</strong>r Timer als auch <strong>de</strong>r ADC haben <strong>de</strong>m Hauptprogramm etwas mitzuteilen<br />

und setzen jeweils ein Bit eines Flaggenregisters rFlag. Also etwa so:<br />

Isr1:<br />

Isr2:<br />

[...]<br />

sbr rFlag,1

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!