Forum: Compiler & IDEs Problem mit Timer


von Michael R. (mray)


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;
    }
  }
}

von Stefan E. (sternst)


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?

von Michael R. (mray)


Lesenswert?

ja es ist nur ein Teil des Codes, ich wollte nur die wesentlichen Zeilen 
posten. Der Variablen merk wird natürlich der Wert von Sekunde 
zugeiesen.
Habe meinen Fehler jetzt verstanden, 'TCCR2 |= (1<<CS21);' dürfte es 
lösen.

Vielen Dank

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.