Hallo Leute,
ich bin hier kurz vorm Verzweifeln.
Da gibt es dieses PWM-Signal, dessen Pulsbreite ich mittels Input
Capture messen will. Das ganze auf einer Atmega 1280-Möhre.
Mein Problem ist, dass ich zwar nen Interrupt bekomme, wenn ich auf
steigende Flanke prüfe und wenn ich auf fallende Flanke prüfe, aber
beides in Kombination klappt nicht. Wenn ich nach der steigenden Flanke
auf fallende umschalte, kommt der zweite Interrupt nicht mehr!
Als Vorbereitung mach ich diesen hier:
1 | // rising edge mode
|
2 | TCCR5B |= (1 << ICES5);
|
3 |
|
4 | pulse_on = TRUE;
|
5 |
|
6 | // enable input capture interrupt
|
7 | TIMSK5 |= (1 << ICIE5);
|
8 | sei();
|
In der ISR dann das hier:
1 | ISR(TIMER5_CAPT_vect) {
|
2 | uint8_t temp = SREG;
|
3 |
|
4 | if (pulse_on) {
|
5 | // switch to falling edge mode
|
6 | TCCR5B &= ~(1 << ICES5);
|
7 |
|
8 | // clear ICF5 by writing logical 1
|
9 | TIFR5 |= (1 < ICF5);
|
10 |
|
11 | pulse_on = FALSE;
|
12 | } else {
|
13 | write("x");
|
14 | }
|
15 |
|
16 | SREG = temp;
|
17 | }
|
Da kommt dann nur noch der erste Interrupt und dann nix mehr. Das
Umschalten der Flankenerkennung scheint fehlzuschlagen. Dabei nudel ich
doch extra noch die 1 auf das ICF, so wie das Datenblatt es mir befiehlt
;)
Hat jemand eine Idee?