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
Hallo, Du beschreibst nirgens TCNT1 Dadurch läuft der Timer immer alle 65535 Schritte. Axel
>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.
Hi >Hallo, >Du beschreibst nirgens TCNT1 Wozu? >Dadurch läuft der Timer immer alle 65535 Schritte. Nein. Nur bis ORR1A. MfG Spess
Hi Korrektur: 'Nein. Nur bis ORR1A' -> Nein. Nur bis OCR1A. MfG Spess
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.
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?
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.