Problem mit Timer

OP #2483382
Lesenswert?

Hallo,

ich habe ein Problem mit der Zeitberechnung beim Atmega8. Ich benutze 
eine Vorlage aus dem Tutorial, die ich auf den Atmega8 angepasst habe. 
Ich gebe die Sekunden auf einem kleinen 2-Segment-Display aus. Dabei 
wird jedoch nicht jede Sekunde ein neuer Wert ausgegebensonder etwa alle 
2, der Timer läuft also irgendwie zu langsam. Woran kann es liegen?
Hier der Quelltext:


/* uC:Atmega8*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


//Variablen für die Zeit
volatile unsigned int millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

/**********************************************************/

/*******************************************************/
int main(void)
{
  volatile unsigned int lSetup = 0;
  volatile unsigned int merk;
  volatile unsigned int temp;
  merk = 0;
  temp = 0;

  DDRC = 0b00001111; /* Output */
  DDRD = 0b00000000; /* Input  */
  PINC = 0b00001111; /* internal Pullups */

  // Timer 0 konfigurieren
  TCCR2 = (1<<WGM21); // CTC Modus
  TCCR2 = (1<<CS21); // Prescaler 8
  // ((1000000/8)/1000) = 125
  OCR2 = 125-1;


  // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE2);

  // Global Interrupts aktivieren
  sei();
  while(1)

  {

    /* Sekunde ausgeben */
  temp = merk % 10; // Einer
         PORTC = temp;
  temp = (merk - temp) / 10;  // 10 Zehner
  PORTC = temp + 16;

  }
}

/*
Der Compare Interrupt Handler
wird aufgerufen, wenn
TCNT0 = OCR0A = 125-1
ist (125 Schritte), d.h. genau alle 1 ms
*/
ISR (TIMER2_COMP_vect)
{
  millisekunden++;

  if(millisekunden == 1000)
  {
     sekunde++;
    millisekunden = 0;

    if(sekunde == 60)
    {
      minute++;
      sekunde = 0;
    }
    if(minute == 60)
    {
      stunde++;
      minute = 0;
    }
    if(stunde == 24)
    {
      stunde = 0;
    }
  }
}
#2483607
Lesenswert?

Michael Rochel schrieb:
> Dabei
> wird jedoch nicht jede Sekunde ein neuer Wert ausgegebensonder etwa alle
> 2, der Timer läuft also irgendwie zu langsam. Woran kann es liegen?

Höchst erstaunlich, dass da überhaupt was sinnvolles ausgegeben wird, wo 
doch keine der Zeit-Variablen in die Ausgabe mit einfließt. Wir sehen 
also mal wieder nicht den echten Code, sondern nur irgendwas 
Verstümmeltes.

Nun denn, hier ist dein Problem:
1
  TCCR2 = (1<<WGM21); // CTC Modus
2
  TCCR2 = (1<<CS21); // Prescaler 8
Welchen Inhalt genau hat TCCR2 nach diesen zwei Zeilen wohl?

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