Dwa tygodnie siedzę nad rozwiązaniem problemu z tym dallaskiem w C (w bascomie wszystko działa jak powinno)
Na początku próbowałem uruchomić jakiegoś gotowca lecz nic się nie udawało, później sam napisałem całą obsługę z pomocą datasheeta i dalej nie działa. Podejrzewam błąd odczytu (lub zapisu) z dallasa. na wyświetlaczu wyświetlają mi się albo krzaczki albo jakieś dziwne wartości b7, 159 -0.1 (modyfikuje konwersje odczytanej wartości) etc... gdy podgrzewam dska w palcach wartość na wyświetlaczu sie nie zmienia.
Programuje w eclipse avr, 8mhz wewnętrzny oscylator
Kod: Zaznacz cały
/*==============================================================================================*/
#define SET_BIT(r,x) r|=_BV(x);
#define CLR_BIT(r,x) r&=~_BV(x);
#define TOG_BIT(r,x) r^=_BV(x);
/*==============================================================================================*/
void send(char bit) //zapisanie pojedynczego bitu
{
SET_BIT(H_DDR_1W,H_1W);
CLR_BIT(H_PORT_1W,H_1W); // ustawiam port na wyjscie poziom 0
_delay_us(15); //czekam
if(bit==0) // jeżeli wysyłam zero to dalej czekam i dopiero wtedy ustawiam 1
{
_delay_us(60-15);
SET_BIT(H_PORT_1W,H_1W);
}
else //gdy idzie jedynka to ustawiam 1 i czekam do konca okna transmisyjnego
{
SET_BIT(H_PORT_1W,H_1W);
_delay_us(60-15);
}
_delay_us(1); // czekam 1us odstep miedzy oknami transmisyjnymi
}
unsigned char read(void) //odczytanie pojedynczego bitu
{
unsigned char PRESENCE=0;
SET_BIT(H_DDR_1W,H_1W);
CLR_BIT(H_PORT_1W,H_1W); //ustawiam wyjscie stan niski na 1us
_delay_us(1);
CLR_BIT(H_DDR_1W,H_1W); // ustawiam wejscie podciagniete do 1
SET_BIT(H_PORT_1W,H_1W);
_delay_us(15);// po 15us sprawdzam czy stan na porcie wysylam 1 lub 0
if(bit_is_set(H_PIN_1W,H_1W)) PRESENCE=1; else PRESENCE=0;
_delay_us(60-15);// czekam do konca okna transmisyjnego
_delay_us(1);// przerwa miedzy oknami
return(PRESENCE);
}
void send_byte(char wartosc) //wyslanie bajtu
{
unsigned char i;
unsigned char pom;
for (i=0;i<8;i++)
{
pom=wartosc>>i;
pom&= 0x01;
send(pom);
}
}
unsigned char read_byte(void) odczytanie 2 bajtow
{
unsigned char i;
int wartosc = 0;
for(i=0;i<16;i++)
{
if(read()) wartosc|=0x01<<i;
}
return(wartosc);
}