Hallo,
ich möchte eine Infrarotübertragung mittels Input-Capture realisieren.
Der Sender sendet folgende IR-Signale:
1 | TCCR1A |= (1 << WGM12) | (1 << WGM11) | (1 << COM1A1);
|
2 | TCCR1B |= (1 << WGM13) | (1 << CS10);
|
3 | ICR1 = 14745600 / 38000 - 1;
|
4 | OCR1A = (1475600 / 38000 - 1) / 2;
|
5 |
|
6 | while(1)
|
7 | {
|
8 | TCCR1A |= (1 << COM1A1); // 500µs lang moduliertes IR-Licht senden
|
9 | _delay_us(500); // ...
|
10 | TCCR1A &=~(1 << COM1A1); // IR-Diode ausschalten
|
11 | _delay_ms(1000); // Eine Sekunde warten
|
12 | }
|
Der Empfänger hat folgenden Code (läuft mit 14.7456 MHz):
1 | unsigned int oldlength;
|
2 | int main()
|
3 | {
|
4 | oldlength = 0;
|
5 | TIMSK |= (1 << TICIE1); // Interrupt anschalten
|
6 | TCCR1B = (0 << ICES1) | (1 << CS12) | (1 << ICNC1); // Auf fallende Flanke triggern,
|
7 | // Störunterdrückung einschalten,
|
8 | // Vorteiler auf 256.
|
9 | }
|
10 |
|
11 | ISR(TIMER1_CAPT_vect)
|
12 | {
|
13 | TCCR1B ^= (1 << ICES1); // Flankenerkennungsrichtung umkehren
|
14 | unsigned int length = ICR1 - oldlength; // Da der Counter bei einem Interrupt nicht auf Null gesetzt wird,
|
15 | // immer die Differenz zum alten Counterwert als Länge speichern
|
16 | char buf[20];
|
17 | sprintf(buf, "%d\r\n", length); // Wert per UART an den Computer senden
|
18 | puts(buf);
|
19 |
|
20 | oldlength = length;
|
21 | }
|
Ich hätte jetzt erwartet, dass ich jetzt immer dasselbe Zahlenpaar
empfange. Ich empfange aber folgendes:
1 | 12655
|
2 | 8
|
3 | 30721
|
4 | 11
|
5 | -16743
|
6 | 19
|
7 | 1323
|
8 | 27
|
9 | 19389
|
10 | 35
|
11 | -28079
|
12 | 40
|
13 | -10010
|
14 | 50
|
15 | 8056
|
16 | 58
|
17 | 26127
|
18 | 61
|
19 | -21340
|
20 | 68
|
21 | -3273
|
22 | 76
|
23 | 14794
|
24 | 85
|
25 | -32675
|
26 | 93
|
27 | -14606
|
28 | 98
|
29 | 3461
|
30 | 107
|
31 | 21529
|
32 | 115
|
33 | -25940
|
34 | 124
|
35 | -7874
|
36 | 133
|
37 | 10192
|
38 | 142
|
39 | 28259
|
40 | 150
|
Hierbei sind mir mehrere Sachen unklar: Warum wächst die kleinere der
beiden Zahlen stetig an? Sollte sie nicht immer dieselbe sein?
Und die große beider Zahlen; Warum hat sie manchmal negative Werte, wenn
die Variable length doch als vorzeichenlos deklariert ist?
Ich freue mich auf eure Aufklärung.
Vielleicht mache ich auch prinzipiell etwas falsch beim Empfangen...