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

[atmega8][c][pcf8583] jak naliczać lata

Piotr Kania 13 Lut 2009 20:43 1884 12
REKLAMA
  • #1 6146158
    Piotr Kania
    Poziom 15  
    Pytanie jest oczywiste jak naliczać lata w PCF rejestr lat daje tylko 4 wartości żeby wiedzieć jak ma naliczać poszczególne miesiące ale jak inkrementować liczbę lat? Zastanawiałem się nad warunkiem if(miesiąc>12){rok++;} ale to chyba nie będzie latać, albo jakoś wykrywać zmianę tego rejestru lat ? Czy ma ktoś jakiś pomysł ?
  • REKLAMA
  • #2 6146731
    K_o_n_r_a_d
    Poziom 23  
    Oprócz samego RTC masz w pcf8583 jeszcze 240 (o ile sie nie mylę) bajtów pamięci. Wykorzystaj to. A w jaki sposób - a w jaki chcesz - coś wymyśl - można to zrobić na 100 sposobów, np. 1 komórkę pamięci przeznacz na aktualny rok (licząc np. od roku 2000), drugą na poprzedni odczytany rok z pcf8583. Porównując wartość komórki pamięci zawierającej ten poprzedni zapisany z aktualnie odczytanym, np. raz na miesiąc przy zmianie miesiąca - wykryjesz zmianę roku.
    Piotr Kania napisał:
    Zastanawiałem się nad warunkiem if(miesiąc>12){rok++;} ale to chyba nie będzie latać,
    Hmm... miesiąc>12... a jaki to miesiąc jest? :)
  • #3 6146918
    Piotr Kania
    Poziom 15  
    jak znasz aż tyle sposobów to gratuluje a możesz podać ten najprostszy :). Rok odczytany z PCF ma tylko 4 wartości wiec nie mam pojęcia jak chcesz to porównywać :). A może poprostu wykrywać zniane pierwszego bitu roku 00,01,10,11 to wszystkie możliwości tylko jak to zrobić, oto jest pytanie
  • #4 6147025
    K_o_n_r_a_d
    Poziom 23  
    Nie znam 100 sposobów bo po co, po prostu jak jest potrzeba to wymyśla się taki który będzie pasował do danej sytuacji, nie ma sensu uczyć się sposobów na pamięć. Jeśli rozumiem jak działa PCF8583 to nie jest problemem wymyślenie sposobu - to miałem na myśli.

    No więc np. tak jak napisałem wyżej. Podczas ustawianie roku np. ustawiając 2009, zapisuję w komórce pamięci PCFa, np. pod adresem 100 wartość 9 a w innej komórce, np. pod adresem 101 wartość (od 0 do 3) odczytaną z RTC. Teraz odczytując aktualny czas z RTC, porównujemy rok z wartością odczytaną z komórki 101. Jeśli są różne znaczy, że rok się zmienił a więc zmieniamy na aktualną wartość komórki 100 i 101 i tak dalej.

    Jest to pierwszy sposób który przyszedł do głowy, więc niekoniecznie jest optymalny, ale będzie działał.

    Należy pamiętać, że PCF8583 rozróżnia lata przestępne - o ile się nie mylę 0 jest rokiem przestępnym - do sprawdzenia w datashecie.
  • REKLAMA
  • #5 6147114
    Piotr Kania
    Poziom 15  
    tak ale najpierw trzeba zrobić synchronizacje tzn ustawić rok ma 2009 potem podzielić prze 4 reszte z dzielenia wpakować do pcf i mamy właściwie ustawionego :) teraz to co jest w pcf przelać do ramu a potem porównywać. Jęzeli różne to inkrementacja roku i znów przepisać z pcf ja to tak widze na teraz

    Dodano po 1 [minuty]:

    dodaje sprostowanie np na 2009 :P
  • REKLAMA
  • #6 6148824
    Piotr Kania
    Poziom 15  
    Natrafiłem na problem przy dzieleniu liczby lat w BCD przez 4. Np dzieląc 16 dostaje wynik 2 oto kod
    
    rtc_write(0x10,rok1); // zapisuje pod adres 0x11 rok ustawiony
    h=(rok1 % 4);
    rtc_write(0x11,h);// znacznik roku reszta z dzielenia przez 4
    


    dzielenie działa ale tylko dla pierwszych czterech bitów jak zrobić żeby to zadziałało dla całego bajtu?

    Dodano po 10 [minuty]:

    chyba najlepsze wyjście to zrobienie konwersji z bcd na 10 i dopiero %4 ?
  • REKLAMA
  • #9 6149617
    dawid512
    Poziom 32  
    Wg. mnie pomysł zapisywania danych związanych z rokiem do PCF-a to zbyt duże kombinowanie. Prosciej zrobic sobie jakąś zmienna typu word do ktorej zapisac na poczatek np. 2009. Potem prosty warunek: jezeli zmienil sie miesiac i wynosi 1(styczen) to inkrementowac sobie ta zmienna.
  • #11 6149680
    dawid512
    Poziom 32  
    Taka że daruję sobie odczytywanie roku bo i po co go odczytywać.
  • #13 6150003
    Piotr Kania
    Poziom 15  
    Panowie rok trzeba odczytać żeby wiedzieć czy jest przestępny czy nie bo inaczej dni miesiąca lutego się nalicza i zauważcie że to najlepiej zrobić tak że ustawić rok na 00 zapisać go do ramu pcf i tak sobie będzie bezpieczny jeżeli macie podtrzymanie. Następnie podzielić %4 i macie rozpoznanie czy przestępny jeśli 0 to przestępny:) Teraz tą informacje dać już do pcf do rejestru roku i zapisać to też w jego ramie. Następnie w uP robisz if(!(rokpcf=rokram)){inkrementujesz rok na wyświetlaczu i do rokram dajesz aktualny rokpcf}. Mam nadzieje ze niezamotłałem :D

    Dodano po 1 [godziny] 2 [minuty]:

    właśnie to załadowałem do proca i działa
REKLAMA