' Das Zählerprogramm
' Das Grundgerüst des Programms geht auf eine Veröffentlichung von
' Roland Walter in der FA 1/03 zurück, wurde aber verändert und angepasst.
'
' Frequenzzähler bis 10 MHz ohne Vorteiler und
' vorgeschaltetem Schmitt-Trigger 74AC14. Eingang: 50mV Spitze-Spitze oder größer
'
' Torzeit = 1 Sekunde:
' Berechnet sich aus Quarzfreq / Timer0-Vorteiler * 256 Timer0-Steps * 1500 Timer0-Überläufe.
' 24576000 Hz / 64 * 256 * 1500 = 1 Sekunde
'$PROG &HFF , &HEF , &HDF , &HF9 ' generated. Take care that the chip supports all fuse bytes.
$regfile = "m88def.dat"
$crystal = 24576000 '10240000 'Quarz: 10,240 MHz
$baud = 4800
Dim Countlo As Word 'Low Word Zähler
Dim Counthi As Word 'High Word Zähler
Dim Count As Long 'Resultat der Zählung
Dim Temp As Long 'temp Variable
Dim Timer0_durchlaeufe As Integer
Dim S1 As String * 11
Dim S2 As String * 11
'TimerO (für Torzeit) und Timerl (als Zähler) konfigurieren:
On Timer0 On_timer0_overflow
Config Timer0 = Timer , Prescale = 64 'Torzeit-Timer mit Takt/64
On Timer1 On_counter_overflow
Config Timer1 = Counter , Edge = Rising
Config Pind.5 = Input 'Zählereingang auf Input
'Lcd -Anzeige konfigurieren , 8 Zeichen in einer Zeile:
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.1 , Rs = Portb.0
Cls
Cursor Off
'cursor blink
Locate 2 , 1
Lcd "Frequenzz{225}hler";
Enable Timer0 'TimerO-Intermpts ein für Torzeit)
Enable Interrupts 'Alle Interrupts ein
Start Timer0
Main:
Goto Main
On_timer0_overflow: 'Wenn Timer0 überläuft
If Timer0_durchlaeufe = 0 Then 'Zähler starten
Enable Timer1 'Zähler-Overflow-Interrupts ein
Start Timer1
Timer0_durchlaeufe = 1
Elseif Timer0_durchlaeufe < 1500 Then '1500 Timer0 - Umläufe warten
Incr Timer0_durchlaeufe
Else 'Tor schließen, 1 Sek. vorbei, nun Zähler lesen
Stop Timer1
Disable Timer1 'Zähler-Overflow-Interrupts ausschalten
Countlo = Timer1 'Low Word lesen
Timer1 = 0 'Zähler zurücksetzen
Timer0_durchlaeufe = 0
Temp = Counthi * 65536
Count = Temp + Countlo
Print Count
Locate 1 , 1
S1 = Str(count)
S2 = Format(s1 , "000000000")
S1 = Left(s2 , 3) + "." + Mid(s2 , 4 , 3) + "." + Right(s2 , 3)
Lcd "FREQU=" ; S1 ; "Hz"
Count = 0
Counthi = 0
Countlo = 0
'Interruptanforderungen löschen
Tifr0.tov0 = 1 'TimerO-Overflow-Flag löschen (nicht = 0!!!)
Tifr1.tov1 = 1 'Timerl -overflow -flag Löschen(nicht= 0!!!)
End If
Return
On_counter_overflow: 'für TIMER 1
Incr Counthi 'High Word des Zählers erhöhen (Count+65536)
Return