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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.