Interrupt Int0

Gast #64831
Lesenswert?

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.
Angehängte Dateien:
#64834
Lesenswert?

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
Angehängte Dateien:
Gast #64835
Lesenswert?

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
Gast #64836
Lesenswert?

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.

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