IR empfang - problem bei aufzeichnung

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren