Hier mal das ganze Programm:
Man sieht, der Timer ist auf 1MHz eingestellt, also Messeinheit 1µs. Schafft der µC das?
Code:
'#####################################################
$regfile = "m8def.dat" 'ATmega8 mit externem 16 MHz Quarz
$crystal = 16000000
$baud = 9600
'############ Variablen ##############################
Dim Mikrosekunden As Long
Dim Sekunden As Single
Dim Geschwindigkeit As Single
Dim Strecke As Single
Dim Ausgabe As String * 5
Strecke = 0.1 'Länge der Messstrecke in Metern
'############ Interrupts & Timer konfigurieren #######
Config Int0 = Falling 'Beide Male bei fallender Flanke reagieren
Config Int1 = Falling
Enable Interrupts
Enable Int0 'Die Erste Schranke aktivieren, die zweite noch sperren
On Int0 Isr_schranke1
On Int1 Isr_schranke2
Config Timer1 = Timer , Prescale = 1
On Timer1 Timer_irq
Const Timervorgabe = 65520
'############ Ein- und Ausgänge ######################
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output
Portd.2 = 1 'Interne Pull-Up Widerstände aktivieren
Portd.3 = 1
'############ LCD Display ############################
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 1
Cls
Cursor Off Noblink
'############ Bezeichnungen ##########################
Schranke1 Alias Pind.2
Schranke2 Alias Pind.3
Led1 Alias Portd.6
Led2 Alias Portd.7
Lcdlicht Alias Portb.0
'############ Hauptschleife ##########################
Do
If Schranke1 = 0 Then Led1 = 0 Else Led1 = 1
If Schranke2 = 0 Then Led2 = 0 Else Led2 = 1
Loop
End
'############ Interrupt-Routinen #####################
Isr_schranke1:
Disable Int1
Enable Timer1
Return
Isr_schranke2:
Disable Timer1
Sekunden = Mikrosekunden / 1000000
Geschwindigkeit = Strecke / Sekunden
Geschwindigkeit = Geschwindigkeit * 3.6
Ausgabe = Fusing(geschwindigkeit , "#.#")
Cls
Lcd Ausgabe
Mikrosekunden = 0
Enable Int0
Return
Timer_irq:
Timer1 = Timervorgabe
Incr Mikrosekunden
Return
Grüße, Björn
Lesezeichen