Forum: Mikrocontroller und Digitale Elektronik IR2PC IR Decoder synchronisieren ARM


von Thomas M. (Firma: keine) (tommy1169)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe schon gesucht aber nichts passendes gefunden, alle ähnlichen 
Beiträge nur für ATmega leider.

Ich möchte gern die FB Signale einer JVC Ferbedienung (Hifi) mit einem 
µC empfangen, decodieren und die Werte per RS232 einen PC übergeben.
Es steht also vorher fest welche Frequenz und welcher Code ausgewertet 
werden soll. Zudem würde es auch reichen, das Betätigen zweier 
unterschiedlichen Tasten anzuzeigen bzw. auszugeben.

Die Idee dahinter ist:

-Per TSOP empfange und demoduliere ich das IR Signal.
-Mit einem KEIL MCB2300 mit LPC2378 Prozessor der auf 12Mhz läuft, soll 
das empfangene Signal abgetastet und als Bitmuster in einem Array 
gespeichert werden.
-Dieses Array wird dann alle 250ms ausgelesen, die entscheidenden Bits 
ausgewertet (8 Kommandobits) und diesen Zuständen jeweils eine Ausgabe 
zugewiesen die dann über Com0 oder Com1 des Keil Boards an den PC 
übergeben werden.
-Mit einem Monitorprogramm(Java) werden dann die Nachrichten vom Keil 
Board ausgelesen und dargestellt.

Mein Ansatz
======================================================================
Folgende Funktionsblöcke denke ich, sind hierfür nötig:

-ein Timer der zyklisch einen Eingangspin abtastet und so das 
demodulierte IR-Signal in den LPC2378 "holt".
-Ein Synchronisationsblock der erkennt wann Keine Taste gedrückt wird 
bzw. wann eine Taste gedrückt wird und die Befüllung eines Arrays zum 
richtigen Zeitpunkt startet.
-Ein Array das die empfangenen Daten zwischenspeichert
-Eine Funktion die die Bits(0-7) vom Kommandobereich ausliest und 
auswertet
-Eine Funktion die die ausgewerteten Daten über COM(n)an den PC sendet

Was bisher funktioniert:
-Empfangen der IR Signale am Eingangspin (Darstellen des Signalverlaufes 
am Audioeingang mit Cool Edit)
-Setzen des Timers
-Abtasten der Signalbursts mit 700µs ~1,429Khz Takt (warum 700µs, eine 
logische 1 ist 2,1ms und eine logische 0 1,05ms lang - bei 3 Abtastungen 
pro gesendetem Bit sollte eine eindeutige Abtastung möglich sein)
-Senden der Daten per RS232 und Darstellen der Daten auf dem PC per 
Monitorprogramm

Probleme und Grund dieses Threads:
======================================================================
1. Um die Daten richtig interpretieren und auswerten zu können, muss die 
Abtastung mit dem FB-Signal synchronisiert werden, da sonst mit 
Sicherheit das Array zwar beschrieben wird, allerdings nur mit 
Datenmüll. Dieses Synchronisieren funktioniert leider noch nicht und ich 
habe auch noch keinen zuverlässigen Ansatz dafür.

Meine Idee hierzu war:
Am Anfang eines Signalbursts der FB wird ein Startbit von 8,4ms Länge 
gesendet, gefolgt von einer Pause von 4,2ms. Danach beginnt der 
Datenteil ,mit 8Bit Gerätecode und weiteren 8Bit Kommandocode gefolgt 
von einem Stopbit. Danach gibt es eine Pause von (x)Millisekunden, die 
je nach gesendeten Daten etwas varriert, bevor der nächte Burst kommt, 
der allerdings ohne Startbit und folgender Pause gesendet wird.

->Wenn also der Eingang zwischen 4ms und 8ms logisch 1 ist, handelt es 
sich mit Sicherheit um das Startbit
->Ist also das Startbit erkannt, kann die Datenabtastung und Befüllung 
des Arrays beginnen. Dazu zählt ein zweiter Zähler solange bis der 
Anfang des sich wiederholenden Datenblocks beginnt, genau da wird der 
Zähler wieder auf Null gesetzt und das Array wird erneut beschrieben
->Der Kommandocode ist bekannt und die entscheidenden Bits werden mit 
dem Arrayinhalt verglichen

Aber hier zeigt sich das Problem:
Es scheint keine Synchronität zu geben. Nach Beschalten einer LED als 
Bestätigung einer Taste blinkt diese bei jeder Taste auf, obwohl die 
Bedingungen für die entscheidenden Bits gesetzt wurden.
Es sieht aus als würden die Daten so durchlaufen und irgenwann mal 
zufällig die Bedingung für ein bestimmtes Kommando stimmen.

Wie würde ein zuverlässiger Ansatz für eine Synchronisierung aussehen 
und mit welcher Abtastrate sollte bei einer Flankenbreite von 0,6ms 
typischerweise abgetastet werden? Ich hatte 0,7ms also 0,35ms Puls/Pause 
gewählt.

Ist es überhaupt korrekt mit einer if Abfrage auf die passenden 
Bedingungen zu prüfen?


2. Beim Timing kommt irgendwann das Problem, dass je mehr Anweisungen 
und Funktionen der Prozessor ausführen muss, das Timing nicht mehr 
stimmt und somit gar nichts mehr. Eigentlich sollte doch bei 12Mhz genug 
Zeit sein die Bedingungen abzufragen, das Array zu beschreiben und 
auszulesen sowie die Daten zu versenden. Vermutlich geht das Timing bei 
Funktionen die auf Eingaben warten kaputt z.b printf oder lcd_print, 
denn da funktioniert der Timer nicht mehr , verändert alle Zeiten 
irgendwie.

======================================================================== 
==

Vielleicht hat ja jemand die Zeit sich das alles mal durchzulesen.
Möglicherweise machts ja gleich "achsoooo" und ich mache nur 
grundlegende Fehler. Der Code ist noch ziemlich durcheinander, aber ich 
hänge ihn mit an damit Ihr Euch das mal ansehen könnt.

Für ein paar Anregungen wäre ich dankbar...

Tom

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.