Forum: Mikrocontroller und Digitale Elektronik IR-Empfang mit ICP


von Anja (Gast)


Lesenswert?

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...

von Anja (Gast)


Lesenswert?

push
auf die erste Seite. Mein Problem ist leider immernoch nicht gelöst.

von spess53 (Gast)


Lesenswert?

Hi

>Und die große beider Zahlen; Warum hat sie manchmal negative Werte, wenn
>die Variable length doch als vorzeichenlos deklariert ist?

Kommt darauf an, wie dein PC-Programm die Werte interpretiert.

>Hierbei sind mir mehrere Sachen unklar: Warum wächst die kleinere der
>beiden Zahlen stetig an? Sollte sie nicht immer dieselbe sein?

> unsigned int length = ICR1 - oldlength;
> ....
> oldlength = length;

Du musst den letzten ICP-Wert speichern und vom aktuellen abziehen 
(Übertrag beachten).

Ich versuchs mal trotz fehlender C-Kenntnisse:

 length= ICR1-ICR_old
 ....
 ICR_old = ICR1

MfG Spess

von Matthias L. (Gast)


Lesenswert?

Weiterhin hat die main keine Endlosschleife. Und evtl ist das sprintf im 
Interrupt ungünstig, da es möglicherweise zu lange braucht...

von Anja (Gast)


Lesenswert?

Ok, das war ein sehr dummer Denkfehler von mir.

Jetzt habe ich alle ICP-Werte, die nach einem Overflow eingelesen werden 
ignoriert (also alle, die nach der 1-sekündigen Pause eintreten) und 
erhalte folgendes:
1
141
2
76
3
57
4
131
5
130
6
136
7
137
8
75
9
131
10
56
11
128
12
131
13
58
14
137
15
128
16
150
17
150
18
149
19
149
20
148
21
148
22
97

Allerdings hätte ich den Wert 115 erwartet. Zumindest allerdings immer 
einen nahezu konstanten Wert.

Der Impuls ist nämlich 500µs lang und der Vorteiler (mittlerweile) auf 
64. Damit ergibt sich:

n = 14745600  64  (1 / 0.0005) = 115.

Woran liegt das?

von Ulrich (Gast)


Lesenswert?

Die Überragung der Daten per puts dauert vermutlich länger als 500µs. 
Auch die Umwandlung mit sprintf kann zu langsam sein.


Die Empfänger für Moduliertes Licht haben auch ein gewisse Verzögerung 
und können so einen Puls etwas verlängern oder ggf. auch verkürzen. Die 
angegebenen Mindestlängen sind ja auch oft im Bereich 6 Zyklen oder etwa 
150 µs.

von Anja (Gast)


Lesenswert?

>Die Empfänger für Moduliertes Licht haben auch ein gewisse Verzögerung
>und können so einen Puls etwas verlängern oder ggf. auch verkürzen. Die
>angegebenen Mindestlängen sind ja auch oft im Bereich 6 Zyklen oder etwa
>150 µs.

Aber doch nicht derart viel. Für eine Manchester-Datenübertragung muss 
ich doch einen Doppelpuls von einem Einzelpuls unterscheiden können. Und 
das ist bei den oben gegebenen Messwerten nicht der Fall. :-(

von geb (Gast)


Lesenswert?

sprintf und puts haben ganz sicher nichts in der Interruptroutine 
verloren,die dauern viel zu lange. Setz ein Flag und mach das in der 
Hauptschleife.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.