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

PCF8583 + ATMEGA8 + BASCOM -> problem z odczytem daty

JOLLY 21 Paź 2007 19:02 6830 38
Najlepsze odpowiedzi

Dlaczego w programie BASCOM z PCF8583 miesiąc wyświetla się jako losowe liczby i jak poprawnie odczytać datę z tego układu?

Miesiąc wyświetla się jako losowe liczby, bo w PCF8583 część informacji o dacie współdzieli bity z innymi polami, więc trzeba najpierw poprawnie ustawić rejestr kontrolny 0 i/lub maskować bity po odczycie [#4400841][#4401356] W praktyce pomogło wpisanie do rejestru 0 wartości 0 zamiast 8, a potem rozdzielenie danych maską bitową: np. dla dnia `Temp = D And &B00111111`, a dla roku `Temp = D And &B11000000`; analogicznie trzeba traktować miesiąc i dzień tygodnia z rejestru 06 [#4400841][#4401356] Po tej zmianie autor dostał poprawny odczyt daty, np. `03/01` zamiast `03/41` [#4400841] Osobny błąd w kodzie wyświetlania polegał na sprawdzaniu `If D < 0` i `If Mon < 0` — powinno być ` < 10`, bo tylko liczby jednocyfrowe wymagają dopisania zera [#4400373]
Wygenerowane przez model językowy.
REKLAMA
  • #1 4400289
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Witam, jestem początkującym programistą w bascom, chciałem przetestować wykorzystanie układu PCF 8583, napotkałem jednak na problem z którym nie mogę sobie poradzić w żaden sposób, mianowicie miesiące wyświetlają się jak chcą, tzn są to liczby z kosmosu wzięte, np 49, przeskakują razem z dniami itp. pewnie to mój błąd w kodzie, ale nie mam pojęcia gdzie, przeglądałem datasheeta, szukałem po forach, po innych kodach i nic do głowy mi nie przychodzi, oto kod:

    $regfile = "m8def.dat"
    
    $crystal = 8000000
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portb.1 , Rs = Portc.0
    
    Config 1wire = Portb.7
    Config Sda = Portc.4
    Config Scl = Portc.5
    Config I2cdelay = 10
    I2cinit
    
    Set Portd.0
    Set Portd.1
    S1 Alias Portd.0
    S2 Alias Portd.1
    
    Declare Sub Ustawh
    Declare Sub Ustawm
    Config Debounce = 20
    
    
    
    Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim M As Byte
    Dim S As Byte
    Dim H As Byte
    Dim D As Byte
    Dim Mon As Byte
    
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    
    
    Cursor Off Noblink
    Cls
    
    Do
      '1wire
     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
    
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2 = 1wread(2)
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
     Waitms 750
    
       I2 = I2 * 10
       I2 = I2 / 16
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
    
    'i2c
    
       I2cstart
       I2cwbyte 160
       I2cwbyte 2
       I2cstart
       I2cwbyte 161
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Ack
       I2crbyte D , Ack
       I2crbyte Mon , Nack
       I2cstop
    
    
    H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : D = Makedec(d) : Mon = Makedec(mon)
    
     If H < 10 Then
       Lcd "0" ; H ; ":"
       Else
       Lcd ; H ; ":"
     End If
     Locate 1 , 4
       If M < 10 Then
       Lcd "0" ; M ; ":"
       Else
       Lcd ; M ; ":"
     End If
     Locate 1 , 7
       If S < 10 Then
          Lcd "0" ; S ;
          Else
          Lcd ; S ;
     End If
    Locate 1 , 11
    Lcd ; Ss ; Chr(0) ; "C"
    Lowerline
    If D < 0 Then
       Lcd "0" ; D ; "/"
       Else
       Lcd ; D ; "/"
    End If
    Locate 2 , 4
       If Mon < 0 Then
       Lcd "0" ; Mon
       Else
       Lcd ; Mon
    End If
    
    
    Home
    
    Waitms 180
    
    Debounce Pind.0 , 0 , Ustawh , Sub
    
    Debounce Pind.1 , 0 , Ustawm , Sub
    
    Loop
    End                                                         'end program
    
    Ustawh:
    H = H + 1
    If H > 23 Then
       H = 0
    End If
    M = Makebcd(m)
    H = Makebcd(h)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cstop
    Return
    
    Ustawm:
    S = 0
    M = M + 1
    If M > 59 Then
       M = 0
    End If
    M = Makebcd(m)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cstop
    Return
    


    Jest tam jeszcze obsługa DS18b20 ale nie sądzę żeby to wpływało na cokolwiek. Po za tym nie działa jeszcze ten fragment:

    
    If D < 0 Then
       Lcd "0" ; D ; "/"
       Else
       Lcd ; D ; "/"
    End If
    

    zawsze zmienna d jest wyświetlana bez 0, nawet jak < 0.

    Prosiłbym o jakieś nakierowanie na właściwy trop, co może być nie tak.

    Pozdrawiam
  • REKLAMA
  • #2 4400332
    MKJ
    Poziom 11  
    Posty: 10
    Z tym "0" przed D -spróbuj dać Locate 2,1 przed Lcd i średnik przed "0" ,może to pomoże
  • #3 4400373
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    JOLLY napisał:

    
    If D < 0 Then
       Lcd "0" ; D ; "/"
       Else
       Lcd ; D ; "/"
    End If
    

    zawsze zmienna d jest wyświetlana bez 0, nawet jak < 0.

    Prosiłbym o jakieś nakierowanie na właściwy trop, co może być nie tak.


    Bo D nigdy nie jest mniejsze od 0 tylko od 10... przecież o to Ci chodziło.
    Zrób to tak (wywalając ten średnik w drugim "Lcd"):
    If D < 10 Then
       Lcd "0" ; D ; "/"
       Else
       Lcd  D ; "/"
    End If

    To samo dotyczy miesięcy, ale do tego pewnie sam już dojdziesz. Ponadto przed wyświetleniem danych należałoby zadbać o odpowiednie ich sformatowanie (umiejscowienie) na wyświetlaczu. Do tego służy komenda Locate x,y. To co zaproponuję jest pamięciożerne, ale naprowadza na dobry trop - można ucywilizować to rozwiązanie wprowadzając dodatkową zmienną wskazującą w której kolumni należy wyświetlić parametr, ale na razie spróbój tak:
    Locate 1 , 16
    If D < 10 Then  
       Lcd "0"
    Else
       Locate 1 , 17
    End If 
    Lcd D ; "/"
  • #4 4400392
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Racja, działa, no to musi być moje roztargnienie, tyle się dziwiłem czemu nie działa, a takie proste było, dzięki wielkie. Pozostał problem miesiąca jeszcze.
  • REKLAMA
  • #5 4400429
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    W trakcie Twojej odpowiedzi zmieniłem post. Przeczytaj go jeszcze raz...
    Ta sama kwestia dotyczy miesiąca plus formatowanie danych.
  • #6 4400497
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Tak tak, jak najbardziej można tak formatować i zawsze ma się to w miejscu w którym się tego oczekuje. Ja mam datę wyświetlana od pierwszej linijki 2 kolumny, więc bez tego mam dobre formatowanie, bo jeśli <10 to będzie 0 a jeśli > to będzie jakaś cyfra i wszystko pozostanie tam, gdzie było.
    Pozostał ten nieszczęsny miesiąc, z którym takie cuda mam.
  • #7 4400520
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    Jakie cuda? Co tam jeszcze nie tak?
  • #8 4400540
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    No np teraz mi wyświetla 49 miesiąc, gdy ustawie na godz. 23:59 i przejdzie mi na następny dzień, to i miesiąc się zmienia, na kolejną dziwna cyfrę typu 69, albo inna, raz było ponad 100 też.
  • #9 4400568
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    A spróbój takiego zabiegu:
    Locate 2 , 1
    Lcd Bcd(d) ; "/" ; Bcd(mon)  

    usuwając (remując) wcześniej linijki
    H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : D = Makedec(d) : Mon = Makedec(mon) 

    i
    Lowerline 
    If D < 0 Then 
       Lcd "0" ; D ; "/" 
       Else 
       Lcd ; D ; "/" 
    End If 
    Locate 2 , 4 
       If Mon < 0 Then 
       Lcd "0" ; Mon 
       Else 
       Lcd ; Mon 
    End If 

    Tak jest prościej i bardziej przejrzyście. A jak nie to po staremu:
    Locate 1 , 4 
    If mon < 10 Then  
       Lcd "0" 
    Else 
       Locate 1 , 5 
    End If 
    Lcd mon
  • #10 4400641
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Zmieniłem tak, wyzerowałem zegar, bo ma podtrzymywanie bateryjne, czyli data była 01/01, ustawiłem godz. 23:59 i po zmianie data jest 02/21, pojęcia nie mam czemu tak, ciągle jakieś dziwne cyfry w tym miesiącu.

    Następna zmiana to 03/41, czyli miesiąc zmienia się z każdą zmianą dnia o 20, tylko czemu?
  • #11 4400841
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    A ustawiłeś rejestr kontrolny PCF'a???
    Zobacz http://www.alldatasheet.com/datasheet-pdf/pdf/18220/PHILIPS/PCF8583.html
    Jest to rejestr 0 - proponuję zajrzeć do pdf'a: na stronie 6 jest opisany cały bajt z rozbiciem na znaczenie poszczególnych bitów statusu i sterowania. W uproszczeniu jeśli nie korzystasz z roku i dnia tygodnia to możesz wyzerować flagę maskowania najstarszych bitów w bajcie 05 (rok/dzień miesiąca) i 06 (dzień tygodnia/miesiąc) zarówno rok jak i dzień tygodnia zapisywane są na najstarszych bitach. Wyzerowanie tego bitu (mask flag=0) zdejmuje maskę, zaś dla 1 nakłada maskę na te najstarsze bity.
    Konkludując: zrób taki myk - przed procedurą zapisu czasu do PCF'a daj to (tak, żeby najpierw program dokonał wpisu pod adres 0, a dopiero potem odczytywał dane z PCF'a, więc po uruchomieniu należy wejść w procedurę ustawiania czasu):
    I2cstart
       I2cwbyte 160
       I2cwbyte 0
       I2cwbyte 8                              ' włącza maskowanie roku i dnia tygodnia
       I2cstop

    To powinno pomóc.
    Jak zechcesz odczytywać rok i dzień tygodnia to wytłumaczę Ci jak to odkręcić...
  • #12 4401005
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Właśnie, o to chodziło, też zastanawiałem się nad tym, że w tym bajcie, jest też odczyt dnia tygodnia i może to z tym mi kolidować, zmieniłem teraz i zamiast 03/41 mam 03/01, czyli prawidłowo wreszcie. A jeśli chciałbym wykorzystać odczyt dnia tygodnia, by wyświetlać nazwy dni to jak to zrobić, żeby nie kolidowało mi z miesiącem?
  • Pomocny post
    #13 4401356
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    No to jak się zastanawiałeś nad tym, to powinieneś zaskoczyć o co chodzi...
    Po prostu należy najpierw wyłączyć maskowanie roku i dnia tygodnia (więc zamiast 8 do rejestru 0 wpisać wartość 0), potem odczytać cały bajt, zamaskować niepotrzebne bity w danym bajcie: najpierw rok i odczytać dzień miesiąca, potem zamaskować dzień miesiąca i odczytać rok - podobnie z miesiącem i dniem tygodnia. Maskowanie bitów w bajcie wygląda tak:
    Temp = D And &B00111111
    Day=Temp
    Temp = D And &B11000000
    Year=Temp

    ponieważ rok zapisywany jest na 2 najstarszych bitach, zaś dzień na 6 młodszych.

    Mam nadzieję, że pomogłem rozwiązać problemy natury arytmetycznej - walcz dalej i zaglądaj do pdf'a, bo bez tego daleko nie zajedziesz.
    Pzdr.
  • #14 4401407
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Dzięki wielkie, będę sie tym bawił jeszcze na pewno i wszystko mam nadzieję, że pojmę bez problemu, ważne zrobić ten krok do przodu, wiedzieć jak zacząć, a potem jakoś pójdzie.
  • REKLAMA
  • #15 4401453
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    Otórz to. Maskowanie jest bardzo proste i mooocno użyteczne. Gdybyś od początku o nim wiedział to nie byłoby najmniejszego problemu z odczytem miesiąca. Zresztą dobrym nawykiem jest stosowanie maskowania zbędnych bitów w bajcie, bo czasami nie masz pojęcia co tam się może pojawić. Oszczędza to mnóstwo czasu i nerwów.
    Pzdr.
  • #16 4401746
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Jeszcze jakbyś mógł mi wytłumaczyć jedno, bo jakoś nie mogę zrozumieć, czemu
    I2cstart
    I2cwbyte 160
    I2cwbyte 0
    I2cwbyte 8 -> akurat 8?
    I2cstop

    przeglądam pdfa i nic mi nie przychodzi do głowy, rejestr 0 a potem flaga maski jest 4. Całkiem źle rozumuje na pewno, jakbyś mógł wyjaśnić tylko, byłbym wdzięczny.
  • #17 4402069
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    No dobra, zaskoczyłeś mnie tym pytaniem...
    Wracamy do szkoły:
    - te cyferki w kwadracikach (od 7 do 0) to numery bitów;
    - przy "7" jest napisane MSB czyli po naszemu 'najbardziej znaczący bit' lub najstarszy bit (jest najbardziej znaczący bo reprezentuje największą wartość w tym bajcie - ale o tym potem);
    - przy "0" jest LSB co oznacza, że ten bit jest najmłodszy czyli najmniej znaczący bo reprezentuje najmniejszą wartość.
    - cały bajt składa się z 8 bitów (te 8 kwadracików);
    - na każdym bicie może być w danej chwili stan 0 lub 1 - to jak żarówka - świeci lub nie, w związku z tym jeden bit przyjmuje tylko 2 wartości;
    - zgodnie z logiką liczb binarnych po złożeniu kilku bitów do siebie tworzą one ciąg w którym każdy kolejny bit ma wartość 2 razy większą od poprzedniego. najmniejszą wartość ma bit najmniej znaczący, a największą nasz MSB.
    - idąc tą drogą otrzymujemy: bit LSB (opisany jako '0') ma wagę (reprezentuje wartość) 1 decymalnej; bit b1 ('1') ma wagę 2, b2 - 4, b3 - 8, b4 - 16, b5 - 32, b6 - 64, b7 - 128.
    - stąd wynika, że chcąc ustawić w bajcie rejestru 0 PCF'a jeden bit (b3, czyli czwarty w kolejności od prawej LSB do lewej MSB) pod którym ukrywa się flaga mask należy go zapalić czyli ustawić w stan 1 logicznej. Teraz policz sobie w kratkach od prawej do lewej: mamy wartości 1, 2, 4, 8, 16...
    Chcąc włączyć tylko ten jeden bit (b3 opisany kwadracikiem z cyfrą 3) musimy nadać całemu bajtowi wartość 8.

    Bez podstaw daleko nie zajedziesz. Poszukaj w necie "zapis binarny", "logika binarna", itp i przyswój sobie zagadnienie bo to podstawa działania procków!
    Pzdr.
  • #18 4402393
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    A widzisz, teraz pojmuje, o bitach i ogólnie to wiem, tylko nie rozumiałem o tym włączaniu pojedynczych bitów jak nadaje sie wartości całemu bajtowi. Jeszcze raz dzięki za wytłumaczenie, muszę jeszcze sporo poczytać.

    Pozdrawiam
  • #19 4436550
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    Witam

    Mam taki problem, wczoraj postanowiłem pobawić się tym pcf8583 i niestety nie udało mi się z niego odczytać! Domyślam się że albo coś źle podłączyłem a lbo coś w programie. zastanawia mnie kilka rzeczy, czy układ z tym pcf, kwarcem i kondensatorem może bć na ddzielnej płytce połączony przewodami około 5 cm???
    Nie wiem do dońca o co chodzi z adresem bo gdzie nie patrze jest co innego, a ja mam A0 połączone z +5V więc jaki powinienem mieć adres?
    Powiem jeszcze tylko że problem polega na tym że przy odczycie mam jakieś cyferki 38:20:10 i nic się nie zmienia(mimo pętli do loop) a jak ustawię opoźnienie to 38 zmieniea sie co i raz na inną cyferkę!
    Czy ktoś miał podogny problem lub wie czego to może być przyczyna??

    Pozdrawiam i czekam na wszelkie wskazówki
    Dawid K.
  • #20 4436587
    gregoorr
    Poziom 18  
    Posty: 229
    Pomógł: 19
    Ocena: 34
    madziulek napisał:

    Nie wiem do dońca o co chodzi z adresem bo gdzie nie patrze jest co innego, a ja mam A0 połączone z +5V więc jaki powinienem mieć adres?
    Pozdrawiam i czekam na wszelkie wskazówki
    Dawid K.


    Rem Przeszukiwanie magistrali I2C w
    Rem poszukiwaniu adresów urządzeń.
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portd.0 , E = Portc.2 , Rs = Portc.1
    
    
    Dim Adres As Byte                                           'zmienna adres
    
    Config Scl = Portb.0
    Config Sda = Portb.1
    Cursor Off
    
    Cls
    For Adres = 0 To 255
    I2cstart                                                    'start magistrali
    I2cwbyte Adres                                              'wysyła 1 bajt, (zapytanie o odpowiedź)
    I2cstop                                                     'koniec transmisji
    
    If Err = 0 Then                                             'jeśli odpowiedziało to
    Cls
    Lcd "Uklad pod:" ; Adres ; "  "
    Wait 2
    End If
    
    Next Adres
    
    Cls
    Lcd "Koniec szukania"
    End
    


    Jest to prościutki program do szukania adresów. Możesz nim sprawdzić na jakim adresie odezwie się układ, i czy się odezwie. Jeśli A0 jest do plusa to powinno być 162 i 163. Reszta jest chyba opisana powyżej. Powinieneś umieścić program którego używasz do czytania układu. Jeśli coś zczytujesz to zakładam że od strony "elektrycznej" jest ok. Jeśli chodzi o przewody, to 5cm nie powinno być problemem.
  • #21 4436990
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    Oki

    Dzięki, sprawdzę może to coś z adresem!
  • REKLAMA
  • #22 4441000
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    witam
    Niestety adresu nie znajduje ale ja pracuje na 89s52 może to ma znaczenie?

    Program mam taki jak mna początku i na na lcd 38:22:94!!

    Co to znaczy-pomocy!!
  • #23 4441077
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    A przekonwetrowałeś z bcd na dec poleceniem zmienna = makedec(zmienna)?, może dlatego? zobacz kod na początku, jeśli tak to musisz mieć w kodzie pomyłkę, może zmienne nie tak coś są.
  • #24 4441118
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    ma przekopiowany kod jak na początku, tamtem jest wporządku, prawda??

    Dodano po 2 [minuty]:

    oczywiście porty mam od s52 i adres 162 i 163!

    Dodano po 1 [godziny] 17 [minuty]:

    A czemu przy pętli, która odczytuje dane z PCF8583 nic się nie zmienia, a powinno?

    POZDRAWIAM
  • #25 4442469
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Mi chodzi tamten kod, więc jest dobry, zresztą standardowy dosyć. A co dokładnie powinno być? Opisz dobrze, wklej kod jak powinno być. Bardzo dziwne, że u ciebie nie chce chodzić.
  • #26 4442651
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    udało mi się zrobić że po włączeniu są same zerowa a problem tkwił w tym że nie dodałem rezystorów podciągających CDA i SCL, ale w schematach które posiadałem nie było takich. Teraz problem tkwi w tym że zegar nie odlicza czasu, jest już taki post, ale nie ma rozwiązania tego problemu, wiesz może czemu tak się dzieje? Próbowałem już prawie wszystkiego, może podaj swój schemat podłączenia!

    Dzięki za zainteresowanie moim problemem!
  • #27 4445323
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Ja mam w taki sposób podpiętego PCFa do ATmega8 i wszystko jest w porządku. Wyjscia INT nie musisz podpinać, ale jest ono przydatne.
    Załączniki:
    • PCF8583 + ATMEGA8 + BASCOM -> problem z odczytem daty pcf.gif (8.43 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #28 4446815
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    Podłączenie jest oki tylko jedna sprawa, od czego jest ten rezystor R1?
    Myślę że mam uszkodzonego PCFa.
    Kupię jutro jeszcze jednego i kwarc, a jaki kwarc najlepszy żeby w miarę dobrze chodził?

    Pozdrawiam
    Dawid K.
  • #29 4451848
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    R1 możesz pominąć, a kwarc to tylko 32,768, ja mam wyluta z jakiejś płyty głównej i chodzi bardzo dobrze.
  • #30 4453973
    madziulek
    Poziom 16  
    Posty: 234
    Pomógł: 1
    Ocena: 13
    Więc sprawa ma się tak - kupiłem nowego PCFa, kwarc,
    sprawdzałem nawet z różnymi kondensatorami (33p i 22p) i NIC!!!!
    Po załączeniu jest ciągle 00:00:00 i data 01/01!!!
    Ja dotykam do kwarca to czasami doda parę sekund, ale też nie zawsze!!!
    Co to może być bo już nie mam pomysły!!!
    Przypomnę że cały układ mam na kabelkach o długości około 5cm, ale to chyba nie powinno przeszkadzać, cały układ tzn na płytce, tylko zasilanie i I2C jest na kabelkach

    Proszę o pomoc, co zrobić żeby zaczął odliczać czas!!!

    Pozdrawiam

    Dodano po 16 [minuty]:

    A czy te kondensatory na napięciu ma duże znaczenie, bo ja próbowałem z 100n, 100n i 100u a więcej z zasilanie nie kombinowałem!
    A kondensatory dawałem przy samej nóżce zasilającej czyli za diodą a tu jest przed, może to ma znaczenie, ale czy tak jest to nie chce mi się wierzyć, ale może!?!?

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z odczytem daty i czasu z układu PCF8583 za pomocą mikrokontrolera ATmega8 programowanego w Bascom. Głównym problemem były nieprawidłowe wartości miesięcy, które wyświetlały się jako liczby niezgodne z rzeczywistością (np. 49, 69, ponad 100). Przyczyną okazało się nieprawidłowe ustawienie rejestru kontrolnego (rejestr 0) układu PCF8583, a dokładniej maski bitów odpowiadających za rok i dzień tygodnia, które kolidowały z danymi miesiąca. Zalecane było wyzerowanie flagi maskowania w bajcie 05 i 06, co pozwoliło na poprawne odczytywanie miesiąca. Wskazano także na konieczność stosowania maskowania bitów w bajtach odczytywanych z układu, aby oddzielić poszczególne dane (np. rok, dzień tygodnia, miesiąc, dzień).

Dodatkowo poruszono kwestie prawidłowego formatowania wyświetlania daty na LCD, w tym stosowania komendy Locate oraz warunkowego dopisywania zera przed jednocyfrowymi wartościami dni i miesięcy.

W dalszej części dyskusji pojawiły się problemy z fizycznym działaniem układu PCF8583, takie jak brak odliczania czasu i stałe wyświetlanie 00:00:00 oraz 01/01. Okazało się, że brak rezystorów podciągających na liniach SDA i SCL magistrali I2C powodował błędy komunikacji. Ponadto podkreślono konieczność stosowania kwarcu o częstotliwości 32,768 kHz, typowego dla zegarów czasu rzeczywistego, gdyż użycie innych wartości (np. MHz) skutkowało nieprawidłowym działaniem układu.

Zalecano także sprawdzenie pracy generatora w PCF8583 poprzez pomiar impulsów na wyjściu INT, które może być wykorzystane do przerwań w mikrokontrolerze, choć nie jest obowiązkowe do podstawowego działania.

Wskazano na znaczenie dokładnego zapoznania się z dokumentacją techniczną (datasheet) PCF8583, zwłaszcza opisem rejestrów i bitów kontrolnych, co pozwala na prawidłową konfigurację i odczyt danych. Przykładowy fragment kodu i opis rejestrów zostały udostępnione, aby ułatwić zrozumienie nietypowego kodowania daty w tym układzie.

Podsumowując, poprawne działanie PCF8583 z ATmega8 wymaga: właściwego ustawienia rejestru kontrolnego (maskowanie bitów), stosowania rezystorów podciągających na liniach I2C, użycia odpowiedniego kwarcu 32,768 kHz oraz prawidłowego formatowania i maskowania odczytywanych danych w kodzie Bascom.
Wygenerowane przez model językowy.
REKLAMA