Hi, ich habe eine ISR für INT0 in der mit dem Z-Pointer ein Wert aus dem Flash gelesen wird lpm r16, Z Je nachdem welchen Wert ein weiteres REgister enthält, wird der Z-Pointer in der Hauptschleife des Programms mit verschiedenen Werten geladen cpi nextmuster, musteranzahl brne vergleich ldi nextmuster, 0 vergleich: cpi nextmuster, 0 brne zweig0 ldi ZL, LOW(muster0*2) ldi ZH, HIGH(muster0*2) ldi nextbild, 0 zweig0: ... ... zweig1: ... ... inc nextmuster Ich habe mich nun gefragt was passiert, wenn INT0 genau zwischen ldi ZL,LOW(muster0*2) und ldi ZH,HIGH(muster0*2) oder zwischen ldi ZH, HIGH(muster0*2) und ldi nextbild, 0 ausgelöst wird. Dann würde die ISR ja das richtige ZL verwenden, aber es könnte ja passieren, das ZH oder nextmuster nicht den richtigen Inhalt hat, oder? Wenn ich jetzt vor den ldi Befehlen die Interrupts abschalte und gleich danach wieder ein, vergleich: cpi nextmuster, 0 brne zweig0 cli ldi ZL, LOW(muster0*2) ldi ZH, HIGH(muster0*2) ldi nextbild, 0 sei zweig0: könnte das ja eigentlich nicht mehr passieren. Ich habe aber noch zwei Timer (einer zum entprellen und einer zum Multiplexen von LEDs). Wenn jetzt genau dann ein TimerOverflow auftritt während die Interrupts gesperrt sind geht der Overflow ja verloren. Zwischen cli und sei sind ja jeweils nur 3 ldi Befehle. Also sind die Interrupts nur für sehr kleine Zeit inaktiv. Könnte das trotzdem Probleme machen (z.B. Tastendruck "verpassen") machen. Könnte man auch nur INT0 deaktivieren indem man in GIMSK INT0 auf 1 setzt und dann halt wieder auf 0? Bin noch Anfänger und etwas unsicher, ob man das so machen würde? Grüße Michael
Hi >Wenn jetzt genau dann ein TimerOverflow auftritt >während die Interrupts gesperrt sind geht der Overflow ja verloren. Nein. Der wird nach SEI ausgeführt. MfG Spess
M. S. schrieb: > cli > ldi ZL, LOW(muster0*2) > ldi ZH, HIGH(muster0*2) > ldi nextbild, 0 > sei > während die Interrupts gesperrt sind geht der Overflow ja verloren. Da geht nix verloren. Der Controller merkt sich den Interrrupt, der wird nur eben 2 Takte später bearbeitet. > Könnte man auch nur INT0 deaktivieren indem man in GIMSK INT0 auf 1 > setzt und dann halt wieder auf 0? Macht mehr Aufwand. Grüße, Peter
Achso, also werden die Interrupts trotz CLI regestriert, der AVR "merkt" sich das irgendwie, und löst sie aus sobald Interrupts mit SEI wieder freigegeben sind? EDIT: da war ich wohl zu langsam ;)
Hi >Achso, also werden die Interrupts trotz CLI regestriert, der AVR "merkt" >sich das irgendwie, und löst sie aus sobald Interrupts mit SEI wieder >freigegeben sind? Ja. Jeder Interrupt hat ein eigenes Flag in dem das gespeichert wird. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.