ICP Interrupt Problem, löst bei Berührung und zufällig aus.

Gast #1606910
Lesenswert?

Hallo Zusammen,

ich hab den ICP1 eines Atmega128 folgendermaßen initialisiert

  TCCR1B |= (1 << ICNC1) | (1 << ICES1) | (1 << CS12);
  TIMSK |= (1 << TICIE1);
  TCNT1 = 0;

An PD4 hängt ein TSOP und der soll ein IR-Signal decodieren.

Die ISR(TIMER1_CAPT_vect) wird auch aufgerufen, allerdings bekomme ich 
interrupts, die völlig undefiniert sind und zufällig auftreten.
Erst dachte ich, dass es an dem fehlenden Pullup liegen könnte, doch mit 
programmierten Pullups, sowie festem Pullup, bekomme ich die Störungen 
nicht weg. Wie könnte man sowas abfangen oder beseitigen? Vielen Dank 
schon mal...

Schönen Sonntag
Karl
Gast #1606930
Lesenswert?

IR-Empfänger ist richtig. Unabhängig von dem TSOP, ist so ein Verhalten 
möglich? Trotz Pullup? Eigentlich ja nur, wenn der TSOP aktiv gegen GND 
zieht, oder?
ich finde den Fehler einfach nicht... Oszi habe ich leider nicht da, 
sonst hätte ich das als aller erstes getan...
#1606932
Lesenswert?

Karl schrieb:
> IR-Empfänger ist richtig. Unabhängig von dem TSOP, ist so ein Verhalten
> möglich? Trotz Pullup? Eigentlich ja nur, wenn der TSOP aktiv gegen GND
> zieht, oder?
> ich finde den Fehler einfach nicht... Oszi habe ich leider nicht da,
> sonst hätte ich das als aller erstes getan...

Beim TSOP (ich denke mal das gilt fuer alle) ist ein Pullup eher 
hinderlich. Der hat ja schon einen recht starken drin... ;)

Ich verstehe aber immernoch nicht wie der TSOP einen /Timer/interrupt 
ausloesen soll..


Volker
Gast #1607025
Lesenswert?

@Volker: Danke für die Info. Hab mit grad mal ein soundkarten oszi 
gebastelt, der TSOP scheint ok zu sein. Ich habe diverse Projekte mit 
einem TSOP gesehen, wo ca 10k Pullup dran hängen.

>Ich verstehe aber immernoch nicht wie der TSOP einen /Timer/interrupt
>ausloesen soll..

Der ICP ist ja genau für solche Zwecke geeignet (Frequenzzähler)
Anhand der Timerstände und deinem SystemTakt kannst du dann die Frequenz 
errechnen. Ich möchte erstmal nur die TimeTicks zwischen jeweils den 
steigenden oder fallenden Flanken ermitteln und über die UART 
ausgeben... Aber wie gesagt, wenn der TSOP am µC hängt, dann löst der 
einfach so aus. Auf dem Soundoszi sehe ich einiges an Rauschen, aber ich 
denke und hoffe, dass das nicht der Realität entspricht.

Gruß Karl
#1607036
Lesenswert?

Karl schrieb:
> Auf dem Soundoszi sehe ich einiges an Rauschen, aber ich
> denke und hoffe, dass das nicht der Realität entspricht.

Doch, das tut es.
Ist quasi wie bei älteren UKW-Radios ohne Rauschsperre.

Besser ist daher die Abtastung mit einem Timerinterrupt, damit filtert 
man kurze Störungen raus.
Und dann muß man noch testen, ob die Pulse dem erwarteten Code 
entsprechen.


Peter
#1607231
Lesenswert?

> Oder hat's vielleicht den IR-Empf. erwischt ? versuch den doch mal zu
> ersetzen.

Nö, es ist völlig normal, dass der Spikes ausgibt. Dazu reicht schon 
eine ESL. Man muss eben die Software so schreiben, dass sie sich von 
Spikes oder Fremdsignalen nicht verarschen lässt.

...
Gast #1607472
Lesenswert?

Hallo Karl,

wie hast du programmtechnisch die Spikes weggefiltert?
Stehe vor einem ähnlichem Problem, dass ich manchmal Interrupts erhalte, 
die da nicht sein sollten...

