AVR Interrupt trotz Sperrung

Gast #523818
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...
#523827
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.
Gast #523833
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

Gast #523855
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...
Gast #524192
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren