/Designs/Measuring_instruments/AWS01A/SW/MPL115A1.c
0,0 → 1,125
/*
MPL115A1 SDN - +3.3V (always power on)
MPL115A1 #CS - PIN_C2
MPL115A1 DOUT - PIN_C4
MPL115A1 DIN - PIN_C5
MPL115A1 SCLK - PIN_C3
MPL115A1 GND - GND
MPL115A1 VDD - +3.3V
*/
 
 
// SPI mode definitions.
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
 
float a0; // correctiaon coefficients
float b1;
float b2;
float c12;
 
 
void MPL_init()
{
unsigned int8 a0_MSB, a0_LSB;
unsigned int8 b1_MSB, b1_LSB;
unsigned int8 b2_MSB, b2_LSB;
unsigned int8 c12_MSB, c12_LSB;
 
output_low(CSN_SPI);
 
spi_write(0x88); // get MSB for a0
a0_MSB = spi_read(0x00);
spi_write(0x8A); // get LSB for a0
a0_LSB = spi_read(0x00);
 
spi_write(0x8C); // get MSB for b1
b1_MSB = spi_read(0x00);
spi_write(0x8E); // get LSB for b1
b1_LSB = spi_read(0x00);
 
spi_write(0x90); // get MSB for b2
b2_MSB = spi_read(0x00);
spi_write(0x92); // get LSB for b2
b2_LSB = spi_read(0x00);
 
spi_write(0x94); // get MSB for c12
c12_MSB = spi_read(0x00);
spi_write(0x96); // get LSB for c12
c12_LSB = spi_read(0x00);
 
spi_read(0x00);
output_high(CSN_SPI);
// translate to floating point number
a0 = ((unsigned int16) a0_MSB << 5) + (a0_LSB >> 3) + (a0_LSB & 0x07)/8.0;
b1 = ((((b1_MSB & 0x1F) * 0x100) + b1_LSB) / 8192.0) - 3;
b2 = ((((unsigned int16) (b2_MSB - 0x80) << 8) + b2_LSB)/ 16384.0) - 2;
c12 =(((c12_MSB * 0x100) + c12_LSB)/16777216.0);
}
 
float MPL_get_pressure()
{
unsigned int8 LSB_data, MSB_data;
unsigned int16 ADC_pressure, ADC_temperature;
float Pcomp;
 
output_low(CSN_SPI); //Start temperature and pressure conversion
spi_write(0x24);
spi_write(0x00);
output_high(CSN_SPI);
 
delay_ms(10);
output_low(CSN_SPI); // get MSB for Pressure
spi_write(0x80);
MSB_data = spi_read(0x00);
spi_write(0x82); // get LSB for Pressure
LSB_data = spi_read(0x00);
output_high(CSN_SPI);
 
ADC_pressure = (((unsigned int16) MSB_data << 8) + LSB_data ) >> 6; // conversion of 8bit registers to 16bit variable
 
output_low(CSN_SPI);
spi_write(0x84);
MSB_data = spi_read(0x00);
spi_write(0x86); // get LSB for Temperature
LSB_data = spi_read(0x00);
spi_read(0x00);
output_high(CSN_SPI);
 
ADC_temperature = (((unsigned int16) MSB_data << 8) + LSB_data ) >> 6; // conversion of 8bit registers to 16bit variable
Pcomp = (a0 + (b1 + c12 * ADC_temperature) * ADC_pressure + b2 * ADC_temperature ); // compute relative compensated pressure
 
return (Pcomp * ((115.0 - 50.0)/1023.0) + 50.0); // return absolute pressure
}
 
float MPL_get_temperature()
{
unsigned int8 LSB_data, MSB_data;
unsigned int16 ADC_temperature;
 
output_low(CSN_SPI); //Start temperature and pressure conversion
spi_write(0x22);
spi_write(0x00);
output_high(CSN_SPI);
 
delay_ms(10);
output_low(CSN_SPI);
spi_write(0x84);
MSB_data = spi_read(0x00);
spi_write(0x86); // get LSB for Temperature
LSB_data = spi_read(0x00);
spi_read(0x00);
output_high(CSN_SPI);
 
ADC_temperature = (((unsigned int16) MSB_data << 8) + LSB_data ) >> 6; // conversion of 8bit registers to 16bit variable
return ( ((float) ADC_temperature - 498.0)/-5.35) + 27.0; // return temperature in deg C
}
 
/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/main.c
6,15 → 6,6
 
#CASE // Case sensitive compiler
 
/*#define LCD_ENABLE_PIN PIN_E0 ////
#define LCD_RS_PIN PIN_E1 ////
#define LCD_RW_PIN PIN_E2 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
*/
#define SEND_DELAY 50 // Time between two characters on RS232
 
char VER[4]=VERSION; // Buffer for concatenate of a version string
22,8 → 13,12
#define ONE_WIRE_PIN PIN_C7
#include "..\ds1820.c"
 
#define sht_data_pin PIN_D0
#define sht_clk_pin PIN_D1
#include "..\SHT.c"
 
#define CSN_SPI PIN_C2
#include "..\MPL115A1.c"
 
void welcome(void) // Welcome message
{
50,7 → 45,6
 
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
57,22 → 51,18
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC); // This device COMP currently not supported by the PICWizard
setup_oscillator(OSC_8MHZ);
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64);
output_high(CSN_SPI);
delay_ms(100);
 
 
printf("Simple Thermomether\r\n",);
printf("(c) Kaklik 2013\r\n");
printf("www.mlab.cz\r\n");
 
welcome();
welcome();
 
/* lcd_init();
lcd_putc("(c) Kaklik 2013");
lcd_gotoxy(3,2);
lcd_putc("www.mlab.cz");
Delay_ms(2000);
*/
 
sht_init();
MPL_init(); // get correction coefficients from the sensor
 
while (TRUE)
{
80,17 → 70,18
int8 j; // String pointer
int8 check=0; // Checksum is calculated between '$' and '*'
float SHT_temp,SHT_hum;
float local_temp;
float barometer_temperature, barometer_pressure;
 
 
// lcd_gotoxy(1,2);
// printf(lcd_putc,"T: %f K ",ds1820_read()+273.15);
 
// printf("$T1.0 %f \r\n",ds1820_read()+273.15);
delay_ms(100);
{ // printf
 
sht_rd(SHT_temp,SHT_hum);
 
local_temp = ds1820_read()+273.15;
SHT_temp += 273.15;
barometer_temperature = MPL_get_temperature() + 273.15;
barometer_pressure = MPL_get_pressure() * 10.0; // conversion to hectopascals
delay_us(SEND_DELAY);
putc('$');
delay_us(SEND_DELAY);
98,12 → 89,16
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%Lu \0", seq);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%f \0", ds1820_read()+273.15);
sprintf(output,"%f \0", local_temp );
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%f \0", SHT_temp + 273.15);
sprintf(output,"%f \0", SHT_temp);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%f \0", SHT_hum);
sprintf(output,"%3.1f \0", SHT_hum);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%f \0", barometer_temperature);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"%5.1f \0", barometer_pressure);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j]); check^=output[j++]; }
sprintf(output,"*%X\r\n\0", check);
j=0; while(output[j]!=0) { delay_us(SEND_DELAY); putc(output[j++]); }
delay_us(SEND_DELAY);
112,9 → 107,7
//---WDT
restart_wdt();
seq++; // Increment the number of measurement
 
}
 
}
 
