Hallo, ich versuche mich gerade daran, ein Programm zu schreiben, dass den IR-Code meiner Denon-Fernbedienung (arbeitet mit DENON Code) auszulesen. Auf einer Internetseite habe ich die Beschreibung des Denon-Codes gefunden: Das einzige was momentan wichtig ist in Kürze: Eine übermittelte 0 wird aus 275µs Impuls und 775µs Pause aufgebaut, eine 1 aus 275µs Impuls und 1900µs Pause. So weit so gut. Jetzt habe ich ein bisschen gerechnet und bin darauf gekommen, dass ich bei einem Timer ohne Prescaler auf ~ 15600 Interrupts pro Sekunde komme. (4.000.000 / 256) Ein empfangener Impuls dauert dann also rechnerisch etwas um die 4,3 "Interrupts" lang. Und je nach Signal (0 oder 1) dauert die Pause 30 oder 12 "Interrupts". Mein Programm soll also zählen, wieviele Interrupts lang der Pin High war und wieviel danach wieder Low. Und daraus müsste sich dann ja ein Code ermitteln lassen. Soweit die Theorie. Die Interrupt Routine schaut wie folgt aus: SIGNAL(SIG_OVERFLOW0) { if (PIND & ~(1<<PIND0)) { high_tick++; } if ((high_tick>=4) && (PIND & ~(1<<PIND0))) { low_tick++; } if (low_tick>=12 && (PIND & ~(1<<PIND0))) { data<<=1; if (low_tick>=30) { data|=0; } else { data|=1; } high_tick=0; low_tick=0; } PORTB=data; } Aber es funktioniert nicht so wie es soll. Ich möchte den Emfangenen Code auf Port B an LED's darstellen. Allerdings bekomme ich nur ausgeschaltete LED's nachdem ich irgendeinen Knopf meiner Fernbedienung drücke. Ich bin nicht so der Oberchecker in der Mikrocontroller Programmierung also helft mir ein bisschen auf die Sprünge. Ich habe mir auch schon ein paar Sourcecodes von RC5 Empfängern angeschaut, aber irgendwie werde ich nicht wirklich schlau daraus. Danke schonmal! Steffen Abel
Wie willst Du denn einen Puls von 275us auf einer LED sehen? Soweit ich weiß schafft dies das menschliche Auge nicht, oder? Wieso verwendest Du nicht den Interrupteingang, der sollte doch besser gehen, als die Timerlösung? Sind nur ein paar Verständnisfragen... Marc
@steffen: ist da denn kein Träger drauf? Bzw. falls ja, demodulierst Du das Signal (z.B. mit einem TSOP17xx als Empfänger)? Denn wenn Du einfach so mit dem Interrupt machst, dann kann es schon sein, daß Du da gerade bei einem Low mißt. Wie hast Du die Diode überhaupt angeschlossen? Erzähl doch mal dazu ein bischen mehr. Als ersten Test würde ich empfehlen, eine Endlosschleife zu programmieren, die einfach nur den Wert einließt und auf der LED darstellt. Damit kannst Du testen, ob alles richtig angeschlossen ist und ob Du die Ports richtig ansprichst. @marc: Einen einzelnen Puls wird man wohl kaum sehen, aber da kommt ja nicht nur einer und das menschliche Auge sieht da die Durchschnittshelligkeit. Markus
Hallo Markus, also ich habe keine IR Diode, sondern einen IR Empfänger und Demodulator, sorry für die falsche Angabe. Es ist ein SFH506 von Siemens. Folglich ist das Signal schon demoduliert. Wie meinst du das mit der Endlosschleife? Ich habe bereits mal das Signal, das von dem Empfänger kommt auf einen Port ausgeben lassen, ich sehe die LED dann auch flackern, sobald ich mit einer Fernbedienung ein Signal sende. @Marc: Wie stellst du dir das vor mit dem Interrupteingang? Sobald der Empfänger auf High geht würde ich dort ja dann einen Interrupt auslösen, aber wie zähle ich die Low-Zeit??! mfg Steffen
Di legst das Signal des Empfaenngers direkt auf den externen interrupt. Wenn dieser Aktiv ist startest du den timer und laesst ihn zaehlen bis der externe Int wieder auf 0 ist und liest den timer aus
Ok, dann habe ich die Dauer des High-Impulses, aber wie bekomme ich die des Low-Impulses? Wieder den Timer starten und zählen lassen, bis der nächste High kommt? Verstehe ich das richtig?
korrekt ;) Es gibt verschiedenne Betriebsarten, wie du den interrupt nutzen kannst bei steigender flakne und bei fallender flanke oder bei sich aendener flanke denk Gruss Jens
aaahh... das klingt ja schonmal gut, dann kann ich also immer bei ändernder Flanke den Timer starten und dadurch die Impulslängen ermitteln, wenn ich das richtig verstehe...
Wenn der Impuls immer 275µs lang ist, und sich lediglich die Länge der Pause zwischen den Impulsen ändert - würde es dann nicht genügen den Interrupt bei fallender Flanke auszulösen und dann bis zum nächsten Impuls zu zählen?
Stimmt eigentlich. Danke für den Hinweis. Ich werde eure Vorschläge morgen mal in die Tat umsetzen (sofern ich das hinbekomme). Eine Frage hätte ich aber noch, ist eher allgemein: Wenn ich 2 Timer laufen lasse mit verschiedenen Interrupts und so weiter, werden die dann nacheinander abgehandelt oder können die Interrupts parallel behandelt werden. Konkret: Das eine Interrupt-Signal brauche ich für die Steuerung von nem Dimmer, das andere für den DENON-Code. Geht das beides parallel oder wird da immer eins nach dem anderen angearbeitet?
Du hast nur eine CPU und demzufolge wird jeder Code nacheinander abgearbeitet, egal ob Interrupt oder Hauptprogramm. Deshalb die 3 goldenen Regeln: 1. Halte Interrupts so kurz wie möglich ! 2. Halte Interrupts so kurz wie möglich ! 3. Halte Interrupts so kurz wie möglich ! Aber Du hast ja die Capture-Funktion für Eingangssignale, bzw. die clear, toggle oder set on compare Funktion für Ausgänge. Damit kannst Du auf den Takt genau messen bzw. setzen, egal, wann der dazugehörige Interrupt ausgeführt wird. Peter
Hallo Threadstarter, Deine Beschreibung des Denon-Codes kommt der Definition von Sony nahe. Das zugehörige Protokoll heißt SIRCS (Sony-spezifisch). Für den Sony-Code habe ich mal einen Empfänger mit dem ATmega8 gebaut und geschrieben. Dieser Empfänger zeigt den Code auf einem Display an und zählt, wie oft der gleiche Code hintereinander gesendet wurde. Falls jemand am Code Interesse hat, suche ich ihn mal wieder raus (frühestens heute abend) und stelle ihn zur Verfügung. MfG, Khani
Ja hätte interesse. Kannst ja hier im Forum rein stellen. Gruß PatrickHH
Ja ich natürlich auch. Also den genauen Aufbau vom Denon-Code habe ich von dieser Seite hier: http://mikrocontroller.cco-ev.de/de/IR-Protokolle.htm
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.