Forum: Mikrocontroller und Digitale Elektronik Versuche Code über IR Diode auszulesen


von Steffen Abel (Gast)


Lesenswert?

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

von Marc (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

@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

von Marc (Gast)


Lesenswert?

@markus
Hast Recht, Denkfehler von mir.

Marc

von Steffen Abel (Gast)


Lesenswert?

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

von Jens123 (Gast)


Lesenswert?

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

von Steffen Abel (Gast)


Lesenswert?

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?

von Jens123 (Gast)


Lesenswert?

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

von Steffen Abel (Gast)


Lesenswert?

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

von Joachim Schäfer (Gast)


Lesenswert?

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?

von Steffen Abel (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Khani (Gast)


Lesenswert?

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

von PatrickHH (Gast)


Lesenswert?

Ja hätte interesse. Kannst ja hier im Forum rein stellen.

Gruß PatrickHH

von Steffen Abel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.