M
member_tdh
Guest
Bok!
Im 'koristeći PIC16F88 do sučelja sa SHT75, ali kod neće raditi.
Mogao bilo tko pomoć mene?!
poniłtava comstart (void)
(
trisa1 = 0; / / DATA u output-line
ra0 = 0;
ra1 = 1;
# asm nop # endasm
ra0 = 1;
# asm nop # endasm
ra1 = 0;
# asm nop # endasm
ra0 = 0;
# asm nop # endasm
ra0 = 1;
# asm nop # endasm
ra1 = 1;
# asm nop # endasm
ra0 = 0;
)
poniłtava comreset (void)
(
nepotpisani pougljiti I;
trisa1 = 0; / / DATA u output-line
ra1 = 1;
ra0 = 0;
for (i = 0; i <9; i ) / / 9 clock cycles
(
ra0 = 1;
# asm nop # endasm
ra0 = 0;
)
comstart (); / / prijenos start
HumiError = false;
)
poniłtava sht_soft_reset (void)
(
comreset (); / / SHT75 komunikacija reset
comwrite (RESET); / / SHT71 poslati naredba reset
)
poniłtava sht_init (void)
(
sht_soft_reset (); / / reset SHT71
/ / Comreset (); / / SHT71 komunikacija reset
delay_ms (15); / / kašnjenje za vlast-up
)
poniłtava comwait (void)
(
nepotpisani int16 sht_delay;
ra1 = 1;
ra0 = 0;
for (sht_delay = 0; sht_delay <30000; sht_delay )
(
if (! ra1)
(
/ / printf ( "\ n \ r-> SHT71 comwait pogreška! \ n \ r");
break;
)
delay_us (10);
)
)
poniłtava comwrite (nepotpisano pougljiti ddata)
(
nepotpisani pougljiti I;
trisa1 = 0; / / DATA u output-line
for (i = 0; i <8; i )
(
ra0 = 0;
if (ddata & 0x80) ra1 = 1;
else ra1 = 0;
ra0 = 1;
ddata <<= 1;
# asm nop # endasm
)
ra1 = 1; / / release DATA-line (SUA njih)
trisa1 = 1; / / DATA-line in ulaz
# asm nop # endasm
ra1 = 0; / / (stari broj)
ra0 = 0; / / (stari broj)
ra0 = 1; / / sat za
9. ack
# asm nop # endasm
if (input (PIN_A1))
(
HumiError = true; / / check ack (Podaci će biti srušen po SHT11)
dok (HumiError)
(
rb3 = 1;
printf ( "\ n \ r-> SHT71 writed error ... ack! \ n \ r");
)
)
ra0 = 0;
)
nepotpisani int comread (nepotpisano pougljiti nazad)
(
nepotpisani pougljiti I;
nepotpisani bbyte int = 0;
trisa1 = 1; / / DATA-line in ulaz
for (i = 0; i <8; i )
(
bbyte <<= 1;
ra0 = 1;
bbyte | = input (PIN_A1);
ra0 = 0;
# asm nop # endasm
)
/ / Ra1 =! Leđa; / / "ack == 1" Srušit DATA-Line
trisa1 = 0; / / DATA u output-line
ra1 =! leđa; / / "ack == 1" Srušit DATA-Line
ra0 = 1;
# asm nop # endasm
ra0 = 0;
# asm nop # endasm
trisa1 = 1; / / DATA-line in ulaz
ra1 = 1;
povratak bbyte;
)
nepotpisani int s_measure (nepotpisano pougljiti mod)
(
nepotpisani pougljiti msb = 0, lsb = 0, CRC;
sht_soft_reset ();
comstart ();
preklopnik (mod)
(
slučaju Temp:
comwrite (MEASURE_TEMP);
break;
slučaju HUMI:
comwrite (MEASURE_HUMI);
break;
Zadano:
break;
)
trisa1 = 1; / / DATA-line in ulaz
comwait (); / / čekati za mjerenje za dovršetak
msb = comread (ack); / / pročitati prvi bajt (MSB)
lsb = comread (ack); / / read drugi bajt (LSB)
CRC = comread (noACK); / / read provjerava
povratak (msb * 256 lsb);
)
poniłtava HumidityGet (* p_humidity plutaju, plutaju p_temperature *)
(
nepotpisani int = 0 vlaga, temperatura = 0;
vlaga = s_measure (HUMI); / / mjera vlažnosti
DoAm = vlaga;
temperatura = s_measure (temp); / / izmjeriti temperaturu
NhietDo = temperatura;
if (HumiError == istinit) comreset (); / / u slučaju pogrešci: Reset
drugi
(
* p_humidity = (splav) vlažnost; / / pretvara cijeli broj u splavariti
* p_temperature = (splav) temperatura; / / pretvara cijeli broj u splavariti
calc_sth11 (p_humidity, p_temperature); / / izračunavanje vlažnosti, temperature
)
)
//------------------------------------------------ ----------------------------------------
/ / Izračunava temperatura [° C] i vlažnost [% RH]
/ / Ulaz: humi [krpelja] (12 bit)
/ / Temp [krpelja] (14 bit)
/ / Izlaz: humi [% RH]
/ / Temp [° C]
//------------------------------------------------ ----------------------------------------
poniłtava calc_sth11 (* p_humidity plutaju, plutaju p_temperature *)
(
splavariti rh_lin; / / rh_lin: linearni Vlaga
splavariti rh_true; / / rh_true: temperaturno kompenzirani vlažnosti
splavariti t_C; / / t_C: Temperatura [° C]
t_C = D1 D2 * (* p_temperature);
if (t_C> 100) t_C = 100;
if (t_C <1) t_C = 1;
rh_lin = C3 * (* p_humidity) * (* p_humidity) C2 * (* p_humidity) C1;
rh_true = (t_C-25) * (T1 T2 * (* p_humidity)) rh_lin;
if (rh_true> 100) rh_true = 100;
if (rh_true <0.1) rh_true = 0,1;
* p_temperature = t_C;
* p_humidity = rh_true;
)
poniłtava s_write_statusreg (nepotpisano pougljiti vrijednost)
(
comstart ();
comwrite (STATUS_REG_W); / / poslati naredbu senzor
comwrite (vrijednost); / / pošalji vrijednost status register
)
nepotpisani pougljiti s_read_statusreg (nepotpisano pougljiti vrijednosti, provjerava pougljiti nepotpisan)
(
comstart ();
comwrite (STATUS_REG_R);
value = comread (ack); / / read stanja (8-bitni)
ispitni zbroj = comread (noACK); / / read provjerava (8-bitni)
vratiti vrijednost; / / error = 1, u slučaju bez odgovora obrazac senzor
)
Im 'koristeći PIC16F88 do sučelja sa SHT75, ali kod neće raditi.
Mogao bilo tko pomoć mene?!
poniłtava comstart (void)
(
trisa1 = 0; / / DATA u output-line
ra0 = 0;
ra1 = 1;
# asm nop # endasm
ra0 = 1;
# asm nop # endasm
ra1 = 0;
# asm nop # endasm
ra0 = 0;
# asm nop # endasm
ra0 = 1;
# asm nop # endasm
ra1 = 1;
# asm nop # endasm
ra0 = 0;
)
poniłtava comreset (void)
(
nepotpisani pougljiti I;
trisa1 = 0; / / DATA u output-line
ra1 = 1;
ra0 = 0;
for (i = 0; i <9; i ) / / 9 clock cycles
(
ra0 = 1;
# asm nop # endasm
ra0 = 0;
)
comstart (); / / prijenos start
HumiError = false;
)
poniłtava sht_soft_reset (void)
(
comreset (); / / SHT75 komunikacija reset
comwrite (RESET); / / SHT71 poslati naredba reset
)
poniłtava sht_init (void)
(
sht_soft_reset (); / / reset SHT71
/ / Comreset (); / / SHT71 komunikacija reset
delay_ms (15); / / kašnjenje za vlast-up
)
poniłtava comwait (void)
(
nepotpisani int16 sht_delay;
ra1 = 1;
ra0 = 0;
for (sht_delay = 0; sht_delay <30000; sht_delay )
(
if (! ra1)
(
/ / printf ( "\ n \ r-> SHT71 comwait pogreška! \ n \ r");
break;
)
delay_us (10);
)
)
poniłtava comwrite (nepotpisano pougljiti ddata)
(
nepotpisani pougljiti I;
trisa1 = 0; / / DATA u output-line
for (i = 0; i <8; i )
(
ra0 = 0;
if (ddata & 0x80) ra1 = 1;
else ra1 = 0;
ra0 = 1;
ddata <<= 1;
# asm nop # endasm
)
ra1 = 1; / / release DATA-line (SUA njih)
trisa1 = 1; / / DATA-line in ulaz
# asm nop # endasm
ra1 = 0; / / (stari broj)
ra0 = 0; / / (stari broj)
ra0 = 1; / / sat za
9. ack
# asm nop # endasm
if (input (PIN_A1))
(
HumiError = true; / / check ack (Podaci će biti srušen po SHT11)
dok (HumiError)
(
rb3 = 1;
printf ( "\ n \ r-> SHT71 writed error ... ack! \ n \ r");
)
)
ra0 = 0;
)
nepotpisani int comread (nepotpisano pougljiti nazad)
(
nepotpisani pougljiti I;
nepotpisani bbyte int = 0;
trisa1 = 1; / / DATA-line in ulaz
for (i = 0; i <8; i )
(
bbyte <<= 1;
ra0 = 1;
bbyte | = input (PIN_A1);
ra0 = 0;
# asm nop # endasm
)
/ / Ra1 =! Leđa; / / "ack == 1" Srušit DATA-Line
trisa1 = 0; / / DATA u output-line
ra1 =! leđa; / / "ack == 1" Srušit DATA-Line
ra0 = 1;
# asm nop # endasm
ra0 = 0;
# asm nop # endasm
trisa1 = 1; / / DATA-line in ulaz
ra1 = 1;
povratak bbyte;
)
nepotpisani int s_measure (nepotpisano pougljiti mod)
(
nepotpisani pougljiti msb = 0, lsb = 0, CRC;
sht_soft_reset ();
comstart ();
preklopnik (mod)
(
slučaju Temp:
comwrite (MEASURE_TEMP);
break;
slučaju HUMI:
comwrite (MEASURE_HUMI);
break;
Zadano:
break;
)
trisa1 = 1; / / DATA-line in ulaz
comwait (); / / čekati za mjerenje za dovršetak
msb = comread (ack); / / pročitati prvi bajt (MSB)
lsb = comread (ack); / / read drugi bajt (LSB)
CRC = comread (noACK); / / read provjerava
povratak (msb * 256 lsb);
)
poniłtava HumidityGet (* p_humidity plutaju, plutaju p_temperature *)
(
nepotpisani int = 0 vlaga, temperatura = 0;
vlaga = s_measure (HUMI); / / mjera vlažnosti
DoAm = vlaga;
temperatura = s_measure (temp); / / izmjeriti temperaturu
NhietDo = temperatura;
if (HumiError == istinit) comreset (); / / u slučaju pogrešci: Reset
drugi
(
* p_humidity = (splav) vlažnost; / / pretvara cijeli broj u splavariti
* p_temperature = (splav) temperatura; / / pretvara cijeli broj u splavariti
calc_sth11 (p_humidity, p_temperature); / / izračunavanje vlažnosti, temperature
)
)
//------------------------------------------------ ----------------------------------------
/ / Izračunava temperatura [° C] i vlažnost [% RH]
/ / Ulaz: humi [krpelja] (12 bit)
/ / Temp [krpelja] (14 bit)
/ / Izlaz: humi [% RH]
/ / Temp [° C]
//------------------------------------------------ ----------------------------------------
poniłtava calc_sth11 (* p_humidity plutaju, plutaju p_temperature *)
(
splavariti rh_lin; / / rh_lin: linearni Vlaga
splavariti rh_true; / / rh_true: temperaturno kompenzirani vlažnosti
splavariti t_C; / / t_C: Temperatura [° C]
t_C = D1 D2 * (* p_temperature);
if (t_C> 100) t_C = 100;
if (t_C <1) t_C = 1;
rh_lin = C3 * (* p_humidity) * (* p_humidity) C2 * (* p_humidity) C1;
rh_true = (t_C-25) * (T1 T2 * (* p_humidity)) rh_lin;
if (rh_true> 100) rh_true = 100;
if (rh_true <0.1) rh_true = 0,1;
* p_temperature = t_C;
* p_humidity = rh_true;
)
poniłtava s_write_statusreg (nepotpisano pougljiti vrijednost)
(
comstart ();
comwrite (STATUS_REG_W); / / poslati naredbu senzor
comwrite (vrijednost); / / pošalji vrijednost status register
)
nepotpisani pougljiti s_read_statusreg (nepotpisano pougljiti vrijednosti, provjerava pougljiti nepotpisan)
(
comstart ();
comwrite (STATUS_REG_R);
value = comread (ack); / / read stanja (8-bitni)
ispitni zbroj = comread (noACK); / / read provjerava (8-bitni)
vratiti vrijednost; / / error = 1, u slučaju bez odgovora obrazac senzor
)