Hi,
folgendes gegeben: Durchflusssensor an Heizungsanlage, Open Collektor Ausgang, 96 Impule pro Liter, Pullup 4,7K. Signal an pind.0 eines Atmega8 angeschlossen. Interner RC Oszillator. Ansonsten orginal Fusebits.
Gemessen wird mit Timer1 von Fallender zu Fallender Flanke. Allerdings bekomme ich keine richtigen Werte. Zeit von Fallender bis Fallender Flanke mit Oszi gemessen. 60ms. Ergibt laut Adam Riese 625 Liter pro Stunde. Der AVR zeigt mir aber irgendwas um die 910 Liter an. Habe auchmal einen neuen genommen. Gleiches Ergebnis. Hab ich irgend einen Denkfehler?
Code:
$regfile "m8def.dat"
$crystal = 2000000
$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 = 64
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
Tccr1b = &B00000011
State = 1
Waitms 1
Gosub Wait_one
Gosub Wait_zero
End If
If State = 1 Then
State = 0
Gosub Auswerten
Gosub Wait_one
End If
Loop
Auswerten:
Tempword1 = Tcnt1l
Tempword = Tcnt1h * 256
Tempword = Tempword + Tempword1 'ca 2031.3
Templong = Tempword * 95 'Zeit für 1 Liter
Tempsingle = 31250 / Templong 'Liter pro Sekunde
Durchflusstemp = Tempsingle * 3600 'Liter pro Stunde
If Durchflusstemp > 200 And Durchflusstemp < 1000 Then
Durchfluss = Durchflusstemp
End If
Timer1 = 0
Incr Displaywarten
If Displaywarten = 50 Then
Locate 1 , 1 : Lcd "Durchfluss:"
Locate 2 , 1 : Lcd Durchfluss ; " L/h " ; Tempword ; " "
Displaywarten = 0
End If
Return
Wait_one:
Do
If Pind.0 = 0 Then
Return
End If
Loop
Return
Wait_zero:
Do
If Pind.0 = 0 Then
Tccr1b = &B00000000
Return
End If
Loop
Return
Lesezeichen