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

[BASCOM][PCF8563] Problem z ustawieniem godziny.

krzyss159 16 Lip 2010 20:49 3097 4
REKLAMA
  • #1 8299706
    krzyss159
    Poziom 10  
    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:


    
    
    
    $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ę...
  • REKLAMA
  • #2 8299970
    alien_audio
    Poziom 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
  • REKLAMA
  • #3 8300178
    krzyss159
    Poziom 10  
    niestety nic nie pomogło, w funkcji zapisu dodałem zmienną mmm
    
    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?
  • REKLAMA
  • #4 8300204
    alien_audio
    Poziom 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 8301093
    krzyss159
    Poziom 10  
    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]
REKLAMA