No więc, tak jak obiecałem jakiś czas temu postaram się przybliżyć i wytłumaczyć kwestię programowej obsługi popularnego układu RTC ? PCF8583.
Układ ten ma zarówno zwolenników jak i przeciwników, a jedni i drudzy mają swoje racje. Są układy prostsze w obsłudze programowej, posiadające wszystkie interesujące nas dane w osobnych rejestrach prostych do odczytania/zapisania, lecz często są one cięższe do kupienia w małych sklepach, czasem droższe i bardziej kapryśne niż stary, ale ciągle jary PCF8583. No ale temat ten nie ma na celu dyskutowania nad zaletami i wadami poszczególnych układów!
Postaram się w miarę jasny i przejrzysty sposób opisać moje boje z tym układem, które ostatecznie doprowadziły do wykorzystania prawie wszystkich jego możliwości. Prawie, dlatego, że układ ten ma jeszcze rejestry odpowiedzialne za alarm (budzik), które w pewnych zastosowaniach również mogą okazać się niezwykle przydatne!
Noty aplikacyjnej i sposobu podłączania układu do mikrokontrolera nie będę przytaczał, bo informacji na ten temat jest tak dużo, że nawet zupełny amator po obejrzeniu jakiegokolwiek schematu urządzenia około-zegarkowego wykorzystującego ten układ (a projektów takich na elektrodzie jest dużo) będzie wiedział ?z czym to się je?.
Zacznijmy od odrobiny teorii. Na początek proponuję przypomnienie (lub zapoznanie) sobie wiadomości na temat systemu dwójkowego (binarnego) i podstawowego kodu BCD ? BCD8421. Informacje na ten temat można znaleźć choćby na Wikipedii, np. w tym artykule: Kod BCD .
Teraz możemy przystąpić do właściwego tematu.
Zacznijmy od krótkiego fragmentu programu w BASCOMIE:
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Ack
I2crbyte Dzien , Ack
I2crbyte Miesiac , Nack
I2cstop
Kod ten działał będzie tylko wtedy, kiedy nasz RTC jest jedynym układem pracującym i podłączonym do szyny I2C naszego mikrokontrolera. Ale początkujący raczej rzadko stosują więcej niż jeden taki układ i myślę że nie jest to problemem, a ci bardziej zaawansowani raczej nie będą czytać tych moich wypocin :P.
Przeanalizujmy ten krótki fragment. Poczynając od pierwszej lini:
1. Inicjujemy szynę I2C,
2. podajemy adres zapisu do naszego układu (162),
3. wpisujemy wartość 2, odpowiadającą numerowi rejestru który potem odczytamy, odczyt zacznie się od tego rejestru,
4. ponownie inicjujemy szynę,
5. podajemy adres odczytu (163)
6. odczytujemy wartość rejestru sekund, zapisujemy ją do zmiennej ?Sekundy? i kontynuujemy odczytywanie (Ack),
7. kontynuujemy odczytywanie dla Minut, Godzin, Dnia, Miesiąca ? analogicznie do punktu powyżej, po odczytaniu wartości rejestru Miesiąca kończymy transmisję (Nack),
8. ?zatrzymujemy? szynę I2C.
Po tej operacji mamy w pięciu zmiennych zapisane interesujące nas dane. I teraz przyda się przypomnienie systemu dwójkowego i BCD ;-). Układ PCF8583 operuje właśnie na kodzie BCD i wszystkie odczytywane/zapisywane do niego dane muszą być zapisane właśnie w tym kodzie.
Aby w pełni zrozumieć sposób działania tego układu, musimy sobie wyobrazić 5 rejestrów, każdy ma po 8 bitów. W trzech pierwszych zapisane są wartości sekund, minut i godzin, oczywiście w kodzie BCD. W rejestrze czwartym zapisany jest numer dnia miesiąca i ?zamaskowany? w nim numer roku. I tu uwaga: PCF8583 nie ma ?prawdziwego? licznika lat. Numer roku zapisywany jest jedynie na dwóch bitach i przyjmuje wartości od 0 (00) do 3 (11). ?Rok? 0 jest rokiem przestępnym, a kolejne 3 są kolejnymi latami w czteroletnim cyklu pomiędzy latami przestępnymi. Ale na razie się tym nie przejmujmy ? poradzimy sobie z tym.
W rejestrze piątym zapisany jest numer miesiąca w roku i również ?zamaskowany? numer dnia danego tygodnia. Numer dnia tygodnia przyjmuje wartości od 0 (000) dla poniedziałku do 6 (111) dla niedzieli.
Myślę że całą sprawę najlepiej wyjaśni prosty rysunek, który przedstawia przykładowe zawartości odczytanych rejestrów, którym przyporządkowałem umowne nazwy, odpowiadające nazwom zmiennym z naszego fragmentu programu:
Jak widać (mam nadzieję) rejestry sekund, minut i godzin zawierają po prostu ich wartości w kodzie BCD. W rejestrze dnia natomiast, na dwóch najstarszych bitach jest ukryty numer roku w czteroletnim cyklu o którym wspominałem wyżej. Na dwóch kolejnych bitach zapisane są dziesiętne części numeru dnia miesiąca, a na czterech najmłodszych jedności numeru dnia miesiąca.
Podobnie sprawa ma się w przypadku rejestru miesiąca. Na trzech najstarszych bitach zapisany jest numer dnia tygodnia, na następnym bicie części dziesiętne numeru miesiąca i na czterech najmłodszych jedności numeru miesiąca.
Aby teraz wyciągnąć z tego wszystkiego interesujące nas liczby w systemie dziesiętnym, wykonamy kilka prostych operacji. Oto następny fragment programu:
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
I przeanalizujmy:
1. Zmienną Sekundy konwertujemy z kodu BCD do systemu dziesiętnego,
2. analogicznie postępujemy ze zmiennymi Minuty i Godziny, ponieważ jak pamiętamy w tych rejestrach zapisane są tylko i wyłącznie te wartości,
3. pomocniczej zmiennej o nazwie Rok przypisujemy wartość zmiennej Dzien, zawierającej wartość rejestru dnia, w którym ukryty jest również numer roku,
4. przesuwamy teraz w prawo o 6 bitów naszą zmienną Rok, dzięki czemu ?zerujemy? 6 bitów zawierających numer dnia miesiąca i zostają nam 2 bity z numerem roku,
5. konwertujemy zmienną Rok na system dziesiętny,
6. teraz bierzemy ?na stół? zmienną Dzień, która do tej pory nie była ruszana ? zerujemy 2 najstarsze bity (siódmy i szósty) ? bity te, jak pamiętamy, zawierają numer roku i nie są nam już potrzebne,
7. konwertujemy teraz zmienną Dzien do systemu dziesiętnego,
8. do zmiennej pomocniczej Dzien_tygodnia wpisujemy zawartość zmiennej Miesiąc,
9. przesuwamy w prawo o pięć miejsc zmienną Dzien_tygodnia ? dzięki tej operacji, podobnie jak z numerem roku, zostają nam tylko 3 bity zawierające numer dnia tygodnia,
10. i ponownie: konwertujemy zmienną Dzien_tygodnia do systemu dziesiętnego,
11. zerujemy 3 najstarsze bity zmiennej Miesiąc ? wymazujemy z niej numer dnia tygodnia,
12. i możemy ją przekonwertować do systemu dziesiętnego ? otrzymujemy numer miesiąca.
Mam nadzieję że całość opisałem wystarczająco jasno, by każdy mógł zrozumieć. Po tych operacjach otrzymujemy w kilku zmiennych (Sekundy, Minuty, Godziny, Rok, Dzien, Dzien_tygodnia, Miesiąc) wszystko, co potrzebne do pełnej orientacji w czasie ;-).
A cały program odczytujący te dane z naszego układu i wyświetlający je na ekranie alfanumerycznego wyświetlacza LCD może wyglądać tak:
Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
Do
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Ack
I2crbyte Dzien , Ack
I2crbyte Miesiac , Nack
I2cstop
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
Cls
Lcd "Godzina: " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
Loop : End
Czy to takie trudne? Wydaje mi się że nie. Zachęcam do eksperymentowania!
A teraz zajmijmy się zapisem danych do układu ? w końcu jakoś ten czas i datę trzeba ustawić! ;-) Tak naprawdę jeśli do tej pory udało się nam do tej pory zrozumieć zasadę odczytu i rozgryźć ?co gdzie siedzi? to teraz wystarczy wszystko zrobić w drugą stronę! Zacznę więc od razu z grubej rury i podam fragment programu. Pomijam oczywiście wcześniejsze ustawienie odpowiednich wartości dla naszych zmiennych, ponieważ nie ma na to uniwersalnej reguły ? każdy robi to na swój sposób, zależnie od urządzenia nad którym pracujemy ? czy to podając wartości liczbowe z pilota/klawiatury, impulsatorem inkrementujemy czy dekrementujemy itp. itd?
Godziny = Makebcd(Godziny)
Minuty = Makebcd(Minuty)
Sekundy = Makebcd(Sekundy)
Rok = Rok Mod 4
Rok = Makebcd(Rok)
Shift Rok , Left , 6
Dzien = Makebcd(Dzien)
Dzien = Rok Or Dzien
Miesiac = Makebcd(Miesiac)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Left , 5
Miesiac = Dzien_tygodnia Or Miesiac
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte Sekundy
I2cwbyte Minuty
I2cwbyte Godziny
I2cwbyte Dzien
I2cwbyte Miesiac
I2cstop
I znowu przeanalizujmy:
1. Konwertujemy zmienną Godziny z systemu dziesiętnego na kod BCD,
2. analogicznie postępujemy ze zmiennymi Minuty i Sekundy
3. wartość roku (np. 2010) dzielimy przez 4. Reszta z tego działania odpowiada numerowi roku, jaki możemy wpisać do PCF?a ? łatwo zauważyć że dzielenie roku przestępnego przez 4 da 0 reszty, a kolejnych lat po nim po kolei da resztę 1, 2 i 3. Nie wierzysz? Sprawdź!
4. konwertujemy zmienną Rok do kodu BCD,
5. i przesuwamy ją 6 miejsc w lewo, robiąc miejsce dla numeru dnia w miesiącu,
6. zmienną Dzien konwertujemy na kod BCD,
7. teraz zmiennej Dzien przypisujemy sumę logiczną zmiennych Rok i Dzien. Jeśli nie wiesz jak działa suma logiczna (OR) to zapraszam na Wikipedię,
8. zmienną Miesiąc konwertujemy do BCD,
9. zmiennej Dzien_tygodnia przypisujemy wartość zmiennej Miesiąc,
10. i przesuwamy ją 5 miejsc w lewo, pownie ?robiąc miejsce? dla numeru miesiąca,
11. i na koniec znowu stosujemy sumę logiczną i ?łączymy? zmienne Dzien_tygodnia i Miesiąc,
12. dokonujemy zapisu naszych zmiennych do odpowiednich rejestrów PCF?a8583.
Trudne? Jeśli tylko nie zamąciłem Ci za bardzo w głowie to na pewno uznasz że nie ;-)
Jak widać nie taki diabeł straszny jak go malują. Tylko z pozoru wydaje się to trudne ? jeśli raz zrozumiesz ideę działania naszego bohatera to na pewno przyznasz mi rację. A mam nadzieję że te moje wypociny Ci w tym pomogą!
Jeśli tak będzie, to nie obrażę się, jeśli klikniesz przysłowiowe ?Pomógł? ? taka nagroda bardzo mnie ucieszy i zmobilizuje do dalszej pracy.
Na ?odkrycie? czekają jeszcze rejestry alarmu! ;)
Powodzenia we własnych eksperymentach!
Zegar
Co ma na celu stosowanie tego układu? możliwość stosowania podtrzymania zasilania samego zegara w przypadku zaniku zasilania? i prostszy kod? ostatnio zaczynam naukę bascoma i w książce mam kilka gotowych zegarów zrealizowanych programowo.. No ale właśnie z podtrzymaniem zasilania z baterii to chyba nie byłoby tak kolorowo, bo prądu trochę by ciągnął cały układ.
Układy RTC stosuje się przede
Układy RTC stosuje się przede wszystkim w celu "odelżenia" procesorowi - nie w każdym urządzeniu mikrokontroler może jednocześnie odmierzać czas i zajmować się pozostałymi czynnościami.
Po drugie dokładność! Zegarki programowe zazwyczaj używają timerów procesora, które mogą zmieniać swoje parametry w zależności np. od warunków otoczenia (choćby temperatury), zasilania itp. I choć są sztuczki programowe i sprzętowe pomagające korygować ewentualne opóźnienia/przyśpieszenia to w przypadku układów RTC sprawa jest banalnie prosta: wystarczy zastosować przyzwoitej jakości kwarc zegarkowy i problemów być nie powinno.
Po trzecie: możliwości. Nawet taki PCF8583 choć już bardzo stary (BARDZO!) bez większych problemów udostępnia nam pełną godzinę, datę i możliwość zaprogramowania alarmu. Dodatkowo posiada wyjście INT (zbocze opadające jako aktywne) które generuje przerwanie z częstotliwością 1Hz - a takie cosekundowe przerwanie przydaje się w wielu konstrukcjach! A są układy nowsze, bardziej nowoczesne i oferujące jeszcze większe możliwości...
Po czwarte: właśnie kwestia podtrzymywania zasilania. Choć "większe" AVR'y mają wbudowany układ RTC, który jeszcze łatwiej obsłużyć z poziomu bascoma niż zewnętrzny, to pozostaje kwestia oszczędności prądu w razie zaniku zasilania z sieci. Można co prawda wykrywać zanik zasilania sieciowego programowo i wprowadzać procesor w stan power-down, ale mimo tego jego pobór prądu w tym stanie będzie kilka(dziesiąt) razy większy niż układów RTC. U mnie podtrzymywanie oparte jest na kondensatorku 4700uF i jest w stanie na nim "wytrzymać" bite 3 doby - wątpię by procesor w stanie power-down wytrzymał na tyle długo, by móc pod tym względem choćby troszkę konkurować. A PCF8583 w cale nie jest super-enerooszczędnym układem! Nowsze układy są pod tym względem jeszcze lepsze!
Czy muszę Cię jeszcze przekonywać? ;-)
Re: RTC
oprócz tego co kolega słusznie napisał, czasami konstrukcja programu uniemożliwia precyzyjne odmierzanie czasu. Np gdy chcemy używać układów na 1-wiere to procesor musi zapewnić ścisłe zależności czasowe przy nadawaniu. Gdy program przerywany jest timerem to może się okazać że ani układ na 1-wire nie chodzi, ani zegar nie jest w żaden sposób precyzyjny.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Przerwanie INT
Witam
W jaki sposób "zmusić" pcf-a do generowania przerwania co sekundę (generowania 1Hz) ?
Konkretnie chodzi mi o komendy w bascomie, i w którym miejscu je należy wpisać, odnosząc się do powyższych przykładów
Pozdrawiam
PCF 8583 generuje cosekundowe
PCF 8583 generuje cosekundowe przerwanie od razu po włączeniu zasilania i nie trzeba tego w żaden sposób konfigurować.
Za to trzeba pamiętać o tym, że aktywnym zboczem jest zbocze opadające i odpowiednio skonfigurować mikrokontroler, np tak:
Config Int0 = Falling
Ten fragment nie wymaga chyba komentowania?
Z moich doświadczeń wynika, że dobrze jest też podciągnąć port mikrokontrolera na który chcemy podawać przerwanie do +Vcc, zwłaszcza jeśli łączy go z wyprowadzeniem PCF'a dosyć długa ścieżka. Opór >=10k jest w sam raz.
Wielkie dzięki :)))
Wielkie dzięki :)))
Punk 9 zapisu do rtc
W punkcie 9 zapisu jest chyba błąd. Nadpisanie dnia tygodnia miesiącem uniemożliwia poprawne wprowadzenie dnia tygodnia. Wg. mnie należy usunąć wpis
i będzie dobrze. Mimo wszystko na dzień dzisiejszy jest to chyba jedyny tak dobrze opisany sposób obsługi tego PCF'a. Pozdrawiam
piękny opis
Bardzo ładnie opisane funkcje zegara, kalendarza
dziękuje, pozdrawiam
pytanie odnośnie odczytu daty
dobry opis, nie doczytałem się tylko w jaki sposób zapisać rok np 2011, jeżeli przy wyświetlaniu posłużymy się po prostu dodawaniem np 2008+3 to teraz się zgodzi, ale za rok będzie pokazywać z powrotem 2008 rok. Jak sobie poradzić z tym problemem. Proszę o jakąś podpowiedź.
Re: PCF
Niestety PCF nie pamięta tego. Ja osobiście bym w eepromie procka zapisywał rok np 2008 do którego dodawał bym 0... 3. Jak się licznik przekręci to do eeprom wpisał bym 2012 itd
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
dokładność pcf8583 vs ds1307
porównywałem dokładności obu układów pcf8583 (kwarc + trymer) ds1307 nie wymaga trymera i w zasadzie nie ma możliwości regulacji bo ich raczej nie potrzebuje, pcf8583 wypada bardzo kiepsko po "dostrojeniu" wydaje się że chodzi dokładnie ale wystarczy przenieść go do pomieszczenia o innej temperaturze i proces trymowania można rozpoczynać od początku - czy macie podobne spostrzeżenia ?
Re: PCF
Nie zauważyłem takiego problemu.... ale tak jak mówisz mam zegar w jednym pomieszczeniu i raczej go nie przenoszę do innego.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Nigdy jeszcze nie stosowałem
Nigdy jeszcze nie stosowałem żadnej dodatkowej kalibracji do PCF'a 8583 i nigdy też nie narzekałem na jego dokładność. Być może kluczem do sukcesu są dwie, może trzy rzeczy: porządna filtracja zasilania, odpowiedniej jakości kwarc zegarkowy i poprawna aplikacja samego układu i jego elementów otaczających (czytaj: poprawny projekt PCB). Zaniedbując którąś z tych rzeczy sami prosimy się o kłopoty.
[edit] Za to DS jest baaaardzo wybredny jeśli chodzi o napięcie zasilania i podtrzymania! Następny zonk jest taki, że wartość i stabilność napięcia podtrzymania wpływa na pracę układu podczas normalnej pracy! Jeśli nie spełnimy wymagań opisanych w nocie katalogowej będziemy mieli przysłowiową orkę na ugorze podczas prób opanowania tego układu!
Re: Zasilanie PCF
Odnośnie zasilania i płytki to zgadzam się w 100%... nie da się tego złożyć na stykówce i oczekiwać że dobrze pójdzie. Kiedys widziałem w karcie katalogowej lub nocie aplikacyjnej layout płytki jaki powinien być. http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CFMQFjAE&url=http%3A%2F%2Fwww.zlgmcu.com%2Fdownload%2Fdowns.asp%3FID%3D509&ei=LOzqTvX_NdPt8QOFyZWMCg&usg=AFQjCNH3n6UP0kjb-niASVyR5OMFaf96rg
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Mario
Witam ,dlaczego adres 162 (mógłbyś wyjaśnić). Czy pod ten programik zadziała też DS1307??? ,a może inaczej się go adresuje??? ,pozdrawiam.
Re: Obsługa DS1307
Z tego co wiem to DS1307 obsługuje się troszkę inaczej. Swego czasu bujnąłem zegar na tym RTC ale pamiętam że są z nim delikatne kłopoty.
Moja strona w powijakach
OK ,a skąd te adresy?
OK ,a skąd te adresy?
Przeglądam PDF i widzę adresy rejestrów 01 - 0F ,próbowałem z szesnastkowego przeliczać na dziesiętny ,bo myślałem że chodzi o odczyt
danego rejestru ,ale to chyba nie to. Widzę jest jeszcze alarm i inne przydatne "cuda". Zależy by mi załapać skąd te adresy wtedy może jakoś
połapię się z DS1307, pozdrawiam.
Re: Obsługa DS1307
Po co będziesz wyważał otwarte drzwi? W samplach jest obsługa DS1307. Wiem tylko że jeszcze trzeba z tym troszkę powalczyć bo coś się dzieje, ale nie pamiętam co?
Moja strona w powijakach
Mario
Ok ,dzięki. Czegoś takiego właśnie szukałem. Teraz już nie powinno być problemu!!! ,jeszcze raz dzięki!!! ;)
A ja mam pytanie co jest źle
A ja mam pytanie co jest źle w tym kodzie. Ustawiłem sobie do testów trzy przyciski i wszystko ładnie działa ale nie mogę zmienić wartości początkowej minuty.
Dzięki za pomoc
Re: Pcf
Wydaje mi się że nie wywołujesz nigdzie procedury która wpisuje wartość zmiennej A do wartości godzin lub minut.... mogę się jednak mylić. Możesz sobie dopisać linijkę zaraz pod obsługą przycisków, która wyświetli niektóre zmienne na LCD i zobaczysz co się dzieje
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Adres RTC
Może i moje pytanie jest banalne, ale znalazłem info że adres układu zmienia się, zależnie od podłączenia pinu AO
Jednak nigdzie nie znalazłem, jakie to adresy.
Wiem że rtc ma adresy r-162 w-163 i r-160 w-161. Teraz pytanie brzmi, który jest przy stanie wysokim na AO, a który przy niskim
PCF8583
Dla 8583. Karta katalogowa strona 17. Bit A0 bespośrednio trafia na bit 1 w adresie układu, czyli A0=1 daje adres +2, Z ustawionym A0 adresy będą 162 i 163
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
zmienione adresy zapisu i odczytu
Witam Mirley, ;)
próbowałem zaimpletować twój "gotowy" kod do odczytu czasu i daty i nie działało. Nie działało, dlatego, że podałeś adres odczytu i zapisu dla ds1307, nie wiem może na innych pcf'ach działa ale u mnie nie dlatego pozwole sobie wkleić zmodyfikowany kod (zmienione są tylko adresy odczytu i zapisu):
Pozdrawiam,
feriar ;)
Mam pytanie odnośnie tego kodu
Dlaczego procedura Odczyt_pcf8583 jest z parametrami czy użycie procedury bez parametrów lub podprogramu i operowanie od razu na zmienych globalnych H, M, S, D , Mon nie jest bardziej optymalne?
declare sub od razu lokuje miejsce w pamięci na parametry, czy tak? Mósi zapamiętać adres zmienych?
Czyli bez tych parametrów zaoszczędzimy na ramie? Czy jednak jest to beznaczenia i objętość jest taka sama bo parametry i zmienne to te same obszary pamięci.
Czy szybkość wykonywania w obu przypadkach jest taka sama?
Co jest bardziej optymalne jeśli chodzi pamięć programu?
Witam. Mój problem dotyczy
Witam.
Mój problem dotyczy poprawności wyświeltania czasu na lcd.
Otóż sekundy zmieniają się nierównomiernie. przez 3-4sek czas leci szybciej po czym następuje chwila przerwy i znowu to samo - i tak w kółko.
Proszę o pomoc w czym tkw problem.
Poniżej fragment kodu dotyczący zegara :
Re: PCF
Co jaki odcinek czasu wywołujesz procedurę Gettime? nie czasem co 1s? wywołuj 10 razy na sekundę aby zauważyć zmianę czasu w liczniku Pcf albo skorzystaj z przerwania, które on generuje bo chyba da się to tak zrobić.
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
Zegar na M32-dopisanie alarmu.
Witam wszystkich
Jestem w posiadania takiego zegara jak w temacie.Jestem baaardzo początkujący, ale udało mi się dodać termometr jednopunktowy do tego zegara.Zacząłem kombinować z dopisaniem alarmu ,ale po 2 dniach walki odpuściłem.Nie wiem jak zrobić kilka rzeczy:
Gdzie zacząć dopisywać kod?
Jak pod przyciski przypisać alarm ,które już są?
Jakie polecenia?
Przejrzałem dużo postów i kilka przykładów ,ale jakoś nie mogłem ich powiązać z moim zegarem.POMOŻECIE?
Pozdrawiam.
Troche odgrzeję wątek tego
Troche odgrzeję wątek tego zegara.
Sam ostatnio uruchamiałem PCF8583 , który posiadał dopiętą dodatkową pamięć 24C16 - na tej samej magistrali I2C co PCF8583 - Po wielu podejściach zdecydowałem się wylutować 24C16, z którą niestety nie mogłem uruchomić zegara.
ps. Adresy READ/WRITE :
HA3,HA2 ---> A0 podpięte do +Vcc
HA1,HA0 ---> A0 podpięte do GND
------------
re. "Pinky"
H....m, wymaga to dopisana kodu odpowiadającego za nastawy alarmów w rejestrach , które masz dokładnie opisane w notach katalogowych - zajrzyj także do dołączonych bibliotek $include "PCF8583.bas" w pokazanym kodzie.
Najlepiej zapytaj kolegów , którzy powyższy programik tworzyli - gdzie to Masz dopisać.
Witam, Nurtuje mnie jedno
Witam,
Nurtuje mnie jedno pytanie, czy z tego pcf'a muszę odczytywać wszystkie dane po kolei, czy mogę ominąć np jedną? Potrzebuję godziny, minuty (sekundy od biedy, ale nie muszą być) i numer dnia tygodnia. W jaki sposób mam ominąć zmienną "dzien" (nazwa z artykułu), żeby pobrać po niej zmienną "miesiac" w której zakodowany jest numer dnia tygodnia? Czy da się to jakoś ominąć? Myślałem jak to zrobić i ewentualnie ten sposób powinien się przyjąć. Zamiast do zmiennej "dzien" zapisze do zmiennej "Miesiac", później ją wyzeruje i właściwą linijkę zapisze do zmiennej miesiąc.
Czyli zamiast tak:
zrobić tak:
Nie sprawdzałem tego, ale wydaje mi się, że powinno dać radę. Proszę o jakieś wskazówki jak to inaczej rozwiązać, lub to czy tak może być (jeszcze chwile potrwa zanim skończę pisać obsługę PCF'a w dość rozbudowanym programie, gdzie sam pcf jest tylko dodatkiem.
Pozdrawiam
Dawid K.
RE: PCF
Najszybciej jest tak jak napisałeś.... nie ma sensu zerować zmienną miesiąc bo kolejny odczyt ją nadpisze
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
zapis dni tygodnia do zmiennej miesiac
Witam!
Strona świetna, porady super, ale ... niestety zawsze jakieś jest;)
Chodzi mi konkretnie o Twój kod do zapisu dni tygodnia w zmiennej miesiąca.
Coś mi tu nie gra.
Przyjmijmy że
- dzień_tygodnia= 02 czyli środa
- miesiąc= 06 czyli czerwiec
dzień tygodnia to b00000010
miesiąc konwerujemy na kod BCD
miesiąc = 0000 0110
zmienną dzień tygodnia zastępujemy miesiącem i tym samym tracimy zawartość zmiennej dzień_tygodnia !
przesuwamy w lewo o 5 pozycji -> dzień_tygodnia=1100 0000 - i już tutaj jest zonk bo dzień tygodnia zamiast wartości 2 ma wartość (po odczycie) 6, a więc niedziela.
Albo ja czegoś nie rozumiem - w każdym razie taki kod wgrany do atmegi8 robi śmieci w stylu miesiąc 23 i dzień tygodnia przeskakujący o 2-3.
Mógłbyś pomóc w moim rozumowaniu? :)
błąd w zapisie
Teraz to działa z dniami tygodnia
Re: Pełna obsługa zegara PCF8583 w bascomie!
A jak obsłużyć tego pcf'a jeśli prócz niego na szynie mamy pamięć eeprom i inny procesor lub czujnik pojemnościowy z serii AT42QT1070 ?
Trzeba uważać tylko na adresowanie układów czy wchodzi w grę coś więcej ?
Moja strona w powijakach
Odp. Pełna obsłucga zegara PCF8583 w bascomie
Kiedy weszła I2C Philipsa idea była jasna. Kilka układów na jednej szynie z możliwością sprzętowej konfiguracji adresu. Teraz nie jest tak różowo. W zalezności od producenta niektóre układy mają tylko jeden adres i nie da się go konfigurowac. Trzeba czytać note aplikacyjną producenta Twojej kostki. Nie raz jako elektronik samochodowy widziałem że układy pamięci nie pracują zamiennie. Wylut 24C04 i wlutowanie w to miejsce innej czasem kończy się fiaskiem bo na płycie adres jest skonfigurowany "nie domyślnie" np. A0 = 1 i A2 = 1 a nowa kośc nie obsługuje zmian. Stąd może wielu ma problemy i nie wie dlaczego nie działa To samo jest z popularnymi w samochodówce 93C46...niektóre układy nie obsługują pinu ORG (8 Bit lub 16 Bit)
Reasumując tania pamięć w układzie może bruździć na I2C i pewnie dlatego kolega kilka postów wyżej musiał ja wylutować.
Miłego dnia :D
BARTek
Moja strona
bascom?
A ja wam panowie powiem tak dajcie sobie spokój z BASCOM em tez dawniej bawiłem się w tym prymitywnym języku. Jezyk C wydawał mi się za trudny ale odkąd przerzuciłem się na C to już na pewno NIGDY nie wrócę do BASCOM . Polecam Eclipse bardzo fajny i darmowy program ewentualnie żeby było łatwiej oswoić się z C na początek można spróbować Arduino.
PS. W BASCOMIE robisz co wiesz... a w C wiesz co robisz ... ;)
Odp. bascom?
To, że o drugiej w nocy marnujesz czas na takie wypowiedzi nasuwa mi pewne podejrzenia co do Twojej osoby.
Nie Ty jeden "znasz" C, gościu, ale nie każdy tak się z tym obnosi...
Ps. Włącz kiedyś Atmel Studio6 na 5 minut i napisz kilka linijek kodu.
Chodzi mi o samą wygodę bo pomijam podejrzenie, że pewnie nie wiesz jak skonfigurować go by działał z Twoim USBasp.
Wrzuć na luz i koduj sobie a innym daj robić to co lubią.
BARTek
Moja strona
Pełna obsługa PCF8583
Odświeżę temat
obsługa tej kostki działa wyśmienicie sposobem podanym przez kolegę Villen (i tu moje osobiste podziękowania dla kolegi Villen za te opisy) należy pamiętać tylko o właściwym ustawieniu adresów (w przykładach podanych przez kolegę villen A0 mósi być podpięte do plusa). Jeżeli ktoś podpina A0 do minusa adresy odpowiednio 160 i 16
Błąd podczas kompilacji
Podczas kompilacji wywala mi takie błędy:
O co w tym chodzi?
Odp. Błąd podczas kompilacji
Jeśli jeszcze nie masz to włącz numerowanie linii kodu. To, mi przynajmniej, pomaga szybciej orientować się w kodzie.
Włącza się to w ustawieniach Bascom->Options->Environment->Line numbers
Twój błąd oznacza najczęściej że nie zdefiniowano takiej zmiennej poprzez
Dim
Zmiennej może tez brakować z powodu literówki. Na przykład zadeklarowano
Dim Rol As Byte
a w kodzie próbujesz użyć RokPo prostu się przyjrzyj. Albo czegoś brakuje albo jest zadeklarowane jako typ który nie przyjmuje takich wartosci.
Na przykład ktoś próbuje zapisać String tekstowy do zmiennej typu Bajt..
BARTek
Moja strona
Wygląda to
Wygląda to tak:
Ok. To poprawiłem.
Teraz mam takie błędy:
Pełna obsługa PCF8583
Poprawię samego siebie
Jeżeli ktoś podpina A0 do minusa adresy odpowiednio 160 i 161
Odp. Wygląda to tak..
Znajdź w kodzie ten kawałek i dopisz, jak ja, zmienną "Zapisz_czas" (z podkreślnikiem)
...i będzie malina :D
Miłego dnia
BARTek
Moja strona
Dzięki. Skompilował
Dzięki. Skompilował się.
Tylko mam jeszcze problem. Po wgraniu pokazuje godzinę w miejscu daty, a daty nie. Tylko godzinę mogę ustawić
Teraz kod tak wygląda:
RTC uwagi
Jak słusznie poinformował mnie jeden z użytkowników w treści:
Jest nieprawdziwe stwierdzenie - dlaczego kod ma działać tylko jak RTC jest jedynym układem na magistrali?
Proszę o korektę lub komentarz
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.