Forum: Mikrocontroller und Digitale Elektronik timer0 als sekundenzähler


von Cherkaoui E. (char9i)


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.

von Johannes M. (johnny-m)


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!)

von Johannes M. (johnny-m)


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...

von Cherkaoui E. (char9i)


Lesenswert?

ich habe mich ja verrechnet

3686400/64= 57600
aber sonst stimmt das mit ZEAHL = 3686400/64/256=225

Der Atmega8 ist im Einzatz.

>Nun, CS10 gehört zu Timer 1 und nicht zu Timer 0

das war nur Tippfehler.

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.