Uhr mit Mega8 läuft zu schnell

OP #1729130
Lesenswert?

Hallo!

Ich habe mich mal an eine einfache Uhr gesetzt, läuft eigentlich so, wie 
ich mir das vorstelle ABER zu schnell... (mit dem Faktor 3,75)

Der Source-Code ist im Anhang enthalten und basiert teilweise auf dem 
Wiki.

Ich wäre sehr dankbar, wenn mal jemand drüberschauen könnte :D

Achja, die LCD-Routinen sind jene aus dem AVR-GCC-Tutorial dieser Seite.

Grüße
Angehängte Dateien:
Gast #1729160
Lesenswert?

>Du beschreibst nirgens TCNT1

>Dadurch läuft der Timer immer alle 65535 Schritte.

Braucht man beim Benutzen der Capture-Unit auch nicht...
Je nach Timer-Mode wird der Timer beim Vergleichswert auf 0 
zurückgesetzt.
#1729193
Lesenswert?

Das WGM12-Bit ist nicht in TCCR1A sondern in TCCR1B.
Daher wählst du nicht den CTC-Mode sondern den Normalmodus.
Und warum steht in deiner Berechnung /1000 ? Willst du 1000Hz
Interrupt erzeugen? Dann liefe die Uhr aber um den Faktor 1000 zu 
schnell.

So wie es ist hast du 1000000/8/65536 Hz, das ergibt 1,9 Hz.
Läuft dein Oszillator mit 2MHz, statt mit einem? Dann hätten wir
3,8 Hz, was ja zu deiner Beobachtung ungefähr passt.
OP #1729405
Lesenswert?

Ersteinmal vielen Dank für die Antworten.

zu Sohn von Gosar:
Ein Mega8 - wie es im Titel steht :D

zu Uwe Nagel:
Ich habe den Quellcode nun abgeändert:
1
// Timer 1 konfigurieren -> MILLISekunden
2
TCCR1B = (1<<WGM12); // CTC Modus
3
TCCR1B |= (1<<CS11); // Prescaler 8
und
1
ISR (TIMER1_COMPA_vect)
2
{
3
  ms++;
4

5
  if (ms == 2000) {
6
    a++;
7
    ms = 0;
8
  }
9
}

Jetzt rast die Uhr ungefähr 2160x so schnell, wie sie soll... und nicht 
1000 mal... (waren Millisekunden und nicht Sekunden im Beispiel)

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR 
-> Damit dürfte in diesem Beispiel ein Fehler sein, oder?

Timer0 vom Mega8 unterstützt kein CTC, daher habe ich Timer1 genommen, 
kann aber sein, dass ich da beim Umschreiben einen Fehler gemacht 
habe...

Grüße
#1730063
Lesenswert?

Tilman Stremlau schrieb:

> Ich hatte mir auch gedacht, dass hier ein int16 notwendig wäre, aber im
> Beispiel wird das so definiert. Schaut dann der Compiler, was am
> geeignesten wäre?

Nein. Welche Datentypen du nimmst, ist dein Bier.

> Ich verwende die internen 1MHz, aber so ungenau kann das ja auch nicht
> sein.

Bist du 100% sicher mit den 1Mhz?
Hast du die kontrolliert?

Ansonsten: Komplettes Programm zeigen.

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