timer0 als sekundenzähler

OP #1209427
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
>   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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.