Witam.Próbuje uruchomić ds18b20 na Atmega 32 zewnętrzny kwarc 16Mhz.zdaje sobie sprawe że temat był milion razy przerabiany na forum.Jednak może wgląd trzeciej osoby pozwoli dopatrzeć się jakiegoś niuansu.Po napisaniu procedury i wgraniu jej do procka na wyswietlaczu mam -0.07 .Po odczytaniu młodszej czesci wyniku mam 0xff w starszej to samo.Prosze o pomoc. z góry dziękuję.Oto mój kod
#define pin_1wire 7
#define port_1wire PIND
#define out_1wire_low PORTD &= ~(1<< pin_1wire);
#define out_1wire_high PORTD |= (1<< pin_1wire);
#define one_wire_in DDRD &=~(1<<pin_1wire);
#define one_wire_out DDRD |= (1<<pin_1wire);
unsigned char one_wire_reset(void)
{
uint8_t reset_impulse=0;
one_wire_out;
//_delay_us(550);
_delay_loop_2(2000);
one_wire_in;
// _delay_us(75);
_delay_loop_2(300);
if(bit_is_clear(port_1wire,pin_1wire))
{
reset_impulse=1;
}
else
{
reset_impulse=0;
}
//_delay_us(470);
_delay_loop_2(1880);
if (bit_is_set(port_1wire, pin_1wire))
{
reset_impulse=1;
}
else
{
reset_impulse=0;
}
return reset_impulse;
}
//////////////////////////////////
//
//funkcja czytająca bit z magistrali
//
/////////////////////////////////////
uint8_t one_wire_read_bit(void)
{
uint8_t c_bit;
one_wire_out;
_delay_us(2);
one_wire_in;
_delay_us(15);
if(bit_is_set(port_1wire,pin_1wire))
c_bit=1;
else
c_bit=0;
return c_bit;
}
//////////////////////////////////
//
//funkcja wysyłajaca bit na magistrale
//
/////////////////////////////////////
void one_wire_write_bit(char bit)
{
one_wire_out;
_delay_us(2);
if(bit==1) //wyslanie 1
one_wire_in;
_delay_us(40); //wyslanie 0
_delay_us(40);
one_wire_in;
}
/////////////////////////////////////////
//
// funkcja wysyłająca bajt na magistrale
//
/////////////////////////////////////////
void one_wire_write_byte(char val)
{
char licznik;
char caly_bit; //wartosc do wysłania
for(licznik=0;licznik<8;licznik++)
{
caly_bit= val>>licznik;
caly_bit &= 0x01;
one_wire_write_bit(caly_bit);
}
_delay_us(100);
}
//////////////////////////////////
//
//funkcja czytająca bajt z magistrali
//
/////////////////////////////////////
uint8_t one_wire_read_byte(void)
{
char licznik;
char bajt_zczytany=0; //wartosc odczytana
for(licznik=0;licznik<8;licznik++)
{
if(one_wire_read_bit())
bajt_zczytany |=(0x01<<licznik);
_delay_us(30);
_delay_us(15);
}
return bajt_zczytany;
}
unsigned char one_wire_pomiar( void)
{
char Temperatura_LSB=0, Temperatura_MSB=0;
float Temperatura=0;
uint8_t reset;
char stringbuffer[8];
char a[2];
char b[2];
reset= one_wire_reset();
if(reset==1)
{
GLCD_TextGoTo(1,0);
GLCD_WriteString("czujka jest" );
//one_wire_write_byte(0x55); //wysłanie komendy room match
//one_wire_write_addr(termometr); // ustawienie czujnika
one_wire_write_byte(0xCC);
one_wire_write_byte(0x44); //konwerscja temperatury
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
reset= one_wire_reset();
one_wire_write_byte(0xCC);
one_wire_write_byte(0xBE); // odczyt scratchpada
Temperatura_LSB =one_wire_read_byte(); //odczyt LSB
Temperatura_MSB =one_wire_read_byte();//odczyt MSB
Temperatura_MSB= (Temperatura_MSB & 0xFF);
reset= one_wire_reset();
dtostrf(Temperatura_MSB,1,2, a);
GLCD_TextGoTo(3,5);
GLCD_WriteString(a );
dtostrf(Temperatura_LSB,1,2, b);
GLCD_TextGoTo(3,6);
GLCD_WriteString(b );
Temperatura= (float)((Temperatura_LSB)+(Temperatura_MSB << 8))/16;
dtostrf(Temperatura,1,2, stringbuffer);
GLCD_TextGoTo(1,1);
GLCD_WriteString(stringbuffer );
GLCD_TextGoTo(7,1);
GLCD_WriteString("stopni Celcjusza" );
}
else
{
GLCD_TextGoTo(5,0) ;
GLCD_WriteString("brak czujki" );
}
return 0;
}
#define pin_1wire 7
#define port_1wire PIND
#define out_1wire_low PORTD &= ~(1<< pin_1wire);
#define out_1wire_high PORTD |= (1<< pin_1wire);
#define one_wire_in DDRD &=~(1<<pin_1wire);
#define one_wire_out DDRD |= (1<<pin_1wire);
unsigned char one_wire_reset(void)
{
uint8_t reset_impulse=0;
one_wire_out;
//_delay_us(550);
_delay_loop_2(2000);
one_wire_in;
// _delay_us(75);
_delay_loop_2(300);
if(bit_is_clear(port_1wire,pin_1wire))
{
reset_impulse=1;
}
else
{
reset_impulse=0;
}
//_delay_us(470);
_delay_loop_2(1880);
if (bit_is_set(port_1wire, pin_1wire))
{
reset_impulse=1;
}
else
{
reset_impulse=0;
}
return reset_impulse;
}
//////////////////////////////////
//
//funkcja czytająca bit z magistrali
//
/////////////////////////////////////
uint8_t one_wire_read_bit(void)
{
uint8_t c_bit;
one_wire_out;
_delay_us(2);
one_wire_in;
_delay_us(15);
if(bit_is_set(port_1wire,pin_1wire))
c_bit=1;
else
c_bit=0;
return c_bit;
}
//////////////////////////////////
//
//funkcja wysyłajaca bit na magistrale
//
/////////////////////////////////////
void one_wire_write_bit(char bit)
{
one_wire_out;
_delay_us(2);
if(bit==1) //wyslanie 1
one_wire_in;
_delay_us(40); //wyslanie 0
_delay_us(40);
one_wire_in;
}
/////////////////////////////////////////
//
// funkcja wysyłająca bajt na magistrale
//
/////////////////////////////////////////
void one_wire_write_byte(char val)
{
char licznik;
char caly_bit; //wartosc do wysłania
for(licznik=0;licznik<8;licznik++)
{
caly_bit= val>>licznik;
caly_bit &= 0x01;
one_wire_write_bit(caly_bit);
}
_delay_us(100);
}
//////////////////////////////////
//
//funkcja czytająca bajt z magistrali
//
/////////////////////////////////////
uint8_t one_wire_read_byte(void)
{
char licznik;
char bajt_zczytany=0; //wartosc odczytana
for(licznik=0;licznik<8;licznik++)
{
if(one_wire_read_bit())
bajt_zczytany |=(0x01<<licznik);
_delay_us(30);
_delay_us(15);
}
return bajt_zczytany;
}
unsigned char one_wire_pomiar( void)
{
char Temperatura_LSB=0, Temperatura_MSB=0;
float Temperatura=0;
uint8_t reset;
char stringbuffer[8];
char a[2];
char b[2];
reset= one_wire_reset();
if(reset==1)
{
GLCD_TextGoTo(1,0);
GLCD_WriteString("czujka jest" );
//one_wire_write_byte(0x55); //wysłanie komendy room match
//one_wire_write_addr(termometr); // ustawienie czujnika
one_wire_write_byte(0xCC);
one_wire_write_byte(0x44); //konwerscja temperatury
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
_delay_ms(200);
reset= one_wire_reset();
one_wire_write_byte(0xCC);
one_wire_write_byte(0xBE); // odczyt scratchpada
Temperatura_LSB =one_wire_read_byte(); //odczyt LSB
Temperatura_MSB =one_wire_read_byte();//odczyt MSB
Temperatura_MSB= (Temperatura_MSB & 0xFF);
reset= one_wire_reset();
dtostrf(Temperatura_MSB,1,2, a);
GLCD_TextGoTo(3,5);
GLCD_WriteString(a );
dtostrf(Temperatura_LSB,1,2, b);
GLCD_TextGoTo(3,6);
GLCD_WriteString(b );
Temperatura= (float)((Temperatura_LSB)+(Temperatura_MSB << 8))/16;
dtostrf(Temperatura,1,2, stringbuffer);
GLCD_TextGoTo(1,1);
GLCD_WriteString(stringbuffer );
GLCD_TextGoTo(7,1);
GLCD_WriteString("stopni Celcjusza" );
}
else
{
GLCD_TextGoTo(5,0) ;
GLCD_WriteString("brak czujki" );
}
return 0;
}