
Originally Posted by
Charles Linquis
stop the incrementing or stop the interrupt when freq >= maxfreq
I've tried this on my real PIC with a potentiometer :
Code:
DEFINE OSC 32
DEFINE LCD_DREG PORTC
DEFINE LCD_EREG PORTD
DEFINE LCD_RSREG PORTD
DEFINE LCD_EBIT 0
DEFINE LCD_RSBIT 1
DEFINE ADC_BITS 10
' ADC registers configuration
ADCON0=%11101
ADCON1=%10000
ADCON2=%10000110
ADCHS=%1010101
ANSEL0=%11110000
' Variable init
freq var word
rfreq var word
maxfreq var word
minfreq var word
dum6 var word
dum7 var word
accel var word
decel var word
frac var word
oldfrac var word
potsense var word
' Variables def
maxfreq=1200
minfreq=10
accel=1000
decel=1000
' Start freq
freq=minfreq
main:
' Start ADC conversion
ADCON0.1=1
WHILE ADCON0.1=1:WEND
' Store ADC results
potsense.HighByte=ADRESH
potsense.LowByte=ADRESL
' Convert pot result
rfreq=(potsense<<6)**maxfreq
' Acceleration ramp
if freq<rfreq then
dum6=(rfreq-minfreq)/accel
dum7=(rfreq-minfreq)//accel
freq=freq+dum6
frac=frac+dum7
if frac dig 3<>oldfrac then oldfrac=frac:freq=freq+1
endif
' Deceleration ramp
if freq>rfreq then
dum6=(maxfreq-rfreq)/decel
dum7=(maxfreq-rfreq)//decel
freq=freq-dum6
frac=frac-dum7
if frac dig 3<>oldfrac then oldfrac=frac:freq=freq-1
endif
' Display results
lcdout $fe,$2,"Frequency: ",dec5 freq
lcdout $fe,$c0,"Ref: ",dec5 rfreq
pause 1
goto main
And unfortunately the timing is not very accurate, it depends of the "maxfreq" variable defined. I can have a 1 or 2 seconds gap.
And above 1000, the "accel"/"decel" values doesn't increase the time of the ramp.
Bookmarks