First off, I should mention that math and I don't get along very well.....

I doing a complete redesign of my charcoal smoker temperature controller. It worked very well, but I made some hardware mistakes when I designed the board, and I ran out of memory on the 16F886 I was using BEFORE I ran out of features I wanted to add.

To that end, I redesigned the board for an 18F2550, and decided on a fresh start with the program as I made some poor efficiency decisions on the first one. I am using Henrik's PID routines as before, and DT's Analog oversampling this time.

I want to have the temperature displays have one decimal place instead of just integer, so I am trying to comprehend the floating point example in 4FUNC.BAS (provided by MELabs). I am currently at work (testing a fire alarm system in a huge building), but I am basically sitting here while the Sprinkler Fitter moves around sending in his signals once in a while. That means I have time to play a bit.

C_TEMP and COOK_ADJUST are word variables.

Can someone 'vet' the following code and let me know if I'm on the right track here? Any suggestions or advice would be appreciated. I have tried to whittle down the example code so it only works for one decimal place. I have included the 18F 24-bit include file at the beginning of the program.

Thanks

Code:
	
    C_TEMP = C_TEMP * 100 	'MULTIPLY RAW ADC READING BY 100 THEN DIVIDE BY CALIBRATION VALUE TO GET
							'CELCIUS TEMPERATURE
    aint = C_TEMP
    resulthold = aint
    Gosub itofa     	' Convert aint to float  
    bint = COOK_ADJUST	'DIVIDE BY ADJUST VALUE TO GET CELCIUS
    Gosub itofb     	' Convert int to float
    Gosub fpdiv     	' FP divide (/ COOK_ADJUST)
    resulthold = aint	'STORE RESULT OF DIVISION IN RESULTHOLD
    'NOW NEED TO CONVERT CELCIUS TO FARENHEIGHT
    'F = ((C * 9) / 5) + 32
    Gosub itofa     	' Convert aint to float  aint=result from divide
    bint = 9
    Gosub itofb     	' Convert int to float
    Gosub fpmul     	' FP multiply (*9)
    resulthold = aint	'STORE RESULT OF MULTIPLICATION IN RESULTHOLD	
    Gosub itofa     	' Convert int back to float - aint=result from multiply
    bint = 5
    Gosub itofb     	' Convert int to float
    Gosub fpdiv     	' FP divide (/5)
    resulthold = aint	'STORE RESULT OF DIVISION IN RESULTHOLD	
    Gosub itofa			' Convert aint to float
    bint = 32
    Gosub itofb			' Convert bint to float
    Gosub fpadd			' FP add (+32)	
    fpplaces = 1 		'DISPLAY WITH ONE DECIMAL PLACE
    Gosub fpdisplayr				' Call display routine

    'OTHER STUFF
	
fpdisplayr: 
    'I DISPENSED WITH THE IF STATEMENTS, ONLY EVER WANT ONE DECIMAL PLACE
    ' Set floating point barg to 0.05
    bexp = $7A
    bargb0 = $4C
    bargb1 = $CD
	
fpdisplay:	
    bexp = aexp					' Store the FP value of aarg to the barg variables
    bargb0 = aargb0
    bargb1 = aargb1
    Gosub ftoia					' Convert aarg to integer
    ahold = aint				' Save this value for the final display
    Gosub itofa					' Convert integer back to float
    Swap aexp,bexp				' Swap the FP values of aarg and barg before subtraction
    Swap aargb0,bargb0
    Swap aargb1,bargb1
    Gosub fpsub					' Subtract the integer portion from the full number
    bint = 10					' Make bint = 10 E fpplaces		
    Gosub itofb					' Convert bint to integer prior to FP multiply
    Gosub fpmul					' Multiply the decimal portion x 10 E fpplaces
    Gosub ftoia					' Convert result to aint integer
    'DISPLAY    CT:xxx.x COOKER TEMP TO ONE DECIMAL PLACE
    Lcdout $FE, 1, "CT:", dec abs ahold, ".", dec abs aint
    RETURN