mikrocontroller.net

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


Autor: Tilman Stremlau (killerfaultier)
Datum:
Angehängte Dateien:

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

Autor: Axel Düsendieb (axel_jeromin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Du beschreibst nirgens TCNT1

Dadurch läuft der Timer immer alle 65535 Schritte.


Axel

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hallo,
>Du beschreibst nirgens TCNT1

Wozu?

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

Nein. Nur bis ORR1A.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Korrektur:

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

MfG Spess

Autor: Uwe Nagel (ulegan)
Datum:

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

Autor: Sohn von Gosar (Gast)
Datum:

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

Autor: Tilman Stremlau (killerfaultier)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Timer 1 konfigurieren -> MILLISekunden
TCCR1B = (1<<WGM12); // CTC Modus
TCCR1B |= (1<<CS11); // Prescaler 8
und
ISR (TIMER1_COMPA_vect)
{
  ms++;

  if (ms == 2000) {
    a++;
    ms = 0;
  }
}

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

Autor: dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ist ms eine int16?

Autor: Uwe Nagel (ulegan)
Datum:

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

Autor: Tilman Stremlau (killerfaultier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ms ist nicht speziell definiert:
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Er (Gast)
Datum:

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

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.