Hallo! Ich versuche mich gerade an einer Frequenzmessung mit der Input Capture Funktion des Timer1 an einem ATmega328p. In nachfolgendem kurzen Programm habe ich den Kern meines Problems zusammengefasst, bei 70 Hz Rechtecksignal am ICP1-Pin funktioniert noch alles, bei einer Frequenz von 100 Hz werden schon (reproduzierbar) Flanken ausgelassen (siehe Oszibilder) und ab 200-300 Hz, wird die ISR gar nicht mehr aufgerufen. Ich kann mir dieses Verhalten wirklich nicht erklären, weiß jemand Rat?
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/pgmspace.h> |
4 | |
5 | //Ueberlaufzaehler
|
6 | volatile uint8_t ovf_t1 = 0; |
7 | |
8 | //Initialize timer
|
9 | void InitTimer1(void) |
10 | {
|
11 | //cnt init
|
12 | TCNT1=0; |
13 | //steigende Flanke, noise canceler und kein Vorteiler
|
14 | TCCR1B|=(1<<ICES1)|(1<<ICNC1)|(1<<CS10); |
15 | //Input Capture und Overflow Interrupt enable
|
16 | TIMSK1|=(1<<ICIE1)|(1<<TOIE1); |
17 | //Bereits akt. Interrupts loeschen
|
18 | TIFR1 |= (1<<TOIE1)|(1<<ICIE1); |
19 | }
|
20 | |
21 | //capture ISR
|
22 | ISR(TIMER1_CAPT_vect) |
23 | {
|
24 | PORTB ^= (1 << PB5); |
25 | }
|
26 | |
27 | //Overflow ISR
|
28 | ISR(TIMER1_OVF_vect) |
29 | {
|
30 | ovf_t1++; |
31 | }
|
32 | |
33 | void io_init() |
34 | {
|
35 | DDRB |= (1 << PB5); |
36 | }
|
37 | |
38 | int main(void) |
39 | {
|
40 | io_init(); |
41 | //Frequenzmessung mit Timer1 an D8 initialisieren und starten
|
42 | InitTimer1(); |
43 | |
44 | //globale Interruptfreigabe
|
45 | sei(); |
46 | |
47 | while(1) |
48 | {
|
49 | }
|
50 | }
|

