Forum: Mikrocontroller und Digitale Elektronik Uhr mit Mega8 läuft zu schnell


von Tilman S. (killerfaultier)


Angehängte Dateien:

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

von Axel D. (axel_jeromin) Benutzerseite


Lesenswert?

Hallo,
Du beschreibst nirgens TCNT1

Dadurch läuft der Timer immer alle 65535 Schritte.


Axel

von STK500-Besitzer (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Hallo,
>Du beschreibst nirgens TCNT1

Wozu?

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

Nein. Nur bis ORR1A.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Korrektur:

'Nein. Nur bis ORR1A' -> Nein. Nur bis OCR1A.

MfG Spess

von Uwe N. (ulegan)


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.

von Sohn von Gosar (Gast)


Lesenswert?

Tilman Stremlau schrieb:
> läuft eigentlich so, wie
> ich mir das vorstelle ABER zu schnell...

siehst mal wieder wie schnell die Zeit vergeht :)

ne, welchen Controller programmierst du?

von Tilman S. (killerfaultier)


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

von dirk (Gast)


Lesenswert?

Und ist ms eine int16?

von Uwe N. (ulegan)


Lesenswert?

dirk schrieb:
> Und ist ms eine int16?
Wenn's eine 8-Bit Variable wäre, würde sie nie 2000 und die Uhr würde 
garnicht laufen.

Ansonsten läuft das Programm zumindest im Simulator mit den beiden 
Änderungen einwandfrei.
Aber wie taktest du den Prozessor eigentlich?

Uwe

von Tilman S. (killerfaultier)


Lesenswert?

ms ist nicht speziell definiert:
1
volatile unsigned int  ms;

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?

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

von Karl H. (kbuchegg)


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.

von Er (Gast)


Lesenswert?

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

Naja für ne Eieruhr reichts normalerweise grad noch.

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.