//#include "dbloader.c" // Space reservation for the BootLoader
/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/main.hex
1,402 → 1,588
:1000000008308A00F52800000D050D0523104D3934
:1000000010308A00002800000D050D0523104D3921
:10001000E135EF366539A0127310A8212910321886
:10002000B118A02A532A0D050000D3346D38EC32E4
:10003000202AE832F236EF36653AE832F2060A0054
:10004000A8312910CB306B36E9352019B018B3062A
:100050000A00F73B77176D366131AE31FA060A00B8
:1000600083168613831286130830F80037280000A1
:10007000F8174828F813F30C03188617031C861387
:10008000781748287813F80B3B2846280000861775
:100090003F308400840B4A280000F81B3A28781B64
:1000A00042280800831603178C170C140000000068
:1000B00083120C087F39031996280313BD00031718
:1000C0000D080313BE0003170F080313BF003D08FC
:1000D000F30030203E0803178D0003133F08031779
:1000E0008F0083168C170C140000000083120C0D77
:1000F0000E0D7F39031996280313BD0003170D0851
:100100000313BE0003170F080313BF003D08F300DD
:1001100030203E0803178D0003133F0803178F009C
:100120008D0A03198F0A03135228031703130800BB
:100130007008F2006F08F1007208FA00710884007C
:1001400083137A18831780080319AA28F10A031960
:10015000F20A9C286F087102F7007208FA00700812
:10016000031C700FFA027708F800080083160317C3
:100170008C170C14000000000318DF2883120C08F1
:100180007F39F0000D08F1000F08F2007008F3004D
:1001900003133020710803178D0072088F00831637
:1001A0008C170C140000000083120313EF0BD928E6
:1001B000DC2883160317DF28F82883160317831219
:1001C0000C0D0E0D7F39F0000D08F1000F08F20044
:1001D0007008F30003133020710803178D007208B4
:1001E0008F008D0A03198F0A03100313EF0BB62833
:1001F0000800800803190E29F0010408EF007010B0
:10020000831B70140008F30030206F0884008313F0
:1002100070188317840A0319850AF9280800243006
:10022000BD004930BE006430BF003A30C00020300D
:10023000C1006930C2007230C3006D30C40072303A
:10024000C5006130C6006B30C7003430C8002E30A6
:10025000C9006330CA002030CB003230CC003130CE
:10026000CD003730CE00CF002030D0003230D1006A
:100270003030D2003130D300D4002D30D5003030B2
:10028000D6003930D7002D30D8003030D900353085
:10029000DA002030DB003130DC003830DD003A306D
:1002A000DE003530DF003630E0003A30E10031303A
:1002B000E2003630E3005A30E4002030E5006B30D5
:1002C000E6006130E7006B30E8006C30E90069302F
:1002D000EA006B30EB002030EC002430ED00EE0142
:1002E000F0013D30EF009820013078023D3E84005F
:1002F00083130008243C031D8729F0013D30EF00E3
:100300009820013078023D3E840083138001043040
:1003100003178D0000308F0003100F300313EF0020
:10032000B620223084008313F9200C3003178D008F
:1003300000308F0003140F300313EF00B62023307A
:10034000F3003020413084008313F9200D30F30096
:1003500030200A30F300302064008A150A12872901
:1003600083160814881083128810B629B7298316BB
:10037000881083128814BC29BD29831608108312A3
:100380000810C229C32983168810831288100330ED
:10039000F700F70BC9298316881083128814D02917
:1003A000D12983160814D429D529881083128810DE
:1003B00008003D308400831300080319EC29023043
:1003C000F800F701F70BE229F80BE1299730F70065
:1003D000F70BE829800BDF29080083160814881022
:1003E000831288100330F700F70BF429BD013D0894
:1003F000083C031C0D2A83168810831288140330CE
:10040000F700F70B012A8316881083128810033037
:10041000F700F70B092ABD0AF729B0211430BD00F7
:10042000D9218A150A128A298030D2000330F700B8
:10043000F70B182AD1015108073C031C3B2A8316ED
:100440008810831288105008520503192B2A83162E
:100450000814302A8312831608108312081083169A
:10046000312A322A881083128814362A372A031038
:10047000D20CD10A1B2A8316881083128810402AB6
:10048000412A831608148312531008185314831634
:100490008810831288144C2A4D2A831688108312E0
:1004A0008810003053180130F80008008316081433
:1004B0008810831288105C2A5D2AD101D00151086E
:1004C000753C031C772A031D692A50082F3C031C26
:1004D000772A831608148312081C772A0630F7003F
:1004E000F70B702A0000D00A0319D10A5F2A08000E
:1004F000D201D101D0015008073C031C952A0310FA
:10050000D10DD20D8316881083128814872A882A69
:100510008316081483120818511483168810831246
:100520008810922A932AD00A7B2A831608108312F5
:1005300008109A2A9B2A8316881083128814033085
:10054000F700F70BA12A8316881083128810A82AB7
:10055000A92A831608148312D0015008073C031CF3
:10056000C72A0310D10DD20D831688108312881468
:10057000B92ABA2A8316081483120818511483164C
:10058000881083128810C42AC52AD00AAD2A83167F
:100590000814CA2ACB2A8810831288140330F70063
:1005A000F70BD02A83168810831288105108F800A0
:1005B0005208F90008008E30F7006608F800650858
:1005C000F900FA01F808031DEF2A7908F800F9018B
:1005D0000830F702F808031DEF2AF701F72A031085
:1005E000F81BF62AF90DF80DF703EF2AF8130800A7
:1005F0006D080319822B8316A0007108031D022BBE
:100600008312822BA0070318102B7F30A00203183F
:100610000B2B8312822B031D0F2B8312822B162B85
:100620008130A007031C162B8312822B2008F700B1
:10063000F801F901FA0183126E088316A400A417C9
:1006400083126F088316A3007008A2001830A00060
:10065000A101221C482B7408FA07031C352BF90A48
:10066000031D352BF80A0319A1177308F907031C9A
:100670003C2BF80A0319A11772088312EF00EF1739
:100680006F08F807031C472B8316A11783128316E4
:10069000A10DF80CF90CFA0CA40CA30CA20C03107D
:1006A000A00B282B0130F707031C582B8312822B39
:1006B000F81B622BA40DFA0DF90DF80DF70B622B48
:1006C0008312822BA41F752BFA0A031D752BF90ABE
:1006D000031D752BF80A031D752BF80CF90CFA0C89
:1006E000F70A031D752B8312822B83126E08831663
:1006F000A1007208A106A11F7F2BF817872BF81302
:10070000872B8312F701F801F901FA01831683128E
:10071000080080308318EE068316A201A30183121D
:100720006A088316A10083126E088316A10683123D
:10073000690803199F2C8316A000F70083126D0827
:100740000319AC2C8316A0020319392C031CEB2BC4
:1007500083126E088316A600A61783126F088316ED
:10076000A5007008A400A3010310A60CA50CA40CFE
:10077000A30CA00BB32BA11FC02B2214C52C22103D
:10078000201022166C3084008313DA2C2212A11B55
:10079000D32B201CDE2BA60CA50CA40CA30CF70A53
:1007A0000319C02CDE2BA61BE12B0310A30DA40DF7
:1007B000A50DA60DF7030319C02CD32B22175F2C10
:1007C000221383126A088316A100A11FE92BA61722
:1007D000B92CA613B92C83126D088316A000F7005C
:1007E000831269088316A00283126A088316A60082
:1007F000A61783126B088316A50083126C08831654
:10080000A400A3010310A60CA50CA40CA30CA00B20
:10081000012CA11F0E2CA214C52CA2102010A21670
:10082000703084008313DA2CA212A11B212C201C0F
:100830002C2CA60CA50CA40CA30CF70A0319C02C95
:100840002C2CA61B2F2C0310A30DA40DA50DA60D5B
:10085000F7030319C02C212CA2175F2CA2138312BB
:100860006E088316A100A11F372CA617B92CA6135A
:10087000B92C83126E088316A600A61783126F0880
:100880008316A5007008A400A11F4A2CA6132215E8
:10089000C52C2211A30120106C3084008313DA2CA4
:1008A000A11B752C83126A088316A100201C5F2CE3
:1008B000A60CA50CA40CA30CF70A0319C02CA31FAB
:1008C000702CA40A031D702CA50A031D702CA60A07
:1008D000031D702CA60CA50CA40CF70A0319C02C40
:1008E000221BE02BA21B2E2C982C8030A606A61FC4
:1008F0007F2CC52C83126E088316A1008E2C8312C8
:100900006A088316A100A608031D8E2CA508031DE6
:100910008E2CA408031D8E2CF701B92CA61B982C35
:100920000310A30DA40DA50DA60DF70B8E2CC02C46
:10093000A11F9C2CA617B92CA613B92C83126D08E5
:10094000F7006E088316A60083126F088316A500B1
:100950007008A400B92C83126908F7006A0883168E
:10096000A60083126B088316A50083126C088316F9
:10097000A4002608F8002508F9002408FA00F82C3D
:10098000F701F801F901FA01F82CA301A409A5095E
:10099000A609A309A30A031DD32CA40A031DD32C63
:1009A000A50A0319A60A2218BF2BA2180D2C22197A
:1009B000492C7A2C0008A407031CE42CA50A031D6B
:1009C000E42CA60A0319201484030008A507031CBD
:1009D000EC2CA60A0319201484030008801F803A17
:1009E000A60703182014221AC62BA21A142C502C66
:1009F00083120800270884008313281883175008DF
:100A00008000840A8001A70A0319A80A0800800848
:100A100003191C2DBE010408BD003E10831B3E14AB
:100A20000008D000FA243D08840083133E18831781
:100A3000840A0319850A072D8A150A12482BC50155
:100A40000408C4004510831B45143E0EF038C00056
:100A5000C007E23EC100323EC3003E080F39C10765
:100A6000C107C307E93EC200C207C2073D0E0F39E6
:100A7000C207C307C20DC30DC309C30D3D080F391B
:100A8000C307C00D0730BF000A30C307C203031CF1
:100A9000452DC207C103031C492DC107C003031C18
:100AA0004D2DC007BF03031C512D3F30840083131D
:100AB00007304405441384074330040203194417E4
:100AC0000008F700031D6C2D441B6C2D441A7E2D6D
:100AD000C4196C2D20306F2DC41544123030F70727
:100AE000BE010408BD003E10831B3E147708D000F1
:100AF000FA243D08840083133E188317840A441F98
:100B00005C2D8A150A12782B0830C702031C942D1D
:100B10004730840083130310800C00080319942DC0
:100B2000922D0000800B912D0800A6132608831635
:100B30008700831287130230C600F830C70084256F
:100B4000C60B9D2DA6172608831687000230831238
:100B5000C600F830C7008425C60BA92DA6172608A5
:100B60008316870083120800C7014708073C031C4F
:100B7000DB2DA61326088316870083128713C02D4A
:100B8000C12D0314C60C0318C72D8713C82D871752
:100B9000A6132608831687002730F700F70BCE2D03
:100BA000D12D8312A617260883168700D72DD82D9E
:100BB0008312C70AB52D0800C6014608073C031C6E
:100BC000042EA61326088316870083128713E82DA8
:100BD000E92DA6172608831687000530F700F70BC6
:100BE000EF2D8312A6172608831687008312871B12
:100BF000FB2D0310FC2D0314C70C4F30F700F70B2F
:100C0000FF2D022EC60ADD2D4708F8000800BD01A1
:100C10009525CC30C600B4254430C600B425BD08A7
:100C2000031D162EDC257808BD000F2E9525CC302F
:100C3000C600B425BE30C600B425DC257808BE0049
:100C4000DC257808BF003F08C1003E08C00041080D
:100C5000C7004008C6008E30F7004708F800460875
:100C6000F900FA01C71F392EF809F909F90A031921
:100C7000F80AF808031D462E7908F800F901083033
:100C8000F702F808031D462EF7014F2E0310F81B3C
:100C90004D2EF90DF80DF703462EC71FF8137708F0
:100CA000C6007808C7007908C8007A08C900490852
:100CB000CD004808CC004708CB004608CA00D10147
:100CC000D001CF018330CE004A080319292FD60066
:100CD0004E080319292FD602031C732E7F30D60726
:100CE0000318292F792E8130D602031C292F0319CE
:100CF000292F5608F700F801F901FA01D5014B0830
:100D0000D400D4174C08D3004D08D2001930D600B7
:100D10005108D20203189C2E0130D30203189C2ED6
:100D2000D40203189C2ED50203189C2ED50AD40A8F
:100D3000D30A5108D207CE2E5008D3020318B72E7B
:100D40000130D4020318B72ED5020318B72ED50AE6
:100D5000D40A5008D3075108D207031CCE2ED30A59
:100D6000031DCE2ED40A031DCE2ED50ACE2E4F083B
:100D70008038D4020318CD2E0130D5020318CD2EB1
:100D8000D50A4F088038D4075008D307031CAB2E70
:100D9000D40A031DAB2ED50AAB2E7A14D60BD12E56
:100DA000DC2E0310D20DD30DD40DD50D0310FA0D8A
:100DB000F90DF80DD70D882E571CE42E0310F80CF2
:100DC000F90CFA0CD70CE72EF7030319292FD71BC0
:100DD000102F0310D20DD30DD40DD50D5108D20212
:100DE0000318FC2E0130D3020318FC2ED402031882
:100DF000FC2ED502031C1F2F5008D3020318072F07
:100E00000130D4020318072FD502031C1F2F4F08EF
:100E10008038D4020318102F0130D502031C1F2F75
:100E2000FA0A031D1F2FF90A031D1F2FF80A031DBD
:100E30001F2FF70A0319292FF80CF90CFA0C4B088D
:100E4000D6004F08D606D61F272FF8172D2FF813D8
:100E50002D2FF701F801F901FA017A08C500790888
:100E6000C4007808C3007708C2004208F7004308AE
:100E7000F8004408F9004508FA008A150A129F2B69
:100E8000F701F801F901FA01D801D901DA01DB0112
:100E9000570856045504540403197E2F2030DC00F3
:100EA0000310D00DD10DD20DD30DD80DD90DDA0D03
:100EB000DB0D57085B02031D672F56085A02031DFE
:100EC000672F55085902031D672F54085802031C49
:100ED000782F5408D8025508031C550FD90256081C
:100EE000031C560FDA025708031C570FDB020314CA
:100EF000F70DF80DF90DFA0DDC0B502F583084006A
:100F000083130800BE1B942F0F30F7003D0EF7052A
:100F10000A30770203188F2F3030F707912F3E08E1
:100F2000F7077708D000FA240F30BD050A303D02DC
:100F300003189C2F30309E2FBE133E08BD073D087E
:0A0F4000D000FA248A150A12952C3D
:101000000408C8004708CA00031921284608F00050
:101010004508EF004408EE004308ED00F401F30139
:101020002030F2008230F1008A11F8228A157A0805
:10103000C6007908C5007808C4007708C300CA0B49
:1010400006284608D3004508D2004408D1004308CA
:10105000D0005008B63CD000FA015108D400D11796
:101060000310D10CD20CD30CFA0CF90CF80CF70CC1
:10107000D00B3028D41F4728F709F809F909FA09D5
:10108000F70A0319F80A0319F90A0319FA0A7A0880
:10109000C6007908C5007808C4007708C300C61FD9
:1010A0005E28C803C816C309C409C509C609C30A0E
:1010B0000319C40A0319C50A0319C60A3B30CF0035
:1010C0009A30CE00CA30CD00CC010A30CA004708A1
:1010D0000319C80A4608D3004508D2004408D100C5
:1010E0004308D0004F08D7004E08D6004D08D50061
:1010F0004C08D4008A1140278A150008C300840ACE
:101100000008C400840A0008C500840A0008C6005C
:10111000FD308407F708031DA028470A4A02031977
:10112000A02848080319A2280F394A0203199A284F
:101130000318DA28C81BDA28481BA2282030D42834
:101140002030C805C81EB228C8124708031DC803AE
:101150007708C8002D30D0008A11FA248A15480873
:10116000F700C80147084A02031DC2287708C800D3
:101170002E30D0008A11FA248A154808F700203052
:10118000C80500303030C81ED428C8124708031DD7
:10119000C8037708C8002D30D0008A11FA248A15B8
:1011A0004808F700C8013030F7077708D0008A11E7
:1011B000FA248A154F08D3004E08D2004D08D100FA
:1011C0004C08D000D701D601D5010A30D4008A11CD
:1011D00040278A157A08CF007908CE007808CD001C
:1011E0007708CC00CA0B6A280800840183131F30DB
:1011F0008305713083168F000F08861383128617BC
:10120000831603170908C039890003131F129F12A0
:1012100000300317880083128701880189010313B6
:10122000A001A1013030A2002E30A3003130A40073
:10123000A501FF30A600A701A801AA01A9018316F4
:1012400003170908C039890003131F129F120030C9
:1012500003178800831203131F139F1383169F170E
:1012600083121F149412A612260883168700831275
:1012700026162608831687008312A61126088316D1
:101280008700013083129400003083169400010817
:10129000C73908388100831290010030F8009200AD
:1012A00000308316920083122615260883168700C5
:1012B0008312970183169B019C0101309D008312CC
:1012C00003178701880189017130831603138F008A
:1012D0000F081530831203178D0000308F008A111C
:1012E000031352208A15203003178D0000308F0021
:1012F0008A11031352208A15293003178D000030FC
:101300008F008A11031352208A158A110F298A151A
:101310008A11ED298A15B4016430BD008A11D921E2
:101320008A15BE01BD01BC01BB01BA01B9018A1118
:10133000B0218A150330D0008A1114228A154D106D
:1013400078184D144D18B2298A1156228A158A111F
:1013500078228A157908CF007808CE004E08F80068
:101360004F08F9007908BE007808BD008A11B02145
:101370008A150530D0008A1114228A154D1078186C
:101380004D144D18D1298A1156228A158A117822B6
:101390008A157908CF007808CE004E08F8004F086B
:1013A000F9007908C0007808BF003E08CE003D086B
:1013B000CD004008D0003F08CF004E08E6004D08A1
:1013C000E5008A11DB228A157708D9007808DA004F
:1013D0007908DB007A08DC00F0007908EF00780873
:1013E000EE007708ED000A30F400D730F300233028
:1013F000F2007830F1008A11F8228A157708D900B6
:101400007808DA007908DB007A08DC0083147A08AF
:10141000EC007908EB007808EA007708E900F001B1
:10142000EF012030EE008430ED008A1189238A1507
:101430007A08B8007908B7007808B6007708B500D0
:101440005008E6004F08E5008A11DB228A157A0869
:10145000D8007908D7007808D6007708D500580852
:10146000F0005708EF005608EE005508ED00543024
:10147000F400E330F3002530F2007A30F1008A11F5
:10148000F8228A157708D9007808DA007908DB0095
:101490007A08DC005808F0005708EF005608EE0004
:1014A0005508ED005808F4005708F3005608F200FC
:1014B0005508F1008A11F8228A157708DD007808AE
:1014C000DE007908DF007A08E000F0007908EF001C
:1014D0007808EE007708ED00A230F400E730F30062
:1014E0003B30F2006C30F1008A11F8228A15831427
:1014F0005C08EC005B08EB005A08EA005908E900B8
:101500007A08F0007908EF007808EE007708ED001F
:101510008A1189238A157708D9007808DA007908B2
:10152000DB007A08DC0083147A08EC007908EB0011
:101530007808EA007708E900F001EF01EE01813058
:10154000ED008A1189238A157A08C4007908C3003E
:101550007808C2007708C10083143808EC00370807
:10156000EB003608EA003508E900F001EF014830E9
:10157000EE008330ED008A1189238A157708D9009F
:101580007808DA007908DB007A08DC00AC30F0007B
:10159000C530EF002730EE007130ED005808F40040
:1015A0005708F3005608F2005508F1008A11F82296
:1015B0008A1583100A30EC00D730EB002330EA00A4
:1015C0007830E9007A08F0007908EF007808EE003A
:1015D0007708ED008A1189238A155C08F0005B0802
:1015E000EF005A08EE005908ED007A08F400790877
:1015F000F3007808F2007708F1008A11F8228A15C2
:101600007708D9007808DA007908DB007A08DC006E
:1016100083107A08EC007908EB007808EA00770874
:10162000E9004408F0004308EF004208EE004108DA
:10163000ED008A1189238A157A08BC007908BB005D
:101640007808BA007708B9002130F700F70B262B8D
:101650002430F3008A1130208A152130F700F70B6F
:101660002F2BA8012B30A7004130D0008A11FA247B
:101670008A155730D0008A11FA248A155330D000C9
:101680008A11FA248A152230840083138A11072DC7
:101690008A152030D0008A11FA248A15B3012B3024
:1016A000330784008313800803196D2B2130F70062
:1016B000F70B582B2B303307840083130008BD0031
:1016C0003D08F3008A1130208A153308B30A2B3EF7
:1016D000840083130008B4064F2BA8012B30A70009
:1016E000103084002A08BE002908BD008A111F2D71
:1016F0008A152030D0008A11FA248A15B3012B30C4
:10170000330784008313800803199D2B2130F700D1
:10171000F70B882B2B303307840083130008BD00A0
:101720003D08F3008A1130208A153308B30A2B3E96
:10173000840083130008B4067F2B8A11072E8A15B4
:101740007708BD007808BE007908BF007A08C0009D
:10175000C2010408C1004210831B421483104008D8
:10176000EC003F08EB003E08EA003D08E90033309A
:10177000F0009330EF000830EE008730ED008A1162
:1017800089238A1541088400831342188317770838
:10179000BD007808BE007908BF007A08C000A80123
:1017A0002B30A700893084004008C6003F08C500E0
:1017B0003E08C4003D08C3000230C70000202030AE
:1017C000D0008A11FA248A15B3012B303307840024
:1017D000831380080319032C2130F700F70BEE2B3D
:1017E0002B303307840083130008BD003D08F3004D
:1017F0008A1130208A153308B30A2B3E84008313E4
:101800000008B406E52B83103808EC003708EB001D
:101810003608EA003508E9003330F0009330EF0075
:101820000830EE008730ED008A1189238A15770889
:10183000BD007808BE007908BF007A08C000A80182
:101840002B30A700893084004008C6003F08C5003F
:101850003E08C4003D08C3000230C700002020300D
:10186000D0008A11FA248A15B3012B303307840083
:10187000831380080319532C2130F700F70B3E2CFB
:101880002B303307840083130008BD003D08F300AC
:101890008A1130208A153308B30A2B3E8400831343
:1018A0000008B406352CA8012B30A700893084002D
:1018B0003C08C6003B08C5003A08C4003908C3000C
:1018C0000230C70000202030D0008A11FA248A1587
:1018D000B3012B3033078400831380080319872C4E
:1018E0002130F700F70B722C2B3033078400831361
:1018F0000008BD003D08F3008A1130208A15330826
:10190000B30A2B3E840083130008B406692CA80197
:101910002B30A7002A30D0008A11FA248A15340807
:10192000BD003730BE008A11822F8A150D30D000DD
:101930008A11FA248A150A30D0008A11FA248A15ED
:10194000B3012B3033078400831380080319B92CAB
:101950002130F700F70BAA2C3308B30A2B3E840082
:1019600083130008BD003D08F3008A1130208A155A
:10197000A12C2130F700F70BBB2C6400A90A031936
:06198000AA0A8B29630096
:100060006330840083130008031943280230F8002A
:10007000F701F70B3928F80B38289730F700F70B02
:100080003F28800B362808008316861383128613B8
:100090000830F8004B280000F8175E28F813831684
:1000A000D60C831203188617031C861378175E2854
:1000B0007813F80B4F285C28000086173F30840027
:1000C000840B60280000F81B4E28781B5828080075
:1000D000831603178C170C140000000083120C0801
:1000E0007F390319B0280313D90003170D08031330
:1000F000DA0003170F080313DB0059088316D60034
:10010000831244205A0803178D0003135B0803175A
:100110008F0083168C170C140000000083120C0D46
:100120000E0D7F390319B0280313D90003170D08EA
:100130000313DA0003170F080313DB0059088316B3
:10014000D600831244205A0803178D0003135B085E
:1001500003178F008D0A03198F0A031368280317EA
:100160000313080083165308D5005208D40055081D
:10017000FA005408840083137A188317800803193F
:10018000C528D40A0319D50AB72852085402F70023
:100190005508FA005308031C530FFA027708F800B9
:1001A00083120800831603178C170C14000000003C
:1001B0000318082983120C087F3983160313D30010
:1001C000831203170D0883160313D4008312031739
:1001D0000F0883160313D5005308D600831244205A
:1001E00083165408831203178D00831603135508D2
:1001F000831203178F0083168C170C140000000065
:100200000313D20B042906290317082932290317DF
:1002100083120C0D0E0D7F3983160313D300831246
:1002200003170D0883160313D400831203170F0856
:1002300083160313D5005308D60083124420831677
:100240005408831203178D00831603135508831275
:1002500003178F008D0A03198F0A031083160313E7
:10026000D20BD32883120800800803195029831663
:10027000D3010408D2005310831B53140008D60086
:100280008312442083165208840083135318831763
:10029000840A031D4E298312850A8316831234298A
:1002A000080024308316A0004930A1006430A20069
:1002B0003A30A3002030A4006930A5007230A600B7
:1002C0006D30A7007230A8006130A9006B30AA0021
:1002D0003430AB002E30AC006330AD002030AE00C7
:1002E0003230AF003130B0003730B100B2002030D2
:1002F000B3003230B4003030B5003130B600B70052
:100300002D30B8003030B9003930BA002D30BB0084
:100310003030BC003530BD002030BE003130BF0071
:100320003830C0003A30C1003530C2003630C3002A
:100330003A30C4003130C5003630C6005A30C700EC
:100340002030C8006B30C9006130CA006B30CB0070
:100350006C30CC006930CD006B30CE002030CF0047
:100360002430D000D101D301A030D2008312B220BA
:1003700001307802A03E840083130008243C031D52
:10038000CD298316D301A030D2008312B2200130D0
:100390007802A03E840083138001043003178D008F
:1003A00000308F0003100F3083160313D200831226
:1003B000D22022308400831334210C3003178D00A7
:1003C00000308F0003140F3083160313D200831202
:1003D000D22023308316D60083124420A430840018
:1003E000831334210D308316D600831244200A3043
:1003F0008316D6008312442064008A110A169F28AF
:1004000083160814881083128810062A072A831678
:100410008810831288140C2A0D2A83160810831260
:100420000810122A132A83168810831288100330AA
:10043000F700F70B192A8316881083128814202AD4
:10044000212A83160814242A252A8810831288104A
:100450000800831608148810831288100330F700F0
:10046000F70B302AD9015908083C031C492A831686
:100470008810831288140330F700F70B3D2A831687
:100480008810831288100330F700F70B452AD90A29
:10049000332A00221430E30030208A110A16A228E1
:1004A0008E30F70083162D08F8002C08F900FA01A9
:1004B000F808031D652A7908F800F9010830F702E9
:1004C000F808031D652AF7016D2A0310F81B6C2A32
:1004D000F90DF80DF703652AF81383120800660872
:1004E0000319342BF2006A080319342BF202031C9F
:1004F0007E2A7F30F2070318342B842A8130F202DF
:10050000031C342B0319342B7208F700F801F9018E
:10051000FA01F1016708F000F0176808EF006908B8
:10052000EE001930F2006D08EE020318A72A013020
:10053000EF020318A72AF0020318A72AF1020318F2
:10054000A72AF10AF00AEF0A6D08EE07D92A6C080B
:10055000EF020318C22A0130F0020318C22AF10286
:100560000318C22AF10AF00A6C08EF076D08EE07BB
:10057000031CD92AEF0A031DD92AF00A031DD92A20
:10058000F10AD92A6B088038F0020318D82A013002
:10059000F1020318D82AF10A6B088038F0076C08BA
:1005A000EF07031CB62AF00A031DB62AF10AB62A81
:1005B0007A14F20BDC2AE72A0310EE0DEF0DF00D92
:1005C000F10D0310FA0DF90DF80DF30D932A731CBC
:1005D000EF2A0310F80CF90CFA0CF30CF22AF703CB
:1005E0000319342BF31B1B2B0310EE0DEF0DF00D35
:1005F000F10D6D08EE020318072B0130EF0203180E
:10060000072BF0020318072BF102031C2A2B6C089E
:10061000EF020318122B0130F0020318122BF10223
:10062000031C2A2B6B088038F00203181B2B0130A7
:10063000F102031C2A2BFA0A031D2A2BF90A031DB7
:100640002A2BF80A031D2A2BF70A0319342BF80C5E
:10065000F90CFA0C6708F2006B08F206F21F322B55
:10066000F817382BF813382BF701F801F901FA01C4
:1006700008008030831C3F2B8316B5068312831637
:10068000BA01BB013108B9003508B90630080319B1
:100690002D2CB800F70034080319362CB8020319C2
:1006A000D22B031C902B3508BE00BE173608BD00A8
:1006B0003708BC00BB010310BE0CBD0CBC0CBB0C4E
:1006C000B80B5A2BB91F672B3A144A2C3A10381022
:1006D0003A16B330840083135F2C3A12B91B7A2B7D
:1006E000381C852BBE0CBD0CBC0CBB0CF70A0319C7
:1006F000452C852BBE1B882B0310BB0DBC0DBD0DDF
:10070000BE0DF7030319452C7A2B3A17F22B3A1337
:100710003108B900B91F8E2BBE173E2CBE133E2CDC
:100720003408B800F7003008B8023108BE00BE1720
:100730003208BD003308BC00BB010310BE0CBD0C69
:10074000BC0CBB0CB80B9C2BB91FA92BBA144A2CA0
:10075000BA103810BA16B730840083135F2CBA125F
:10076000B91BBC2B381CC72BBE0CBD0CBC0CBB0C66
:10077000F70A0319452CC72BBE1BCA2B0310BB0D50
:10078000BC0DBD0DBE0DF7030319452CBC2BBA17CC
:10079000F22BBA133508B900B91FD02BBE173E2C67
:1007A000BE133E2C3508BE00BE173608BD00370804
:1007B000BC00B91FDF2BBE133A154A2C3A11BB01FE
:1007C0003810B330840083135F2CB91B082C310818
:1007D000B900381CF22BBE0CBD0CBC0CBB0CF70ACC
:1007E0000319452CBB1F032CBC0A031D032CBD0A97
:1007F000031D032CBE0A031D032CBE0CBD0CBC0C38
:10080000F70A0319452C3A1B872BBA1BC92B272C37
:100810008030BE06BE1F102C4A2C3508B9001D2C96
:100820003108B900BE08031D1D2CBD08031D1D2C79
:10083000BC08031D1D2CF7013E2CBE1B272C0310EA
:10084000BB0DBC0DBD0DBE0DF70B1D2C452CB91FEE
:100850002B2CBE173E2CBE133E2C3408F700350857
:10086000BE003608BD003708BC003E2C3008F7003B
:100870003108BE003208BD003308BC003E08F80055
:100880003D08F9003C08FA007D2CF701F801F90158
:10089000FA017D2CBB01BC09BD09BE09BB09BB0A1D
:1008A000031D582CBC0A031D582CBD0A0319BE0A8F
:1008B0003A18662BBA18A82B3A19DE2B0D2C000813
:1008C000BC07031C692CBD0A031D692CBE0A031951
:1008D000381484030008BD07031C712CBE0A0319D9
:1008E000381484030008801F803ABE0703183814A8
:1008F0003A1A6D2BBA1AAF2BE52B8312080026117A
:100900002608831687008312071113088830930086
:100910008316140C031C892C83121308930183166D
:10092000140C031C902C83121308D90013088A306E
:1009300093008316140C031C9A2C83121308930142
:100940008316140C031CA12C83121308DA0013085D
:100950008C3093008316140C031CAB2C83121308E9
:1009600093018316140C031CB22C83121308DB00B2
:1009700013088E3093008316140C031CBC2C8312B6
:10098000130893018316140C031CC32C8312130841
:10099000DC001308903093008316140C031CCD2C3C
:1009A0008312130893018316140C031CD42C831296
:1009B0001308DD001308923093008316140C031CF7
:1009C000DE2C8312130893018316140C031CE52CF0
:1009D00083121308DE001308943093008316140C5E
:1009E000031CEF2C8312130893018316140C031CB1
:1009F000F62C83121308DF00130896309300831639
:100A0000140C031C002D8312130893018316140C7D
:100A1000031C072D83121308E000130893018316AB
:100A2000140C031C102D8312261126088316870030
:100A300083120715E2015908E100E10DE20DE10D15
:100A4000E20DE10DE20DE10DE20DE10DE20DE03010
:100A5000E1055A0CF700F70CF70C1F30F705770883
:100A6000E1070318E20A5A0807398316AD01AC0002
:100A7000831250227A08E9007908E8007808E70034
:100A80007708E600ED01EC01EB018230EA006F220D
:100A90007708E5007808E6007908E7007A08E800BA
:100AA00062088316AD00831261088316AC008312BE
:100AB000502283107A088316B3007908B2007808B0
:100AC000B1007708B000831268088316B70083125C
:100AD00067088316B600831266088316B500831272
:100AE00065088316B400831239237A08AA007908AE
:100AF000A9007808A8007708A7005B081F39FA0149
:100B0000E200E1015C08E1070318E20A62088316CB
:100B1000AD00831261088316AC00831250227A085C
:100B2000E9007908E8007808E7007708E600ED01B9
:100B3000EC01EB018C30EA006F227708E1007808C5
:100B4000E2007908E3007A08E40083147A08831647
:100B5000B300831279088316B200831278088316D3
:100B6000B100831277088316B000B701B601403098
:100B7000B5008030B400831239237A08AE007908BA
:100B8000AD007808AC007708AB0080305D02E20170
:100B9000E100E200E1015E08E1070318E20A6208F1
:100BA0008316AD00831261088316AC0083125022B5
:100BB0007A08E9007908E8007808E7007708E60095
:100BC000ED01EC01EB018D30EA006F227708E100C6
:100BD0007808E2007908E3007A08E40083147A08D0
:100BE0008316B300831279088316B2008312780843
:100BF0008316B100831277088316B000B701B601DF
:100C0000B5018030B400831239237A08B200790824
:100C1000B1007808B0007708AF00FA015F08E20081
:100C2000E1016008E1070318E20A62088316AD00DB
:100C3000831261088316AC00831250227A08E900FF
:100C40007908E8007808E7007708E600ED01EC0194
:100C5000EB019730EA006F227A08B6007908B500F8
:100C60007808B4007708B3008A110A16A5288030E6
:100C7000EE000330F700F70B3B2EED016D08073C4B
:100C8000031C5E2E83168810831288106C086E0574
:100C900003194E2E83160814532E83128316081040
:100CA000831208108316542E552E88108312881430
:100CB000592E5A2E0310EE0CED0A3E2E8316881084
:100CC00083128810632E642E8316081483126F100B
:100CD00008186F1483168810831288146F2E702ED4
:100CE000831688108312881000306F180130F800C6
:100CF0000800831608148810831288107F2E802E17
:100D0000ED01EC016D08753C031C9A2E031D8C2E21
:100D10006C082F3C031C9A2E831608148312081C9F
:100D20009A2E0630F700F70B932E0000EC0A0319F9
:100D3000ED0A822E0800EE01ED01EC016C08073C83
:100D4000031CB82E0310ED0DEE0D831688108312D0
:100D50008814AA2EAB2E83160814831208186D145B
:100D60008316881083128810B52EB62EEC0A9E2E9C
:100D70008316081083120810BD2EBE2E831688100D
:100D8000831288140330F700F70BC42E83168810E3
:100D900083128810CB2ECC2E831608148312EC01FC
:100DA0006C08073C031CEA2E0310ED0DEE0D8316B4
:100DB000881083128814DC2EDD2E8316081483120B
:100DC00008186D148316881083128810E72EE82EF9
:100DD000EC0AD02E83160814ED2EEE2E8810831206
:100DE00088140330F700F70BF32E83168810831254
:100DF00088106D08F8006E08F900080083163408A2
:100E000003196F2FBC00380803196F2FBC07031894
:100E1000102F7F30BC02031C6F2F03196F2F142F6C
:100E20008130BC0703186F2F3C08F700F801F90167
:100E3000FA013508C000C0173608BF003708BE00E9
:100E40001830BC00BD013E1C3D2F3B08FA07031CB7
:100E50002F2FF90A031D2F2FF80A0319BD173A087F
:100E6000F907031C362FF80A0319BD173908B60015
:100E7000B6173608F8070318BD17BD0DF80CF90CA6
:100E8000FA0CC00CBF0CBE0C0310BC0B222F01309F
:100E9000F70703186F2FF81B542FC00DFA0DF90D2B
:100EA000F80DF70303196F2FC01F652FFA0A031DF2
:100EB000652FF90A031D652FF80A031D652FF80C2D
:100EC000F90CFA0CF70A03196F2F3508BD00390821
:100ED000BD06BD1F6D2FF817732FF813732FF70181
:100EE000F801F901FA01831208000830E302031C3B
:100EF000852F6330840083130310800C00080319CE
:100F0000852F832F0000800B822F0800A613260850
:100F100083168700831287130230E200F830E30063
:100F20007527E20B8E2FA61726088316870002303E
:100F30008312E200F830E3007527E20B9A2FA61720
:100F400026088316870083120800E3016308073C24
:100F5000031CCC2FA6132608831687008312871341
:100F6000B12FB22F0314E20C0318B82F8713B92F37
:100F70008717A6132608831687002730F700F70B7C
:100F8000BF2FC22F8312A617260883168700C82FEB
:100F9000C92F8312E30AA62F0800E2016208073C6A
:100FA000031CF52FA61326088316870083128713C8
:100FB000D92FDA2FA6172608831687000530F700E9
:100FC000F70BE02F8312A6172608831687008312DB
:100FD000871BEC2F0310ED2F0314E30C4F30F700A9
:100FE000F70BF02FF32FE20ACE2F6308F80008006A
:10100000D9018A1186278A15CC30E2008A11A527DA
:101010008A154430E2008A11A5278A15D908031DD4
:1010200017288A11CD278A157808D9000E288A1129
:1010300086278A15CC30E2008A11A5278A15BE3092
:10104000E2008A11A5278A158A11CD278A1578080A
:10105000DA008A11CD278A157808DB005B08DD00ED
:101060005A08DC005D08E3005C08E2008E30F700FF
:101070006308F8006208F900FA01E31F4428F80940
:10108000F909F90A0319F80AF808031D5128790823
:10109000F800F9010830F702F808031D5128F7019C
:1010A0005A280310F81B5828F90DF80DF70351289A
:1010B000E31FF8137708E2007808E3007908E400FA
:1010C0007A08E500E9006408E8006308E7006208C0
:1010D000E600ED01EC01EB018330EA008A116F229A
:1010E0008A157A08E1007908E0007808DF007708BF
:1010F000DE005E08F7005F08F8006008F90061088C
:10110000FA008A110A16702A26112608831687000B
:10111000831207111308223093008316140C031C4A
:101120008E288312130893018316140C031C952830
:1011300083122611260883168700831207150A30AA
:10114000E3008A1130208A152611260883168700AD
:10115000831207111308843093008316140C031CA8
:10116000AE288312130893018316140C031CB528B0
:1011700083121308DA001308863093008316140CC8
:10118000031CBF288312130893018316140C031C3D
:10119000C62883121308D900130893018316140C70
:1011A000031CCF288312261126088316870083127A
:1011B0000715DE015A08DD00DE00DD015908DD07F4
:1011C0000318DE0A5E0CDC005D0CDB00DC0CDB0CC3
:1011D000DC0CDB0CDC0CDB0CDC0CDB0CDC0CDB0CD3
:1011E0000330DC055C088316AD0083125B088316B0
:1011F000AC008A11831250228A157708DD00780826
:10120000DE007908DF007A08E00083147A0883168C
:10121000B300831279088316B2008312780883160C
:10122000B100831277088316B000B701B601793098
:10123000B5008730B4008A11831239238A157708E4
:10124000DD007808DE007908DF007A08E000E900B8
:101250007908E8007808E7007708E6003330ED0009
:10126000EC00AB30EB008130EA008A116F228A1566
:101270007708DD007808DE007908DF007A08E000F2
:1012800083107A088316B300831279088316B2009C
:10129000831278088316B100831277088316B00092
:1012A000B701B6015830B5008330B4008A118312FB
:1012B00039238A158A110A16D02A26112608831680
:1012C0008700831207111308243093008316140C2F
:1012D000031C67298312130893018316140C031C43
:1012E0006E2983122611260883168700831207159C
:1012F0000A30E3008A1130208A1526112608831649
:101300008700831207111308803093008316140C92
:10131000031C87298312130893018316140C031CE2
:101320008E2983121308DA00130882309300831683
:10133000140C031C98298312130893018316140CB0
:10134000031C9F2983121308D9002611260883162F
:10135000870083120715E4015A08E300E400E30163
:101360005908E3070318E40A640CDC00630CDB0093
:10137000DC0CDB0CDC0CDB0CDC0CDB0CDC0CDB0C31
:10138000DC0CDB0C0330DC052611260883168700F5
:10139000831207111308843093008316140C031C66
:1013A000CE298312130893018316140C031CD5292C
:1013B00083121308DA001308863093008316140C86
:1013C000031CDF298312130893018316140C031CDA
:1013D000E62983121308D900130893018316140C0D
:1013E000031CEF2983122611260883168700831217
:1013F0000715E4015A08E300E400E3015908E30794
:101400000318E40A640CDE00630CDD00DE0CDD0C66
:10141000DE0CDD0CDE0CDD0CDE0CDD0CDE0CDD0C80
:101420000330DE055E088316AD0083125D08831667
:10143000AC008A11831250228A1536088316B70031
:10144000831235088316B600831234088316B5005C
:10145000831233088316B4007A08BB007908BA00F7
:101460007808B9007708B8008A118312FE268A1519
:1014700083102E088316B30083122D088316B20042
:1014800083122C088316B10083122B088316B00038
:101490007A08B7007908B6007808B5007708B40074
:1014A0008A11831239238A157708E3007808E4004B
:1014B0007908E5007A08E6005C088316AD0083121F
:1014C0005B088316AC008A11831250228A156608C5
:1014D0008316B700831265088316B600831264086A
:1014E0008316B500831263088316B4007A08BB0024
:1014F0007908BA007808B9007708B8008A11831211
:10150000FE268A1583102A088316B3008312290841
:101510008316B200831228088316B10083122708AD
:101520008316B0007A08B7007908B6007808B500CD
:101530007708B4008A11831239238A157708E300EB
:101540007808E4007908E5007A08E6005E0883166A
:10155000AD0083125D088316AC008A1183125022FD
:101560008A1532088316B700831231088316B60035
:10157000831230088316B50083122F088316B40037
:101580007A08BB007908BA007808B9007708B80073
:101590008A118312FE268A15831066088316B3000B
:1015A000831265088316B200831264088316B100A3
:1015B000831263088316B0007A08B7007908B60072
:1015C0007808B5007708B4008A11831239238A1588
:1015D0007A08E2007908E1007808E0007708DF0087
:1015E00062088316B700831261088316B60083125F
:1015F00060088316B50083125F088316B400883034
:10160000BB002030BA000230B9007B30B8008A112C
:101610008312FE268A157708E3007808E40079082B
:10162000E5007A08E60083107A088316B300831277
:1016300079088316B200831278088316B1008312EA
:1016400077088316B000B701B6014830B500843082
:10165000B4008A11831239238A158A110A160C2BB9
:101660003708840083133818831766088000840ABB
:101670008001B70A0319B80A080080080319522B21
:10168000DA010408D9005A10831B5A140008E60036
:1016900030235908840083135A188317840A0319C6
:1016A000850A3D2B8A110A16632BE1010408E0002C
:1016B0006110831B61145A0EF038DC00DC07E23E37
:1016C000DD00323EDF005A080F39DD07DD07DF0796
:1016D000E93EDE00DE07DE07590E0F39DE07DF07C1
:1016E000DE0DDF0DDF09DF0D59080F39DF07DC0DD7
:1016F0000730DB000A30DF07DE03031C7B2BDE072D
:10170000DD03031C7F2BDD07DC03031C832BDC07BD
:10171000DB03031C872B5B308400831307306005D9
:10172000601384075F300402031960170008F70094
:10173000031DA22B601BA22B601AB42BE019A22B55
:101740002030A52BE01560123030F707DA010408CD
:10175000D9005A10831B5A147708E6003023590821
:10176000840083135A188317840A601F922B8A11EE
:101770000A16992BF701F801F901FA01EE01EF01C0
:10178000F001F1016D086C046B046A040319F82B75
:101790002030F2000310E60DE70DE80DE90DEE0D27
:1017A000EF0DF00DF10D6D087102031DE12B6C08BA
:1017B0007002031DE12B6B086F02031DE12B6A0809
:1017C0006E02031CF22B6A08EE026B08031C6B0FFF
:1017D000EF026C08031C6C0FF0026D08031C6D0F08
:1017E000F1020314F70DF80DF90DFA0DF20BCA2BE7
:1017F0006E308400831308000408DE005D08E000FA
:101800000319252C5C088316B70083125B08831626
:10181000B60083125A088316B5008312590883163E
:10182000B400BB01BA012030B9008230B8008A117F
:101830008312FE268A157A08DC007908DB00780816
:10184000DA007708D900E00B022C5C08E9005B089D
:10185000E8005A08E7005908E6006608B63CE600CA
:10186000FA016708EA00E7170310E70CE80CE90C37
:10187000FA0CF90CF80CF70CE60B342CEA1F4B2C85
:10188000F709F809F909FA09F70A0319F80A031917
:10189000F90A0319FA0A7A08DC007908DB007808EB
:1018A000DA007708D900DC1F622CDE03DE16D909C6
:1018B000DA09DB09DC09D90A0319DA0A0319DB0A98
:1018C0000319DC0A3B30E5009A30E400CA30E3003B
:1018D000E2010A30E0005D080319DE0A5C08E90055
:1018E0005B08E8005A08E7005908E6006508ED00C3
:1018F0006408EC006308EB006208EA00BA23000801
:10190000D900840A0008DA00840A0008DB00840A8F
:101910000008DC00FD308407F708031DA22C5D0AD7
:1019200060020319A22C5E080319A42C0F3960026F
:1019300003199C2C0318D42CDE1BD42C5E1BA42C66
:101940002030D02C2030DE05DE1EB22CDE125D08E9
:10195000031DDE037708DE002D30E60030235E082D
:10196000F700DE015D086002031DC02C7708DE0071
:101970002E30E60030235E08F7002030DE05003010
:101980003030DE1ED02CDE125D08031DDE0377082A
:10199000DE002D30E60030235E08F700DE01303037
:1019A000F7077708E60030236508E9006408E800D7
:1019B0006308E7006208E600ED01EC01EB010A3084
:1019C000EA00BA237A08E5007908E4007808E30021
:1019D0007708E200E00B6E2C0800DA1BFF2C0F30BA
:1019E000F700590EF7050A3077020318FA2C303049
:1019F000F707FC2C5A08F7077708E60030230F306A
:101A0000D9050A3059020318072D3030092DDA1391
:101A10005A08D9075908E60030238A110A16002D02
:10200000840183131F308305713083168F000F08FE
:10201000861383128617831603170908C0398900AF
:1020200003131F129F1200300317880083128701C9
:10203000880189010313A001A1013030A2002E30D4
:10204000A3003130A400A501FF30A600B701B801FC
:10205000BA01B901831603170908C03989000313AF
:102060001F129F12003003178800831203131F13DF
:102070009F1383169F1783121F1483160108C739F5
:1020800008388100831290010030F800920000307F
:102090008316920083122615260883168700831262
:1020A000970183169B019C0101309D008312031749
:1020B0008701880189017130831603138F000F088F
:1020C00083129412A61226088316870083122616FE
:1020D0002608831687008312A61126088316870018
:1020E000223083129400403083169400831226110C
:1020F000260883168700831207156430E3000A124E
:1021000030200A16153003178D0000308F000A1298
:10211000031368200A16203003178D0000308F004B
:102120000A12031368200A16293003178D000030A5
:102130008F000A12031368200A160A1251290A1680
:102140000A12292A0A160A127F2C0A16C4016430C0
:10215000E3000A1230200A16DA01D901CC01CB01C2
:10216000CA01C9010A1200220A160330EC000A1241
:1021700037260A166910781869146918CD280A12CA
:1021800079260A160A129B260A167908EB007808A7
:10219000EA006A08F8006B08F9007908DA007808A4
:1021A000D9000A1200220A160530EC000A1237265E
:1021B0000A166910781869146918EC280A12792629
:1021C0000A160A129B260A167908EB007808EA001C
:1021D0006A08F8006B08F9007908DC007808DB0071
:1021E0005A08EA005908E9005C08EC005B08EB00BB
:1021F0006A088316AD00831269088316AC000A12C0
:10220000831250220A1677088316A0007808A100CE
:102210007908A2007A08A300B7002208B6002108B6
:10222000B5002008B4000A30BB00D730BA00233014
:10223000B9007830B8000A128312FE260A16770811
:102240008316A0007808A1007908A2007A08A300EC
:1022500083142308B3002208B2002108B10020082B
:10226000B000B701B6012030B5008430B4000A12C6
:10227000831239230A167A08C8007908C70078083B
:10228000C6007708C5006C088316AD0083126B0882
:102290008316AC000A12831250220A167A08F40040
:1022A0007908F3007808F2007708F10074088316C3
:1022B000B7007308B6007208B5007108B400543056
:1022C000BB00E330BA002530B9007A30B8000A12FA
:1022D0008312FE260A1677088316A0007808A1004C
:1022E0007908A2007A08A3007408B7007308B60042
:1022F0007208B5007108B4007408BB007308BA0016
:102300007208B9007108B8000A128312FE260A1674
:1023100077088316A4007808A5007908A6007A0833
:10232000A700B7002608B6002508B5002408B400A9
:10233000A230BB00E730BA003B30B9006C30B800C7
:102340000A128312FE260A16831483162308B3008A
:102350002208B2002108B1002008B0007A08B700B6
:102360007908B6007808B5007708B4000A1283121D
:1023700039230A1677088316A0007808A100790887
:10238000A2007A08A30083142308B3002208B20035
:102390002108B1002008B000B701B601B5018130B5
:1023A000B4000A12831239230A167A08E000790869
:1023B000DF007808DE007708DD0083144808831604
:1023C000B300831247088316B200831246088316AF
:1023D000B100831245088316B000B701B60148303A
:1023E000B5008330B4000A12831239230A16770825
:1023F0008316A0007808A1007908A2007A08A3003B
:10240000AC30B700C530B6002730B5007130B4002D
:102410007408BB007308BA007208B9007108B800EC
:102420000A128312FE260A1683100A308316B3009E
:10243000D730B2002330B1007830B0007A08B7004E
:102440007908B6007808B5007708B4000A1283123C
:1024500039230A1683162308B7002208B60021087C
:10246000B5002008B4007A08BB007908BA007808E3
:10247000B9007708B8000A128312FE260A167708F8
:102480008316A0007808A1007908A2007A08A300AA
:1024900083102308B3002208B2002108B1002008ED
:1024A000B000831260088316B70083125F0883169A
:1024B000B60083125E088316B50083125D0883168A
:1024C000B4000A12831239230A167A08CC0079085C
:1024D000CB007808CA007708C9000A128A150028BC
:1024E0000A168A117708D9007808DA007908DB0023
:1024F0007A08DC00DE010408DD005E10831B5E1438
:1025000083105C088316B30083125B088316B20045
:1025100083125A088316B100831259088316B0003B
:102520003330B7009330B6000830B5008730B400C0
:102530000A12831239230A165D08840083135E1879
:1025400083177A08D0007908CF007808CE00770882
:10255000CD00831048088316B30083124708831602
:10256000B200831246088316B10083124508831611
:10257000B0003330B7009330B6000830B500873074
:10258000B4000A12831239230A167A08C80079089F
:10259000C7007808C6007708C5000A128A15842883
:1025A0000A168A117708D9007808DA007908DB0062
:1025B0007A08DC00DE010408DD005E10831B5E1477
:1025C00083105C088316B30083125B088316B20085
:1025D00083125A088316B100831259088316B0007B
:1025E0003330B7009330B6000830B5008730B40000
:1025F0000A12831239230A165D08840083135E18B9
:1026000083177A08D4007908D3007808D2007708B5
:10261000D1000A128A155D290A168A117708D90095
:102620007808DA007908DB007A08DC008316B70046
:1026300083125B088316B60083125A088316B5000E
:10264000831259088316B400BB01BA012030B900C7
:102650008230B8000A128312FE260A167A08D800C1
:102660007908D7007808D6007708D5002130F70020
:10267000F70B382B24308316D6000A12831244201D
:102680000A162130F700F70B432BB8013B30B70097
:102690004130E6000A128A1530230A168A11573093
:1026A000E6000A128A1530230A168A115330E60012
:1026B0000A128A1530230A168A11223084008313E5
:1026C0000A128A153D2B0A168A112030E6000A12DA
:1026D0008A1530230A168A11C3013B304307840050
:1026E0008313800803198D2B2130F700F70B762B0D
:1026F0003B304307840083130008D9005908831630
:10270000D6000A12831244200A164308C30A3B3E2D
:10271000840083130008C4066D2BB8013B30B7005A
:10272000103084003A08DA003908D9000A128A15F4
:10273000552B0A168A112030E6000A128A1530231A
:102740000A168A11C3013B304307840083138008B3
:102750000319C32B2130F700F70BAC2B3B30430799
:10276000840083130008D90059088316D6000A1282
:10277000831244200A164308C30A3B3E8400831395
:102780000008C406A32BB8013B30B7008930840091
:102790005008DC004F08DB004E08DA004D08D90075
:1027A0000230DD000A128A15FC230A168A11203035
:1027B000E6000A128A1530230A168A11C3013B303B
:1027C00043078400831380080319FF2B2130F7008F
:1027D000F70BE82B3B304307840083130008D90034
:1027E00059088316D6000A12831244200A16430899
:1027F000C30A3B3E840083130008C406DF2BB801E4
:102800003B30B700893084004808DC004708DB0013
:102810004608DA004508D9000230DD000A128A15A0
:10282000FC230A168A112030E6000A128A1530238A
:102830000A168A11C3013B304307840083138008C2
:1028400003193B2C2130F700F70B242C3B304307B6
:10285000840083130008D90059088316D6000A1291
:10286000831244200A164308C30A3B3E84008313A4
:102870000008C4061B2CB8013B30B70002308400AE
:102880004C08DC004B08DB004A08DA004908D90094
:102890000130DD000A128A15FC230A168A11203045
:1028A000E6000A128A1530230A168A11C3013B304A
:1028B00043078400831380080319772C2130F70025
:1028C000F70B602C3B304307840083130008D900CA
:1028D00059088316D6000A12831244200A164308A8
:1028E000C30A3B3E840083130008C406572CB8017A
:1028F0003B30B700893084005408DC005308DB000B
:102900005208DA005108D9000230DD000A128A1597
:10291000FC230A168A112030E6000A128A15302399
:102920000A168A11C3013B304307840083138008D1
:102930000319B32C2130F700F70B9C2C3B304307D5
:10294000840083130008D90059088316D6000A12A0
:10295000831244200A164308C30A3B3E84008313B3
:102960000008C406932CB8013B30B7000430840043
:102970005808DC005708DB005608DA005508D90073
:102980000130DD000A128A15FC230A168A11203054
:10299000E6000A128A1530230A168A11C3013B3059
:1029A00043078400831380080319EF2C2130F700BC
:1029B000F70BD82C3B304307840083130008D90061
:1029C00059088316D6000A12831244200A164308B7
:1029D000C30A3B3E840083130008C406CF2CB80111
:1029E0003B30B7002A30E6000A128A1530230A1657
:1029F0008A114408D9003730DA000A128A15ED2C02
:102A00000A168A110D30E6000A128A1530230A16BA
:102A10008A110A30E6000A128A1530230A168A1132
:102A2000C3013B30430784008313800803192B2D17
:102A30002130F700F70B1A2D4308C30A3B3E8400F0
:102A400083130008D90059088316D6000A1283128E
:102A500044200A16112D2130F700F70B2D2D6400AC
:0A2A6000B90A0319BA0AA628630098
:04400E00F52CFF3F4F
:00000001FF
;PIC16F887
;CRC=E53B CREATED="23-II-13 01:39"
;CRC=6D57 CREATED="24-II-13 20:35"
/Designs/Measuring_instruments/AWS01A/SW/PIC16F887/main.pjt
17,15 → 17,17
0=0000 %S 0 0 796 451 3 0
[Opened Files]
1=main.c
2=main.h
3=C:\Program Files\PICC\devices\16F887.h
4=C:\Program Files\PICC\drivers\string.h
5=C:\Program Files\PICC\drivers\stddef.h
6=C:\Program Files\PICC\drivers\ctype.h
7=..\ds1820.c
8=..\1wire.c
9=..\SHT.c
10=
2=..\MPL115A1.c
3=main.h
4=C:\Program Files\PICC\devices\16F887.h
5=C:\Program Files\PICC\drivers\string.h
6=C:\Program Files\PICC\drivers\stddef.h
7=C:\Program Files\PICC\drivers\ctype.h
8=..\ds1820.c
9=..\1wire.c
10=..\SHT.c
11=
12=
[Target Data]
OptionString=-p +FM
FileList=D:\MLAB\Designs\Measuring_instruments\AWS01A\SW\PIC16F887\main.c
/Designs/Measuring_instruments/AWS01A/SW/SHT.c
1,245 → 1,245
///////////////////////////////////////////////////////////////////////////////
// //
// Driver file for SHT75 Temperature & Humidity Sensor //
// //
// ***** To initialise SHT75 sensor upon power up ***** //
// //
// Function : sht_init() //
// Return : none //
// //
// //
// ***** To measure and caluculate SHT75 temp & real RH ***** //
// //
// Function : sht_rd (temp, truehumid) //
// Return : temperature & true humidity in float values //
// //
///////////////////////////////////////////////////////////////////////////////
 
