' Starttaster Port B, Pin 2 ' ' ' Relais Port B, Pin 3 ' ' ' VIEL SPASS ' Matthias ' '--------------------------------------------------------------------------' $regfile = "m8def.dat" ' BASCOM AVR Steuerdatei für ATmega8 $crystal = 3686400 ' 3,6864 Mhz Quarz $baud = 9600 '------------------------------------------------------------------------------ ' Initialisierung des LCD Displays (unveränderte Standardbelegung) ' Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Lcdbus = 4 Cls Cursor Off Noblink ';-------------------------- Timererläuterung ------------------------------------ ';Prescale = 8 'Überlauf ';3,6864 MHZ / 8 = 460,8khz / 256 = 1,8 kHZ alle 0,5555 ms kommt ein Überlauf ';Prescale = 1024 ';3,6864 MHZ / 1024 = 3,6khz / 256 = 14 HZ alle 71 ms kommt ein Überlauf 'Beispiel: ';Gesucht = alle 10 ms bei Prescale 1024 soll ein Timerüberlauf stattfinden. '; ';Lösung: 1 / 0,01(sec) = 100 Hz d.h. Teiler für 3,6 khz = 3600/100 = 36 '; Timer läuft bei 256 über. 256-36 = 220, d.h der Timer muss mit 220 '; vorgeladen werden damit alle 10 ms ein Überlauf und somit ein Interrupt '; ausgelöst wird. '; ';-------------------------- Einschaltinitialisierung ----------------------------- Declare Sub Ausgeben ';Up für das Ausgeben der Zeit $regfile = "m8def.dat" ';ATmega8-Deklarationen $crystal = 3686400 ';Quarz: 3,6864 MHz $baud = 9600 Dim Stopzeit As Byte Dim Strstopzeit As String * 3 Dim Strsekunden As String * 2 Dim Strminuten As String * 2 Dim Strstunden As String * 2 Dim Sekunden As Byte Dim Sekundenbackup As Byte Dim Minuten As Byte Dim Stunden As Byte Dim Nr As Byte Dim Stopstart As Bit Dim Fertig As Bit ';Konstanten Const Timervorgabe = 220 ';Voreinstellung für 10ms Interrupt bei 3,6 kHZ ';LCD Anzeige definieren Config 1wire = Portc.5 ';Definieren ob Ein oder Ausgang '; 76543210 Ddrc = &B00100000 ';1 = Ausgang 0 = Eingang ';Ddrb = &B00011111 '1 = Ausgang 0 = Eingang ';Ddrc = &B00000000 '1 = Ausgang 0 = Eingang ';Pull Up's der verwendeten Eingänge aktivieren Portc.4 = 1 ' ; Taster "Start" Portc.5 = 1 ' ; TASTER "Stop " ';Interrupthandling für Timer 0 Enable Interrupts ';Interrupts global einschalten On Timer0 Ontimer0 ';Interrupt Routine für Timer0 overflow ';Timer 0 definieren Config Timer0 = Timer , Prescale = 1024 ';Timer für die Timeoutkontrolle Enable Timer0 ';Timer 0 Overflow-Interrupt ein Stop Timer0 Cls Locate 1 , 1 Lcd "Stopptime" Locate 2 , 1 Lcd "Warte auf Start" ';Hauptschleife-------------------------------------------------------------------------------- Do ';Start Taster If Pinc.4 = 0 And Stopstart = 0 Then Start Timer0 Timer0 = Timervorgabe Stopstart = 1 Stopzeit = 0 ' Print "Start" End If ';Stop Taster If Pinc.5 = 0 And Stopstart = 1 Then Stop Timer0 Stopstart = 0 Fertig = 1 Nr = Nr + 1 ' Print "Stop" End If ';Laufende Zeit ausgeben wenn sich die Sekunde wechselt If Stopstart = 1 And Sekunden <> Sekundenbackup Then Call Ausgeben Sekundenbackup = Sekunden End If ';Ergebnis visualisieren If Fertig = 1 Then Call Ausgeben ';Variablen löschen Fertig = 0 : Stunden = 0 : Minuten = 0 : Sekunden = 0 : Stopzeit = 0 End If Loop ';Ende Hauptschleife-------------------------------------------------------------------------------- Sub Ausgeben ';Ausgeben der Stopzeit auf das LCD Display ';Hundertstel Sekunden formatieren Strstopzeit = Str(stopzeit) If Len(strstopzeit) = 1 Then Strstopzeit = "0" + Strstopzeit Strstopzeit = Strstopzeit + "0" ';Sekunden formatieren Strsekunden = Str(sekunden) If Len(strsekunden) = 1 Then Strsekunden = "0" + Strsekunden ';Minuten formatieren Strminuten = Str(minuten) If Len(strminuten) = 1 Then Strminuten = "0" + Strminuten ';Stunden formatieren Strstunden = Str(stunden) If Len(strstunden) = 1 Then Strstunden = "0" + Strstunden ';Auf dem Display ausgeben Cls ';Display löschen Locate 2 , 1 Lcd Strstunden ; ":" ; Strminuten ; ":" ; Strsekunden ; ":" ; Strstopzeit Print Nr ; "-> " ; Strstunden ; ":" ; Strminuten ; ":" ; Strsekunden ; ":" ; Strstopzeit Cursor Off End Sub Ontimer0: ';Ontimer 0 wird immer bei einem Überlauf von Timer 0 als Interruptroutine aufgerufen. ';Timer 0 wird mit 220 vorgeladen, der Überlauf erfolgt bei 256. Somit ergibt sich ein ';Interruptinterval von 10 ms Timer0 = Timervorgabe ';für 10 ms Interrupt If Stopstart = 1 Then Incr Stopzeit If Stopzeit = 100 Then Incr Sekunden Stopzeit = 0 If Sekunden = 60 Then Incr Minuten Sekunden = 0 If Minuten = 60 Then Minuten = 0 Incr Stunden End If End If End If End If Return ';Return ist am Ende der Interrupt Routine sehr wichtig End