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 - PCF 8583 - obsługa daty - dziwna reakcja

tomek1355 28 Lis 2012 18:30 1263 3
REKLAMA
  • #1 11585919
    tomek1355
    Poziom 9  
    Witam wszystkich,
    Otóż napotkałem następujący problem przy obsłudze wspomnianego w temacie zegara PCF8583. Godzina obsługiwana jest prawidłowo (stąd też wnioskuje, że metody konwersji BCD <-> DEC są ok). Najpierw zamieszczę kod, później opiszę problem:
    Odczyt:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odczyt wykonywany jest w przerwaniu zewnetrznym, pod które jest podłączona noga INT zegara, w związku z tym odczyt następuje co sekundę.
    Teraz zapis:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Efekt: Przy uruchomieniu (bez baterii) mamy oczywiscie godzine 00:00 1/1/2012. Po zmianie godziny na 23:59 (za pomocą UstawGodzineNaRTC) odczyt działa OK, wyswietla mi się godzina 23:59. Po minięciu minuty (nie korzystajac z UstawDateNaRTC, czyli data jest domyslna po uruchomieniu RTC 1/1/2012) data jaka mi sie wyswietla to 0/1/2012... Jeśli w tym momencie znowu ustawie godzine na 23:59 to po minięciu minuty wyswietli się 2/1/2012. Następnie znowu przestawiam godzinę na 23:59 i po minięciu minuty mam 00:00 2/1/2012, a po ponownej takiej operacji jest 4/1/2012 itd itd... Jakby nie obslugiwal dni nieparzystych. Ale jeśli uzyje UstawDateNaRTC i ustawie np 15/10/2012 i godzine 23:59, po minucie otrzymuje 14/10/2012... Nie jestem w stanie sprawdzic wszystkich mozliwych dat ale widac ze dziala bardzo dziwnie. Konsultowalem sie z kilkoma osobami w tej sprawie i na ich oko (moje tez) w kodzie jest wszystko ok... Ma ktos jakis pomysl, co moze byc nie tak?
    Byłbym wdzięczny za wszystkie sugestie i pomoce :)
    Pozdrawiam
  • REKLAMA
  • #2 11586142
    tehaceole

    Poziom 28  
    Poczytaj tutaj. Dodatkowo w załączniku masz bezpośrednio kody opisane w tamtym przykładzie. Wszystko działa. Zapewniona jest obsługa dni tygodnia, lat przestępnych etc.
    Dodatkowo w Timer1 umieszczona jest obsługa autodostrajania pcfa w przypadku problemów z kwarcem. Wsio bazuje na wykorzystaniu przerwania ICP - nóżka int pcfa jest podłączona do pinu ICP uP.

    Plik ZEGAR_CWU_MENU.c to fragment większego projektu. Usunąłem to co nie potrzebne i zostawiłem tylko to co Tobie się przyda żeby zaskoczyć "co autor miał na myśli" tworząc funkcje.

    Pozdrawiam
  • REKLAMA
  • #3 11586172
    Krauser
    Poziom 26  
    Dziwne że rok działa (chyba, żę B ma wymiar 8 bitów)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 11588003
    tehaceole

    Poziom 28  
    Krauser napisał:
    Dziwne że rok działa (chyba, żę B ma wymiar 8 bitów)
    Kod C - [rozwiń]
    B&=11000000; //<------------ bez 0b
    B= (B>>6);
    //B = bcd2dec(B);
    int rok = 2012 + B;

    Dziwne to jest tu podejście Autora do odczytu roku. Przecież w PCF8583 wartość roku odczytywana z tego rejestru mieści się w zakresie 0-3. Jest to informacja o tym który aktualnie mamy rok od ostatniego roku przestępnego. Dlatego w przytoczonych przeze mnie materiałach wartość roku trzymana jest jako osobna zmienna w ram pcfa, natomiast ten rejestr służy tylko do określenia czy nastąpiła zmiana roku. W rozwiązaniu Autora wartość odczytana z pcf dodawana jest do 2012. I fajnie... Tylko co Autor zrobi przy zmianie z 2015 na 2016? :)
    Może jednak tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA