ISR(TIMER2_COMP_vect)//4)Führe diese ISR bei Overflow von TCNT0 aus
27
{
28
millisekunden++;
29
if(millisekunden==1000)
30
{
31
sekunde++;
32
millisekunden=0;
33
}
34
// ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
35
// WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
36
charBuffer_ms[20];// in diesem {} lokal
37
itoa(millisekunden,Buffer_ms,10);
38
// ... ausgeben
39
charBuffer_s[20];// in diesem {} lokal
40
itoa(sekunde,Buffer_s,10);
41
// ... ausgeben
42
lcd_init();
43
set_cursor(7,1);
44
lcd_string(Buffer_ms);
45
set_cursor(0,1);
46
lcd_string(Buffer_s);
47
}
und kann mir nicht erklären warum der zu langsam zählt.
Taktfrequenz ist 16MHz, fuses dafür sind gesetzt.
Eigentlich sollte es ja laut der Formel:
16 000 000 64 250 = 1000
in einer sekunde 1000 interrupts geben. und da 1sec = 1000ms sollte des
j stimmen...
kann mir vll jemand helfen?
Mfg, Pat
Schau nochmal genau hin. Die Formel im Datenblatt beschreibt etwas
anderes (nicht Interrupts pro Sekunde), deshalb hast du einen
Fehlerfaktor von 2 drin.
achso also prakrisch durch den 2. Timer dann bestimmen wie oft die
anzeige aktualisiert wird?
edit: hab nu die Änderungen ( bis auf das mit der anzeigen funktion)
vorgenommen aber jetzt ist der irgendwie zu schnell????
> nimm einen zweiten Timer
Wenn anzeigen() gerade ausgeführt wird, und länger als 1 ms dauert, dann
hilft auch ein zweiter Timer nichts...
Richtigerweise wird lcd_init() genau 1 mal gemacht. Und dann in der
Hauptschleife das anzeigen(). Für das Ausführen von anzeige() wird in
der ISR ein Flag gesetzt.
Etwa so:
1
volatilecharupdateanzeige;
2
:
3
main(){
4
while(1)
5
{
6
if(updateanzeige){
7
anzeigen();
8
updateanzeige=0;// fertig, Flag löschen
9
}
10
}
11
12
}
13
:
14
ISR(TIMER2_COMP_vect)//4)Führe diese ISR bei Overflow von TCNT0 aus
Patrick R. schrieb:
> edit: hab nu die Änderungen ( bis auf das mit der anzeigen funktion)> vorgenommen aber jetzt ist der irgendwie zu schnell????
Um welchen AVR geht es denn genau?
Beim Mega8 z.B. sind CS20+CS21 ein Teiler von 32 (und nicht 64).
ah ok dann is klar warums net geht is nemmich genau der ^^. Tja das war
wohl ein blick ins datenblatt zu wenig ^^ thx
edit: hab nu im datenblatt folgendes gefunden:
The prescaled clock has a frequency of either f/8, f/64, f/256 or f/1024
also müsse der doch stimmen...
Patrick R. schrieb:
> edit: hab nu im datenblatt folgendes gefunden:> The prescaled clock has a frequency of either f/8, f/64, f/256 or f/1024
Jede Wette, das Zitat stammt aus den Kapitel:
Timer/Counter0 and Timer/Counter1 Prescalers
(du verwendest Timer2)
Kann hier aber keiner wirklich kontrollieren, da wir ja immer noch nicht
wissen, welcher AVR.
hab vorher das geschrieben:
>ah ok dann is klar warums net geht is nemmich genau der<
-> also n ATmega8
hab den code nun überarbeitet und (1<<CS22) gesetzt, nun zählt er im
richtigen tempo ^^
Vielen Dank nochmal für eure hilfe