Dann versuch' Dich mal hiermit:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.1 , Db6 = Portd.5 , Db7 = Portd.0 , E = Portd.2 , Rs = Portd.3
Config Lcd = 16 * 2
Cursor Off
Const True = 1
Const False = 0
Const Measure_success = 0
Const Measure_failed = 1
Const Measure_request = 2
Dim Frequency As Long
Dim Capt_prev_val As Word
Dim Capt_curr_val As Word
Dim Measure_result As Long
Dim Capt_result As Word At Measure_result Overlay ' Differenz aus Capture beschreibt das Low-Word von Measure_Result
Dim Ovf_result As Word At Measure_result + 2 Overlay ' Mit dem Overflowergebnis das High-Word von Measure_Result beschreiben, spart das multiplizieren mit 65536
Dim Ovf_ctr As Word
Dim F_str As String * 10
' Variablen zur Ablaufsteuerung
Dim Got_edge As Byte
Dim Measure_status As Byte
Config Timer1 = Timer , Prescale = 1 ' , Noise Cancel = 1 ' , Capture Edge = Falling ' , Noise Cancel = 1
' Trigger durch Analogkomperator an Pin4, AIN1, AIN0 an Bandgap Reference 1V
Config Aci = On , Compare = On
Acsr.acbg = 1
On Capture1 Isr_capt Nosave
Enable Capture1
On Ovf1 Isr_ovf
Enable Ovf1
Ovf_ctr = 0
Got_edge = False
Tifr = Bits(icf1 , Tov1)
Enable Interrupts
Initlcd
Cursor Off Noblink
Cls
Locate 1 , 1
Lcd "START"
Wait 2
Cls
Do
Locate 1 , 1
Measure_status = Measure_request
While Measure_status = Measure_request
Wend
If Measure_status = Measure_failed Then
Lcd "Timeout K.Erg."
End If
If Measure_status = Measure_success Then
If Measure_result > 0 Then
Measure_result = Measure_result / 10
' Frequency = 826787928 / Measure_result ' Kalibrierung für abweichenden internen RC Oszillator
Frequency = 830996156 / Measure_result
' Frequency = 800000000 / Measure_result
F_str = Str(frequency)
Lcd "Freq: " ; Format(f_str , "000.000") ; " Hz"
Else
Lcd "Fehler, Ergebnis = 0"
End If
End If
Waitms 50
Loop
End
Isr_capt:
PUSH R22
LDS R22, ICR1L
STS {Capt_curr_val}, R22
LDS R22, ICR1H
STS {Capt_curr_val +1}, R22
POP R22
Pushall
If Measure_status = Measure_request And Got_edge = True Then ' Messung angefordert und eine Flanke erkannt ?
Capt_result = Capt_curr_val - Capt_prev_val ' Ja, dann Werte übernehmen
Measure_status = Measure_success
If Capt_curr_val < Capt_prev_val Then ' Natürlicher Overflow ?
Decr Ovf_ctr ' Bereichsgrenze überschritten, Overflows um 1 erniedrigen
End If
Ovf_result = Ovf_ctr
End If
Capt_prev_val = Capt_curr_val ' Aktuellen CAP-Wert speichern
Ovf_ctr = 0 ' Overflowzähler zurücksetzen
Got_edge = True
Popall
Return
Isr_ovf:
Incr Ovf_ctr
' If Ovf_ctr > 122 Then ' Niedrigste Messfrequenz 1 Hz unterschritten
If Ovf_ctr > 126 Then ' Korrektur für zu hohe RC Oszillatorfrequenz
Got_edge = False
Ovf_ctr = 0
If Measure_status = Measure_request Then Measure_status = Measure_failed
End If
Return
Edit:
µC wird momentan mit 'nem 16MHz Quarz betrieben, war noch so im Code gestanden, hab's geändert.
Musst die Werte halt auf 4MHz Takt anpassen.
EditEdit:
Hab' gerad' mal den ATMega8 als µC angegeben, das compiliert ohne Probleme. Es sollte also reichen den Takt auf 4MHz anzupassen, da ist nur:
Code:
Frequency = 830996156 / Measure_result
If Ovf_ctr > 126 Then
zu ändern. Dann LCD anpassen und der Analog-Comparator-Pin ist auch ein anderer.
Lesezeichen