Timer0 zählt zu lange

OP #690217
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren