Takze pri mereni teploty mi cidlo posle pri pokojove teplote toto binarni cislo:
1010 1010 0111 0000,
po pouziti vzorce a pretipovani na char dostanu cislo: 70 (overeno i pomoci kalkulacky, ze to ma vyjit 70,14).
Rozliseni je defaultni, takze 14b a rezim No Hold Master
A do senzoru posilam:
[code]#define mer_teplotu 0xf3
#define i2c_adr_w 0b10000000
#define i2c_adr_r 0b10000001
start_sekvence();
zapis_byte(i2c_adr_w);
zapis_byte(mer_teplotu);
_delay_ms(1000);
start_sekvence();
zapis_byte(i2c_adr_r);
_delay_ms(1000);
start_sekvence();
zapis_byte(i2c_adr_r);
teplota |= precti_byte(0)<<8; //precteni prvnich 8 bitu dat (MSB)
teplota |= precti_byte(1); //precteni druhych 8 bitu dat (LSB)
stop_sekvence();
teplota &= ~0x0003; //vymaze posledni 2 bity ()
t = -46.85 + 175.72/65536 * (float)(teplota);[/code]
A samotne funkce vypadaji takto:
[code]#define sht_sck0 {PORTD&=0b11111110;}
#define sht_sck1 {PORTD|=0b00000001;}
#define sht_data0 {PORTD&=0b11111101;}
#define sht_data1 {PORTD|=0b00000010;}
void start_sekvence(void)
{
DDRD|=0b00000011; //nastaveni bitu sck a data na vystupni
sht_sck1;
sht_data1;
sht_data0;
_delay_us(10);
sht_sck0;
_delay_us(10);
}
void stop_sekvence(void)
{
DDRD|=0b00000011; //nastaveni bitu sck a data na vystupni
sht_sck0;
sht_data0;
sht_sck1;
_delay_us(10);
sht_data1;
_delay_us(10);
}
unsigned char zapis_byte(unsigned char hodnota)
{
unsigned char maska, err = 0;
DDRD|=0b00000010; //nastaveni linky (sht_data) na vystup
for (maska=0x80; maska>0; maska>>=1) //maskovani
{
//vymaskovana hodnota-zapis log0 or 1 na sber.
if (maska & hodnota) {sht_data1;}
else {sht_data0;}
_delay_us(1);
sht_sck1; //clk pro sbernici
_delay_us(5); //drzeni clk v log0
sht_sck0; //shozeni clk
_delay_us(1);
}
DDRD&=0b11111101; //nastaveni linky (sht_data) na vstup
sht_sck1; //9. clk pro ACK
_delay_us(1);
err=bit_is_set(PIND, PD1); //pokud neprijde ACK -> err=1
sht_sck0;
_delay_us(20);
return err;
}
unsigned char precti_byte(unsigned char ack)
{
unsigned char maska, merena_hodnota = 0;
DDRD&=0b11111101; //nastaveni linky (sht_data) na vstup
for (maska=0x80; maska>0; maska>>=1) //maskovani
{
sht_sck1;
_delay_us(5);
if (PIND & 0b00000010)
merena_hodnota=(merena_hodnota | maska);
sht_sck0;
_delay_us(1);
}
DDRD|=0b00000010; //nastaveni linky (sht_data) na vystup
if(ack==0)
{ sht_data0; }
else
{ sht_data1; }
_delay_us(1);
sht_sck1;
_delay_us(5);
sht_sck0;
sht_data1;
DDRD&=0b11111101; //nastaveni linky (sht_data) na vstup
_delay_us(20);
return merena_hodnota;
}[/code]
Dekuji moc za ochotu.