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
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
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
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.
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
Auch danke an euch, Hubert und moep! Dann war meine Idee ja gar nicht so verkehrt. :)
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
Ok, damit kann ich doch schon mal ein ganzes Stück weiter! :) Vielen Dank euch nochmal! Gruß, Maik
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
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.
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
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;
}
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?
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.