hier einmal ein quelltext für die messung von niedrigen frequenzen
durch periodenmessung mit hilfe der input-capture funktion.

viel spass
klaus

Code:
 
' Bascom Frequenzzähler für langsame Frequenzen: Zeit zwischen den Flanken zählen
' unter verwendung der input capture einheit



' dieser code basiert auf einem C quelltext von
' Autor:  Karl heinz Buchegger (kbuchegg) (Moderator)
' Datum: 08.02.2007 22:28
' Dateianhang : Freqcount.c
' aus dem Microcontroller.net

' umsetzung für Bascom durch kolisson 15.09.2009


$baud = 115200


' **********************  hier noch deinen crystal rein
$crystal = 14745600
$regfile = "m8def.dat"

$hwstack = 32
$swstack = 10
$framesize = 40


' ++++++++++++++++++++++++++++++++++   hier wird $crystal ausgelesen
Dim Quartzfrequenz As Long
    Quartzfrequenz = _xtal
' ********************************************** hier den prescaler für timer1 definieren
' zulässig sind 1,8,64,256,1024
Const Prescalerwert = 1
' in dieser version wird der overflow von T1 ausgewertet und mitgezählt
' daher kann man mit prescale = 1 d.h. volle auflösung fahren

'******************** und den capturetimer configurieren  ********************
Config Timer1 = Timer , Capture Edge = Falling , Prescale = 1       'Prescalerwert
Start Timer1
' ****************************************************************************

' *********** das zu messende digitalsignal  wird am ICP1 eingang (hier PB0) eingespeist



Dim Starttime As Word
Dim Endtime As Word
Dim Nroverflows As Byte
Dim Ersteflanke As Bit
Dim Updatedisplay As Bit
Dim Taktejesekunde As Long
Dim Periodendauer As Single
Dim Frequenz As Single
Dim Counterticks As Long
Taktejesekunde = Quartzfrequenz / Prescalerwert


Dim Maxoverflows As Long
Maxoverflows = Taktejesekunde / 65535


'*****  zwei werte zur verzögerung des seriellen ausgabe
'*****  sonst verschluckt sich das terminalprogramm
'*****   kleinerer wert = schnellerer output
Dim Outputcounter As Byte
Const Anzeigeinterval = 10
'***************************

Ersteflanke = 1
Updatedisplay = 0

'*********************************  option eingangscomparator
' diese 2 zeilen sind optional zu verwenden
' da der icp1 eingang ja logigpegel benötigt
'besteht hier die möglichkeit anstelle des icp den ain1 eingang des comparators zu verwenden
' der eingang ist dann empfindlicher --- schwelle etwa 1,23 volt '
' der icp1 eingang gilt dann nicht mehr als eingang und kann als normaler port verwendet werden
Config Aci = On , Compare = On
Acsr.6 = 1                                                  'interne bandgap als ref
'*********************************  ende option eingangscomparator


'  ******************* und die int routinen  definieren
On Ovf1 T1overflow
Enable Ovf1

On Capture1 Captureint                                      'wenn pb0 auf low geht  dann capture int
Enable Capture1

Enable Interrupts


' *************  und los gehts

Do

     If Nroverflows > Maxoverflows Then
     Print "freq kleiner 2 Hz"
     Nroverflows = 0
     Updatedisplay = 0
     Ersteflanke = 1
     End If

If Updatedisplay = 1 Then





     If Outputcounter = Anzeigeinterval Then

     'Disable Capture1
    'Disable Ovf1
    Disable Interrupts

     ' //
     ' // Die Zeitdauer zwischen den Flanken bestimmen
     ' // Da EndTime und StartTime unsigned sind, braucht nicht
     ' // darauf Ruecksicht genommen werden, dass EndTime auch
     ' // kleiner als StartTime sein kann. Es kommt trotzdem
     ' // das richtige Ergebnis raus.
     ' // Allerdings muss die Anzahl der Overflows in der Messperiode
     ' // beruecksichtigt werden
     ' //
     ' // Die Zeitdauer wird als Anzahl der Taktzyklen zwischen den
     ' // beiden gemessenen Flanken berechnet ...

      Counterticks = Nroverflows * 65536
      Counterticks = Counterticks + Endtime
      Counterticks = Counterticks - Starttime

      '// ... mit der bekannten Taktfrequenz ergibt sich dann die Signalfrequenz
      Periodendauer = Counterticks / Taktejesekunde
      Frequenz = 1 / Periodendauer

     ' //
     ' // Das Ergebnis fuer die Anzeige aufbereiten ...
     ' //
     ' // ... und ausgeben
     ' //

      Print " Counterticks= " ; Counterticks

      Print " Periodendauer= " ; Periodendauer

      Print " Frequenz=  " ; Frequenz

     ' //
     ' // Das wars: Display ist wieder up to date
      '// die naechste Messung kann starten
      '//

     Outputcounter = 0
     'Timer1 = 0
     'Enable Capture1
     'Enable Ovf1
     Enable Interrupts
     End If

      Outputcounter = Outputcounter + 1
      Counterticks = 0
      Updatedisplay = 0

  End If


Loop


End                                                         'end program



T1overflow:
Nroverflows = Nroverflows + 1
'Print "timer1 overflow"
Return


Captureint:
If Updatedisplay = 1 Then Return                            '// Das Display wurde mit den Ergebnissen der vorhergehenden
                                                             '// Messung noch nicht upgedated. Die naechste Messung
                                                             '// verzögern, bis die Start und EndTime Variablen wieder
                                                             '// gefahrlos beschrieben werden koennen

If Ersteflanke = 1 Then
 Starttime = Capture1
 Nroverflows = 0
 Ersteflanke = 0                                            ' / / Die Naechste Flanke Ist Das Ende Der Messung

 Else

Endtime = Capture1
Updatedisplay = 1                                           ' / / Eine Vollständige Messung. Sie Kann Ausgewertet Werden
Ersteflanke = 1                                             '/ / Bei Der Naechsten Flanke Beginnt Der Naechste Messzyklus

End If

Return