kolisson
16.09.2009, 01:13
hier einmal ein quelltext für die messung von niedrigen frequenzen
durch periodenmessung mit hilfe der input-capture funktion.
viel spass
klaus
' 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
durch periodenmessung mit hilfe der input-capture funktion.
viel spass
klaus
' 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