mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IR-Empfang mit ICP


Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte eine Infrarotübertragung mittels Input-Capture realisieren.

Der Sender sendet folgende IR-Signale:
TCCR1A |= (1 << WGM12) | (1 << WGM11) | (1 << COM1A1);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = 14745600 / 38000 - 1;
OCR1A = (1475600 / 38000 - 1) / 2;

while(1)
{
  TCCR1A |= (1 << COM1A1); // 500µs lang moduliertes IR-Licht senden
  _delay_us(500);          // ...
  TCCR1A &=~(1 << COM1A1); // IR-Diode ausschalten
  _delay_ms(1000);         // Eine Sekunde warten
}

Der Empfänger hat folgenden Code (läuft mit 14.7456 MHz):
unsigned int oldlength;
int main()
{
  oldlength = 0;
  TIMSK  |= (1 << TICIE1);                             // Interrupt anschalten
  TCCR1B  = (0 << ICES1) | (1 << CS12) | (1 << ICNC1); // Auf fallende Flanke triggern,
                                                       // Störunterdrückung einschalten,
                                                       // Vorteiler auf 256.
}

ISR(TIMER1_CAPT_vect)
{
  TCCR1B ^= (1 << ICES1);                 // Flankenerkennungsrichtung umkehren
  unsigned int length = ICR1 - oldlength; // Da der Counter bei einem Interrupt nicht auf Null gesetzt wird,
                                          // immer die Differenz zum alten Counterwert als Länge speichern
  char buf[20];
  sprintf(buf, "%d\r\n", length);         // Wert per UART an den Computer senden
  puts(buf);

  oldlength = length;
}

Ich hätte jetzt erwartet, dass ich jetzt immer dasselbe Zahlenpaar 
empfange.  Ich empfange aber folgendes:
12655
8
30721
11
-16743
19
1323
27
19389
35
-28079
40
-10010
50
8056
58
26127
61
-21340
68
-3273
76
14794
85
-32675
93
-14606
98
3461
107
21529
115
-25940
124
-7874
133
10192
142
28259
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...

Autor: Anja (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
141
76
57
131
130
136
137
75
131
56
128
131
58
137
128
150
150
149
149
148
148
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?

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-(

Autor: geb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.