Hallo zusammen,
Ich habe eine Frage bzgl. des ICP beim Tiny24
Mein Timer läuft mit 1MHz takt und am InputCapturePin ist das signal
eines RC-Empfängers angeschlossen. (20ms Periodendauer, 1-2ms
high-pegel, 18-19ms low-pegel)
Nun das will ich in meinen Tiny 24 einlesen. Dazu hab ich den Timer wie
folgt kunfiguriert:
1 | // clk/8 (1MHz), Normal-Mode, no PWM
|
2 | TCCR1A = (1<<COM1A1) | (1<<COM1B1);
|
3 | TCCR1B = (1<<ICNC1) | (1<<ICES1) | (1<<CS11);
|
4 | TIMSK1 = (1<<ICIE1) | (1<<OCIE1B) | (1<<OCIE1A) | (1<<TOIE1);
|
5 |
|
6 | TIMSK1 = 0xFF;
|
7 | sei();
|
d.h. Noise-Canceler ist Aktiv, und es wird auf die steigende Flanke
getriggert.
umd damit aber die dauer des High-pegels bestimmen zu können hab ich
folgende ISR geschrieben
1 | ISR ( TIM1_CAPT_vect ) {
|
2 | static uint16_t pos_edge = 0;
|
3 | uint16_t time = 0;
|
4 |
|
5 |
|
6 | if ( TCCR1B & (1<<ICES1) ) { // Wenn auf die steigende Flanke getriggert wurde
|
7 | TCCR1B &= ~(1<<ICES1); // Auf fallende Flanke Triggern
|
8 | pos_edge = ICR1; // Merken wann die Flanke war
|
9 | led_an(); // nur zum debuggen
|
10 | }
|
11 | else {
|
12 | TCCR1B |= (1<<ICES1); // Wieder auf steigende Flanke Triggern
|
13 | time = ICR1 - pos_edge; // +Pulsbreite berechnen
|
14 | if ( time > 900 && time < 2100 ) { // Wenn gelesene Pulsbreite akzeptabel in globale Variablen übernehmen
|
15 | read_pos = time;
|
16 | sig_good_cnt = 0;
|
17 | }
|
18 | led_aus(); // nur zum debuggen
|
19 | }
|
20 | }
|
So, ich denke in der Theorie sollte das funktionieren.
Nun stelle ich aber fest, dass das nur dann funktioniert, falls beim
Programmieren das Empfängersignal anliegt. Sobald ich das Signal aber
nur kurzzeitig vom AVR trenne oder den Strom von der Schaltung nehme
triggert der Interrupt offensichtlich nicht mehr.
Interessant war auch, dass ich es geschafft habe den Stecker zu ziehen,
als die LED gerade an war. Sie blieb dann an bis ich das Signal wieder
an den AVR anlegt. Dann ging die LED aus und bleib wieder aus.
zusammenfassend, kann man sagen, dass mein Code also nur nach einem
Reset funktioniert, während dem das Signal anlag, und auch nur solange
das signal dann da ist, verschwindet es einmal wird es nicht mehr
erkannt.
Woran könnte das liegen?!