Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8] Komunikacja z RTC [PCF8563P]

14 Cze 2011 18:16 3198 2
  • Poziom 2  
    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:
    Code:
    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:
    Code:
    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
    [Atmega8] Komunikacja z RTC [PCF8563P]
  • Computer ControlsComputer Controls
  • Moderator na urlopie...
    Kolego drogi!
    Pierwszy z podanych przez Ciebie zegarów (DS2415) korzysta z magistrali 1wire, natomiast drugi (PCF8563) korzysta z zupełnie innego standardu jakim jest I2C (czyt. "i kwadrat ce"). Trzeba więc użyć odpowiednich funkcji odczytujących/zapisujących dane na magistralę I2C.
    Trochę toerii: I2C korzysta z 2 linii, SDA to 2 kierunkowa linia danych, ale dane na niej są zapisywane/odczytywane tylko przy odpowiednim zboczu na linii zegarowej SCL.
    Poza tym dokumentacje nie są ubogie, a to co Kolega robi to tak jakby chciał kolega otworzyć zamek szyfrowy tradycyjnym kluczem - i jeden zamek i drugi zamyka drzwi, ale ich otwieranie wygląda nieco inaczej ;-)
    Polecam poczytać nieco o I2C w sieci.
  • Computer ControlsComputer Controls