PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Genauigkeit ATMEGA16 mit 16MHz Quartz



Arne
14.12.2004, 17:38
Hi,

wie genau ist der Timer1 des ATMEGA16?
Ich habe mit Hilfe von rnAVR und zum Teil geklauten :-) Code eine Uhr geschrieben. Diese Uhr lief die 1. Stunde vor und jetzt nach (je ca 20 Sek). Ist das normal oder mein Code so schlecht (bin Anfänger)?


Cls
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
Config Lcd = 16 * 2


Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte


Config Timer1 = Timer , Prescale = 256
On Timer1 Timer_irq
Const Timervorgabe = 3036

Enable Timer1
Enable Interrupts


Stunde = 16 'Uhr stellen
Minute = 27


Do
'Hier könnte Ihr Hauptprogramm stehen
Loop



'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
'Timer1 = Timervorgabe

Sekunde = Sekunde + 1
If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
If Stunde = 24 Then Stunde = 0
End If
End If
Cls
Lcd Stunde ; ":" ; Minute ; ":" ; Sekunde
Return



P.S.: Ich benutze ein 16MHz Quartz

Adam
14.12.2004, 20:31
Ich weiß nicht ob du den Prescaler richtig eingestellt hast d.h. ob der Interrupt wirklich nach jeder Sekunde ausgelöst wird. Man kann das ausrechnen wir groß der Prescaler sein müss bei 16Mhz für eine Sek. aber da bin ich überfragt.

recycle
18.12.2004, 03:12
Diese Uhr lief die 1. Stunde vor und jetzt nach (je ca 20 Sek). Ist das normal oder mein Code so schlecht (bin Anfänger)?


Wenn rnAVR dir für eine Frequenz von 1 Hz eine Timervorgabe von 3036 ausrechnet und du diese Timervorgabe im Programmcode auskommentierst, ist es eigentlich normal, dass deine Uhr falsch geht.

Ohne die Timervorgabe werden deine Sekunden ca. alle 950 ms anstatt einmal pro Sekunde hochgezählt.
Dass deine Uhr erst ca. 20 Sekunden vor und dann 20 Sekunden nach geht erklärt das allerdings auch nicht, theoretisch müsste sie konstant vorgehen.