Forum: Mikrocontroller und Digitale Elektronik TSOP, was kommt an?


von Maik (Gast)


Lesenswert?

Hallo, ich habe vor, mich ein wenig mit Infrarot-Steuerung zu 
beschäftigen.
Dabei kam ich auf den TSOP, als Empfänger des IR Signals einer normalen 
Fernbedienung.
Aber was kommt denn genau beim Microcontroller an, wenn der TSOP ein 
Signal auffängt?
Wird dann einfach der "Burst" als 1 und kein Burst als Null 
weitergegeben und man interpretiert das ganze nun anhand des Verwendeten 
Code? (zb MD5)?
Da der TSOP den verwendeten Code ja nicht kennt, kann er die richtigen 
Bits ja nicht auslesen.

Gruß, Maik

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Schau Dir mal dir IR-Protokollbeschreibung

  http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail

an. Oder die Literaturhinweise unter:

  http://www.mikrocontroller.net/articles/IRMP#Literatur

Wenn Du Dir dann noch den ganzen IRMP-Artikel

  http://www.mikrocontroller.net/articles/IRMP

durchliest, hast Du auch direkt die Lösung. ;-)

Gruß,

Frank

von moep (Gast)


Lesenswert?

Du bekommst vom TSOP nur die Bits die eben empfangen wurden, die 
Trägerfrequenz wird ja schon demoduliert.
Das interpretieren musst du in Software machen, je nach Protokoll eben.
Schau mal hier z.B. http://www.mikrocontroller.net/articles/IRMP

von Hubert G. (hubertg)


Lesenswert?

Maik schrieb:
> Wird dann einfach der "Burst" als 1 und kein Burst als Null
> weitergegeben und man interpretiert das ganze nun anhand des Verwendeten
> Code? (zb MD5)?

So ist es.

von Maik (Gast)


Lesenswert?

Hallo Frank,
Vielen Dank für die Antwort! :)

Von IRMP hab ich schon was gehört, ich wollte es allerdings (um es 
besser zu verstehen und daraus lernen zu können) für eine FB selber 
entwickeln.
Durchlesen werde ich es mir aber dennoch, denn es stehen bestimmt genug 
Informationen drin, die ich gebrauchen kann. ;)

Ich weiß noch nicht, ob es nicht auch erwähnt wird (falls ja, werde ich 
ja darüber stolpern), aber wie lese ich das Signal am besten aus?
Über einen Interrupt, sobald ein Signal am TSOP anliegt oder doch eher 
über einen Timer, der in der passenden Frequenz arbeitet?

Nun mache ich mich erstmal ans lesen.

Gruß, Maik

von Maik (Gast)


Lesenswert?

Auch danke an euch, Hubert und moep!
Dann war meine Idee ja gar nicht so verkehrt. :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Maik schrieb:
> Ich weiß noch nicht, ob es nicht auch erwähnt wird (falls ja, werde ich
> ja darüber stolpern), aber wie lese ich das Signal am besten aus?

IRMP macht es über einen Timerinterrupt, d.h. das Signal wird mit 
(idealerweise) 15kHz gescannt.

Eine Alternative dazu wäre ein Pin-Change-Interrupt. Damit sollte es 
auch gehen.

Gruß,

Frank

von Maik (Gast)


Lesenswert?

Ok, damit kann ich doch schon mal ein ganzes Stück weiter! :)

Vielen Dank euch nochmal!

Gruß, Maik

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hubert G. schrieb:
> Maik schrieb:
>> Wird dann einfach der "Burst" als 1 und kein Burst als Null
>> weitergegeben und man interpretiert das ganze nun anhand des Verwendeten
>> Code? (zb MD5)?
>
> So ist es.

Nicht ganz. Burst ist 0 (GND) am TSOP, Pause ist 1.

Gruß,

Frank

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Eine Alternative dazu wäre ein Pin-Change-Interrupt. Damit sollte es
> auch gehen.

Aber nur bedingt. Wenn der TSOP Störungen auffängt, wird der 
Interruptpin möglicherweise wild getoggelt. Das kann dem Programm 
schlecht bekommen. Wird der Pin jedoch zyklisch auf seinen Status 
geprüft, kann das Programm sehr schnell Müll von echten Daten 
unterscheiden und der Rechenaufwand ist stets derselbe. Das Programm 
kann unbeeinflusst von der Eingangsgröße immer schön weiterlaufen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Knut Ballhause schrieb:
> Aber nur bedingt. Wenn der TSOP Störungen auffängt, wird der
> Interruptpin möglicherweise wild getoggelt. Das kann dem Programm
> schlecht bekommen.

Das sehe ich genauso.

> Wird der Pin jedoch zyklisch auf seinen Status
> geprüft, kann das Programm sehr schnell Müll von echten Daten
> unterscheiden [...]

Genau SO macht es IRMP, es ist eine einfache Zustandsmaschine.

Gruß,

Frank

von Maik (Gast)


Lesenswert?

Hallo,

ich habe mir ein kleines Programm überlegt, mit dem ich hoffe 
herauszufinden, was die Fernbedienung genau sendet.
Um nachher ein richtiges Signal auszuwerten, wird natürlich ein anderes 
Programm genommen, dies hier dient nur dazu, den Takt des Signals 
auszulesen.

