Witam, pytanie dotyczy połączenia między uC a układem RTC jak w temacie.
Domyślnie połączenie dotyczyło RTC DS2415 gdzie łączyliśmy się z pinem 1-Wire (Input/Output).
Fukcje:
Powyższe funkcje zapewniały odczyt i zapis czasu do RTC i działał w pierwotnej wersji. Kiedy zmianie w układzie podległ RTC (na PCF8563P - połaczenie pinu PB6 do SDA - niby dwukierunkowe) mam dziwne wrażenie że zapis na RTC nie działa, bo po każdym ponownym uruchomieniu zaczyna zagarek pomykać od tej samej godziny.
Dokumentacja do tego układu jest bardzo uboga. Chodzi mi o to (mam pewne przeczucie) czy połączenie PB7 atmegi do SCL (input clock) i przestawienie funkcji na:
będzie działać ?
Proszę o odpowiedź.
W załączniku pierwotny układ, obecnie w miejscu RTC jest PCF8563P z połączeniem PB6 - SDA
![[Atmega8] Komunikacja z RTC [PCF8563P] [Atmega8] Komunikacja z RTC [PCF8563P]](https://obrazki.elektroda.pl/4439294400_1308068110_thumb.jpg)
Domyślnie połączenie dotyczyło RTC DS2415 gdzie łączyliśmy się z pinem 1-Wire (Input/Output).
Fukcje:
void send_1wire (unsigned char znak)
{
if (znak)
{DDRB |= _BV(6); //sciagnij wyjscie 1wire do masy
wait1w(3); //sciagnij linie na czas 5,7us
DDRB &= ~_BV(6); //zwolnij linie 1wire (pozwól na pojawienie sie jedynki)
wait1w(25);} //poczekaj 60us
else
{DDRB |= _BV(6); //sciagnij wyjscie 1wire do masy
wait1w(25); //sciagnij linie 1wire na czas 60us
DDRB &= ~_BV(6); //zwolnij linie 1wire
wait1w(1);} //poczekaj chwile na ustalenie sie stanu magistrali
}
unsigned char odbierz(void)
{
unsigned char bitna1w,i,bajt=0;
for (i=0;i<8;i++)
{
bitna1w=1; //ustaw wstepnie bit
DDRB |= _BV(6); //sciagnij wyjscie 1wire do masy
wait1w(1);
DDRB &=~_BV(6); //zwolnij linie 1wire
wait1w(3);
if bit_is_clear(PINB,PB6) //jesli magistrala jest 0
bitna1w = 0; //odczytany bit jest zerem, jesli nie to jeden
wait1w(46);
if(bitna1w) bajt |= 0x01<<i;
}
return bajt;} //no i zwróc to co odczytałes
Powyższe funkcje zapewniały odczyt i zapis czasu do RTC i działał w pierwotnej wersji. Kiedy zmianie w układzie podległ RTC (na PCF8563P - połaczenie pinu PB6 do SDA - niby dwukierunkowe) mam dziwne wrażenie że zapis na RTC nie działa, bo po każdym ponownym uruchomieniu zaczyna zagarek pomykać od tej samej godziny.
Dokumentacja do tego układu jest bardzo uboga. Chodzi mi o to (mam pewne przeczucie) czy połączenie PB7 atmegi do SCL (input clock) i przestawienie funkcji na:
void send_1wire (unsigned char znak)
{
if (znak)
{DDRB |= _BV(7); //sciagnij wyjscie 1wire do masy
wait1w(3); //sciagnij linie na czas 5,7us
DDRB &= ~_BV(7); //zwolnij linie 1wire (pozwól na pojawienie sie jedynki)
wait1w(25);} //poczekaj 60us
else
{DDRB |= _BV(7); //sciagnij wyjscie 1wire do masy
wait1w(25); //sciagnij linie 1wire na czas 60us
DDRB &= ~_BV(7); //zwolnij linie 1wire
wait1w(1);} //poczekaj chwile na ustalenie sie stanu magistrali
}będzie działać ?
Proszę o odpowiedź.
W załączniku pierwotny układ, obecnie w miejscu RTC jest PCF8563P z połączeniem PB6 - SDA
