' 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.= Input                                       'Zählereingang auf Input


'Lcd -Anzeige konfigurieren , 8 Zeichen in einer Zeile:
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portc., Db5 = Portc., Db6 = Portc., Db7 = Portc., E = Portb., 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