logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega 16] Atmega16 i PCF8563 – błędne wskazania czasu, opóźnienia, godzina 60, I2C software

flapo213 01 Kwi 2008 20:25 11523 17
REKLAMA
  • #1 4981942
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    Witajcie.

    Muszę się podzielić z wami pewnym spostrzeżeniem układ PCF8563 coś nie działa za prawidłowo. Do tej porty używałem układu PCF8583 i wszystko było pięknie ale cena czyni cuda i zastosowałem PCF8563 i lipa. Nie umiem opanować tego układu, na dobę potrafi opóźniać nawet do 5 minut absurd totalny, dodatkowo co jakiś czas w miejscu godziny pojawia mi się np z godziny 19 robi się godzina 59 z godziny 20 robi się 60 itd. Przeczytałem całego pdf-a układu ze strony philipsa, teoretycznie nie widzę błędu czemu na PCF8583 działało a na tym jest jakaś lipa. Nie umiem zrozumieć co powoduje tak wielkie opóźnienia. Na elektrodzie jest kilka postów na ten temat ale mocno nie precyzyjnych. Używam I2C softwarowego, wszystkie podwieszenia układu zgodnie z ideologią do SDA i SCL 3.3k. Bateryjka z Vcc przez diody wszystko extra. Podtrzymywanie jest ok po zaniku zasilania i ponownym włączeniu jest ok. Tylko, że czasem pojawi się godzina 60 np. Poniżej zamieszczam fragmenty kodu. Proszę pomóżcie bo się zapłaczę siedzę i siedzę itd.

     //
      #define I2CDir DDRA  // Dobrać
      #define I2COut PORTA // Dobrać
      #define I2CIn  PINA  // Dobrać
      //
      #define SDA 6 // Dobrać 
      #define SCL 7 // Dobrać 
      //
      #define SET_SDA I2COut |= (1 << SDA)
      #define CLR_SDA I2COut &= ~(1 << SDA)
      //
      #define SET_SCL I2COut |= (1 << SCL)
      #define CLR_SCL I2COut &= ~(1 << SCL)
      //
      #define SDA_OUT I2CDir |= (1 << SDA)
      #define SDA_IN  I2CDir &= ~(1 << SDA)
      //
      #define SCL_OUT I2CDir |= (1 << SCL)
      #define SCL_IN  I2CDir &= ~(1 << SDA)
      //
      #define GET_SDA (I2CIn & (1 << SDA))
      //
      #define ACK 0
      #define NOACK 1
    
      #define OPOZNIENIE 2
    
    void ZapisI2c(unsigned char byte ,unsigned int a_start,unsigned int a_end,
                  unsigned char device_adres)
    {
      
      volatile unsigned int i, j=0x00;
      
      for(i=a_start; i < a_end; i++)
      {
        i2c_start();	 //rozpoczecie transmisji i2c
        i2c_send(device_adres);	 //adres fizyczny pamieci
        i2c_send(i);	 //komórka pamieci
        i2c_send(byte);	 //dana do zapisu
        i2c_stop();		 //zakończenie transmisji
        for(j=0; j<(5*OPOZNIENIE); j++); // Dobrać tą wartość //xxx (53 ms)
      }
    }
    
    void OdczytI2c(unsigned char adress, unsigned char device_adress,
                            unsigned int liczba_bajtow, unsigned char *buff)
    {
      unsigned int i = 0x00;
      
      i2c_start();	     //inicjalizacja magistrali
      i2c_send(device_adress);     //adres fizyczny ukladu do zapisu danej
      i2c_send(adress);	     //adres rejestru od ktorego rozpoczyna sie odczytywanie
      for(i=0; i<liczba_bajtow; i++)
      {
        i2c_start();	     //inicjalizacja magistrali
        i2c_send(device_adress+1);	     //adres fizyczny ukladu do odczytu danej
        buff[i] = i2c_read(i); //odczyt danej i umieszczenie w kolejnych elementach tablicy
        i2c_stop();
      }
      
     //xxx for(i=0; i<(5*OPOZNIENIE); i++); // Dobrać tą wartość //xxx (53 ms)
      
    }
    
    unsigned char i2c_read(unsigned char ack)  //Odebranie danej z I2C
    {
      unsigned char bitcount=8, temp = 0;
      
      volatile unsigned int i = 0x00;
    
      SET_SDA;
      SDA_IN; // Ustaw SDA na pin wejściowy
      
      do
      {
      
        for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
        
        SET_SCL;
        
        for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
        
        temp <<= 1;
        
        if(GET_SDA) 
          temp++;
        
        CLR_SCL;
      
      }while(--bitcount);
      
      if(ack)
        SET_SDA;
      
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
      
      SET_SCL;
      
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
      
      CLR_SCL;
      
      return (temp);
    }
    
    void i2c_send(unsigned char byte) //Wysylanie bitu na magistralŕ I2C
    {
      unsigned char bitcount = 9;
      volatile unsigned int i = 0x00;
    
      do
      {
        CLR_SCL;
        
        if(byte&0x80)    
          SET_SDA;
        else
          CLR_SDA;
        
        byte <<=1;
        
        for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
        
        SET_SCL;
        
        for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
        
      }while(--bitcount);
      
      CLR_SCL;
    }
    
    void i2c_start(void)  // Pod AVR OK #!
    {
      volatile unsigned int i = 0x00;
      
      // Załącz linie Sda i Scl
      SDA_OUT;
      SCL_OUT;
      
      SET_SDA;
      SET_SCL;
    
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
    
      CLR_SDA;
    
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
    
      CLR_SCL;
    }
    
    void i2c_stop(void)  //Wysłanie sekwencji Stop na I2C
    {
      volatile unsigned int i = 0x00;
      
      CLR_SDA;
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
      SET_SCL;
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
      SET_SDA;
      for(i=0; i<OPOZNIENIE; i++); // Dobrać tą wartość //xxx (1 ms)
    }
    
    
    //-------------------------------------------------------------
    

    Wartość stałej OPOZNIENIE nic nie wnosi znaczącego.


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • REKLAMA
  • #2 4983550
    al777
    Poziom 27  
    Posty: 646
    Pomógł: 105
    Ocena: 83
    W tym problemie są 2 problemy :
    1. Fluktuacja częstotliwości zegara - tutaj mogą być różne przyczyny : niewłaściwe odsprzęganie zasilania, złe poprowadzenie ścieżek, nawet pętle masy. I faktycznie, może być tak, że to co nie przeszkadza układowi PCF8583, stanowi problem dla PCF8563. Zamieść schemat i fragment płytki - będzie nam łatwiej zgadywać.
    2. Stan nieustalony na nieużywanych bitach w pamięci układu - ja miałem to i w PCF8563 i w PCF8583. Producent w nocie aplikacyjnej pisze wyraźnie, że te bity są nie zaimplementowane - zapomniał tylko ostrzec że to co się z nich odczyta to może być 0 lub 1 i nie sposób przewidzieć które kiedy.
    Rozwiązanie : np. dla pola godzin - z noty aplikacyjnej widzimy, że zaimplementowane są bity 0-5, 2 bity od strony MSB maskujemy zerami np. tak :
    godzina &= 0x3F;
    oczywiście już po dokonaniu odczytu z układu. U mnie działało (dwa z układów chodzą do tej pory, jeden ponad 2 lata bez przerwy).
  • REKLAMA
  • #3 4985230
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    Dzisiaj konsultowałem się z inżynierami w pracy i powiedzieli, że tego układu nie można za często czytać, bo wprowadza to chwilowe opóźnienia. Ja odczytuję wartość z układu co 30 sekund, może to powoduje problem opóźnienia. A maskowanie pomogło rzeczywiście stoi jak byk w dokumentacji. Pozdrawiam
  • #5 4985385
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    A kondensatory przy kwarcu masz do masy czy zasilania?
  • #7 4985968
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    Witam ponownie zamieszczam fragment schematu z zegarkiem
    Załączniki:
    • [Atmega 16] Atmega16 i PCF8563 – błędne wskazania czasu, opóźnienia, godzina 60, I2C software zegarek.jpg (42.44 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 4987725
    al777
    Poziom 27  
    Posty: 646
    Pomógł: 105
    Ocena: 83
    Schemat wygląda OK, nic do zarzucenia. Mam tylko nadzieję że kondensator C6 jest ceramiczny, umieszczony jak najbliżej pinów układu i z możliwie krótkimi końcówkami.
    Czy jakieś inne ścieżki nie przechodzą bardzo pinów 1 i 2 układu ?

    Co do szybkości czytania - ja czytałem co sekundę i było OK (czytanie wyzwalanie zboczem z wyjścia /INT), tylko że czytałem wyłącznie sekundy, chyba że się zmieniły z 59 na 00 - wtedy czytałem również minuty, a jak one się zmieniły z 59 na 00 - również godziny, itd.). To był zegarek z sekundnikiem i ma (bo działa do dziś) różnicę rzędu 8 sekund na tydzień (nie kalibrowałem go specjalnie, kwarc był wyszabrowany ze starego zegarka bo się spieszyłem a w sklepie nie było).

    A teraz sam postawię problem - właśnie zauważyłem że w nocie aplikacyjnej do PCF8583 kondensator kalibrujący kwarc (C5 na twoim schemacie) jest faktycznie do +VCC, ale w nocie do PCF8563 Philipsa jest on już do masy. Ja miałem zawsze do masy, a zakładałem na przemian oba układy i nie stwierdziłem różnicy. Może ktoś też się wypowie na ten temat ?
    Aha, a w tym drugim układzie o którym wspominałem mam ten kondensator całkiem nie zalutowany i działa, nie przekraczając minuty różnicy czasu na miesiąc (i tak okresowo synchronizuję zegar). Kwarc z TME, płaciłem astronomicznie bo ze 2 PLN za sztukę brutto.
  • REKLAMA
  • #9 4993084
    flapo213
    Poziom 21  
    Posty: 566
    Pomógł: 35
    Ocena: 10
    Dzięki Al777 za spostrzegawczość, ale muszę Ci powiedzieć, że chyba nie ma to zbytniego wpływu może w dłuższej skali czasu można by coś więcej powiedzieć. Znalazłem chyba rozwiązanie. Otóż okazuje się, że jak się czyta ten układ dużo dużo częściej powiedzmy 10 razy na sekundę to zegar PCF trzyma super czas, testuję już 2 dzień i wygląda bardzo obiecująco. Jest jednak pewien mankament, mianowicie potrafi się brzydko opóźnić nawet o 1 sekundę przy wyłączeniu i ponownym załączeniu. Jak uda mi się to rozwiązać to dam znać. Na razie efekt jest dobry nie opóźnia się.

    Czyli kończąc temat koniecznie trzeba maskować bajt godzin, minut, sekund jak jest w manualu do układu PCF, i z moich obserwacji wynika iż im częściej się odczytuje tym lepiej. Pozdrawiam i zamykam temat

    Dzięki za zainteresowanie - dzięki konstruktywnym podpowiedziom wszystko staje się jaśniejsze.
  • #10 5718465
    kozunami
    Poziom 12  
    Posty: 94
    Pomógł: 1
    Ocena: 1
    Witam!
    Będę robił zegarek na PCF8563 i mam kilka pytań odnośnie Twojego projektu: 1. Jakich dokładnie użyłeś kondensatorów? Ceramiczne,tantalowe? Czy obojętnie? 2. Jakie masz napięcie zasilające RTC? Pytam o to dlatego że chciałbym uniknąć kalibracji o ile to możliwe. Pozdrawiam!
  • REKLAMA
  • #11 6036432
    Dexu
    Poziom 13  
    Posty: 117
    Pomógł: 1
    Trochę czasu już minęło od ostatniego postu ale piszę, bo wg na schemacie 2 posty wyżej jest błąd i nie chciał bym, żeby ktoś go powielił.

    Co do błedu:
    Kondensator odsprzedający kwarc powinien być do masy a nie do VCC.

    Podciągniecie do VCC powoduje właśnie takie objawy o jakich tu była mowa, wiec szczerze mówiac nie mam pojęcia czemu maskowanie i odczytywanie czesciej mogło pomóc.

    Pozdrawiam
    Dexx
  • #12 7147264
    cichy999
    Poziom 20  
    Posty: 725
    Pomógł: 10
    Ocena: 23
    Wykonałem właśnie taki układ (atmega8 i pcf8563P) i też mam problem z odczytem czasu bo wychodzą mi dziwne czasy jak sek. wskakuje na 40 to godzina też wyświetla się 40.

    Co do kondensatora miałem do + a teraz dałem do masy ale to nic nie zmienia.
    Maskowaniem poradziłem sobie z godzinami, H = H And &B00111111
    ale co do daty mam problem.

    Czy ktoś zna przyczynę??
  • #13 7321797
    t_tom
    Poziom 12  
    Posty: 28
    Pomógł: 1
    Z datą jest podobnie, Days=Days And &B00111111 , Weekdays=Weekdays And &B00000111, Months = Months And &B00011111, Years - bez maskowania. Pamiętaj też, że tylko Weekdays (podobnie jak Weekday alarm) nie są kodowane na BCD.
  • #14 8022417
    patrx
    Poziom 16  
    Posty: 245
    Pomógł: 7
    Ocena: 15
    Balu napisał:
    Z czytaniem za częstym bzdura.


    Bzdura? W nocie PCF8563 jak byk stoi, że w chwili odczytywania danych wewnętrzne liczniki są zatrzymywane i stąd opóźnienia:


    When one of the RTC registers is read the contents of all counters are frozen.
    Therefore, faulty reading of the clock/calendar during a carry condition is prevented.


    Dlatego dane powinny być odczytywane szybko i w odpowiednich chwilach tj. gdy nie występują przeniesienia wewnątrz rejestrów PCF8563.
  • #15 8022625
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    To, że są zamrożone nie oznacza,że zegarek stoi. Ja czytam z niego bardzo szybko i przez miesiąc pośpieszył mi się o sekundę. Zamrozenie rejestrów blokuje jedynie nie pozwala na jednoczesny dostęp licznika i odczytu.
  • #16 8023588
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    patrx, bzdura. Układ liczy prawidłowo - sam mam na tym oparty zegar, który jest czytany co 1s i nie ma problemów. To o czym piszesz zapobiega błędowi, kiedy np. jesteś na granicy sekundy - masz np. 9:59:59 i w trakcie odczytu następuje przeskok sekundy - bez tego mechanizmu odczytałbyś 9:59:00. Natomiast nie zatrzymuje to wewnętrznego zegara, w efekcie nie ma żadnych opóźnień. Ludzie mają często kłopot z tym zegarem z zupełnie innych powodów. On bierze ekstremalnie mało prądu, generator kwarcowy ma w związku z tym dużą impedancję, w efekcie łatwo łapie zakłócenia. Stąd niezwykle ważne jest prawidłowe zaprojektowanie połączeń pomiędzy kwarcem, trymerem, scalakiem i odpowiednie odsprzęgnięcie zasilania. W resztą w nocie jest nawet sugerowany rysunek płytki.
  • #17 8844859
    phanick
    Poziom 28  
    Posty: 2949
    Pomógł: 65
    Ocena: 2833
    Ja mam pytanie, bo ten układ mi coś nie działa (w ogóle nie odpowiada ackiem na pierwszy komunikat).

    Czy kwarc zewnętrzny jest wymagany?
  • #18 8845068
    sidisidi
    Poziom 11  
    Posty: 19
    Ocena: 1
    Witam

    tak, kwarc jest wymagany. i to najlepiej przylutowany jak najbliżej nóżek 1 i 2 scalaka.

    z mojego doświadczenia mogę powiedzieć, ze obudowę kwarcu warto przylutować do masy inaczej zdarzało mi sie, ze przybliżywszy palec do kwarcu, ten zaczynał źle wpływać na pomiar czasu i oddawane wartości.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z dokładnością i błędnymi wskazaniami czasu w układzie PCF8563 stosowanym z mikrokontrolerem Atmega16, w szczególności opóźnień do kilku minut na dobę oraz pojawiania się nieprawidłowych wartości godzin (np. godzina 60). Użytkownicy wskazują na dwa główne źródła problemów: fluktuacje częstotliwości zegara wynikające z niewłaściwego odsprzęgania zasilania, złego prowadzenia ścieżek PCB oraz zakłóceń w obwodzie kwarcu 32,768 kHz, a także nieustalone bity w rejestrach RTC, które należy maskować po odczycie (np. godziny maskować maską 0x3F). Zalecane jest stosowanie kondensatorów do masy przy kwarcu, najlepiej ceramicznych i umieszczonych blisko nóżek układu, oraz odpowiednie ekranowanie i uziemienie obudowy kwarcu. Częstotliwość odczytów I2C nie powinna powodować opóźnień, a wręcz częstsze odczyty (nawet do 10 razy na sekundę) mogą poprawić stabilność wskazań. Wewnętrzne liczniki PCF8563 są zamrażane podczas odczytu rejestrów, co zapobiega błędom odczytu, ale nie zatrzymuje zegara, więc opóźnienia nie wynikają z samego odczytu. Wskazano również, że układ PCF8563 jest bardziej wrażliwy na zakłócenia niż PCF8583, co wymaga staranniejszego projektowania układu i PCB. Maskowanie rejestrów daty i czasu jest konieczne, a dla dni tygodnia i alarmów należy pamiętać o braku kodowania BCD. Kwarc zewnętrzny jest wymagany i powinien być przylutowany blisko nóżek RTC.
Wygenerowane przez model językowy.
REKLAMA