Hallo Leute,
ich möchte eine Digitale Uhrzeit anzeigen das funtkioniert soweit
allerdings geht meine uhr vor und ich weiß nicht weshalb.
Ich muss es mit dem Timer0 machen daher ich vom Timer1 den Capture Mode
benötige.
vielen dank!
Mein Code:
Hi
>Ich muss es mit dem Timer0 machen daher ich vom Timer1 den Capture Mode>benötige.
Dann nimm für Timer0 den CTC-Mode.
> 15625/255 = 61 Overflows pro sekunde
->15625/256
MfG Spess
hmm ok, ich steh momentan etwas auf der leitung...
15625/256 = 61 Overflows pro sekunde
1/61 = 16ms
bisher hab ich die Overflows mitgezählt, jetzt müsste ich das dann
umdrehen ?
das macht ja keinen unterschied oder ?
Hi
>1/61 = 16ms
Das sind aber nicht genau 16ms.
Wenn du Timer0 im CTC-Mode mit einem Prescaler von 64 und mit OCR0A=0xF9
betreibst, bekommst du einen OCR0A-Interrupt genau alle 1ms. In der
Interrupt-Routine zählst du bis 1000. Damit hast du deine Sekunde.
Entweder du setzt dann ein Flag und arbeitest die Uhrroutinen im
Hauptprogramm ab oder machst das gleich im Interrupt. Hängt davon ab,
wie zeitkritisch dein Programm ist.
MfG Spess
Patrick schrieb:> ich möchte eine Digitale Uhrzeit anzeigen das funtkioniert soweit> allerdings geht meine uhr vor und ich weiß nicht weshalb.
Vielleicht läuft dein Takt mit einer anderen Frequenz, als du glaubst.
Miss mal genau nach.
Tom schrieb:> Vielleicht läuft dein Takt mit einer anderen Frequenz, als du glaubst.> Miss mal genau nach.
Nein, das tut er nicht. Die Antwort hat Spess doch gerade geliefert.
Mein grosses V. schrieb:> Nein, das tut er nicht. Die Antwort hat Spess doch gerade geliefert.
Du hast die Gangabweichung durch die Frequenzabweichung wegen grober
Fehler nur noch nicht entdeckt. Der von Spess genannte Fehler ist nur
die Spitze des Eisberges. Solange du nicht verrätst, wie doll deine Uhr
genau vorgeht, kann man erstmal nur auf Standardfehlern abklopfen.
bei if(miliseconds == 1000) dauertert es bis 1s kommt ca. 10s
bei if(miliseconds == 100) dauertert es bis 1s kommt < 1s ca. 600ms
ich komme auf keine 100% sekunde ...
Hi
>bei if(miliseconds == 1000) dauertert es bis 1s kommt ca. 10s>bei if(miliseconds == 100) dauertert es bis 1s kommt < 1s ca. 600ms>ich komme auf keine 100% sekunde ...
Dann solltest du mal deine Fuses überprüfen.
MfG Spess
Patrick schrieb:> aber ein sekunden takt bekomme ich damit nicht, jetzt wär sie viel zu> langsam.
Ohne "lcd-routines.h" geht deine Uhr ganz genau. Also, "lcd-routines.h"
auf Interrupt sperren oder ähnliches prüfen.
Auch:
Patrick schrieb:> bei denen hab nie etwas umgestellt also 1s dauert momentan 14s - 15s> (gemessen)
Dann läuft dein Tiny wahrscheinlich mit internem Takt von 1MHz.
Hi
>ich habe aber 16Mhz eingestellt weshalb sollte er mit 1Mhz laufen ?>#define F_CPU 16000000UL
Damit sagst du nur dem Compiler, das dein Controller mit 16MHz laufen
soll. Aber den Takt vom Controller musst du erst über die Fuses
einstellen.
MfG Spess
Patrick schrieb:> ich habe aber 16Mhz eingestellt weshalb sollte er mit 1Mhz laufen ?> #define F_CPU 16000000UL
Du hast gar nichts eingestellt, du hast nur dem GCC mitgeteilt, dass
du glaubst, dass die CPU Geschwindigkeit 16MHz ist.
spess53 schrieb:> Dann solltest du mal deine Fuses überprüfen.>> MfG Spess
spess53 schrieb:> Damit sagst du nur dem Compiler, das dein Controller mit 16MHz laufen> soll. Aber den Takt vom Controller musst du erst über die Fuses> einstellen.
LOL.
Du bist einfach zu schnell...
Default Clock t2313 ist wie bei fast allen AVR's 8Mhz über 1:8 Teiler
ergibt 1MHz. Wenn man stattdessen dem Compiler 16MHz mitteilt, dann baut
der nur eventuelle Wartenschleifen anders. Was er nicht kann ist der
Hardware einen 16MHz Quarz hinzuzufügen. Was er auch nicht kann, denn er
kennt ja die Hardware nicht: die Fuses für Quarzbetrieb anpassen und die
DIV8 Fuse rausnehmen.
Alle Spekulationen über die errechnete Uhrzeit sind vergebene Mühe, wenn
sich diese auf eine nur grob bekannte Frequenz von ca. 1MHz +-10%
bezieht.
ja das habe ich nicht gewusst mit dem F_CPU ich ging davon aus das ich
damit die frequenz einstellen kann aber wozu ist das dann gut ?
Bastler schrieb:> Default Clock t2313 ist wie bei fast allen AVR's 8Mhz über 1:8 Teiler> ergibt 1MHz.
Somit muss ich mit 1Mhz und 1ms einen prescaler von 8 verwenden.
laut dem AVR Calculator hätte ich dann einen Fehler von 0%
http://www.b9.com/elect/avr/kavrcalc/
TCCR0A = 0; //CTC Mode
TCCR0B |= (1<<WGM01) | (1<<CS01); // Prescaler 8
OCR0A=124;
TIMSK = (1<<OCIE0A);
Hi
>ja das habe ich nicht gewusst mit dem F_CPU ich ging davon aus das ich>damit die frequenz einstellen kann aber wozu ist das dann gut ?
Z.B. wenn der Compiler ein Delay ausrechnen muss.
>TCCR0A = 0; //CTC Mode>TCCR0B |= (1<<WGM01) | (1<<CS01); // Prescaler 8
WGM01 befindet sich in TCCR0A
MfG Spess