Forum: Mikrocontroller und Digitale Elektronik IR empfang - problem bei aufzeichnung


von A. F. (elagil)


Angehängte Dateien:

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
}

von A. F. (elagil)


Lesenswert?

Sollte es jemanden interessieren, das problem lag hier:
1
reccode |= (1<<pos);

die 1 ist ein 16bit integer, wird aber um bis zu 31 stellen geschoben, 
es muss also heißen:
1
reccode |= ((uint_32)1<<pos);

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.