Forum: Mikrocontroller und Digitale Elektronik AVR Interrupt trotz Sperrung


von Christoph Romas (Gast)


Lesenswert?

Hallo Leute.

Ich bin dabei mich in AVRs einzuarbeiten und wollte ein kleines 
Timingexperiment machen. Dazu habe ich zwei Tasten an die INT0 und INT1 
Pins eines ATMega16 geklemmt und lasse mit der einen einen Multiplikator 
incrementieren, so das bei dem anderen nach Verstreichen einer Zeit 
10ms*multiplikator eine LED angeht. Nicht wundern warum ich den Int 
genommen habe, ich hab absichtlich keine Entprellung genommen, da ich 
subjektiv testen will wieviel Reaktionszeit durch den Nutzer erkannt 
wird.

Meine Frage ist folgende:
Ich benutze AVR Studio mit GCC und bei Eintritt in die ISR werden die 
Ints gesperrt. Wenn ich den Int nun auf fallende Flanke konfiguriere, so 
wird die ISR zwei mal ausgeführt, obwohl laut Simulation bereits beim 
Springen zum INT Vector das I Flag gelöscht wird. Kann mir das einer 
erklären? Der Compiler sichert vor Ausführen der ISR noch einige 
Register, in der Simulation ist da aber schon (wie gesagt) das I Flag 
0...

von Werner B. (Gast)


Lesenswert?

Weil die das I-Flag bei verlassen der Interruptroutine automatisch 
(durch iret, oder wars reti? ... so viele verschiedene assembler) wieder 
gesetzt wird.

von Erik S. (erik_s)


Lesenswert?

Ein ähnliches Problem hatte ich auch schon: Während der Interruptroutine 
wurde das Flag durch einen erneutes Interruptereignis gesetzt. Ich habe 
es gelöst, indem ich das Flag am Ende des Interrupts per Programmbefehl 
zurücksetze.

Bei dir wird der 2. Aufruf des Interrupts durch das Prellen der Tasten 
herrühren. Also entweder entprellen per HW oder eben Rücksetzen des 
Interruptflag per Code.

von Falk (Gast)


Lesenswert?

@Erik s

>Ein ähnliches Problem hatte ich auch schon: Während der Interruptroutine
>wurde das Flag durch einen erneutes Interruptereignis gesetzt. Ich habe

Das halte ich für ein Gerücht. Das wäre ein elementarer BUG, und der 
wäre längst im Errata sheet gelandet.

Das I Flag im SREG wird definitiv NICHT nochmal gesetzt.

ALLERDINGS kann das jeweilig Interrupt-Flag für die diversen Quellen 
(hier Externer Interrupt) während des aktiven Interruots neu gesezt 
werden. Das ist aber der Sinn der Sache.

MfG
Falk


von johnny.m (Gast)


Lesenswert?

Merke: Durch eine "Sperrung" eines oder aller Interrupts (im ersten Fall 
durch das lokale Freigabe-Bit, im zweiten durch das I-Bit im SREG) wird 
nur die Bearbeitung der betreffenden Ereignisse (also der Sprung in 
den Interrupt-Vektor mit allem was damit zusammenhängt) verhindert, 
nicht aber das Setzen der Interrupt-Flags an sich! Diese sollen 
schließlich auch im Polling-Verfahren abgefragt werden können...

von Christoph Romas (Gast)


Lesenswert?

Ah!

Vielen Dank. Das ist dem Verständnis sehr zuträglich.
Ich hab im Datenblatt nun gefunden das das Flag im GIFR dafür 
verantwortlich ist und als ich es simuliert habe hab ich gesehen das es 
erneut gesetzt wird. Das war also mein Denkfehler!

Vielen Dank!

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
Noch kein Account? Hier anmelden.