Quote Originally Posted by Charles Linquis View Post
According to my calculations -

endval = 1200
startval = 20


endval - startval = 1180
ramp time in milliseconds = 1000

1180/1000 = 1.18 (so 1180/1000 = 1 = increment)
1180//1000 = 180 (=remainder = fractional)



fractional = 0
oldfractional = 0

frequency = 20 ; start value

ISR:

Frequency = frequency + increment ; increment the main part

fractional = fractional + remainder ; Deal with the fractional part
If fractional dig3 != oldfractional ; keep adding up the partial until we reach 1000
oldfractional = fractional ; update so we can see the next change
frequency = frequency + 1 ; add a count - since we broke 1000
Endif


This will increment by one every program loop and then add an extra count every 5 (or so) loops. I haven't tested the algorithm, but I believe it should deal properly with the 'wrap' when "fractional" overflows.
I've tested this :
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
DEFINE LCD_COMMANDUS 10000
DEFINE LCD_DATAUS 2000

'Variable init
freq var word
maxfreq var word
minfreq var word
remain var word
increm var word
time var word
potsense var word
frac var word
oldfrac var word
delta var word

'Variables def
minfreq=10
maxfreq=1200


'Calculate steps
delta=maxfreq-minfreq
time=1000

increm=delta/time
remain=delta//time

frac=0
oldfrac=0
freq=10

main:

' Counter
freq=freq+increm
frac=frac+remain
if frac dig 3 != oldfrac then
oldfrac=frac
freq=freq+1
endif

' 1ms time base (simulates an interrupt)
pause 1

lcdout $fe,$2,"Frequency: ",dec5 freq

goto main
And it seems to work well, the "freq" value get incremented, and if I change the "time" variable, the "freq" value increments more or less quickly.

But the "freq" increments without stopping, and this over 1200!