Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
private:rasperry_pi_ir-onoff [2013/01/25 19:25]
Patrick Wacker [XBox 1 DVD-Fernbedienung] Beschreibung hinzugefügt
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 43: Zeile 65:
  
 {{svg>​private:​rasperry_pi_ir-onoff:​timing_XBox_Stop_Button}} {{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.
 +
 +
 +
 ==== 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 72: 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 ====
Projektwerkzeuge