#define sht_data_pin PIN_D0
#define sht_clk_pin PIN_D1
 
 
//***** Function to alert SHT75 *****
 
void comstart (void)
{
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(2);
output_low(sht_data_pin); //data low
delay_us(2);
output_low(sht_clk_pin); //clk low
delay_us(5);
output_high(sht_clk_pin); //clk high
delay_us(2);
output_float(sht_data_pin); //data high
delay_us(2);
output_low(sht_clk_pin); //clk low
}
 
 
//***** Function to write data to SHT75 *****
 
int1 comwrite (int8 iobyte)
{
int8 i, mask = 0x80;
int1 ack;
 
//Shift out command
delay_us(5);
for(i=0; i<8; i++)
{
output_low(sht_clk_pin); //clk low
if((iobyte & mask) > 0) output_float(sht_data_pin); //data high if MSB high
else output_low(sht_data_pin); //data low if MSB low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(2);
mask = mask >> 1; //shift to next bit
}
 
//Shift in ack
output_low(sht_clk_pin); //clk low
delay_us(2);
ack = input(sht_data_pin); //get ack bit
output_high(sht_clk_pin); //clk high
delay_us(2);
output_low(sht_clk_pin); //clk low
return(ack);
}
 
 
//***** Function to read data from SHT75 *****
 
