IR empfang - problem bei aufzeichnung

OP #3026892
Lesenswert?
• ▲
▼
Hallo,

ich habe mir ein Programm geschrieben, um IR Signale abzutasten.
Ich möchte IRMP nicht verwenden, weil ich selbst lernen will, wie man 
sowas abtasten kann.
Mit ca. 15kHz wird dabei ein demodulierender IR empfänger abgetastet und 
geprüft, ob die Flanke fallend oder steigend war. Ich habe nun ein sehr 
spezielles Problem, das mit dem Signalempfang an sich und der 
Dekodierung nichts zu tun hat.
Bei fallender Signalflanke wird Timer1 gestartet, bei steigender wieder 
ausgelesen. Je nach länge des Intervalls wird jetzt geprüft, ob es ein 
startbit war (4500us), eine 0 (1600us) oder eine 1 (600us).
Ich habe einen logikanalysator angeschlossen und verschiedene ausgänge 
des verwendeten attiny45 getogglet, wenn eine 0, eine 1 oder das 
startbit gelesen wurde.
Angehängt eine Grafik, es schaltet genau so, wie es soll! Immer bei 
fallender Flanke (also steigendem Eingangspegel, weil der IR-Empfänger 
das Signal invertiert), außerdem auf channel3 nach dem startbit und nach 
32 signalen.

Ich habe mal manuell die balken gezählt, es kommt auch der gewünschte 
code heraus ;)

nun zu meinem problem: es werden nur die ersten (mindestens) zehn bis 
(höchstens) 17 bits aufgenommen, danach nur noch nullen.
1
11111011000001000000011100000111 - Signal
2
00000000000000000000011100000111 - eingelesenes Signal

woran kann das liegen? die variablen sind ausreichend groß 
dimensioniert. hier der code: http://snipt.org/zMjd6

und hier der teil, der probleme macht (die ISR), weil er nur bis zur 10. 
stelle das signal aufnimmt, vielleicht hat ja jemand lust, das zu lesen 
;)
1
ISR (TIMER0_COMPA_vect) {
2
  if (prev_status==up && (PINB & (1<<PINB4))) { // ir sig falling
3
    prev_status=down;
4
    TCNT1=0;
5
  }  
6
  if (prev_status==down && !(PINB & (1<<PINB4))) {  // ir sig rising
7
    prev_status=up;
8
    if (micros > 4000 && micros < 6000) {   // startbit
9
      start = true;
10
      pos = 0;
11
    }
12
    else if (start==true) {
13
      if (micros>1000 && micros<2000){   // eins, eins schreiben
14
        reccode |= (1<<pos);
15
        pos++;
16
      }
17
      else if (micros>500 && micros<1000) {  // null: nichts schreiben
18
        pos++;
19
      }
20
    }
21
    if (pos==32) {
22
      if(reccode==kombination){
23
        wechsel();   // schalten!
24
      }
25
      reccode=0;
26
      start=false;
27
      pos=0;
28
    }
29
  }
30
}
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.