Hallo, ich habe an Port d2 einen SFH506 zum Empfang von Infrarot Signalen angeschlossen ( At90s8535 ). Mit der Fernbedienung steuere ich den Ablauf des Programs und kann Werte eingeben. Dies soll nur gelegentlich geschehen, weshalb ich den Interrupt in der ISR sofort wieder sperre. Nach dem erneuten Aktivieren, wird dieser leider sofort wieder ausgeloest, obwohl keine Signale anliegen. wer kann helfen. vielen Dank im voraus. horst.
Vor Freigabe des Ints im GIMSK-Register das zugehörige Flag im GIFR-Register löschen. Sonst löst ein "alter" Interrupt sofort die Int-Routine aus. grüße leo
IR-Signale pollt man besser im Timerinterrupt. Sonst kann es beim zeitweiligen Sperren passieren, daß man den Anfang des nächsten Datenpakets verpaßt und Müll dekodiert. Auch haben einige IR-Empfäger die Angewohnheit auch ohne Signal zyklisch ganz kurze Impulse zu erzeugen. Ein Timerinterrupt ignoriert diese einfach, wie das Entprellen einer Taste. Ein Beispielcode für das RC-5 Protokoll ist im Anhang. Peter
Jein Du löscht zwar, aber zu einem falschen Zeitpunkt. Ich geh mal von folgendem Zustand aus. keine IR-Aktivität, alle Register und Ints gesperrt. Nun gibst du den Int frei und drückst die Fernbedienung. Die (erste!) Flanke gelangt zum uP, INTF wird gesetzt und (weil INTE und GIE enabled) wird die Interrupt-Routine angesprungen (gleichzeitig wird GIE gesperrt und INTF gelöscht; durch den uP). Du löscht Int-Enable und Int-Flag (letzteres könnte man weglassen, ist ja schon gelöscht), vermutlich wird nun in der Interrupt-Routine das IR-Signal gesampelt (??); zumindestens werden etliche IR-Signale eintreffen und das INT-Flag wird umgehend wieder gesetzt, löst aber nichts aus weil ja mittlerweile INT-E gesperrt. Irgendwann willst du jetzt wieder auf IR hören und enablest den INT und sofort wird dieser "alte" Interrupt ausgelöst. -> unmittelbar vor freigeben im GIMSK im GIFR löschen grüße leo
Danke Leo, wenn ich dich rictig verstehe wird trotz Disabeln des Interrupts SIGNAL (SIG_INTERRUPT0) // PD2 Taste1 { outp(0,GIMSK); // INT0: Off outp(0,MCUCR); outp((1<<INTF0),GIFR); // Loeschen durch '1' ! Infra=1; } das flag im GIFR durch die auf die flanke folgenden IR-Signale wieder gesetzt ? Deinen Hinweis probiere ich einmal aus. gruss horst.
Richtig verstanden, zumindestens bei 2313, 2323 und M8 ist es so. Ich geh' davon aus daß die anderen "Familienmitglieder" genauso agieren. grüße leo
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.