Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
private:rasperry_pi_ir-onoff [2013/01/25 19:20] Patrick Wacker [XBox 1 DVD-Fernbedienung] |
private:rasperry_pi_ir-onoff [2013/02/04 19:38] (aktuell) Patrick Wacker [Technisat DigiPal 2 - DBV-T Fernbedienung] Aufgetretene Probleme dokumentiert |
||
|---|---|---|---|
| Zeile 29: | Zeile 29: | ||
| * Übertragungsfehler im IR-Signal sollten erkannt werden. | * Übertragungsfehler im IR-Signal sollten erkannt werden. | ||
| * Automatische Erkennung von RCA und RC5 | * Automatische Erkennung von RCA und RC5 | ||
| + | * Die IR-Codes (Tasten) sollten ohne den PIC neu zu Programmieren änderbar sein. | ||
| + | * RCA und RC5 Codes zum Ein-/Ausschalten im EEProm sichern | ||
| + | * Updates der Codes wenn z.B. der Taster > 8s betätigt wurde. | ||
| + | * - Taster >8s --> IR-Code aufnehmen. | ||
| + | * - 1. "STOP"-Taste | ||
| + | * - 2. "SELECT"-Taste | ||
| + | * - 3. "POWER"-Taste | ||
| + | * - [4. "ANZAHL der STOP-Codes" (STOP so oft betätigen wie es zum einschalten genutzt werden soll) (Default: 2 (z.B. bei "Skip"))] ((eventuelle Erweiterung)) | ||
| + | * - [5. "ANZAHL der STOP-Codes" (STOP so oft betätigen wie es zum ausschalten genutzt werden soll) (Default: 4 (z.B. bei "Skip"))] ((eventuelle Erweiterung)) | ||
| + | * - [6. "ANZAHL der POWER-Codes" (POWER so oft betätigen wie es zum Ein-/Ausschalten genutzt werden soll) (Default: 1 (z.B. bei "Skip"))] ((eventuelle Erweiterung)) | ||
| + | * Entscheidung ob RCA oder RC5 gespeichert wird innerhalb des PICs treffen | ||
| + | * Wenn ein Code nicht gespeichert werden soll (z.B. keine "POWER"-Taste vorhanden) sollte dieser Abschnitt durch ein kurzes betätigen des Tasters übersprungen werden können. | ||
| + | * Anzeige über LED ob CODE richtig entgegen genommen wurde. | ||
| + | * und durch Blinken anzeigen welcher Code gerade eingegeben werden soll. (1-3 mal Blinken, dann ca. 3 Sekunden Pause) | ||
| + | * Automatischer Abbruch der Aufzeichnung wenn länger als 2 Minuten keine Befehle empfangen wurden. | ||
| + | * Taster > 20 Sekunden betätigt --> RESET der IR-Codes auf "Standard" Werte! | ||
| * PIC-Code und Schaltplan/Layout in Subversion verwalten. | * PIC-Code und Schaltplan/Layout in Subversion verwalten. | ||
| + | |||
| + | * Zum Einschalten sollte der Taster länger als 500ms Sekunden betätigt werden und beim Ausschalter sicherheitshalber länger als 4 Sekunden! | ||
| + | * Über die Fernbedienung sollten "Kombinationen" zum Ein/Ausschalten verwendet werden, z.B.: | ||
| + | * 2x STOP, dann SELECT --> Einschalten | ||
| + | * 4x STOP, dann SELECT --> Ausschalten | ||
| + | * Aber auch das Ein-/Ausschalten über eine "POWER"-Taste auf der Fernbedienung sollte möglich sein. | ||
| Zeile 38: | Zeile 60: | ||
| ==== XBox 1 DVD-Fernbedienung ==== | ==== XBox 1 DVD-Fernbedienung ==== | ||
| + | |||
| + | Codierung der "Stop-Taste" auf der XBox DVD-Fernbedienung (RCA - Format) | ||
| + | |||
| + | |||
| + | {{svg>private:rasperry_pi_ir-onoff:timing_XBox_Stop_Button}} | ||
| + | |||
| + | \\ | ||
| + | |||
| + | Die nachfolgenden Zeiten wurden mit dem Oszilloskop ermittelt und stimmen fast 100%ig mit den Zeiten auf [[http://www.sbprojects.com/knowledge/ir/rca.php|SB-Projects]] überein. | ||
| + | |||
| + | | **Timings** ^ t_low ^ t_high ^ t_puls ^ __t_soll__ ^ | ||
| + | ^ Start | 1.6ms | 6.5ms | 8.1ms | 8.0ms | | ||
| + | ^ "0" | 0.6ms | 0.85ms | 1.45ms | 1.5ms | | ||
| + | ^ "1" | 0.65ms | 1.85ms | 2.5ms | 2.5ms | | ||
| + | ^ repeat ((Zeit zwischen letzter steigender Flanke und erster fallender)) | - - | 8ms | - - | ?? | | ||
| + | |||
| + | === Mögliche "Dekodierung" === | ||
| + | |||
| + | * Timer auf 1.6ms | ||
| + | * Interrupt-On-Change (also bei fallender und steigender Flanke) | ||
| + | * Start-Erkennung: | ||
| + | * Int-Change: Timer-An | ||
| + | * Int-Timer: IR-Data muss noch low sein | ||
| + | * --> Start erkannt wenn zwischenzeitlich kein Int-On-Change eingetreten ist! | ||
| + | * Jetzt müssen 6.5ms/1.6ms (**4**) Timer-Interrupts auftreten. | ||
| + | * --> wenn mehr dann Fehler! Warten bis mehr als 8ms/1.6ms (**5**) Timer aufgetreten sind Timer-Reset bei jedem On-Change-Interrupt! | ||
| + | * BitCounter auf 0 setzen | ||
| + | * Bit-Erkennung: | ||
| + | * Timer Reset wenn IR-Data = "0" bei On-Change-Interrupt | ||
| + | * Bei Timer-Interrupt: | ||
| + | * eine "1" an die empfangenen Daten anhängen | ||
| + | * und BitCounter incrementieren | ||
| + | * Bei On-Change-Interrupt: | ||
| + | * Wenn Bit für "1" nicht gesetzt ist: | ||
| + | * eine "0" an die empfangenen Daten anhängen | ||
| + | * und BitCounter incrementieren | ||
| + | * Timer-Reset | ||
| + | * Bit setzen das "1" Empfangen wurde | ||
| + | * ansonsten: | ||
| + | * Timer-Reset | ||
| + | * Bit löschen das "1" Empfangen wurde | ||
| + | |||
| + | === Andere Möglichkeit === | ||
| + | |||
| + | * Timer auf 8.2ms | ||
| + | * Bei fallenden Flanke (On-Change-Interrupt IR-Data=0) den Timer-Wert vergleichen | ||
| + | * Wenn <= 1.5ms --> 0 Empfangen | ||
| + | * Wenn > 1.5ms und <= 2.5ms --> 1 Empfangen | ||
| + | * Wenn > 2.5ms und <= 8.0ms --> Start-Bit | ||
| + | * Wenn > 8.0ms (Timer-Interrupt) --> Pause zwischen den Telegrammen | ||
| + | |||
| + | === Weitere Möglichkeit === | ||
| + | |||
| + | Muss nochmal überdacht werden, war ein kurzfristiger Einfall der nicht zu Ende gedacht wurde! | ||
| + | Wenn keine Logik hinter diesem erkannt werden kann, einfach diesen Punkt entfernen und nicht weiter drüber nachdenken! | ||
| + | |||
| + | * Timer auf 1.6ms | ||
| + | * Interrupt-On-Change (also bei fallender und steigender Flanke) | ||
| + | * Start-Erkennung: | ||
| + | * Int-Change: Timer-An | ||
| + | * Int-Timer: IR-Data muss noch low sein | ||
| + | * --> Start erkannt wenn zwischenzeitlich kein Int-On-Change eingetreten ist! | ||
| + | * Jetzt müssen 6.5ms/1.6ms (**4**) Timer-Interrupts auftreten. | ||
| + | * --> wenn mehr dann Fehler! Warten bis mehr als 8ms/1.6ms (**5**) Timer aufgetreten sind Timer-Reset bei jedem On-Change-Interrupt! | ||
| + | * BitCounter auf 0 setzen | ||
| + | * Bit-Erkennung: | ||
| + | * Timer Reset wenn IR-Data = "0" bei On-Change-Interrupt | ||
| + | * Bei Timer-Interrupt: | ||
| + | * eine "1" an die empfangenen Daten anhängen | ||
| + | * BitCounter incrementieren | ||
| + | * Bit setzen das "1" Empfangen wurde | ||
| + | * Bei On-Change-Interrupt: | ||
| + | * Wenn IR-Data = "0" | ||
| + | * Timer-Reset | ||
| + | * eine "0" an die empfangenen Daten anhängen | ||
| + | * BitCounter incrementieren | ||
| + | * Wenn IR-Data = "1" | ||
| + | * sollte eigentlich nicht vorkommen | ||
| + | * Wenn Bit für "1" nicht gesetzt ist: | ||
| + | * eine "0" an die empfangenen Daten anhängen | ||
| + | * und BitCounter incrementieren | ||
| + | * Timer-Reset | ||
| + | * | ||
| + | * ansonsten: | ||
| + | * Timer-Reset | ||
| + | * Bit löschen das "1" Empfangen wurde | ||
| + | |||
| + | Während der gesamten Erkennung der Daten Bits darf der Timer-Interrupt nicht 2 mal nacheinander auftreten! | ||
| + | Dies bedeutet ein Fehler und es muss auf insgesamt 5 (inklusive der 2 bereits empfangenen) Timer-Interrupts gewartet werden (Neue IR-Daten). | ||
| + | | ||
| + | Wenn mehr als 10 Timer-Interrupts aufgetreten sind, werden keine Daten mehr Empfangen und der Timer kann deaktiviert werden. | ||
| + | Aktivierung bei nächsten On-Change-Interrupt. Außerdem kann in diesem Fall in den "Sleep"-Mode übergegangen werden, ein Erwachen | ||
| + | findet dann bei dem nächsten On-Change-Interrupt statt. | ||
| + | |||
| - | {{svg>timing_XBox_Stop_Button.svg}} | ||
| ==== Technisat DigiPal 2 - DBV-T Fernbedienung ==== | ==== Technisat DigiPal 2 - DBV-T Fernbedienung ==== | ||
| + | |||
| + | Codierung der einer Taste auf der DigiPal 2 (ohne 'e') Fernbedienung (RC5 - Format) | ||
| + | |||
| + | {{svg>private:rasperry_pi_ir-onoff:timing_digipal_remote}} | ||
| + | |||
| + | Dieses Timing ist für das RC5 Format, im Nachhinein wurde festgestellt das einige Tasten ein "extended" RC5 Format übertragen. | ||
| + | Bei diesem ist die START Codierung anders ('10' statt '11 -> somit low-Pegel für 1,8ms). Dadurch überschneidet sich die Zeitmessung mit dem RCA Format. | ||
| + | |||
| + | Außerdem gibt es Probleme beim "fehlerfreien" Empfang des RCA Formats: | ||
| + | - Das Start-Bit ist, bei direkter Richtung der Fernbedienung auf den IR-Empänger, nicht 4ms lang sondern schwankt zwischen 0.8ms und 4ms. Teilweise werden auch mehrere Pulse erkannt! | ||
| + | - Die Logitech Harmony wird besser erkannt als die Original MS XBox Fernbedienung. | ||
| + | - | ||
| + | |||
| + | Die nachfolgenden Zeiten wurden mit dem Oszilloskop ermittelt. | ||
| + | |||
| + | | **Timings** ^ t_low ^ t_high ^ t_puls ^ __t_soll__ ^ | ||
| + | ^ Start | 0.9ms | 0.9ms | 1.8ms | x.y ms | | ||
| + | ^ "0" | 0.9ms | 0.9ms | 1.8ms | x.y ms | | ||
| + | ^ "1" | 0.9ms | 0.9ms | 1.8ms | x.y ms | | ||
| + | |||
| + | |||
| Zeile 70: | Zeile 206: | ||
| ===== Umsetzung ===== | ===== Umsetzung ===== | ||
| + | |||
| + | ==== Verwendete Module ==== | ||
| + | |||
| + | * TIMER0: Increment alle 32µs (Bei 4MHz --> Prescaler 1:32), Overflow bei 8,192ms | ||
| + | * Zur Zeitmessung des IR-Data-Signals | ||
| + | * TIMER1: Increment alle 8µs (Bei 4MHz --> Prescaler 1:8), Overflow bei 524,288ms | ||
| + | * Zur Erkennung von Button-Presses und Zeitmessungen für Sleep/CMD-Ende | ||
| + | * | ||
| ==== Schaltplan ==== | ==== Schaltplan ==== | ||