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

Zegar RTC - altermatywa dla PCF8583

maximus22_kr 01 Mar 2011 14:00 3473 11
  • #1 9220375
    maximus22_kr
    Poziom 18  
    Witam
    Jaki inny układ zegarka RTC moglibyście polecić?

    Mam problem z odczytem/zapisem roku i dnia tygodnia ( mimo wielokrotnego przeczytania wątku Kolegi Villen ) i zastanawiam się, czy jest jeszcze układ RTC, który jest łatwiejszy w ujarzmieniu jeśli chodzi o obsługę roku i dnia tygodnia - wiem, że jest jeszcze DS1307 ( podobno jest bardzo wrażliwy na wartość napięcia podtrzymania ). Jeszcze jakby miał obsługę alarmu(ów) to już nic do szczęścia nie potrzeba.

    Odczyt roku byłby konieczny do ustalenia długości danego miesiąca, tak aby dobrze obsłużyć wyświetlanie miesiąca luty, bo jeśli dobrze wyczytałem z dokumentacji to pozostałe miesiące mają już przypisaną ilość dni.
  • #2 9220486
    piotrva
    VIP Zasłużony dla elektroda
    jakbyś dobrze przeszukał forum to kiedyś był podobny temat: który z zegarów wybrać.
    I była między innymi mowa o pcf8563 (pinowy odpowiednik 8583), który ma już pełny rejestr lat (to znaczy w formie rr z zakresu 00-99)
    polecam lekturę:
    http://www.pira.cz/pdf/PCF8563.pdf
  • #3 9220925
    tmf
    VIP Zasłużony dla elektroda
    A w tym kolejnym nie będzie ci działało coś innego i znowu przerzucisz się na inny scalak?:) Nie prościej doprowadzić swój kod do porządku? W sieci jest też pełno gotowców.
  • #6 9223870
    mirekk36
    Poziom 42  
    kozak_sc napisał:
    Jeśli chodzi o obsługę to czy to będzie DS czy PCF to w sumie na jedno wychodzi. Ja polecam DS-a, jeszcze się nie zawiodłem na nim a PCF czasem robił różne "jajca".


    Chciałbym zobaczyć kod programu i/lub schemat/PCB urządzonka w którym działał taki RTC, że wychodziły różne "jajca" ;) bo mogłoby się szybko okazać, że jednak wychodziły one z programu lub całego projektu.

    Do autora --> jak powiedział Konfucjusz, cytuję:

    "Lepiej nie zaczynać, niż zacząwszy nie dokończyć."

    Bo inaczej poznawanie każdego następnego układu można tak samo zakończyć.
  • #8 9223990
    maximus22_kr
    Poziom 18  
    Kolego mirekk36, nie ma to jak zachęta ( zwłaszcza jak ktoś w wieku 38 lat zaczyna się tego uczyć ) .

    Wiem, że jesteś propagatorem C ( kupiłem nawet książkę, którą polecasz, ale jeszcze nie przyszła na nią pora ) i pewnie w C można to zrobić łatwiej, szybciej i krótszym kodem.

    Poświęciłem kilka wieczorów na tego PCF8583 i zarówno kopiując kod np. Kolegi Villen jak i modyfikując swój nie miałem rezultatów. Wolę na razie odpuścić ten układ, tym bardziej, że jest zgodność wyprowadzeń i zawsze można powalczyć ( podejrzewam, że problem tkwi w maskowaniu, a w PCF8563 jest to bardziej przejrzyste, choć też piszą, że trzeba maskować, no i Weekdays, podobnie jak Weekday alarm nie są kodowane na BCD ) a zegar to nie jest najważniejsza funkcja. No i jeszcze dylemat jeśli chodzi podłączenie, PCF8583 ma OSC przez kondensator do VCC, a PCF8563 do GND - ale zamówiłem już tego drugiego to potestuję

    A żeby nie tworzyć nowego wątku, skoro już w nim napisałeś, to może mógłbyś mi odpowiedzieć w kwestii technicznej ( chyba, że któryś z Kolegów się wypowie ):
    dlaczego używając
    Timer0 do odmierzania czasu
    Timer1 do Pwm
    Odbierając dane z UART w przerwaniu
    jak łącze się przez terminal z PC to blokowane jest sterowanie przez wejścia/przyciski na płytce Atmega32 - działa tylko sterowanie z PC, po rozłączeniu PC można sterować przez wejścia na płytce ( przy okazji jest reset zmian, jakie wprowadzono połączeniem z UART, ale to pewnie da się załatwić dodatkową zmienną ). Tak ma być, czy mój błąd ( pewnie mój błąd, ale chciałem się upewnić ).
  • #9 9224005
    mirekk36
    Poziom 42  
    maximus22_kr napisał:
    Kolego mirekk36, nie ma to jak zachęta ( zwłaszcza jak ktoś w wieku 38 lat zaczyna się tego uczyć ) .


    To piękny wiek do nauki ;) a gwarantuję ci , że ludzie i w starszym wieku rozpoczynają naukę. Ja też mam już ze 45 wiosen i nadal zamierzam się uczyć. Więc bez obaw - i ty dasz radę.

    maximus22_kr napisał:
    i pewnie w C można to zrobić łatwiej, szybciej i krótszym kodem.


    Ale tu już wcale nie chodzi o to, że krótszym kodem czy koniecznie w C. Jak dla mnie to warto chociażby takiego scalaka przeznaczyć dla samego siebie na tzw "pożarcie" w celu nauczenia się takich zagwozdek, a potem ew spokojnie używać dowolnego innego, bo każdy tak na prawdę jest OK.

    Oczywiście nie oznacza to, że na siłę wpieram, że trzeba się nim (tym RTC) zajmować, to oczywiście twoja decyzja, mnie raczej chodziło o zdopingowanie.

    maximus22_kr napisał:
    A żeby nie tworzyć nowego wątku, skoro już w nim napisałeś, to może mógłbyś mi odpowiedzieć w kwestii technicznej ( chyba, że któryś z Kolegów się wypowie ):
    dlaczego używając
    Timer0 do odmierzania czasu
    Timer1 do Pwm
    Odbierając dane z UART w przerwaniu
    jak łącze się przez terminal z PC to blokowane jest sterowanie przez wejścia/przyciski na płytce Atmega32 - działa tylko sterowanie z PC, po rozłączeniu PC można sterować przez wejścia na płytce ( przy okazji jest reset zmian, jakie wprowadzono połączeniem z UART, ale to pewnie da się załatwić dodatkową zmienną ). Tak ma być, czy mój błąd ( pewnie mój błąd, ale chciałem się upewnić ).


    Tutaj niestety przyznam bez bicia, że nie za bardzo w ogóle wiem o co chodzi w tym całym pytaniu - może jakoś coś cieżko dzisiaj kojarzę czy jak ? sam nie wiem. Jednak może dopisz o czym konkretniej piszesz mówiąc, że jak łączysz się przez terminal z PC to blokowane jest sterowanie przyciski w ATmega32? o co tu chodzi ? o jakiś gotowy projekt? o coś co sam stworzyłeś? czy o jakieś teoretyczne pytanie? ... na prawdę przepraszam ale nie rozumiem więc nie za bardzo wiem jak coś podpowiedzieć czy naprowadzić na coś - chociaż bym szczerze chciał.
  • #10 9224035
    maximus22_kr
    Poziom 18  
    Projekt to może nie jest, raczej element/część możliwości układu jakie staram się poznać.

    Na płytce Amtega32
    Dwa wejścia/przyciski, uruchomiony Timer1 dla obydwu wyjść PWM. Sterowanie ( na razie LED ( chcę halogeny do tego podpiąć przez tranzystor NFET ), jeden przycisk/wejście - jedno wyjście ( tylko tak ciekawie, że na przemian, dłuższe przyciśnięcie rozjaśnia, następne dłuższe ściemnia )
    Do każdego wyjścia dwa podprogramy. Przewiduje też Timer0 do odliczania czasu - coś w stylu wyłącznika schodowego.

    Komunikacja UART przez FT232, działa OK - wpisuję określone w programie warunki - dałem po dwa przykłady w kodzie

    Poniżej załączyłem część kodu
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    
    Enable Interrupts
    Enable Urxc
    On Urxc Odczyt_rs
    
    '********************* Konfiguracja Timer1
    Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
    Enable Timer1
    
    '********** Konfiguracja Timer0
    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0
    
    On Timer0 Czas
    
    '********************* Deklaracje wejść i wyjść
    W1 Alias Pina.5
    W2 Alias Pina.6
    St1 Alias Portd.5
    St2 Alias Portd.4
    
    Dim E As String * 8
    Dim F As Byte
    
    '********************* Program
    If E = "onn1" Then
    Pwm1a = 255
    
    End If
    
    If E = "off1" Then
    Pwm1a = 0
    
    End If
    
    
    Up1:
        If Pwm1a < 255 Then                                 
        Pwm1a = Pwm1a + C
     End If
       Return
    
    
    Dn1:
    
    If Pwm1a > 0 Then                                           
        Pwm1a = Pwm1a - C
        End If
       
        Return
    
    Odczyt_rs:
      E = ""
    
      Do
        F = Inkey()
        Select Case F
           Case 0
           Case 10
           Case 13 : If E <> "" Then Exit Do                    ' jeśli coś odebrane
           Case Else
            E = E + Chr(f)                                      ' utwórz ciąg
        End Select
      Loop
    
    Return
    


    I teraz w momencie uruchomienia Terminala na PC i podłączenia, wpisanie warunków podanych w kodzie ATMega działa jak najbardziej, można wyłączać/włączać, zmniejszać/zwiększać jasność. Natomiast nie działa obsługa wejść/przycisków na płytce ATMega, jest jakby zablokowana, dopiero rozłączenie się terminala z UART powoduje, że można sterować przez PINA.5 i PINA.6. Dodatkowo, rozłączenie i ponowne połączenie do UART resetuje wszystkie wprowadzone wcześniej zmiany. Załóżmy, że jest sterownik oświetlenia i mam ochotę zdalnie zmienić stan któregoś z wyjść, wtedy blokuje się działanie bezpośrednio na urządzeniu i jest drugi aspekt, nieco gorszy, jest ustawiony pewien stan wyjść, i ja łącząc się zdalnie je kasuje, czyli np. komuś gaszę światło w niekoniecznie właściwym momencie.

    Nie wiem, czy tak ma być ( nie powinno ), czy jest to błąd, brak czegoś w kodzie, może można w jakiś sposób wykryć rozpoczęcie komunikacji UART i zmiennymi "przytrzymać" istniejący stan wyjść uC
  • #11 9224233
    mirekk36
    Poziom 42  
    No teraz patrząc na kod to można od razu powiedzieć, że wszystkie twoje problemy i całe zło działania kodu, że tak powiem, wynikają z tego sposobu odbierania danych przez RS232 :(

    Pętla Do Loop w przerwaniu to samobójstwo i to jeszcze takie okrutne :( tym bardziej, że w Bascomie masz pięknie akurat zrobioną obsługę RS232 na przerwaniach i z buforami cyklicznymi. A ty to wszystko jednym ruchem ręki pomijasz i zaczynasz pisać własną obsługę przerwania w hmmm niezbyt szczęśliwy sposób.

    Spróbuj jak już chcesz pisać w Bascomie poczytać o:

    Config Serialin oraz Bytematch

    poszukaj przykładów jak tego używać a zniknie od razu 70% twoich problemów. Bo tego nie da sie tak opisać w 2 zdaniach.

    Reasumując twoje przerwanie albo brzydko zawiesza procka albo jeszcze powoduje jego reset - stąd część "efektów specjalnych" o których piszesz.
  • #12 9228067
    maximus22_kr
    Poziom 18  
    Próbowałem wcześniej
    Config Serialin, ale help Bascoma nic nie wspomina Bytematch
    dopiero na forum coś więcej jest

    Config Serialin = Buffered , Size = 7 , Bytematch = 13 ( czyli rozmiar bufora, oraz znak po którym zostaną wpisane znaki do stringu, później Input, który ładnie wytnie znak określony w Bytematch i od razu jest gotowy do badania warunków String. Nie trzeba używać Inkey.

    Co do resetów to masz rację, nie zauważyłem zawieszania programu, natomiast nawiązanie połączenia z terminalem powoduje reset ( obydwie LED migną, jak przy naciśnięciu Reset ).
REKLAMA