Gast
#2022701
Hallo alle zusammen ich habe jetzt ein programm fertig was sehr träge
läuft.Ich benutze einen Atmega8 intern 8Mhz.Kann mir einer sagen was ich
verändern kann um es zu verschnellern?Der ADC reagiert träge und das
Display.MfG Sebastian
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Cursor Off
Config Portb.1 = Output
Config Portc.0 = Input
Config Portc.1 = Input
Config Portb.2 = Output
Config Portb.0 = Input
Portb.0 = 1
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
Dim Ovf_result As Word At Measure_result + 2 Overlay
Dim Ovf_ctr As Word
Dim Ovf_exeed_ctr As Byte
Dim Grad As Word
Dim Grad1 As Word
Dim Rpm As Word
Dim F_str As String * 10
Dim Got_edge As Byte
Dim Measure_status As Byte
Config Timer1 = Timer , Prescale = 1
On Capture1 Isr_capt
Enable Capture1
On Ovf1 Isr_ovf
Enable Ovf1
Ovf_ctr = 0
Ovf_exeed_ctr = 0
Got_edge = False
Tifr = Bits(icf1 , Tov1)
Enable Interrupts
Config Timer2 = Pwm , Prescale = 8 , Compare Pwm = Clear Up , Pwm = On
Enable Timer2
Start Timer2
Config Adc = Free , Prescaler = 4 , Reference = Internal
Start Adc
Cls
Do
Locate 2 , 1
Measure_status = Measure_request
While Measure_status = Measure_request
Wend
If Measure_status = Measure_success Then
If Measure_result > 0 Then
Measure_result = Measure_result / 10
Frequency = 826787928 / Measure_result
F_str = Str(frequency)
Lcd "Freq: " ; Format(f_str , "000.000") ; " Hz"
Else
Lcd "Fehler, Ergebnis = 0"
End If
End If
Grad = Getadc(0) / 5
If Grad > 200 Then Grad = 200
Locate 1 , 1
Lcd Grad ; "ß"
Rpm = Getadc(1)
If Rpm = 1 Then Rpm = 0
If Rpm > 1000 Then Rpm = 1000
Locate 1 , 7
Lcd Rpm ; "Rpm"
Rpm = Rpm / 4
Ocr2 = Rpm
If Grad < 60 Then
Portb.2 = 1
Else
Portb.2 = 0
End If
Waitms 30
Loop
End
Isr_capt:
Capt_curr_val = Capture1
If Measure_status = Measure_request And Got_edge = True Then
Capt_result = Capt_curr_val - Capt_prev_val
Measure_status = Measure_success
If Tifr.tov1 = 1 Then
If Capt_curr_val < 2000 Then
Incr Ovf_ctr
Tifr = 2 ^ Tov1
Else
Measure_status = Measure_request
Incr Ovf_exeed_ctr
If Ovf_exeed_ctr > 9 Then
Measure_status = Measure_failed
Ovf_exeed_ctr = 0
End If
End If
Else
Ovf_exeed_ctr = 0
End If
If Capt_curr_val < Capt_prev_val Then
Decr Ovf_ctr
End If
Ovf_result = Ovf_ctr
End If
Capt_prev_val = Capt_curr_val
Ovf_ctr = 0
Got_edge = True
Return
Isr_ovf:
Incr Ovf_ct
If Ovf_ctr > 122 Then
If Ovf_ctr > 126 Then
Got_edge = False
Ovf_ctr = 0
If Measure_status = Measure_request Then Measure_status = Measure_failed
End If
Return