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