Hast du ggf. ein Stück Code für mich?

Danke!

Grüße
Stefan
#1607594
Lesenswert?

Matthias Lipinsky schrieb:
>>Auf Hannes Tip hin, ...
>
> Sauerei, ich war eher ;-)

Stimmt... Das hat man wohl für einen Scherz gehalten. 8-P
(Gruß elbaufwärts...)

Ich hatte übrigens mal eine ESL, die hat mir grundsätzlich den 
Grundig-TV ausgemacht, selbst aus dem Nachbarzimmer über mehrere 
Reflexionen (bei offenen Türen). Ich habe mich dann von dem Ding trennen 
müssen.

Der entscheidende Tip für mich war allerdings von Peter (danke):
Beitrag "Re: ICP Interrupt Problem, löst bei Berührung und zufällig aus."
Ich werde meine nächsten IR-Empfänger-Versuche mal auf dieser Basis 
machen. Ein paar nicht identifizierte Ein-Euro-Fernbedienungen von 
Pollin habe ich ja noch liegen... ;-)

...
#1607598
Lesenswert?

Karl schrieb:
> Achja noch was,
>
> ist es eigentlich möglich mehrere TSOPs über Gatter

Warum Gatter? - Die haben Open-Coll.-Ausgang, die kann man direkt 
parallelschalten. In einer Rolladensteuerung für ein Eigenheim wurden 
mehrere TSOPs in verschiedenen Räumen parallelgeschaltet und mehrere 
Pollin-IR8-Bausätze (mit neuer Firmware) mit diesem Signal angesteuert.

> zusammenzuschalten,
> um beispielsweise einen "Rundempfänger" zu basteln?
>
> Danke nochmal und Gruß
> Karl

...
Gast #1608351
Lesenswert?

Vielen Dank nochmal an alle, natürlich auch besonders an Matthias ;-)

@Stefan:
Da mein IR-Signal ein Sync-Bit mit bekannter Periodendauer in Ticks vor 
und nach jedem Stream sendet, prüfe ich in der InputCapture-ISR, ob die 
TimeTick-Differenz zwischen 2 aufeinanderfolgenden Input-Capture-Events 
genau der Anzahl an TimeTicks (+-5) von meinem Sync-Signal entspricht. 
Wenn ja wird ein zweiter Timer gestartet und alles was danach kommt in 
einem Array gepuffert. Wenn dieser Timer überläuft bevor mein zweites 
Sync am Ende des Streams kommt, wird das Signal verworfen. Wenn jedoch 
ein zweites Sync kommt, bevor der Timer überläuft, wird der Timer wieder 
gestoppt und der Stream zwischen den beiden Sync-Signalen mit gültigen 
Streams (später ausm EEPROM) verglichen und die dazu jeweils zugeordnete 
Funktion aufgerufen, wenn die Streams übereinstimmen...
Im Prinzip mache ich eine kurze Überprüfung der Periodendauer der 
Signale (innerhalb der InputCaptureISR), da mein Protokoll aus genau 3 
verschiedenen Signalen mit unterschiedlichen Periodendauern besteht.
Klar benötige ich erstmal 2 Timer, aber wie gesagt, da ich mehr 
ressourcen zur Verfügung habe, als ich benötige, war das so mein erster 
"quickhack", welcher seit gestern Nacht 1A funktioniert.

Gruß Karl
#1608373
Lesenswert?

> Klar benötige ich erstmal 2 Timer,

Nööö, der Timer1, der ICP kann, der kann nebenher noch zwei 
Compare-Interrupts generieren, mit denen genaue Intervalle erzeugt 
werden können. Du musst nur dafür sorgen, dass der Timer frei 
durchläuft, also von niemandem (außer dem CPU-Takt) verändert wird. Bei 
ICP bildet man die Differenz zum zuvor gemessenen Wert (neu minus alt), 
bei den Compares liest man den Compare-Wert aus dem OCR-Register, 
addiert das Intervall drauf und schreibt es als neuen Int-Termin ins 
OCR-Register zurück. Und ja, man kann auch noch den Überlauf-Int 
benutzen, der ist aber nur bedingt brauchbar, weil man ja auf Reload 
verzichten muss, denn der Timer muss ungehindert durchlaufen.

...

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