Hallo... also ich habe ein Problem mit einem 8Bit Timer bei einem
atmega128
ich sitz jetzt schon einen halben Tag davor und finde den Fehler einfach
nicht.
folgendes "sollte" passieren ....
der Timer0 wird konfiguriert und nach erreichen der Duration Time
gestoppt... das ganze läuft auch problemlos...beim ersten mal..
ab dem zweiten funktionsaufruf läuft er immer die doppelte Zeit..
also ich rufe die Configure FKT mit einem Pushbutton auf.. immer mit den
gleichen Parametern..
bin schon am verzweifeln.. ev. seht ihr den Fehler..
lg
Bernhard
1 | void configure_timer0(uint8_t mode, uint16_t duration, void(*handler)(void)){
|
2 |
|
3 | TIMER_INTERRUPT_MASK &= ~(_BV(TOIE0)); //disable! Timer0 overflow Interrupt
|
4 |
|
5 | if ( ((mode == PERIODIC) || (mode==ONESHOT) || (mode==STOP)) && (duration>0) ){
|
6 |
|
7 | TIMER_IRQ_REGISTER |= (_BV(TOV0)); //delte existing Interrupt
|
8 | overflow = 0;
|
9 | overflowtocount = 0;
|
10 |
|
11 | }
|
12 | else { //undef. mode!!
|
13 | return;
|
14 | }
|
15 |
|
16 | if (mode == ONESHOT){
|
17 | //set overflowmax to corresponding value
|
18 | //if overflow == overflowmax stop timer
|
19 | timermode = ONESHOT;
|
20 | overflowtocount = duration * OVERFLOWPERMS;
|
21 | TIMER_INTERRUPT_MASK |= (_BV(TOIE0)); //enable Timer0 overflow Interrupt
|
22 | myTimerCallback = handler;
|
23 | }
|
24 | if (mode == PERIODIC){
|
25 | timermode = PERIODIC;
|
26 | overflowtocount = duration * OVERFLOWPERMS;
|
27 | TIMER_INTERRUPT_MASK |= (_BV(TOIE0)); //enable Timer0 overflow Interrupt
|
28 | myTimerCallback = handler;
|
29 | }
|
30 | if (mode == STOP){
|
31 |
|
32 | TIMER0_CONTROL &= ~(_BV(CS02)); //stop timer and reset
|
33 | TIMER_INTERRUPT_MASK &= ~(_BV(TOIE0)); // disable timer0 interrupt-enable bit
|
34 | TIMER0_CONTROL |= (_BV(TOV0)); //delete existing Interrupt
|
35 | TCNT0 = 0x00;
|
36 | return;
|
37 | }
|
38 | TIMER0_CONTROL |= (1<<CS02); //start Timer0 with prescaler 64
|
39 |
|
40 |
|
41 | }
|
ich counte übrigens in der Signalroutine die overflows und vergleiche >=
mit overflowtocount