Hallo,
ich kämpfe nun schon eine ganze Weile mit einem Problem. Ich versuche
über den ICR1 am AT90CAN 8 PWM Signale auszuwerten. Vor dem Pin habe ich
einen Muxer Baustein (CD4051BE) geschallten, der abwechselnd bis zu 8
Kanäle vom RC Empfänger durchschaltet.
Die ISR (TIMER1_CAPT_vect) ruft eine Funktion auf, welche die
Zählerstände auswertet und den Muxer schaltet.
ISR (TIMER1_CAPT_vect)
{
icp_call();
}
Je nach Flanke wird der Wert des ICR1 ausgewertet und in ein Array
geschrieben. Zudem wird noch ein FLAG in der 8Bit Variable "result"
gesetzt. dies benötige ich zum auswerten eines kompletten
Empfangszyklus.
int icp_call()
{
cli();
if (EDGE == negative)
{
diff[mux_CH] = ICR1 - start[mux_CH];
EDGE = positive;
TCCR1B |= (1<<ICES1);
result |= (1<<mux_CH);
PORT_MUX &= 0xF8;
mux_CH++;
PORT_MUX |= mux_CH;
if (mux_CH == max_CH)
{
mux_CH = MUX_CH0;
PORT_MUX &= 0xF8;
}
}
else if( EDGE == positive)
{
start[mux_CH] = ICR1;
EDGE = negative;
TCCR1B &= ~(1<<ICES1);
}
sei();
return 0;
}
Wenn man sich nach einem Durchlauf den Inhalt von diff[i] ansieht, dann
stellt man fest, dass nur zwei Kanäle ausgewertet werden. für i = 0 und
i = 2 erhält man exakt die selben Werte. Genau so für i = 1 und i = 3.
Es scheint als ob hier irgendein Bit Dreher enthalten ist. Leider sehe
ich diesen nicht (Betriebsblind).
Kann von euch jemand meinen Fehler sehen? (Kompletter Code im Anhang)
Danke für eure Hilfe.
Gruß
Fabian