Forum: Mikrocontroller und Digitale Elektronik Timer0 zählt zu lange


von Bernhard F. (zoidberg)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.