Hallo,
habe ein Problem mit der ISR (Overflow) vom Timer1, µC ist ATtiny2313.
Quarz ist 4Mhz, Vorteiler ist acht.
Hier die Initialisierung
1 | /******** Initialisiert den Timer1 ********/
|
2 | void initTimer1(void)
|
3 | {
|
4 | TCCR1A = 0; // No Compare Output Mode or Waveform Generation
|
5 | TCCR1B = (1 << ICNC1) | (1 << CS11); // Noise Canceler an, Fallende Flanke, Vorteiler 8 -> 4MHz / 8 = 500kHz Timer Frequenz
|
6 | TIMSK = (1 << ICIE1) | (1 << TOIE1); // Input Capture Interrupt einschalten, Overflow Interrupt einschalten
|
7 | TCNT1 = PRE_TCNT; // Timer Register wird mit einem Wert vorbelegt, 2^16 - 60536 = 5000
|
8 | }
|
Jetzt toggel ich PB4 in der ISR. An dem Pin habe ich ein Oszilloskop
hängen, somit sollte man eig. schön 10ms HIGH und 10ms LOW sehen.
HIGH ist auch ca. 10ms, LOW hingegen ein bisschen weniger.
Dachte erst das es womöglich am Oskar liegt, aber auch wenn ich ein DMM
mit Frequnzmessung dranhänge zeigt es mir ein Frequenz von 49,96Hz an.
Was läuft hier falsch?
1 | #define PRE_TCNT -5000 // Wert mit dem das TCNT1 Register vorbelegt wird. [sek]
|
2 |
|
3 | /******** ISR des Overflow von Timer1 ********/
|
4 | ISR(TIMER1_OVF_vect)
|
5 | {
|
6 | TCNT1 = PRE_TCNT; // Timer Register wird mit einem Wert vorbelegt, 2^16 - 60536 = 5000 als Rest
|
7 | // somit ist mit jedem Aufruf der ISR 10^-2 Sekunden (0.01) vergangen
|
8 |
|
9 | PORTB ^= (1 << PB4); // DEBUG: Pin Toggeln
|
10 |
|
11 | if(overdrive_magnetic_loops != 0)
|
12 | {
|
13 | // d.h jedes mal wenn overflow_ticks um eins inkrementiert wird,
|
14 | // sind 10ms vergangen
|
15 | overflow_ticks++; // max. 65536 da 16Bit Variable
|
16 | }
|
17 | }
|