www.mikrocontroller.net

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


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst Du jetzt einen Timer-Interrupt oder soll der TSOP einen externen 
Interrupt ausloesen?


Volker

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sieht denn der TSOP? Vielleicht eine Neonröhre oder sowas?

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

Autor: Magnetus (Gast)
Datum:

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

Infrarot Fernbedienungsempfänger.

Schäm dich, Matthias!  ;o)

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups... mist.... hatte deinen Beitrag falsch gelesen... schäm

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes: ESL?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:
> @Hannes: ESL?

Energiesparlampe

...

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank nochmal an alle...

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

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auf Hannes Tip hin, ...

Sauerei, ich war eher ;-)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.