Ich habe einen ATmega168 mit 1MHz und möchte eine Pulslänge messen. Dazu
verwende ich das ICP-Modul von Timer 1 und zusätzlich den Timer
Overflow Interrupt, um ein ungültiges Signal festzustellen. Die
Signallänge darf 6-7 ms betragen, ich habe keinen Timer prescaler. Also
dürfte der Overflow Interrupt nie aufgerufen werden.
1 | ...
|
2 | TCCR1B = (1<< ICNC1) | (1<< CS10); //falling Edge, Noise Canceler, CLk/1
|
3 | TIMSK1 = (1<< ICIE1); //Input Capture Enable
|
4 | ...
|
5 |
|
6 | SIGNAL(SIG_INPUT_CAPTURE1) {
|
7 |
|
8 | PORTD &= ~(1<< PD7);
|
9 |
|
10 | if (syncstat == 10) { //erste fallende Flanke
|
11 | TCNT1 = 0; //Timer auf 0 setzen
|
12 | TIMSK1 = (1<< ICIE1) | (1<< TOIE1); //Input Capture + Overflow Interrupt Enable
|
13 | syncstat = 11; //warte auf zweite fallende Flanke
|
14 | } else if (syncstat == 11) { //zweite fallende Flanke
|
15 | dt = ICR1; //Sollwert 6660 @ 1MHz
|
16 |
|
17 | TCCR1B = 0x00; //deaktivieren
|
18 | TIMSK1 = 0x00 ; //deaktivieren
|
19 |
|
20 | syncstat = 128;
|
21 | }
|
22 |
|
23 | PORTD |= (1<< PD7);
|
24 | }
|
25 |
|
26 | SIGNAL(SIG_OVERFLOW1) { //Darf nie aufgerufen werden -> Fehler!
|
27 |
|
28 | PORTD &= ~(1<< PD5);
|
29 | //UART_print("SIG_OVERFLOW");
|
30 | PORTD |= (1<< PD5);
|
31 |
|
32 | }
|
Der Overflow-Interrupt wird aber merkwürdigerweise 60µs nach dem
ICP-Interrupt aufgerufen.
Hat jemand eine Erklärung?