Forum: Mikrocontroller und Digitale Elektronik Interrupt Int0


von Horst Piening (Gast)


Angehängte Dateien:

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.

von leo (Gast)


Lesenswert?

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

von Horst Piening (Gast)


Lesenswert?

@leo:

 Hab ich doch getan: outp((1<<INTF0),GIFR);   // Loeschen durch '1'

 horst.

von Peter D. (peda)


Angehängte Dateien:

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

von leo (Gast)


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

von Horst Piening (Gast)


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.

von leo (Gast)


Lesenswert?

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