int16 comread (void)
{
int8 i;
int16 iobyte = 0;
const int16 mask0 = 0x0000;
const int16 mask1 = 0x0001;
 
//shift in MSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_high(sht_clk_pin); //clk high
delay_us(2);
if (input(sht_data_pin)) iobyte |= mask1; //shift in data bit
else iobyte |= mask0;
output_low(sht_clk_pin); //clk low
delay_us(2);
}
 
//send ack 0 bit
output_low(sht_data_pin); //data low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(5);
output_low(sht_clk_pin); //clk low
delay_us(2);
output_float(sht_data_pin); //data high
 
//shift in LSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_high(sht_clk_pin); //clk high
delay_us(2);
if (input(sht_data_pin)) iobyte |= mask1; //shift in data bit
else iobyte |= mask0;
output_low(sht_clk_pin); //clk low
delay_us(2);
}
 
//send ack 1 bit
output_float(sht_data_pin); //data high
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(5);
output_low(sht_clk_pin); //clk low
 
return(iobyte);
}
 
 
//***** Function to wait for SHT75 reading *****
 
void comwait (void)
{
int16 sht_delay;
 
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(2);
for(sht_delay=0; sht_delay<30000; sht_delay++) // wait for max 300ms
{
if (!input(sht_data_pin)) break; //if sht_data_pin low, SHT75 ready
delay_us(10);
}
}
 
 
//***** Function to reset SHT75 communication *****
 
