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