Funkcje do obsługi DS'a
A to mam w main:
Problem jest taki, że cały czas wyświetla -16.1 stopnia. Podłączyłem innego DA'a i to samo. Dodam jeszcze że kod pochodzi od jednego użytkownika z forum. U niego działa z kwarcem 16MHz i z odpowiednimi opoźnieniami. U mnie uC jest z zewnętrznym kwarcem 16MHz.
#include <avr/interrupt.h>
#define DQ 0 // pin danych in/out interfejsu 1-WIRE
#define SET_DQ DDRD &= ~_BV(DQ)
#define CLR_DQ DDRD |= _BV(DQ)
#define IN_DQ PIND & _BV(DQ)
//funkcja delay
void owire_delay(unsigned int __count)
{
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
// funkcja inicjalizująca(zerowanie magistrali)
void owire_reset()
{
CLR_DQ;
owire_delay(1920); // opóźnienie ok 480us
SET_DQ;
owire_delay(1920); // opóźnienie ok 480us
}
// funkcja zapisu bitu na magistralę 1-wire
void owire_write_bit(char wire_bit)
{
cli(); // zablokowanie przerwań
CLR_DQ;
owire_delay(40); // opóźnienie 10us
if(wire_bit)
SET_DQ;
owire_delay(400); // opóźnienie 100us
SET_DQ;
sei(); // odblokowanie przrerwań
}
// funkcja odczytu bitu z magistrali 1-wire
char owire_read_bit(void)
{
cli(); // zablokowanie przerwań
CLR_DQ;
owire_delay(4); // opóźnienie 1us
SET_DQ;
owire_delay(40); // opóźnienie 10us
sei(); // odblokowanie pzrerwań
if(IN_DQ)
return 1;
else
return 0;
}
// funkcja odczytu bajtu z magistrali 1-wire
unsigned char owire_read_byte(void)
{
unsigned char licznik98;
unsigned char temp98 = 0;
for (licznik98=0;licznik98<8;licznik98++)
{
if(owire_read_bit())
temp98|=0x01<<licznik98;
owire_delay(200);// opóźnienie 50us
}
return temp98;
}
// funkcja zapisu bajtu na magistralę 1-wire
void owire_write_byte(char wire_wartosc)
{
unsigned char licznik98;
unsigned char temp98;
for (licznik98=0; licznik98<8; licznik98++)
{
temp98 = wire_wartosc >> licznik98;
temp98 &= 0x01;
owire_write_bit(temp98);
}
owire_delay(20); // opóźnienie 5us
}
A to mam w main:
for(;;) {
owire_reset;
owire_write_byte(0xCC);
owire_write_byte(0x44);
//_delay_ms(750);
owire_reset;
owire_write_byte(0xCC);
owire_write_byte(0x44);
temp1=owire_read_byte();
temp2=owire_read_byte();
owire_reset;
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
//itoa(temp,buf,10)
LCDPutStr(buf, 100, 50, LARGE, RED, WHITE);
_delay_ms(1000);
}Problem jest taki, że cały czas wyświetla -16.1 stopnia. Podłączyłem innego DA'a i to samo. Dodam jeszcze że kod pochodzi od jednego użytkownika z forum. U niego działa z kwarcem 16MHz i z odpowiednimi opoźnieniami. U mnie uC jest z zewnętrznym kwarcem 16MHz.
