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







Zitieren

Lesezeichen