Hallo,
ich bin zur Zeit am Nachbilden des Sony SIRCS-Codes. Ich habe die IR-LED
mit Timer0 per Hardware gepulst (40kHz). Das Signal erzeuge ich nun
einfach durch ein- und ausschalten des Timers. Das klappt manuell auch
wunderbar. Mit manuell meine ich folgendes:
1 | IR_LED_ON(); _delay_ms(2.4); IR_LED_OFF(); _delay_ms(0.6);
|
2 |
|
3 | IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
|
4 | IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
|
5 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
6 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
7 | IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
|
8 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
9 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
10 |
|
11 | IR_LED_ON(); _delay_ms(1.2); IR_LED_OFF(); _delay_ms(0.6);
|
12 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
13 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
14 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
15 | IR_LED_ON(); _delay_ms(0.6); IR_LED_OFF(); _delay_ms(0.6);
|
Der Fernseher reagierte wie erwünscht mit dem verringern der Lautstärke.
Der obige Abschnitt wurde mit Timer1 alle 45ms (=22,222Hz) wiederholt.
Nun gibt es zwei Punkte, die mich zum erstellen einer Funktion bewegt
haben:
1. Ich will nur einen Timer (0) verwenden
2. Ich möchte einfach Adresse und Kommando an die Funktion übergeben
können, alles andere macht die Funktion
Hier mal die Funktion:
1 | void SIRCS(uint8_t command, uint8_t address){
|
2 | float x = 0.0;
|
3 |
|
4 | for(uint8_t i=0; i<5; i++){
|
5 | //Start
|
6 | IR_LED_ON();
|
7 | _delay_ms(2.4);
|
8 | IR_LED_OFF();
|
9 | _delay_ms(0.6);
|
10 |
|
11 | //Command
|
12 | for(uint8_t j=0; j<7; j++){
|
13 | IR_LED_ON();
|
14 | _delay_ms(0.6);
|
15 |
|
16 | if(command & j){
|
17 | _delay_ms(0.6);
|
18 | x += 0.6;
|
19 | }
|
20 |
|
21 | IR_LED_OFF();
|
22 | _delay_ms(0.6);
|
23 | }
|
24 |
|
25 | //Address
|
26 | for(uint8_t j=0; j<5; j++){
|
27 | IR_LED_ON();
|
28 | _delay_ms(0.6);
|
29 |
|
30 | if(address & j){
|
31 | _delay_ms(0.6);
|
32 | x += 0.6;
|
33 | }
|
34 |
|
35 | IR_LED_OFF();
|
36 | _delay_ms(0.6);
|
37 | }
|
38 |
|
39 | _delay_ms(27.6-x);
|
40 | }
|
41 | }
|
Hier eine kleine Funktionsbeschreibng:
Da der Code je nach Anzahl der 0en und 1en unterschiedlich lang ist,
wird die 45ms Wiederholzeit mit der Variable x dynamisch errechnet.
Die erste for-Schleife wiederholt den Code 5mal. In ihr wird erst der
Startblock gesendet, dann das Kommando und die Adresse. Unsicher bin ich
mir bei den Abschnitten "if(command & j)" bzw. "if(address & j)", kann
man so überprüfen, ob das j'te Bit gesetzt ist? Naja der Rest sollte
klar sein. Mein Problem ist jetzt, dass das Ganze nicht funktioniert.
Kann es sein, dass durch die ifs und fors das Timing durcheinander
gerät? Wo könnte noch der Fehler liegen?
Hier die Infos über das Protokoll:
http://www.sbprojects.com/knowledge/ir/sirc.htm
Ich hoffe ihr könnt mir weiterhelfen. mfG, Sven