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