Forum: Mikrocontroller und Digitale Elektronik ICP Interrupt Problem, löst bei Berührung und zufällig aus.


von Karl (Gast)


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

von Volker S. (volkerschulz)


Lesenswert?

Meinst Du jetzt einen Timer-Interrupt oder soll der TSOP einen externen 
Interrupt ausloesen?


Volker

von Matthias L. (Gast)


Lesenswert?

Was sieht denn der TSOP? Vielleicht eine Neonröhre oder sowas?

Häng doch mal ein Oszi an den Ausgang vom TSOP dran..

von Magnetus (Gast)


Lesenswert?

Matthias Lipinsky schrieb:
> Was sieht denn der TSOP? Vielleicht eine Neonröhre oder sowas?

Infrarot Fernbedienungsempfänger.

Schäm dich, Matthias!  ;o)

von Magnetus (Gast)


Lesenswert?

Ups... mist.... hatte deinen Beitrag falsch gelesen... schäm

von Karl (Gast)


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...

von Volker S. (volkerschulz)


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

von Karl (Gast)


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

von Peter D. (peda)


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

von Lehrmann M. (ubimbo)


Lesenswert?

Alles brav Entstört ? Elko von Vdd nach GND ? Massenflächen ?

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


Viel Glück =)

von Hannes L. (hannes)


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.

...

von Karl (Gast)


Lesenswert?

@Hannes: ESL?

von Hannes L. (hannes)


Lesenswert?

Karl schrieb:
> @Hannes: ESL?

Energiesparlampe

...

von Karl (Gast)


Lesenswert?

Vielen Dank nochmal an alle...

Auf Hannes Tip hin, wurde der Programmieraufwand zwar bissl 
trickreicher, aber die Spikes stören nun nicht mehr...

von Karl (Gast)


Lesenswert?

Achja noch was,

ist es eigentlich möglich mehrere TSOPs über Gatter zusammenzuschalten, 
um beispielsweise einen "Rundempfänger" zu basteln?

Danke nochmal und Gruß
Karl

von Matthias L. (Gast)


Lesenswert?

>Auf Hannes Tip hin, ...

Sauerei, ich war eher ;-)

von Stefan (Gast)


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

von Hannes L. (hannes)


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... ;-)

...

von Hannes L. (hannes)


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

...

von Karl (Gast)


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

von Hannes L. (hannes)


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.

...

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.