'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [set under view...options] * '* Notice : Copyright (c) 2008 [set under view...options] * '* : All Rights Reserved * '* Date : 01.04.2008 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** DEFINE OSC 4 ADCON1 = %10000111 OUTPUT PORTB.4 OUTPUT PORTB.5 rst var PORTB.4 req var PORTB.5 rst = 1 req = 1 INPUT PORTB.6 counter_pin var PORTB.6 output PORTC.3 output PORTD.0 INPUT PORTD.1 input PORTC.2 out_pin var PORTD.0 out_pin = 1 in_pin var PORTD.1 ptt var PORTC.3 v4 var PORTB.3 Comm_Pin1 VAR PortA.0 Comm_Pin2 VAR PortA.1 Comm_Pin3 VAR PortA.2 Comm_Pin4 VAR PORTA.3 Busy VAR BIT ' Busy Status-Bit R_Temp VAR WORD ' RAW Temperature readings TempC VAR WORD ' Temp in deg C TempF VAR WORD ' Temp in deg F Float VAR WORD ' Holds remainder for + temp C display Cold_Bit VAR R_Temp.Bit11' Sign-Bit for +/- Temp. 1 = Below 0 deg C Real_Cold CON 1 ' Define Real_Cold = 1 BAUD CON 16468 ' N9600 for serial LCD Deg CON 223 ' Data to display Deg ° symbol CLR CON 1 ' CLR LCD command LINE1 CON 128 ' LCD line #1 LINE2 CON 192 ' LCD line #2 INS CON 254 ' LCD command mode parameter Sign VAR BYTE ' +/- sign for temp display Dummy VAR BYTE ' Dummy for Div32 temp VAR BYTE temp_d VAR BYTE lk VAR BYTE mode VAR BYTE s VAR byte m VAR byte mm VAR byte u VAR word dt1 VAR word dt2 VAR word dt3 VAR word dt4 VAR word index VAR word power1 VAR word power2 var word znak VAR bit flag VAR bit time VAR byte interval var byte op VAR word ts1_state var bit ts2_state var bit ts3_state var bit n_addr VAR word addr var word c_addr var word timecycle var byte cz var word i1 var byte i2 var byte i3 var byte i4 var byte stat var byte address con 201 n_addr = $1000 stat = 0 cz = 1 pause 1000 index = 0: dt1 = 0: dt2 = 0: dt3 = 0: dt4 = 0: power1 = 0: power2 = 0 n1: ptt = 0 sloop: gosub ts if (stat = 1) or (stat = 2) then GOSUB store ENDIF beg: SERIN in_pin, 1, 55000, sloop, [address], pin IF pin = 1 then send if pin = 0 then sendstatus if pin = 2 then cycle1 if pin = 3 then cycle2 if pin = 4 then abort if pin = 5 then sendall goto loop cycle1: GOSUB reset_counter cz = 1 timecycle = 91 index = 0 stat = 1 goto sendstatus goto loop cycle2: GOSUB reset_counter cz = 1 timecycle = 121 index = 0 stat = 2 goto sendstatus goto loop abort: stat = 0 gosub reset_counter cz = 1 goto sendstatus GOTO loop sendstatus: index = 0: dt1 = stat: dt2 = c_addr: dt3 = cz: dt4 = 0 ptt = 1: pause 500 SEROUT out_Pin, 2, [254] GOSUB senddata ptt = 0 pause 100 goto beg send: gosub ts REM SEND pause 100 index = 800 ptt = 1: pause 100 b1: SEROUT out_Pin, 2, [254] GOSUB senddata ptt = 0 pause 100 goto beg store: rem запись в памть if (stat = 1) and (cz > 90) then stat = 3 RETURN ENDIF if (stat = 2) and (cz > 120) then stat = 3 RETURN ENDIF addr = n_addr + cz * 6 WRITECODE addr, dt1 WRITECODE addr + 1, dt2 WRITECODE addr + 2, dt3 writecode addr + 3, dt4 writecode addr + 4, power1 WRITECODE addr + 5, power2 cz = cz + 1 RETURN sendall: ptt = 1: pause 100 FOR c_addr = 1 to cz addr = n_addr + c_addr * 6 READCODE addr, dt1 READCODE addr + 1, dt2 READCODE addr + 2, dt3 READCODE addr + 3, dt4 READCODE addr + 4, power1 READCODE addr + 5, power2 rem: dt1 = 1: dt2 = 2: dt3 = 3: dt4 = 4: power1 = 5: power2 = 6 index = c_addr SEROUT out_Pin, 2, [254] GOSUB senddata NEXT c_addr pause 50 index = 0: dt1 = stat: dt2 = c_addr: dt3 = cz: dt4 = 0 SEROUT out_Pin, 2, [254] GOSUB senddata ptt = 0 goto beg Start_Convert1: OWOUT Comm_Pin1, 1, [$CC, $44]' Skip ROM search & do temp conversion Wait_Up1: OWIN Comm_Pin1, 4, [Busy] ' Read busy-bit IF Busy = 0 THEN Wait_Up1 ' Still busy..?, Wait_Up..! OWOUT Comm_Pin1, 1, [$CC, $BE]' Skip ROM search & read scratchpad memory OWIN Comm_Pin1, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms GOSUB Convert_Temp RETURN Start_Convert2: OWOUT Comm_Pin2, 1, [$CC, $44]' Skip ROM search & do temp conversion Wait_Up2: OWIN Comm_Pin2, 4, [Busy] ' Read busy-bit IF Busy = 0 THEN Wait_Up2 ' Still busy..?, Wait_Up..! OWOUT Comm_Pin2, 1, [$CC, $BE]' Skip ROM search & read scratchpad memory OWIN Comm_Pin2, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms GOSUB Convert_Temp RETURN Start_Convert3: OWOUT Comm_Pin3, 1, [$CC, $44]' Skip ROM search & do temp conversion Wait_Up3: OWIN Comm_Pin3, 4, [Busy] ' Read busy-bit IF Busy = 0 THEN Wait_Up3 ' Still busy..?, Wait_Up..! OWOUT Comm_Pin3, 1, [$CC, $BE]' Skip ROM search & read scratchpad memory OWIN Comm_Pin3, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms GOSUB Convert_Temp RETURN Start_Convert4: OWOUT Comm_Pin4, 1, [$CC, $44]' Skip ROM search & do temp conversion Wait_Up4: OWIN Comm_Pin4, 4, [Busy] ' Read busy-bit IF Busy = 0 THEN Wait_Up4 ' Still busy..?, Wait_Up..! OWOUT Comm_Pin4, 1, [$CC, $BE]' Skip ROM search & read scratchpad memory OWIN Comm_Pin4, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms GOSUB Convert_Temp RETURN Convert_Temp: ' +32.0 to +257 F IF Cold_Bit = Real_Cold THEN Yikes ' If Cold_Bit = 1, it's below "0" deg C Sign = "+" : znak = 0 Dummy = 625 * R_Temp ' Multiply to load internal registers with 32-bit value TempC = DIV32 10 ' Use Div32 value to calculate precise deg C Dummy = 1125 * R_Temp TempF = DIV32 100 IF TempF >6795 THEN ' Over 99.5 deg F..? TempF = TempF + 3200 ELSE TempF = TempF + 3200 ENDIF TempC = (R_Temp & $0FF0) >> 4 ' Mask middle 8-bits, shift into lower byte Float = ((R_Temp.Lowbyte & $0F) * 625) ' Lower 4-bits of result * 625 temp = TempC: temp_d = Float DIG 3 RETURN Yikes: ' Display full range -C to -F conversion Sign = "-" : znak = 1 ' Display - symbol for negative temp Dummy = 625 * ~R_Temp+1' Multiply to load internal registers with 32-bit value TempC = DIV32 10 ' Use Div32 value to calculate precise deg C TempF = ~R_Temp / 16 ' Begin conversion from -C to deg +/-F IF TempF >=18 THEN ' Check for -degrees F "-18 C = -0.4 F" TempF = ((((TempF + 50) * 9) /5) -122) ' -C to -F below -17 deg C temp = (TempC DIG 4)*10 + (TempC DIG 3): temp_d = TempC DIG 2 ELSE ' Else result = +deg F TempF = ((((-TempF + 50) * 9) /5) -58)' -C to +F below 32.0 deg F to -17 deg C temp = (TempC DIG 4) *10 + (TempC DIG 3): temp_d = TempC DIG 2 ENDIF RETURN sendword: FOR m = 3 to 0 STEP -1 mm = u DIG m SEROUT out_Pin, 2, [#mm] NEXT m SEROUT out_Pin, 2, [32] RETURN senddata: FOR s = 1 to 7 IF s = 1 THEN u = index GOSUB sendword ENDIF IF s = 2 THEN u = dt1 GOSUB sendword ENDIF IF s = 3 THEN u = dt2 GOSUB sendword ENDIF IF s = 4 THEN u = dt3 GOSUB sendword ENDIF IF s = 5 THEN u = dt4 GOSUB sendword ENDIF IF s = 5 THEN u = power1 GOSUB sendword ENDIF IF s = 6 THEN u = power2 GOSUB sendword ENDIF NEXT s SEROUT out_pin, 2, [13] RETURN ts1: GOSUB Start_Convert1 dt1.Lowbyte = temp : dt1.Highbyte = znak * 10 + temp_d RETURN ts2: GOSUB Start_Convert2 dt2.Lowbyte = temp : dt2.Highbyte = znak * 10 + temp_d RETURN ts3: GOSUB Start_Convert3 dt3.Lowbyte = temp : dt3.Highbyte = znak * 10 + temp_d RETURN ts4: GOSUB Start_Convert4 dt4.Lowbyte = temp : dt4.Highbyte = znak * 10 + temp_d RETURN ts: GOSUB ts1 GOSUB ts2 GOSUB ts3 GOSUB ts4 req = 0 SERIN counter_pin, 1, [254], i1, i2, i3, i4 req = 1 power1.highbyte = i1: power1.lowbyte = i2: power2.highbyte = i3: power2.lowbyte = i4 RETURN reset_counter: rst = 0: pause 50: rst = 1 RETURN