Zitat Zitat von hardware.bas Beitrag anzeigen
Hallo zusammen,
ich bin grad dabei diverse IR-Fernbedienungscodes auszuwerten. Dazu nutze ich einen ATMEGA 162 und den Eingangspin für INT0. Konfiguriert wurde der INT0 mit Rising, da ein 4093 Gatter als Flankenversteiler
Also ein Gatter mit Schmitt-Trigger Eingang wie auch den HC14. Den 4093 musste ich erstmal nachschlagen.

Es soll ab der ersten ansteigenden Flanke des Impulspaketes ein Interrupt ausgelöst werden und in der ISR die restlichen Impulse am selben PIN ausgelesen werden. Deswegen ist der allererste Befehl in der ISR die Interruptdeaktivierung.
Das ist nicht nötig und eher schädlich. Innerhalb eines Interrupts sind typisch die Interrupts gesperrt, mindestens aber der, in dessen Handler man gerade ist.

Die ISR dauert länger als das IR-Impulspaket. Nach der ISR wird der Interrupt wieder freigegeben
Das sollte man nie machen, dann kann ein neuer (oder auch der gleiche) Handler aufgerufen werden, bevor deiner ganz zuende ist. Mit etwas Pech passiert das mehrfach, bis der ganze Stack aufgeraucht ist. Ein Interrupthandler gibt mit dem letzten Befehl (Return From Interrupt) die Interrupte wieder frei, so wie sie beim Eintritt gesperrt werden.

,. also da sind keine IR-Impulse mehr vorhanden. Nun muss ich feststellen, dass die ISR nicht 1x, sondern 2x ausgeführt wird. Für mich ist das zwar für mein Projekt nicht unbedingt problematisch, aber komisch ist das doch. Gibt da eventuell versteckte Timingprobleme?
Es ist kein Timingproblem. Der Interruptpin oder ein Interruptereignis löst nicht den Sprung in den Interrupthandler aus, sonder setzt ein Interruptflag. Immer, also unabhängig davon, ob die Interrupte enabled oder disabled sind. Ein gesetztes Flag bei freigegebenen Interrupten löst dann den Handler aus. Bei manchen Interruptquellen wird diese Flag durch einen Automatismus gelöscht, bei anderen muß es explizit gelöscht werden (Datenblatt). Lösche also dieses Flag und alles ist in Ordnung.

MfG Klebwax