www.mikrocontroller.net

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


Autor: Steffen Abel (Gast)
Datum:

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

Autor: Marc (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@markus
Hast Recht, Denkfehler von mir.

Marc

Autor: Steffen Abel (Gast)
Datum:

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

Autor: Jens123 (Gast)
Datum:

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

Autor: Steffen Abel (Gast)
Datum:

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

Autor: Jens123 (Gast)
Datum:

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

Autor: Steffen Abel (Gast)
Datum:

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

Autor: Joachim Schäfer (Gast)
Datum:

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

Autor: Steffen Abel (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Khani (Gast)
Datum:

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

Autor: PatrickHH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja hätte interesse. Kannst ja hier im Forum rein stellen.

Gruß PatrickHH

Autor: Steffen Abel (Gast)
Datum:

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

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.