Hab jetzt noch ein paar wartezeiten eingefügt zum entprellen eingefügt. Und die Bedingungen der Subroutinen geändert. Nach anpassung der 31250 auf die tatsächliche Taktfrequenz läuft es nun bestens.
Code:
$regfile "m8def.dat"
$crystal = 8000000
$hwstack = 30
$swstack = 30
$framesize = 30
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.7 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portd.5 , Rs = Portd.4
Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Config Portd.3 = Output 'R/W vom Display
Config Pind.0 = Input
Portd.3 = 0
Dim State As Bit
Dim Durchfluss As Word
Dim Durchflusstemp As Word
Dim Tempword As Word
Dim Tempword1 As Word
Dim Templong As Long
Dim Tempsingle As Single
Dim Displaywarten As Byte
State = 0
Wait 1
Cls
Cursor Off
'Hauptprogramm
Do
If Pind.0 = 0 And State = 0 Then
Start Timer1
State = 1 'Status 1
Waitms 1 'Entprellen
Gosub Wait_one
Waitms 1
Gosub Wait_one
Waitms 2
Gosub Wait_zero
End If
If State = 1 Then
State = 0 'Status 0
Gosub Auswerten
Waitms 1 'Evtl. Entprellen
Gosub Wait_one
Waitms 1
gosub wait_one
End If
Loop
Auswerten:
Tempword1 = Tcnt1l
Tempword = Tcnt1h * 256
Tempword = Tempword + Tempword1
Templong = Tempword * 96 'Zeit für 1 Liter
Tempsingle = 31600 / Templong 'Liter pro Sekunde
Durchflusstemp = Tempsingle * 3600 'Liter pro Stunde
Durchfluss = Durchflusstemp
Timer1 = 0
Incr Displaywarten
If Displaywarten = 30 Then
Locate 1 , 1 : Lcd "Durchfluss:"
Locate 2 , 1 : Lcd Durchfluss ; " L/h " ; Tempword ; " "
Displaywarten = 0
End If
Return
Wait_one:
Do
Loop Until Pind.0 = 1
Return
Wait_zero:
Do
Loop Until Pind.0 = 0
Stop Timer1
Return
Im Endstadium werde ich wie bei meiner anderen Anlage auch das ganze über den ICP Pin einlesen.
Lesezeichen