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.
Also nach der Formel müßte alle 8,192ms ein Interrupt ausgelöst werden, demnach müßte ich nach 122 interrupst eine Sekunde haben.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
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







Zitieren

Lesezeichen