Forum: Compiler & IDEs Binäre Uhr - Zählt viel zu langsam


von osmaniak (Gast)


Lesenswert?

Hallo,

ich will eine binäre Uhr mit einem Atmega8 verwirklichen.
Anbei ist mein Codeauszug. Auf meinem STK500 zählen die Sekunden aber 
schon viel zu langsam, ich finde aber den Fehler nicht. Kann von euch 
jemand den Fehler entdecken?

Gruß
osmaniak

#include <avr/io.h>
#include <avr/interrupt.h>
#include "externe_Variablen.h"

  volatile uint8_t sekunden;


int main(void)
{
  cli();
  DDRC=0xFF;
  DDRD=0xFF;
  DDRB=0x03;

  //Timer initialisieren:
  TCCR1A = 0x00;
  TCCR1B|= (1<<CS00)|(1<<CS02);    //Prescaler 1024, CTC-Mode
  OCR1A = 512;                    //Vergleiswert setzten
  TIMSK = (1<<OCIE1A);            //OC-Interrupt aktivieren


  sekunden=0;
  unsigned minuten=0;
  unsigned stunden=0;

  sei();
//Polling-Loop:
  while(1)
  {

    PORTC = 0xFF-sekunden;
    if (sekunden==60)
    {
      sekunden=0;

      minuten++;
      //PORTD = minuten;
      if(minuten==60)
      {
        minuten=0;
        stunden++;
        //PORTC= 0xFFFF - stunden;
        if(stunden==24)
        {
          stunden=0;
        }
      }
    }
  }
  return 0;
}

ISR(TIMER1_COMPA_vect)
{
  sekunden++;
  TIFR |= (1 << OCF1A);
}

von Stefan E. (sternst)


Lesenswert?

Es fehlen essentielle Informationen. Wie ist der Controller getaktet, 
und um wie viel sind die Sekunden zu langsam?

Vom Code her würde ich eigentlich erwarten, dass es viel zu schnell 
läuft, außer der Controller ist ungewöhnlich langsam getaktet.

von osmaniak (Gast)


Lesenswert?

Ich takte mit 4 MHz.
OCR1A = 512; habe ich nun auf 4096 gesetzt.
Trotzdem läuft es noch so ziemlich gleich schnell. Ich vermute ein 
Problem mit der ISR?

Laut meiner Berechnung:

4194304/(4096*1024)=1s

auf genau eine Sekunde kommen.

von Stefan E. (sternst)


Lesenswert?

osmaniak schrieb:
> Ich takte mit 4 MHz.
> ...
> 4194304/(4096*1024)=1s

Was denn nun, 4 oder 4,194304 MHz?

osmaniak schrieb:
> Trotzdem läuft es noch so ziemlich gleich schnell.

Richtig, da du den Timer im Normal-Mode laufen lässt, ist die Zeit 
zwischen zwei Compare-Events ja auch immer gleich groß. Was du 
eigentlich haben willst, ist der CTC-Mode.

von osmaniak (Gast)


Lesenswert?

Das Quartz taktet mit 4,194MHz.

Ok und wie komme ich in den CTC-Mode?

von Stefan E. (sternst)


Lesenswert?

osmaniak schrieb:
> Ok und wie komme ich in den CTC-Mode?

Indem du im Datenblatt nachschaust, welche Bits du wo setzen musst.

von osmaniak (Gast)


Lesenswert?

thx, habs gefunden. Jetzt läufts! ;-)

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.