Witam,
Ostatnio zacząłem sobie pisać funkcje służące komunikacji przez 1 wire.
Nie wiem dlaczego, ale nie działa mi odczyt :/
Staram się odczytać temperaturę od DS18B20.
Dodam, że próbowałem już różnych timingów przy odczycie, ale nic to nie dało.
Oto kod:
A to wewnątrz głównego programu.
Ostatnio zacząłem sobie pisać funkcje służące komunikacji przez 1 wire.
Nie wiem dlaczego, ale nie działa mi odczyt :/
Staram się odczytać temperaturę od DS18B20.
Dodam, że próbowałem już różnych timingów przy odczycie, ale nic to nie dało.
Oto kod:
void onewire_init( void)
{
//ustawienie lini na "0"
cbi( onewire_port, onewire_line);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
unsigned char onewire_reset( void)
{
//ustawienie lini jako wyjscie
//mamy na lini stan "0"
sbi( onewire_ddr, onewire_line);
//stan ma trwac prze minimum 480 us
//my dajemy 490us
_delay_us( 200);
_delay_us( 200);
_delay_us( 90);
//teraz zmieniamy sie na wejscie
//mamy na lini stan "1"
cbi( onewire_ddr, onewire_line);
//UWAGA 1
//czekamy 100 us
_delay_us( 100);
if( bit_is_clear( onewire_pin, onewire_line) )
{
//odczekujemy minimum 480 us
//u nas bedzie to 490 us
//ale jest to czas od puntku UWAGA 1
//wiec czekamy jeszcze 390 us
_delay_us( 200);
_delay_us( 190);
//zwracamy 1, poniewaz wykrylismy urzadzenie onewire
return 1;
}
//niedoczekalismy sie urzadzenie dlatego zwracamy 0 i uciekamy
return 0;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void onewire_write( unsigned char dane)
{
//procedura wysylki 1 bajtu
//single byte :P
for( unsigned char i = 0; i < 8; i++)
{
//przestawiamy sie na wyjscie
//na lini jest "0"
sbi( onewire_ddr, onewire_line);
//czekamy chwilke
_delay_us( 5);
//wysylamy jeden bit z danej
//poczynajac od najmlodszego, najmniej znaczacego
//jesli jest to 1
if( ((dane >> i) & 1) )
//ustawiamy linie na wejscie, a
//stan lini to "1"
cbi( onewire_ddr, onewire_line);
//jesli NIE jest to 1, czyli 0, to
//stan lini to dalej "0"
//czekamy
_delay_us( 75);
//teraz ustawiamy stan lini na "1"
cbi( onewire_ddr, onewire_line);
//odczekujemy chwileczke
_delay_us( 3);
//zaczynamy transmisje nastepnego bitu.......
}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
unsigned char onewire_read( void)
{
unsigned char dane = 0;
for( unsigned char i = 0; i < 8; i++)
{
//przestawiamy sie na wyjscie
//na lini jest "0"
sbi( onewire_ddr, onewire_line);
//czekamy chwilke
_delay_us( 30);
//przestawiamy sie na wejscie
//na lini bedzie "1"
cbi( onewire_ddr, onewire_line);
//teraz urzadzenie daje "0" lub "1"
//malutkie opoznienie
_delay_us( 10);
dane |= ((onewire_pin >> onewire_line) & 1) << i;
//odczekujemy do konca
_delay_us( 70);
//zaczynamy odbior kolejnego bitu.......
}
return dane;
}
A to wewnątrz głównego programu.
if( onewire_reset())
{
sbi( PORTD, PD6);
onewire_write( 0xCC);
onewire_write( 0x44);
_delay_ms( 200);
_delay_ms( 200);
_delay_ms( 200);
_delay_ms( 200);
_delay_ms( 200);
onewire_reset();
onewire_write( 0xCC);
onewire_write( 0xBE);
i_raz = onewire_read();
i_dwa = onewire_read();
}