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.