-
Hallo,
also die Idee mit dem Wikibeitrag fände ich sehr gut, ich denke das viele Anfänger immer über die gleichen Probleme stolpern.
Ich habe zwar ein Buch 'Programmieren der AVR - Risc mit Bascom-AVR' von Claus Kühnel, das ist auch nicht schlecht aber solche Probleme und Fragen werden darin überhaupt nicht behandelt.
Vieleicht kennst Du ein Buch das speziell die Mega8,16 und 32 behandelt.
Mit dem Datasheet in englischer Sprache komme ich oft nicht zurecht.
Hier mal den Code, ich habe dabei noch das LCD Display getestet. Es geht mir aber hauptsächlich um die Timer0 generierte Zeit.
Den Wert von Variable A habe ich aus dem Buch von Herrn Kühnel.
T=256*prescaler/Fosc
rein rechnerisch komme ich auf einen Wert 1/Interrupt = 122, mit diesem wert zähle ich dann bis auf eine Minute.
Ich mußte den Wert aber auf 126 setzen damit ich annähernd auf eine Sekunde komme.
Code:
$regfile = "M16def.dat" ' specify the used micro
'$crystal = 8000000 ' used crystal frequency
$baud = 9200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim
Const On = 1
Const Off = 0
Dim A As Word
Dim C As Word
Config Portd = Input
Portd = 255
Config Portc = Output
Portc = 255
Config Timer0 = Timer , Prescale = 256
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.0 , Rs = Portb.1
Config Lcdbus = 4
Config Debounce = 50
Taster Alias Portd.0
Anzeige Alias Portb.2
A = 0
C = 0
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts
Do
If C = 60 Then
Toggle Portc.1
End If
Wait 1
Debounce Pind.0 , 0 , Anzeige_aus , Sub
Cls
Lcd "Guten Tag"
Locate 2 , 1
Lcd C
Toggle Portc.0
Wait 1
Loop
Anzeige_aus:
If Anzeige = On Then
Anzeige = Off
Else
Anzeige = On
End If
Return
Timer0_isr:
Incr A
If A = 126 Then
Incr C
End If
If A > 126 Then
A = 0
End If
If C > 59 Then
C = 0
End If
Return
Also nach der Formel müßte alle 8,192ms ein Interrupt ausgelöst werden, demnach müßte ich nach 122 interrupst eine Sekunde haben.
Vieleicht mache ich da auch einen gedanklichen Fehler, aber der es so aus als wenn der Controller zu schnell liefe. Deshalb habe ich dann auf 126 geändert, in diesem fall habe ich eine Abweichung von 0,5 Sek. Wenn ich nun aber hochrechne auf einige Stunden, dann ist die Abweichung natürlich inakzeptabel.
Gruß Harald
-
Hi,
für die Timerberechnung gibt es im Downloadbereich das Programm rnavr,
mit dem kann man die Timer sehr gut berechnen.