#PICAXE 20M2
#no_data
disablebod
disabletime
setfreq M32
dirsC=%11111101 ;make C.1 input(C.1 is decay mode)
high A.0 ;prepare for T38400_32 serial
pause 40000 ;initialize display
serout A.0, T38400_32,(0x00,0x0C,0x00,0x00) ;screen saver time off(no scroll)
serout A.0, T38400_32,(0xFF,0x66,0x00,0x10) ;contrast
serout A.0,T38400_32,(0xFF,0xD7) ;clear screen
pause 60 ;7 msec. delay
serout A.0,T38400_32,(0xFF,0x76,0x00,0x01) ;bold
serout A.0,T38400_32,(0xFF,0xE4,0x00,0x04,0x00,0x00);cursor mid-screen
hi2csetup i2cmaster,0xC0,i2cfast_32,i2cbyte ;I2C setup
symbol Data_Reg=b0
symbol Ref_Msb=w1
symbol Ref_Csb=w2
symbol Ref_Lsb=w3
symbol Ref_Alt=w4
symbol Cur_Alt=w5
symbol Delta=w6
symbol Steps=w7
symbol Touch_Flag=w8 ;touch sensor flag
symbol Kolls=w9 ;local Kollsman setting-inHg x 100
symbol Bar_Val=w10 ;barometer setting
symbol Alt_Val=w11
symbol Limit=1000 ;capstan step rotation limit
symbol Gain=100 ;sets step multiplier
symbol CW_32=%10100100 ;step size 1x1xxxx1,direction xxxxx1xx
symbol CCW_32=%10100000
main:
pause 60
serout A.0,T38400_32,(0xFF,0x7F,0xF8,0x00,0x00,0x06," OFF "," ",0x00)
test: ;detect switch condition
outpinsC=%00001000 ;disable the stepper driver
do
gosub finger
loop until Touch_Flag=4
hi2cout 0x26,(0x02) ;reboot/reset
hi2cout 0x26,(0xBA) ;enable altitude/128 OSR/Now
hi2cout 0x13,(0x02) ;enable pressure data flag
hi2cout 0x26,(0xBB) ;make device active
Kolls=Kolls*20**55486 ;convert inHg to Pascals
hi2cout 0x14,(b19,b18) ;write Kollsman to sensor
ref:
gosub sensor
Ref_Alt=Ref_Msb+Ref_Csb*4**53756+Ref_Lsb ;meters to feet
alt_1:
gosub sensor
Cur_Alt=Ref_Msb+Ref_Csb*4**53756+Ref_Lsb ;meters to feet
serout A.0,T38400_32,(0xFF,0xE4,0x00,0x04,0x00,0x00) ;cursor mid-screen
serout A.0,T38400_32,(0xFF,0x76,0x00,0x01) ;bold
compare:
if Cur_Alt=Ref_Alt then
goto alt_1
elseif Cur_Alt>Ref_Alt then
Delta=Cur_Alt-Ref_Alt*Gain max Limit ;steps=delta*Gain
serout A.0,T38400_32,(0xFF,0x7F,0x00,0x1F,0x00,0x06,"ALT: ",#Cur_Alt," FT ",0x00)
goto ccw
elseif Cur_Alt<Ref_Alt then
Delta=Ref_Alt-Cur_Alt*Gain max Limit
serout A.0,T38400_32,(0xFF,0x7F,0xF8,0x00,0x00,0x06,"ALT: ",#Cur_Alt," FT ",0x00)
goto cw
endif
cw:
outpinsC=CW_32 ;stepper/direction low
goto turn
ccw:
outpinsC=CCW_32 ;stepper/direction high
goto turn
turn:
for Steps=1 to Delta ;step pulses decelerating rate
pauseus Steps
pulsout C.4,2 ;make one step
gosub finger ;check touch switch
next Steps
goto alt_1
finger:
touch16 [%11101000],B.0,s_w1
touch16 [%11101000],B.1,s_w2
touch16 [%11101000],B.2,s_w3
touch16 [%11101000],B.3,s_w4
if s_w1<10000 and s_w2<10000 and s_w3<10000 and s_w4<10000 then return
endif
if s_w1>10000 then inc Touch_Flag
if Touch_Flag=5 then
Touch_Flag=0
endif
endif
if Touch_Flag=2 and s_w2>10000 then
Bar_Val=Bar_Val+1000 max 33000 min 25000
elseif Touch_Flag=2 and s_w3>10000 then Bar_Val=Bar_Val+100
elseif Touch_Flag=2 and s_w4>10000 then Bar_Val=Bar_Val+10
endif
if Bar_Val>=33000 then
Bar_Val=25000
endif
Kolls=Bar_Val/10 ;massage for display
bintoascii Kolls,b0,b27,b26,b25,b24 ;massage for decimal point
b27=b27-48
b26=b26-48
b25=b25-48
b24=b24-48
if Touch_Flag=3 and s_w2>10000 then
Alt_Val=Alt_Val+1000 max 36000
elseif Touch_Flag=3 and s_w3>10000 then Alt_Val=Alt_Val+100
elseif Touch_Flag=3 and s_w4>10000 then Alt_Val=Alt_Val+10
endif
if Alt_Val>=36000 then
Alt_Val=0
endif
if Touch_Flag=4 and Kolls<=2500 then
Touch_Flag=1
endif
if Touch_Flag=1 then serout A.0,T38400_32,(0xFF,0x7F,0xF8,0x00,0x00,0x06," OFF "," ",0x00)
elseif Touch_Flag=2 then serout A.0,T38400_32,(0xFF,0x7F,0x00,0x1F,0x00,0x06,"BAR ",#b27,#b26,".",#b25,#b24," inHg ",0x00)
elseif Touch_Flag=3 then serout A.0,T38400_32,(0xFF,0x7F,0x04,0x00,0x00,0x06,"HOLD? ",#Alt_Val," ",0x00)
elseif Touch_Flag=4 then serout A.0,T38400_32,(0xFF,0x7F,0x04,0x00,0x00,0x06,"HOLD ",#Alt_Val," ",0x00)
endif
serout A.0,T38400_32,(0xFF,0x76,0x00,0x01) ;bold
serout A.0,T38400_32,(0xFF,0xE4,0x00,0x04,0x00,0x00);cursor mid-screen
goto test
sensor:
do
hi2cin 0x06,(Data_Reg) ;check for pressure data status
loop until bit2=1 ;if data flag set,then
hi2cin 0x01,(Ref_Msb,Ref_Csb,Ref_Lsb) ;get Msb,Csb,Lsb data
Ref_Msb=Ref_Msb*256 ;convert Msb to decimal meters
Ref_Lsb=Ref_Lsb/16**53756/4 ;convert LSB to fractional feet
return