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...
Weil die das I-Flag bei verlassen der Interruptroutine automatisch (durch iret, oder wars reti? ... so viele verschiedene assembler) wieder gesetzt wird.
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.
@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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.