timer0 als sekundenzähler

OP #1209427
Lesenswert?

Hi;

Ich bin Anfänger beim Programmieren in Mikrocontroller.Ich habe ein 
Programm geschrieben,das die Sekunden zählt. Also mein Quarz taktet mit 
3686400 HZ und als Vorteiler 64.

#include <avr/io.h>
#include <avr/interrupt.h>
#define ZEAHL  F_CPU/(64*256)     //interruptzähler

volatile uint16_t takt = ZEAHL , sekunde = 0;
void setup (void)
{
  TCCR0 |= ( 1<<CS10 )|( 1<<CS00 ); //counter0,Prescaler CK/64
  TIMSK |= ( 1<<TOIE0 ); // enable counter0 overflow interrupt
  TCNT0 = 0; // Counter0 auf Null setzen

  takt = ZEAHL;
  sekunde = 0;

}

int main (void)
{

  setup();
  DDRC |= (1<<PC1);
  sei();
  for (;;)
  {}
}
ISR(TIMER0_OVF_vect)
{

     takt--;
     if (takt==0)  // nach 225 durchlaufen ist eine Sekunde vorgegangen
        {
           takt = ZEAHL;
           sekunde++;
          if (sekunde == 20)
            {
               PORTC |=(1<<PC1);
            }

        }
}

Der Timer läuft,aber der zählt die Sekunden nicht richtig. Hier Z.B 
wollte ich nach 20 Sekunden PINC1 auf 1 setzen aber der macht schon nach 
ungefähr 5 Sekunden. Wie kann ich jetz ZEAHL rechnen damit das Programm 
die Sekunden genau zählt.

Gehe ich die Rechnung durch:

Frequenz   3686400 HZ
Vorteiler  64
Timer 0, also 8 Bit Timer
Nach 225 Interrupts wird erhöht.

3686400 / 64   Vorteiler          14400
14400 / 256     weil 8 Bit Timer     225, paar zerquetschte
225 / 225       weil 225 Overflows  1
das heisst ZEAHL = 225

Habe ich das richtig verstanden oder falsch???
Danke für eure Hilfe im Voraus.
#1209448
Lesenswert?

>   TCCR0 |= ( 1<<CS10 )|( 1<<CS00 ); //counter0,Prescaler CK/64
Nun, CS10 gehört zu Timer 1 und nicht zu Timer 0. Es liegt auch im 
entsprechenden Register an der selben Stelle wie CS00, weshalb der 
Ausdruck da oben nur CS00 setzt. Versuch es mal mit CS01 anstelle von 
CS10...

Mich wundert allerdings ein bisschen, dass Du nur einen Faktor von 4 
bekommst. Habe jetzt allerdings noch nicht ins Datenblatt geschaut, da 
Du nicht erwähnst, um welchen Controller es sich genau handelt (das 
hätte in den Betreff gehört!)
#1209455
Lesenswert?

Cherkaoui Erratib wrote:
> 3686400 / 64   Vorteiler          14400
Das solltest Du noch mal nachrechnen! Das stimmt nämlich schon nicht...

Wenn ich das sehe, kommt mir fast der Verdacht, dass das mit dem CS10 
nur beim Code-Abtippen passiert ist und dass im Originalcode tatsächlich 
CS01 steht. Der Rechenfehler da oben gibt nämlich exakt einen Faktor 4! 
Mit dem falschen CS-Bit wäre es allein dadurch schon ein Faktor 64...

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