mikrocontroller.net

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


Autor: Bernhard Fuchs (zoidberg)
Datum:

Bewertung
0 lesenswert
nicht 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

void configure_timer0(uint8_t mode, uint16_t duration, void(*handler)(void)){
  
  TIMER_INTERRUPT_MASK &= ~(_BV(TOIE0)); //disable! Timer0 overflow Interrupt

  if ( ((mode == PERIODIC) || (mode==ONESHOT) || (mode==STOP)) && (duration>0) ){
    
    TIMER_IRQ_REGISTER |=  (_BV(TOV0)); //delte existing Interrupt
    overflow = 0;
    overflowtocount = 0;
      
  }
  else { //undef. mode!!
    return;
  }

  if (mode == ONESHOT){
  //set overflowmax to corresponding value
  //if overflow == overflowmax stop timer
    timermode = ONESHOT;
    overflowtocount = duration * OVERFLOWPERMS;  
    TIMER_INTERRUPT_MASK |= (_BV(TOIE0)); //enable Timer0 overflow Interrupt
    myTimerCallback = handler;
  }
  if (mode == PERIODIC){
    timermode = PERIODIC;
    overflowtocount = duration * OVERFLOWPERMS;
    TIMER_INTERRUPT_MASK |= (_BV(TOIE0)); //enable Timer0 overflow Interrupt
    myTimerCallback = handler;
  }
  if (mode == STOP){

    TIMER0_CONTROL &= ~(_BV(CS02)); //stop timer and reset
    TIMER_INTERRUPT_MASK &= ~(_BV(TOIE0)); // disable timer0 interrupt-enable bit
    TIMER0_CONTROL |= (_BV(TOV0)); //delete existing Interrupt
    TCNT0 = 0x00;
    return;
  }
  TIMER0_CONTROL |= (1<<CS02); //start Timer0 with prescaler 64
  

}


ich counte übrigens in der Signalroutine die overflows und vergleiche >=
mit overflowtocount

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.