void comreset (void)
{
int8 i;
 
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(5);
for(i=0; i<9; i++)
{
output_high(sht_clk_pin); //toggle clk 9 times
delay_us(5);
output_low(sht_clk_pin);
delay_us(5);
}
comstart();
}
 
 
//***** Function to soft reset SHT75 *****
 
void sht_soft_reset (void)
{
comreset(); //SHT75 communication reset
comwrite(0x1e); //send SHT75 reset command
delay_ms(15); //pause 15 ms
}
 
 
//***** Function to measure SHT75 temperature *****
 
int16 measuretemp (void)
{
int1 ack;
int16 iobyte;
 
comstart(); //alert SHT75
ack = comwrite(0x03); //send measure temp command and read ack status
if(ack == 1) return;
comwait(); //wait for SHT75 measurement to complete
iobyte = comread(); //read SHT75 temp data
return(iobyte);
}
 
 
//***** Function to measure SHT75 RH *****
 
int16 measurehumid (void)
{
int1 ack;
int16 iobyte;
 
comstart(); //alert SHT75
ack = comwrite(0x05); //send measure RH command and read ack status
if(ack == 1) return;
comwait(); //wait for SHT75 measurement to complete
iobyte = comread(); //read SHT75 temp data
return(iobyte);
}
 
 
//***** Function to calculate SHT75 temp & RH *****
 
