Dann versuch' Dich mal hiermit:
Edit: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
µ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:
zu ändern. Dann LCD anpassen und der Analog-Comparator-Pin ist auch ein anderer.Code:Frequency = 830996156 / Measure_result If Ovf_ctr > 126 Then







Zitieren

Lesezeichen