Witam
Wiem, temat był już poruszany, przeglądałem kilka wcześniejszych postów nt 1Wire, przeczytałem kilka dokumentacji, opis z TEJ strony, a także opis z książki "Mikrokontrolery AVR w praktyce". Patrzę w kod, i nie widzę jakichś błędów i wszystko wydaje się być w porządku. A mimo to nie mogę odczytać danych z pastylki DS1990A.
Jeśli chodzi o te wszystkie interwały czasowe, to korzystałem też z tych opisów z książki (obrazki na dole).
A także z tych co są na podanej wyżej stronie (tylko czasy są w us, bo tam są używane mylące skróty ms).
Magistrala 1-Wire jest na PortB.0, na razie "na sztywno" przyporządkowana.
Oto kod który o dziwo niestety nie działa :/ :p :
Główne dwa makra, sterujące magistralą 1-Wire:
Inicjalizacja magistrali 1-Wire, to działa, pastylka daje 0 na linii, funkcja zwraca 0.
"Slot" zapisu:
"Slot" odczytu:
Wysłanie bajtu danych do układu:
Odczyt bajtu danych z magistrali:
Fragment funkcji main, nie wrzucam całego żeby nie robić śmietnika:
Później bufor odczytanych wartości wrzucam na wyśw. LCD i tam pokazuje wartości 255 albo 254.
Przeglądałem kod nie raz, wszystkie odstępy czasowewydają się być w porządku, opcje sterowania linią 1W też. Ale jednak coś nie działa, i już nie mam zielonego pojęcia co to może być. Pastylka jest dobra.
Wiem, temat był już poruszany, przeglądałem kilka wcześniejszych postów nt 1Wire, przeczytałem kilka dokumentacji, opis z TEJ strony, a także opis z książki "Mikrokontrolery AVR w praktyce". Patrzę w kod, i nie widzę jakichś błędów i wszystko wydaje się być w porządku. A mimo to nie mogę odczytać danych z pastylki DS1990A.
Jeśli chodzi o te wszystkie interwały czasowe, to korzystałem też z tych opisów z książki (obrazki na dole).
A także z tych co są na podanej wyżej stronie (tylko czasy są w us, bo tam są używane mylące skróty ms).
Magistrala 1-Wire jest na PortB.0, na razie "na sztywno" przyporządkowana.
Oto kod który o dziwo niestety nie działa :/ :p :
Główne dwa makra, sterujące magistralą 1-Wire:
#define _1W_SET_0() { DDRB |= 0x01; } //PB.0 jako wyjście,
//PortB.0 = 0, więc stan na linii wynosi 0
#define _1W_SET_1() { DDRB &= 0xFE;} //PB.0 jako wejście,
//stan 1 pochodzi z rezystora PullUpInicjalizacja magistrali 1-Wire, to działa, pastylka daje 0 na linii, funkcja zwraca 0.
uint8_t _1WireInit( void )
{
uint8_t InitBit=0;
_1W_SET_0(); //stan 0 na linii
waitus(250); //opóźnienie 500us
waitus(250);
_1W_SET_1(); //stan 1 na linii
waitus(75);
InitBit = (PINB & 0x01); //czytaj z PinB.0
waitus(200);
waitus(205); //czekaj 416us do końca inicjalizacji
return InitBit; //zwraca 0-OK lub 1-nie wykryto pastylki
}"Slot" zapisu:
void _1WireWriteSlot(uint8_t bit)
{
if(bit) //Write 1
{
_1W_SET_0();
waitus(10);
_1W_SET_1();
waitus(65);
}
else //Write 0
{
_1W_SET_0();
waitus(100);
_1W_SET_1();
waitus(3);
}
}
"Slot" odczytu:
uint8_t _1WireReadSlot(void)
{
uint8_t _bit=0;
_1W_SET_0(); //ustaw 0
waitus(1);
_1W_SET_1(); //zwolnij magistralę, stan H z rezystora PullUp
waitus(8);
_bit = (PINB & 0x01); //zwróć wartość PinB.0, 1 lub 0
waitus(25);
return _bit;
}Wysłanie bajtu danych do układu:
void _1WireWriteByte(uint8_t dana)
{
uint8_t i;
for(i=0; i<8; i++)
{
_1WireWriteSlot( dana & 0x01 ); //wyślij 1 lub 0
dana >>= 1;
}
}Odczyt bajtu danych z magistrali:
uint8_t _1WireReadByte(void)
{
uint8_t i;
uint8_t data=0;
for(i=0x01; i!=0; i<<=1) //za każdym obiegiem, przesuń jedynkę w lewo odpowiada
{ //pozycjom zczytanej wartości (czytamy od LSB do MSB)
if( _1WireReadSlot() ) //jeśli _1WireReadSlot() odczytał 1
data |= i; //umieść 1 na odpowiedniej pozycji
}
return data;
}Fragment funkcji main, nie wrzucam całego żeby nie robić śmietnika:
DDRB = 0x00;
PORTB = 0x00;
data1 = _1WireInit();
if(!data1) //0 - oznacza udaną inicjalizację
{
_1WireWriteByte(0x33);
for(uint8_t i=0; i<8; i++)
{ //zapis 8-miu bajtów do bufora
WireBuffer[i] = _1WireReadByte();
}
}Później bufor odczytanych wartości wrzucam na wyśw. LCD i tam pokazuje wartości 255 albo 254.
Przeglądałem kod nie raz, wszystkie odstępy czasowewydają się być w porządku, opcje sterowania linią 1W też. Ale jednak coś nie działa, i już nie mam zielonego pojęcia co to może być. Pastylka jest dobra.