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

[atmega32][C] PCF8583 odczyt czasu daty i dnia tygodnia

margas4542 06 Sie 2011 17:06 4300 22
REKLAMA
  • #1 9797435
    margas4542
    Poziom 16  
    Mam kłopot z niedziałającym poprawnie kodem i szczerze mówiąc nie potrafię znaleźć przyczyny. I2C chodzi poprawnie godziny,minuty,sekundy i dzień pokazuje poprawnie natomiast miesiące i dzień tygodnia to porażka.
    Kod: text
    Zaloguj się, aby zobaczyć kod




    Kod proszę umieścić w znacznikach code.
    Robak
  • REKLAMA
  • #3 9797454
    margas4542
    Poziom 16  
    To może być kłopotliwe bo to nie mały program a mam kłopot z wstawieniem kodu wykorzystując opcję listing kodu [SYNTAX Wybierz] co zapewne zauważyłeś.
  • REKLAMA
  • #4 9797459
    tadzik85
    Poziom 38  
    Ten odczyt napisany jest masakrycznie. Brak jakiegokolwiek maskowania danych.
    I czemu nie odczytujesz blokowo z PCFa
  • #5 9797477
    snnaap
    Poziom 25  
    W związku z tym że w zmiennej buffer_t[4] na 3 ostatnich bitach masz zapisany dzień tygodnia powinieneś robić tak:

    pomocnicza =buffer_t[4]
    buffer_t[4]&=0x00011111
    mc = bcd_na_dec(buffer_t[4])
    pomocnicza = pomocnicza >> 5
    dzien_tygodnia = bcd_na_dec(pomocnicza)
  • REKLAMA
  • #6 9797478
    margas4542
    Poziom 16  
    To znaczy że mam poważny problem bo poprzedni kod też nie funkcjonował poprawnie a skoro ten to masakra to może pokażcie jak ma wyglądać prawidłowo...
  • #7 9797485
    krru
    Poziom 33  
    margas4542 napisał:
    Mam kłopot z niedziałającym poprawnie kodem i szczerze mówiąc nie potrafię znaleźć przyczyny. I2C chodzi poprawnie godziny,minuty,sekundy i dzień pokazuje poprawnie natomiast miesiące i dzień tygodnia to porażka.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Skoro chcesz wyciągać różne bity to po co wcześniej robisz konwersję dcb_na_dec.
  • REKLAMA
  • #9 9797578
    margas4542
    Poziom 16  
    Zapewne coś namieszałem bo nadal mam błędny odczyt
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #11 9799125
    margas4542
    Poziom 16  
    Zarówno w twoim kodzie jak i moim [obecnym] czas i data są wyświetlane poprawnie ale dzień tygodnia to już inna historia .. cały czas pokazuje poniedziałek pomimo zmiany dnia miesiąca .. wklejam odpowiedzialny za to kod może ktoś się dopatrzy programowego niedociągnięcia ..
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 9799145
    krru
    Poziom 33  
    A numer miesiąca odczytuje się poprawnie? W rejestrze statusowym (offset 0) jest bit maskujący odczyt dnia tygodnia. Jeśli jest ustawiony to dzień tygodnia zawsze czyta się jako 0. Nigdzie w programie nie ruszasz tego rejestru, więc nie wiadomo co jest tam wpisane.

    No i jeszcze jedna uwaga - ten rejestr dnia tygodnia nie zmienia się po zmianie dnia miesiąca. Ten układ nie jest w stanie obliczyć dnia tygodnia na podstawie pozostałych rejestrów. Rejest dnia tygodnia to po prostu licznik dni liczący modulo 7. Trzeba wpisać tam właściwą liczbę przy ustawianiu zegarka.
  • #13 9799152
    margas4542
    Poziom 16  
    Właśnie to sprawdziłem i numer miesiąca mam cały czas "0"
  • Pomocny post
    #14 9799153
    Konto nie istnieje
    Konto nie istnieje  
  • #15 9799178
    krru
    Poziom 33  
    >> to nie jest rotacja tylko przesunięcie arytmetyczne. Jeśli argument jest signed będzie powielony bit znaku.
  • #16 9799191
    margas4542
    Poziom 16  
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #17 9799204
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #18 9799218
    krru
    Poziom 33  
    Tu nie chodzi o nazewnictwo, tylko o wynik operacji. Najmłodszy bit jest gubiony, a nie wpisywany na najstarszą pozycję. Ale mniejsza z tym. Po maskowaniu będzie wszystko jedno.

    Natomiast mam pytanko - dlaczego pętla obejmuje te konwersję. Powinno być jakos tak
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 9799404
    margas4542
    Poziom 16  
    Zgadza się .. już poprawiłem dziękuje. Co do dnia tygodnia to znalazłem w necie algorytm pozwalający wyliczyć z daty dzień tygodnia co rozwiązało problem błędnego wyświetlania .. ten kawałek działającego kodu udostępniam i jestem pewien że komuś się przyda...
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #20 10341812
    uzi18
    Poziom 24  
    Witam odswiezam temat, czy do odczytu godziny typowo trzeba zatrzymywac zegar (0xC0) w rej. 0x0
    czy mozna spokojnie sczytywac dane?
    Przegladalem biblioteke pod arduino do tego ukladu i tam nie rozumiem po co zegar jest zatrzymywany.
  • #21 10355482
    margas4542
    Poziom 16  
    W moim kodzie zegar "leci" na okrągło, i odnoszę wrażenie że zatrzymywanie go w tym konkretnym przypadku jest nieporozumieniem. Możliwe że jeżeli wymagał by tego program ze względu na obsługę np;przerwania taka sytuacja mogła by mieć miejsce jestem jeszcze raczkującym atmegowcem więc może wypowiedzą się bardziej doświadczeni koledzy.
  • #22 10356720
    tadzik85
    Poziom 38  
    Zatrzymywanie zegara to zupełne nieporozumienie a wręcz całkowity błąd.
    Czytanie danych z zegara w niczym mu nie przeszkadza.
  • #23 10370599
    uzi18
    Poziom 24  
    
    void PCF8583::get_time(){
      Wire.beginTransmission(address);
      Wire.write(0xC0);   // stop counting, don't mask
      Wire.endTransmission();
    
      Wire.beginTransmission(address);
      Wire.write(0x02);
      Wire.endTransmission();
      Wire.requestFrom(address, 5);
    
      second = bcd_to_byte(Wire.read());
      minute = bcd_to_byte(Wire.read());
      hour   = bcd_to_byte(Wire.read());
      ...
    


    Czy dobrze rozumiem ze to faktycznie zaterzymuje czy moze jednak zatrzaskuje czas?
    Nie wiem jak to interpretowac.
    Normalnie zapis begin... i write powoduje przesuniecie pointera w ukladzie i2c na podany bajt wiec po co takie cos i ten chyba mylacy komentarz?
REKLAMA