***************************************************************************** *** TEMPERATURE.ASM *** *** *** *** Author : Andrew Duffy *** *** Date : February 1993 *** *** Desc. : This program demonstrates how to read the value of the *** *** heater/potentiometer using a simple binary chop routine. *** *** *** *** ©XCNT, 1992-1994. *** ***************************************************************************** ***************************************************************************** *** Includes *** ***************************************************************************** include "subrts.h" Included by default anyway ***************************************************************************** *** Initialisation routine *** ***************************************************************************** move.b #APPS_ALL_IN,d0 Initialise the applications board jsr APPS_INIT (port A all input) movea.l #Instructs,a6 Print instructions jsr OUTSTR ***************************************************************************** *** Main control routine *** ***************************************************************************** Main bsr.s Get.Temperature Call Get.Temperature routine bra.s Main Repeat forever rts Exit (never gets here) ***************************************************************************** *** Get.Temperature routine *** ***************************************************************************** Get.Temperature movem.l d0-d2,-(a7) Save all used registers move.l #127,d0 Set up d0 with starting value move.l #128,d1 Set up d1 to half of start value .Chop lsr.b #1,d1 Divide half value by half again move.b d0,APPS_PORTB Send try value move.b APPS_PORTA,d2 btst #3,d2 Check if value was higher or lower bne.s .Higher If value was higher .Lower sub.b d1,d0 Subtract half value from main value cmp.b #1,d1 Check if all values have been done beq.s .Done bra.s .Chop Try next value .Higher add.b d1,d0 Add half value to main value cmp.b #1,d1 Check if all values have been done beq.s .Done bra.s .Chop Try next value .Done move.b d0,APPS_PORTB (This ensures an acurate reading move.b APPS_PORTA,d1 of the heater with single byte btst #3,d1 differences rather than 2 bytes) beq.s .Done2 Value is correct add.b #1,d0 Value incorrect, subtract 1 from it .Done2 move.w d0,Temperature Save Temperature ***************************************************************************** *** Temperature found - now draw graph *** ***************************************************************************** move.b #18,d0 Locate cursor to print move.b #47,d1 out temperature value. bsr.s Locate Locate cursor move.w Temperature,d0 Temperature between 0 and 255 jsr OUT2HEX Output fan speed move.b #15,d0 Locate cursor to print move.b #8,d1 out fan bar graph. bsr.s Locate Locate cursor moveq #0,d1 Clear d1 move.w Temperature,d1 Temperature between 0 and 255 lsr.b #2,d1 Divide by four move.b #'*',d0 bsr.s Chars Output characters movem.l (a7)+,d0-d2 Unstack registers rts ***************************************************************************** *** Locate routine *** *** Locates the cursor at d0 down, d1 across. *** ***************************************************************************** Locate movem.l d0-d3/a0/a6,-(a7) Save all used registers moveq #0,d3 movea.l #Locate_Seq+2,a0 ANSI locate sequence - Down move.b d0,d3 bsr.s .Locate_1 Convert value to text value movea.l #Locate_Seq+5,a0 ANSI locate sequence - Across move.b d1,d3 bsr.s .Locate_1 Convert value to text value movea.l #Locate_Seq,a6 Output escape sequence jsr OUTSTR movem.l (a7)+,d0-d3/a0/a6 Unstack registers rts .Locate_1 divu #10,d3 Convert tens first bsr .Locate_1.2 .Locate_1.2 add #$30,d3 Then units move.b d3,(a0)+ move.w #0,d3 swap d3 rts ***************************************************************************** *** Chars routine *** *** Prints d1 number of d0.b characters *** ***************************************************************************** Chars movem.l d0-d1/a6,-(a7) Save all used registers .Chars_1 cmpi.b #0,d1 Check if all characters done beq.s .Chars_1.2 jsr OUTCH Output 1 character subi.b #1,d1 Decrement number to do bra.s .Chars_1 Repeat .Chars_1.2 movea.l #EraseToEnd,a6 Output clear to end string jsr OUTSTR movem.l (a7)+,d0-d1/a6 Unstack registers rts ***************************************************************************** *** Variables *** ***************************************************************************** Temperature ds.w 1 ***************************************************************************** *** Strings *** ***************************************************************************** EraseToEnd dc.b 27,'[K',0 even Locate_Seq dc.b 27,'[ ; f',0 ANSI sequence even Re-align code Instructs dc.b "Temperature.asm",13,10,"===============",13,10,13,10 dc.b "Ensure that the ADC is switched on.",13,10 dc.b "Now select between the Heater and the Potentiometer using the",13,10 dc.b "Heater/Pot switch. If you select the potentiometer then use",13,10 dc.b "the slider to adjust it''s value.",13,10 dc.b "(LEDs may be left ON or OFF but will slow down on slower machines)" dc.b 27,"[12;30fTemperature - (Percent)" dc.b 27,"[14;8f00% - - - - - 50% - - - - - 100%" dc.b 27,"[18;32fActual Value :",0 ***************************************************************************** *** End of file TEMPERATURE.ASM. *** *****************************************************************************