Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM][PCF8563] Problem z ustawieniem godziny.

krzyss159 16 Jul 2010 20:49 3007 4
  • #1
    krzyss159
    Level 9  
    Witam, mam problem z układem jak w tytule, polega on na tym że nie mogę programowo ustawić ani przestawić godziny. jak bym nie ustawił zmiennych odpowiedzialnych za czas, godzina startuje od 59s, 0m, 0h(napisałem w kolejności jak mi się wyświetla, ale to bez różnicy). Program wydaje mi się że działa dobrze, układ najwyraźniej też. A myślę tak, dlatego, że zaraz po włączeniu zegar rusza i "idzie dobrze" tzn zmieniają się sekundy, minuty i godziny, ale jak pisałem nie mogę ich w żaden sposób zmienić. Takiego problemu nie ma z dniem miesiąca, miesiącem i rokiem, te dane mogę zmieniać jak tylko chcę.
    Oto kod programu:


    Code:



    $regfile = "m8def.dat"
    $crystal = 8000000



    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
     Config Lcd = 16 * 2                                        '16*2 type LCD screen

    Cls
    Config Sda = Portd.6
    Config Scl = Portd.7

    Config Sda = Portd.6
    Config Scl = Portd.7

     Config Pind.4 = Input
       Config Pind.3 = Input


      Ss Alias Pind.4
       S Alias Pind.3

    Dim D As Byte , Mo As Byte , Y As Byte , Tss As Byte
    Dim Tm(7) As Byte , I As Byte , See As Byte , Ot As String * 10 , M As Byte , H As Byte       'At &H60 Overlay



    Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte , Byval Year1 As Byte)
    Declare Sub Gettime()




    See = 1
    M = 1
    H = 1
    D = 16
    Mo = 7
    Y = 10

    Call Settime(see , M , H , D , Mo , Y)




    Do

    Debounce Ss , 0 , On_ss , Sub



    Call Gettime

    Cls
    '
    Lcd "s:" ; Makedec(tm(1)) ; "m:" ; Makedec(tm(2)) ; "g:" ; Makedec(tm(3)) ; "dz:" ; Makedec(tm(4))
    Lowerline
    Lcd "m: " ; Makedec(tm(6)) ; "r: " ; Makedec(tm(7))

    Waitms 500


    Loop

    End


    Sub Gettime()


        i2cstart
      i2cwbyte 162
      I2cwbyte &H02
      i2cstart
      I2cwbyte 163
      I2crbyte Tm(1) , Ack
      I2crbyte Tm(2) , Ack
      I2crbyte Tm(3) , Ack
      I2crbyte Tm(4) , Ack
      I2crbyte Tm(5) , Ack
      I2crbyte Tm(6) , Nack
      I2cstop


        Tm(1) = Tm(1) And &B01111111                            'sekundy
        Tm(2) = Tm(2) And &B01111111                            'minuty
        Tm(3) = Tm(3) And &B00111111                            'godziny
        Tm(4) = Tm(4) And &B00111111                            'dni miesiąca
        Tm(5) = Tm(5) And &B00000111                            'dni tygodnia (nie używane)
        Tm(6) = Tm(6) And &B00011111                            'miesiące
        Tm(5) = Tm(5) And &B11111111                            'lata
     End Sub


    'Funkcja ustawiająca zegar PCF8563
    Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte , Year1 As Byte)

        Tm(1) = Makebcd(s1)                                     'seconds
        Tm(2) = Makebcd(m1)                                     'minutes
        Tm(3) = Makebcd(h1)                                     'hours
        Tm(4) = Makebcd(d1)                                     'days
        Tm(6) = Makebcd(month1)
        Tm(7) = Makebcd(year1)


        I2cstart                                                'generate start
        I2cwbyte &HA2                                           'write address
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstart                                                'repeated start
        I2cwbyte &HA2                                           'write mode
        I2cwbyte 2                                              'select seconds Register
        For I = 1 To 7
          I2cwbyte Tm(i)
        Next                                                    'write seconds
        I2cstop
    End Sub




    On_ss:

     Incr H



    See = 55
    M = 55
    'H = 5
    D = 16
    Mo = 7
    Y = 10

    Call Settime(see , M , H , D , Mo , Y)


    Return



    Pewnie jest gdzieś jakiś mały błąd, którego nie jestem w satanie wyłapać, proszę Was o pomoc, proszę...
  • #2
    alien_audio
    Level 21  
    Witam.
    W podprogramie do zapisu zegarka nie określiłeś zmiennej Tm(5).
    Wprawdzie nie używasz jej ale jest zapisywania zgodnie z pętlą.
    System wstawia wartość domyślną co zakłóca wartości rejestrów zegarka.

    Wstaw : Tm(5) = 1
  • #3
    krzyss159
    Level 9  
    niestety nic nie pomogło, w funkcji zapisu dodałem zmienną mmm
    Code:

    Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte , Year1 As Byte)
     Dim Mmm As Byte
     Mmm = 1
        Tm(1) = Makebcd(s1)                                     'seconds
        Tm(2) = Makebcd(m1)                                     'minutes
        Tm(3) = Makebcd(h1)                                     'hours
        Tm(4) = Makebcd(d1)
        Tm(5) = Makebcd(mmm)                                    'days
        Tm(6) = Makebcd(month1)
        Tm(7) = Makebcd(year1)


        I2cstart                                                'generate start
        I2cwbyte &HA2                                           'write address
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstart                                                'repeated start
        I2cwbyte &HA2                                           'write mode
        I2cwbyte 2                                              'select seconds Register
        For I = 1 To 7
          I2cwbyte Tm(i)
        Next                                                    'write seconds
        I2cstop
    End Sub


    i nic nie pomogło:( Może macie jakieś inne pomysły?
  • #4
    alien_audio
    Level 21  
    Witam.
    To mój działający kod zapisu i odczytu:
    Kod:
    [code]
    Sub Zapis_czasu
    S = 0
    Mn = Makebcd(mn_1)
    H = Makebcd(h_1)
    D = Makebcd(d_1)
    M = Makebcd(m_1)
    R = Makebcd(r_1)

    I2cstart
    I2cwbyte &HA0
    I2cwbyte 0
    I2cwbyte 8
    I2cstop
    I2cstart
    I2cwbyte &HA0
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte Mn
    I2cwbyte H
    I2cwbyte D
    I2cwbyte M
    I2cstop
    I2cstart
    I2cwbyte &HA0
    I2cwbyte 100
    I2cwbyte R
    I2cstop

    End Sub

    Sub Odczyt_czasu
    I2cstart
    I2cwbyte &HA0
    I2cwbyte 2
    I2cstart
    I2cwbyte &HA1
    I2crbyte S , Ack
    I2crbyte Mn , Ack
    I2crbyte H , Ack
    I2crbyte D , Ack
    I2crbyte M , Nack
    I2cstop
    I2cstart
    I2cwbyte &HA0
    I2cwbyte 100
    I2cstart
    I2cwbyte &HA1
    I2crbyte R , Nack
    I2cstop

    End Sub
    [\code]
    [size=9:bb44d81721][color=#999999:bb44d81721]Dodano po 3 [minuty]:[/color:bb44d81721][/size:bb44d81721]

    Zmień tylko adres układu na Twój
  • #5
    krzyss159
    Level 9  
    Nie wiem co jest, nadal nie działa, dodam że do całego układu dołączone są jeszcze dwie kostki pamięci 24c... ale ich adresy na pewno się nie gryzą z układem pcf.

    Poniżej jest uproszczony schemat podłączenia układu PCF8563, jednak wydaje mi się że to dobre podłączenie, bo przecież układ daje się zapisać i odczytać, a że blednie to już nie wiem z jakiego powodu.


    [BASCOM][PCF8563] Problem z ustawieniem godziny. [/img]