void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
float truehumid1, rh;
 
//calculate temperature reading
tc = ((float) temp * 0.01) - 40.0;
 
//calculate Real RH reading
rh = (float) humid;
 
rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;
 
//calculate True RH reading
rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}
 
 
//***** Function to measure & calculate SHT75 temp & RH *****
 
void sht_rd (float & temp, float & truehumid)
{
int16 restemp, reshumid;
float realhumid;
restemp = 0; truehumid = 0;
 
restemp = measuretemp(); //measure temp
reshumid = measurehumid(); //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid); //calculate temp & RH
}
 
 
//***** Function to initialise SHT75 on power-up *****
 
void sht_init (void)
{
comreset(); //reset SHT75
delay_ms(20); //delay for power-up
}
///////////////////////////////////////////////////////////////////////////////
// //
// Driver file for SHT75 Temperature & Humidity Sensor //
// //
// ***** To initialise SHT75 sensor upon power up ***** //
// //
// Function : sht_init() //
// Return : none //
// //
// //
// ***** To measure and caluculate SHT75 temp & real RH ***** //
// //
// Function : sht_rd (temp, truehumid) //
// Return : temperature & true humidity in float values //
// //
///////////////////////////////////////////////////////////////////////////////
 
//#define sht_data_pin PIN_D0
//#define sht_clk_pin PIN_D1
 
 
//***** Function to alert SHT75 *****
 
