fl { Temperature Sensor(PCT2075) PropForth 5.5 2015/04/14 20:26:54 PCT2075 Propeller Vcc ---- 3.3V SCL ---- SCL SDA ---- SDA A0 ---- GND A1 ---- GND A2 ---- GND GND ---- GND } \ =========================================================================== \ Constants \ =========================================================================== \ Slave addres h48 for PCT2075 (A0=A1=A2=0) h90 wconstant PCT2075 \ register 0 wconstant Temp 1 wconstant Conf 2 wconstant Thyst 3 wconstant Tos 4 wconstant Tidle \ register value \ - Conf 0 wconstant OS_f1 8 wconstant OS_f2 h10 wconstant OS_f3 h18 wconstant OS_f4 0 wconstant OS_act_l 4 wconstant OS_act_h 0 wconstant OS_comp 2 wconstant OS_int 0 wconstant normal 1 wconstant shutdn \ =========================================================================== \ Main \ =========================================================================== \ ----------------Read register --------------------------------------------- \ Read Temperature \ ( -- n1 n2 ) n1:Temperature[11bit]] n2:positive[0]/negative[1] : GetTemp 2 Temp PCT2075 i2c_rd_multi err? swap 8 lshift or 5 rshift dup abs swap h400 and if 1 else 0 then ; \ Get Configuration register \ ( -- n1 ) n1:Configuration[8bit] : GetConf Conf PCT2075 i2c_rd err? ; \ Get HysterisisTemperature register \ ( -- n1 ) n1:HysterisisTemperature[degree] : GetThyst 2 Thyst PCT2075 i2c_rd_multi err? swap 8 lshift or 7 rshift 1 rshift \ *0.5degree ; \ Get OverTemperature register \ ( -- n1 ) n1:OverTemperature[degree] : GetTos 2 Tos PCT2075 i2c_rd_multi err? swap 8 lshift or 7 rshift 1 rshift \ *0.5degree ; \ Get TemperatureIdle register \ ( -- n1 ) n1:TemperatureIdle[msec] : GetTidle Tidle PCT2075 i2c_rd err? d100 u* ; \ ----------------Write register --------------------------------------------- \ Set Configuration register \ ( n1 -- ) n1:Configuration[8bit] : SetConf Conf i2c_wr err? ; \ Set HysterisisTemperature register \ ( n1 -- ) n1:HysterisisTemperature[degree] : SetThyst 8 lshift dup \ Shift tbit n1*2 to left hFF and \ LSByte swap 8 rshift \ MSByte 2 Thyst PCT2075 i2c_wr_multi err? ; \ OverTemperature register \ ( n1 -- ) n1:OverTemperature[degree] : SetTos 8 lshift dup \ Shift tbit n1*2 to left hFF and \ LSByte swap 8 rshift \ MSByte 2 Tos PCT2075 i2c_wr_multi err? ; \ Set Temperature measurement period \ ( n1 -- ) n1:period[n1*100msec] (from 100msec to 3.1sec) : SetTidle h1F and Tidle PCT2075 i2c_wr err? ; \ Convert Temp[11bit] to degree \ ( n1 n2 -- n3 ) n1:Temperature[11bit]] n2:positive[0]/negative[1] n3:Temperature[degree] : degree if h2D emit abs then \ print "-" d125 * d1000 u/mod . \ print integer part h2E emit \ print "." . \ print frac part ." degree" ; \ Display Temperature[degree] \ ( -- ) : demo1 begin GetTemp degree cr fkey? swap drop until ;