Ich dachte mir das so:
Ein Timeroverflow eines 8 Bit Timers zählt eine Variable hoch.
Ein Interrupt, der bemerkt, wenn KEIN Signal vom TSOP kommt schreibt den 
Zählstand in ein Array, welches ich mir nach einer Minute ausgeben 
lasse.
So sehe ich zwar noch nicht, wie lange ein Burst dauert, aber zumindest, 
wann und wie viele ankommen.

Kann man das so machen?

Mein Codevorschlag dazu wäre:

#include <avr/io.h>
#include "lcd-routines.h"  //von hier aus den Tutorials
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t time=0, i=0, n;
volatile uint8_t timearray[100];

ISR(TIMER0_COMPA_vect)
{
  time++; // zählt in 8µs hoch (µC-Takt = 1MHz, 8bit Timer)
}

ISR(PCINT2_vect)
{

  timearray[i] = time;
  i++;
}

int main( void )
{

  lcd_init();
  lcd_string("Start");
  lcd_setcursor( 0, 2 );
  lcd_string("Warte auf Signal");



  PCICR |= (1 << PCIE2);
  PCMSK2 |= (0<<PCINT22);

  TCCR0B = 1;
  TIMSK0 |= (1<<OCIE0A);

  sei();

  while(1)
  {
    if(time>7500000) // entspricht 1min
    {
      for(n=0;n<=i;n++)
      {
        lcd_string(n);
        lcd_setcursor( 0, 2 );
        lcd_string(timearray[n]);
        long_delay(1000);
      }
    }
  };
  return 0;

}

von Maik (Gast)


Lesenswert?

Achtung, ich hab einen Fehler mit dem Timer gemacht!

Ein 8-Bit Timer läuft natürlich über 256 Schritte, nicht nur 8.
Die timer Variable zählt also nur alle 256µs hoch.
Die Abbruchzeit müsste noch angepasst werden.

Schickt das noch, um einigermaßen genaue Werte zu bekommen?

von mex (Gast)


Lesenswert?

Ich programmiere gerad eienen RC5 Codec als Empfänger.

Also hab ich auch einen TSOP der mir 36 kHz demoduliert.
Leider hab ich grad den Code nicht hier, aber wenn du RC5 hier im mc.net 
suchst, dann stolperst du über ein paar Dateien, die sehr hilfreich sein 
dürften, dauert zwar ein wenig bis man durchblickt, aber an sich 
funktioniert es ganz gut.

Ich benutze einen MSP430 und arbeite nur mit einem Timer der immer 
wieder vom compare modus in den capture modus umschaltet, das finde ich 
eigentlich recht trickreich und scheint prozentual gut zu funktionieren, 
also ich habe zwar störhaften codeempfang aber die grobe masse kommt 
richtig an.

Ich hoffe das hilft dir ein wenig.
Viele Grüße

von Maik (Gast)


Lesenswert?

Hallo, danke für deine Antwort!

leider weiß ich nicht, ob meine Fernbedienungen über RC5 senden oder 
über ein anderes Protokoll, daher kann ich auch nicht genau sagen, wie 
lange ein Burst ist, etc.

Ich denke, ich werde das ganze dann mit CTC Modus laufen lassen, um die 
Abtastrate zu steigern.

Mg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Maik schrieb:
> leider weiß ich nicht, ob meine Fernbedienungen über RC5 senden oder
> über ein anderes Protokoll, daher kann ich auch nicht genau sagen, wie
> lange ein Burst ist, etc.

Die Wahrscheinlichkeit, dass eine Deiner Fernbedienungen RC5 sendet, ist 
verschwindend gering. Denn RC5 ist so gut wie ausgestorben - auch wenn 
manche hier im Forum es anders sehen. Dann sprechen sie aber meist von 
irgendwelchen Universal-Fernbedienungen, mit denen sie noch ihren 
uralten Philips-Röhrenfernseher bedienen.

> Ich denke, ich werde das ganze dann mit CTC Modus laufen lassen, um die
> Abtastrate zu steigern.

Warum schaust Du nicht einfach mal in den IRMP-Source rein, um Ideen für 
Dein eigenes Programm zu bekommen? Wenn Du schon IRMP nicht benutzen 
willst, kannst Du Dir trotzdem jede Menge Anregungen holen.

Tipp: Schaue nach in main.c des IRMP-Projekts, da gibt es eine Funktion 
init_timer(). Die sollte das Gewünschte machen - auch für Deine Belange.

Gruß,

Frank

von Maik (Gast)


Lesenswert?

Gute Idee!
Ich hab mich bisher nur in die Dokumentation gelesen, aber ich werde mir 
den Sourcecode wohl auch mal anschauen.

Wenn ich Fragen zu gewissen teilen habe, werde ich mich hier wieder 
melden. :)

Ach ja, eine hätte ich schon: Der Atmega läuft im Moment mit 1MHz, kann 
aber normal bis zu 8MHz.
Muss ich, um diese zu erreichen nur das einschränkendes Fusebit 
deaktivieren?
Oder muss noch mehr angepasst werden?

Gruß, maik

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Maik schrieb:
> Ach ja, eine hätte ich schon: Der Atmega läuft im Moment mit 1MHz, kann
> aber normal bis zu 8MHz.
> Muss ich, um diese zu erreichen nur das einschränkendes Fusebit
> deaktivieren?

Ja.

> Oder muss noch mehr angepasst werden?

Nein.

Gruß,

Frank

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.