void comstart (void)
{
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(2);
output_low(sht_data_pin); //data low
delay_us(2);
output_low(sht_clk_pin); //clk low
delay_us(5);
output_high(sht_clk_pin); //clk high
delay_us(2);
output_float(sht_data_pin); //data high
delay_us(2);
output_low(sht_clk_pin); //clk low
}
 
 
//***** Function to write data to SHT75 *****
 
int1 comwrite (int8 iobyte)
{
int8 i, mask = 0x80;
int1 ack;
 
//Shift out command
delay_us(5);
for(i=0; i<8; i++)
{
output_low(sht_clk_pin); //clk low
if((iobyte & mask) > 0) output_float(sht_data_pin); //data high if MSB high
else output_low(sht_data_pin); //data low if MSB low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(2);
mask = mask >> 1; //shift to next bit
}
 
//Shift in ack
output_low(sht_clk_pin); //clk low
delay_us(2);
ack = input(sht_data_pin); //get ack bit
output_high(sht_clk_pin); //clk high
delay_us(2);
output_low(sht_clk_pin); //clk low
return(ack);
}
 
 
//***** Function to read data from SHT75 *****
 
int16 comread (void)
{
int8 i;
int16 iobyte = 0;
const int16 mask0 = 0x0000;
const int16 mask1 = 0x0001;
 
//shift in MSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_high(sht_clk_pin); //clk high
delay_us(2);
if (input(sht_data_pin)) iobyte |= mask1; //shift in data bit
else iobyte |= mask0;
output_low(sht_clk_pin); //clk low
delay_us(2);
}
 
