Die Konstante wurde wie gesagt von dem Programm rnAVR berechnet, was du hier im Forum auch als Download findest.
Die Konstante ist glaube ich da zu da, damit man die Auflösung feiner einstellen kann.
Druckbare Version
Die Konstante wurde wie gesagt von dem Programm rnAVR berechnet, was du hier im Forum auch als Download findest.
Die Konstante ist glaube ich da zu da, damit man die Auflösung feiner einstellen kann.
Nun, wenn ich das richtig sehe, wird der Timer nach seinem Interrupt mit diesem Wert geladen, somit vergeht weniger Zeit bis zu seinem nächsten Interrupt.
"Const" deklariert die Variable "Timervorgabe" als Konstante, damit ist sie sozusagen schreibgeschützt und man kann nicht einfach im Programm einen neuen Wert drüberbügeln.
Allerdings dürfte der erste Zyklus nach dem Anlauf nicht stimmen, weil der Timer bei 0 startet, sonst ist der erste Timerdurchlauf zu lang.
Etwa so müsste es aber von Anfang an richtig gehen:
$regfile "m8def.dat"
$crystal = 8000000
Config Portd = Output
led alias portd.0
Config Timer1 = Timer, Prescale = 256
Const Timervorgabe = 3036
on timer1 ontimer1
enable timer1
enable interrupts
Timer1=Timervorgabe
do
loop
ontimer1:
Timer1 = Timervorgabe
Toggle Led
Return
Ich hab mal einfach hardstyler´s Programm geklaut... O:)
Viele Grüße
Torsten
Hallo,
habe jetzt mal das programm rnavr probiert. ein feines tool. meine uhr läuft schon.
lasse die jetzt mal laufen um rauszubekommen wie genau die läuft. werde ich dann morgen früh mitbekommen.
cu arno
habe die uhr jetzt ne weile laufen lassen und rausbekommen das die ca nach 7 stunden ( da ist die nacht vorbei *grins*) 20sekunden falsch geht.
das ist ne ganz schön große Abweichung. woran kann das liegen?
ich würde ja mal vermuten, das der interrupt zwar korekt funktioniert aber ebend ne mini sekunde ungenau geht und dadurch bei hoch rechnen und zählen sich fehler einschleichen. weil die ganzen werte habe ich mit dem tool rnavr berechnet. danke also mal das es stimmt :-)
mir würde am ende adann nur einfallen das ich die stunden anders hochrechne und dort ebend so 2-3 sekunden unter den tisch fallen lasse damit die zeit wieder stimmt, nur wäre das für mich keine richtige lösung.
achja, das programm soll einfach eine zeit zählen, es läuft bis 9999h und so. deswegen sind halt bei 7h 20 sekunden fehler schon ne menge.
hier mein Programm:
thx für eure hilfeCode:'********************************
'* Atmega8 mit 8MHz *
'* Uhrenbeispiel *
'********************************
$regfile "m8def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.2 , Rs = Portd.0
Config Lcdbus = 4
Config Lcd = 16 * 2
Dim S As Byte , M As Byte , H As Byte , G As Byte 'Zeit definieren
S = 0
M = 0
H = 0
G = 0
Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 34286
On Timer1 Ontimer1
Enable Timer1
Enable Interrupts
Cls
Do
Waitms 200
Locate 1 , 1
Lcd "UHR-Zeit"
Locate 2 , 2
Lcd ; G ;
Locate 2 , 4
Lcd ; H ;
Locate 2 , 7
Lcd ; M ;
Locate 2 , 10
Lcd ; S ;
Loop
'*******************************************************************************
Ontimer1:
Timer1 = Timervorgabe
S = S + 1
If S = 60 Then 'Sekunde
S = 0
M = M + 1
If M = 60 Then 'Minute
M = 0
H = H + 1
If H = 100 Then 'Zehner Stunde
G = G + 1
If G = 99 Then 'hunderter stunden
End If
End If
End If
End If
Return
'*******************************************************************************
Der interne Quarz des Mega 8 ist nicht so genau wie ein Externer.
Schau doch mal ins Datenblatt, da steht die Abweichung drin.
Viele Grüße
Torsten
Erstmal keine Panik.Zitat:
Zitat von Olle_Filzlaus
Grundsätzlich gehts ja richtig.
Nun kommt die Feinabstimmung.
Thorsten hats ja schon gesagt das der Interne Schwinger nicht gerade ein Muster an Genauigkeit ist was übrigens auch im Datenblatt behandelt wird.
Wenn du deine Schaltung bei unterschiedlichen Temperaturen betreibst (Mal ne Nacht auffer Heizung bzw. im Gemüsefach vom Kühlschrank) wirst du feststellen das der interne Schwinger auch recht Temperaturabhängig ist.
Für eine Anwendung die auf ein genaues Timing setzt ist ein genauerer Takt unbedingt nötig.
Also ein Quarz ist da minimum.
der wird dir schon bessere und Temperaturstabilere Werte liefern.
Was dann noch an Ungenauigkeit übrigbleibt kannst du dann ausgleichen indem du ihn "ziehst".
dh. mit einem kleinen Drehkondensator (Oder ausgemesenem Festkondensator) wird die Schwingfrequenz etwas angepasst.
Dabei gilt natürlich auch hier die Regel des Aufwandes.
Je genauer du es brauchst desto mehr must du anstellen.
Die Steigerung für einen quarz ist ein Qarzofen (Ein Kästchen in dem die Temperatur konstant gehalten wird) oder ein speziell Kompensierter Schwinger.
Natürlich schlägt das im Preis nieder also sollte man sich genau überlegen was man braucht.
Ich würde erstmal ,zwecks Erfahrungswerte,mit nem quarz und nem Trimmerkondensator anfangen.