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
Letzte Überarbeitung Beide Seiten der Revision
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/01/28 19:42]
Patrick Wacker [Umsetzung] angefangen
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}}
 +
 +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 198:
  
 ===== 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