mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer0 als sekundenzähler


Autor: Cherkaoui Erratib (char9i)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Cherkaoui Erratib (char9i)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.