Hallo zusammen.
Ich stehe vor folgendem Problem.
Ich habe einen Attiny2313. Dieser hat ja 4 PWM Kanäle die auch alle
gleichzeitig im 8-Bit Modus benutzt werden, da separat mehrere
LED-Leuchtmittel gedimmt werden sollen.
Die Helligkeit dieser Kanäle soll über eine IR Fernbedienung eingestellt
werden können. Soweit so gut.
Nun habe ich jedoch das Problem, dass ich für die Decodierung der
IR-Signale die High- und Low-Zeiten messen muss. Nun habe ich gedacht,
dass ich zusätzlich noch den Timer Overflow Interrupt verwenden könnte,
jedoch kann ich nicht feststellen ob der Counter gerade rückwärts oder
vorwärts läuft und ich damit nicht die richtige Zeitdifferenz errechnen
kann.
Der PWM läuft als Phase Correct PWM, damit ich auch ein echtes
"Nullsignal" erzeugen kann. Sprich der Counter geht von BOTTOM nach TOP
und dann wieder nach BOTTOM.
Der IR-Empfänger (TSOP) hängt an INT1 und löst sowohl bei steigender als
auch bei fallender Flanke einen Interrupt aus. In der ISR will ich nun
die Zeiten der IR-Signale messen.
Wie kann ich jetzt bestimmen wie lange die Low- bzw. Highphase eines
IR-Signals genauer hat.
Mit einem Konstrukt in der Main-Funktion wie
1 | while(1){
|
2 |
|
3 | _delay_us(10);
|
4 | timer++;
|
5 | }
|
und einer Auswertung in der INT1 ISR:
1 | ISR(INT1_vect){
|
2 | if(first == 0){
|
3 | first = 1;
|
4 | timer= 0;
|
5 | }
|
6 | else{
|
7 | if(timer > 40 && timer < 60){
|
8 | code <<= 1;
|
9 | }
|
10 | else if(timer > 100 && timer < 150){
|
11 | code |= 1;
|
12 | code <<= 1;
|
13 | }
|
14 | count++;
|
15 | first = 0;
|
16 | }
|
17 | if(count == 25){
|
18 | done = 1;
|
19 | count = 0;
|
20 | }
|
21 | }
|
scheint es sehr ungenau zu sein, sodass ich die Zeitfenster recht
großzügig auslegen muss, damit es auch nur ansatzweise funktioniert.
Hat jemand eine Idee wie ich das am geschicktesten realisieren kann?