//send ack 0 bit
output_low(sht_data_pin); //data low
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(5);
output_low(sht_clk_pin); //clk low
delay_us(2);
output_float(sht_data_pin); //data high
 
//shift in LSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_high(sht_clk_pin); //clk high
delay_us(2);
if (input(sht_data_pin)) iobyte |= mask1; //shift in data bit
else iobyte |= mask0;
output_low(sht_clk_pin); //clk low
delay_us(2);
}
 
//send ack 1 bit
output_float(sht_data_pin); //data high
delay_us(2);
output_high(sht_clk_pin); //clk high
delay_us(5);
output_low(sht_clk_pin); //clk low
 
return(iobyte);
}
 
 
//***** Function to wait for SHT75 reading *****
 
void comwait (void)
{
int16 sht_delay;
 
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(2);
for(sht_delay=0; sht_delay<30000; sht_delay++) // wait for max 300ms
{
if (!input(sht_data_pin)) break; //if sht_data_pin low, SHT75 ready
delay_us(10);
}
}
 
 
//***** Function to reset SHT75 communication *****
 
void comreset (void)
{
int8 i;
 
output_float(sht_data_pin); //data high
output_low(sht_clk_pin); //clk low
delay_us(5);
for(i=0; i<9; i++)
{
output_high(sht_clk_pin); //toggle clk 9 times
delay_us(5);
output_low(sht_clk_pin);
delay_us(5);
}
comstart();
}
 
 
//***** Function to soft reset SHT75 *****
 
void sht_soft_reset (void)
{
comreset(); //SHT75 communication reset
comwrite(0x1e); //send SHT75 reset command
delay_ms(15); //pause 15 ms
}
 
 
//***** Function to measure SHT75 temperature *****
 
int16 measuretemp (void)
{
int1 ack;
int16 iobyte;
 
comstart(); //alert SHT75
ack = comwrite(0x03); //send measure temp command and read ack status
if(ack == 1) return;
comwait(); //wait for SHT75 measurement to complete
iobyte = comread(); //read SHT75 temp data
return(iobyte);
}
 
 
//***** Function to measure SHT75 RH *****
 
int16 measurehumid (void)
{
int1 ack;
int16 iobyte;
 
comstart(); //alert SHT75
ack = comwrite(0x05); //send measure RH command and read ack status
if(ack == 1) return;
comwait(); //wait for SHT75 measurement to complete
iobyte = comread(); //read SHT75 temp data
return(iobyte);
}
 
 
//***** Function to calculate SHT75 temp & RH *****
 
void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
float truehumid1, rh;
 
//calculate temperature reading
tc = ((float) temp * 0.01) - 40.0;
 
//calculate Real RH reading
rh = (float) humid;
 
rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;
 
//calculate True RH reading
rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}
 
 
//***** Function to measure & calculate SHT75 temp & RH *****
 
void sht_rd (float & temp, float & truehumid)
{
int16 restemp, reshumid;
float realhumid;
restemp = 0; truehumid = 0;
 
restemp = measuretemp(); //measure temp
reshumid = measurehumid(); //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid); //calculate temp & RH
}
 
 
//***** Function to initialise SHT75 on power-up *****
 
void sht_init (void)
{
comreset(); //reset SHT75
delay_ms(20); //delay for power-up
}