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] Proszę o sprawdzenie kodu zegara na PCF8583

fliper_katrill 20 Lip 2009 09:57 2343 4
REKLAMA
  • #1 6800138
    fliper_katrill
    Poziom 20  
    Posty: 590
    Pomógł: 15
    Ocena: 28
    Witam!
    Proszę o pomoc w rozwiązaniu problemu. Jedyne dane jakie dostaję od PCF-a to 165 dla wszystkich danych (godzina, miesiąc,.....)
    
    '$sim                                                        'praca w emulacji sprzętowej
    $crystal = 4000000
    $regfile = "m32def.dat"
    Config Sda = Portc.1                                        'konfiguracja linii SDA magistrali I2C
    Config Scl = Portc.0                                        'konfiguracja linii SCL magistrali I2C
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7
    
    Dim M As Byte                                               'deklaracja zmiennej określającej minuty
    Dim S As Byte                                               'deklaracja zmiennej określającej sekundy
    Dim H As Byte                                               'deklaracja zmiennej określającej godziny
    Dim Day As Byte                                             'deklaracja zmiennej określającej dzień miesiąca
    Dim Month As Byte                                           'deklaracja zmiennej określającej miesiąc roku
    
    Month = 7
    Day = 20
    H = 9
    M = 15
    
    I2cinit
    'Input "Podaj miesiąc: " , Month
    'Input "Podaj dzień miesiąca: " , Day
    'Input "Podaj godzinę: " , H
    'Input "Podaj minutę: " , M
    Month = Makebcd(month)                                      'konwersja miesiąca do formatu BCD
    Day = Makebcd(day)                                          'konwersja dnia do formatu BCD
    H = Makebcd(h)                                              'konwersja godziny do formatu BCD
    M = Makebcd(m)                                              'konwersja minut do formatu BCD
    S = 0                                                       'wyzerowanie sekund
    I2cstart                                                    'inicjalizacja magistrali I2C
    I2cwbyte 162                                                'podanie adresu PCF8583 do zapisu
    I2cwbyte 0                                                  'wybranie pierwszego (kontrolnego) rejestru
    I2cwbyte 8                                                  'ustawienie zapisu rejestru daty
    I2cstop                                                     'koniec transmisji
    I2cstart                                                    'inicjalizacja magistrali I2C
    I2cwbyte 162                                                'ustawianie trybu zapisu
    I2cwbyte 2                                                  'wybranie drugiego rejestru (sekund)
    I2cwbyte S                                                  'zapis sekund
    I2cwbyte M                                                  'zapis minut
    I2cwbyte H                                                  'zapis godzin
    I2cwbyte Day                                                'zapis dnia
    I2cwbyte Month                                              'zapis miesiąca
    I2cstop                                                     'koniec transmisji
    
    Cls
    Do
    I2cstart                                                    'inicjalizacja magistrali I2C
    I2cwbyte 162                                                'podanie adresu PCF8583 dla zapisu
    I2cwbyte 2                                                  'wybranie drugiego rejestru (sekund)
    I2cstart                                                    'powtórna inicjalizacja magistrali I2C
    I2cwbyte 163                                                'podanie adresu PCF8583 dla odczytu danych
    I2crbyte S , Ack                                            'odczyt sekund z potwierdzeniem transmisji
    I2crbyte M , Ack                                            'odczyt minut z potwierdzeniem transmisji
    I2crbyte H , Ack                                            'odczyt godzin bez potwierdzania transmisji
    I2crbyte Day , Ack                                          'odczyt dni
    I2crbyte Month , Nack                                       'odczyt miesięcy
    I2cstop                                                     'koniec transmisji I2C'wyślij na ekran terminala:
    
    H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : Day = Makedec(day) : Month = Makedec(month)
    Lcd "Godzina:" ; H ; "          "
    Lowerline
    Lcd "Minuta:" ; M ; "           "
    Thirdline
    Lcd "Sekunda:" ; S ; "          "
    Fourthline
    Lcd "Dzien:" ; Day ; " Miesiac:" ; Month ; "   "
    
    Loop
    

    Szczerze dziękuję za pomoc :)
  • REKLAMA
  • Pomocny post
    #2 6800272
    karlos79
    Poziom 33  
    Posty: 1768
    Pomógł: 254
    Ocena: 77
    Witam
    Zerknij na mój kod.
    Procedury napisane są pod AT89S52.

    
    ' ten podprogram czyta czas z RTC i wyswietla go na LCD
    Sub Read_time()
     I2cstart
     I2cwbyte 160
     I2cwbyte 2
     I2cstart
     I2cwbyte 161
     I2crbyte S , Ack
     I2crbyte M , Ack
     I2crbyte G , Nack
     I2cstop
      Waitms 1
     S = Makedec(s)
     M = Makedec(m)
     G = Makedec(g)
       If S = 0 Then
        Set Clear
       End If
       Home
      Lcd "Czas: "
      If G < 10 Then
        Lcd " " ; G
      Else
        Lcd G
      End If
      If M < 10 Then
        Lcd ":" ; Bcd(m)
      Else
        Lcd ":" ; M
      End If
      If S < 10 Then
        Lcd ":" ; Bcd(s)
      Else
        Lcd ":" ; S
      End If
      Waitms 100
      'Cls
    End Sub
    '/////////////////////////////////////////////////////////////////////////////
    Sub Read_date()
    
     I2cstart
     I2cwbyte 160
     I2cwbyte 5
     I2cstop
     I2cstart
     I2cwbyte 161
     I2crbyte Dni , Ack
     I2crbyte Miesiace , Nack
     I2cstop
    
     Rokint = Dni And &B11000000
     Weekday = Miesiace And &B11100000
     Dni = Dni And &B00111111
     Miesiace = Miesiace And &B00011111
     Shift Rokint , Right , 6
    
     Dni = Makedec(dni)
     Miesiace = Makedec(miesiace)
    
     I2cstart
     I2cwbyte 160
     I2cwbyte 16
     I2cstop
     I2cstart
     I2cwbyte 161                                                 'od &h0F
     I2crbyte Temp , Nack
     I2cstop
    
     Tempint = Temp * 4
     Rokint = Rokint + Tempint
    
     Strrok = ""
     If Rokint < 10 Then
       Strrok = "0"
     End If
     If Rokint < 100 Then
       Strrok = Strrok + "0"
     End If
     Strrok = Strrok + Str(rokint)
    
     Lowerline
     Lcd "data:" ; Dni ; ":" ; Miesiace ; ":2" ; Strrok ; "r"
    End Sub
    
    



    I zapis danych
    
    
    Sub Write_time
      S = Makebcd(s)
      M = Makebcd(m)
      G = Makebcd(g)
      I2cstart
      I2cwbyte 160
      I2cwbyte 2
      I2cwbyte S
      I2cwbyte M
      I2cwbyte G
      I2cstop
      Waitms 50
     Goto Main
    End Sub
    '////////////////////////////////////////////////////////////////////////////
    Sub Write_date
    
      Dni = Makebcd(dni)
      Miesiace = Makebcd(miesiace)
      Tempint = Rokint / 4
    
      I2cstart                                                    'start i2c
      I2cwbyte 160                                                'adres rtc
      I2cwbyte 16                                                 'do komorki ram 0F
      I2cwbyte Low(tempint)                                       'zapis bazy roku
      I2cstop                                                     'koniec transmisji
    
      Rokint = Rokint Mod 4
    
      Shift Rokint , Left , 6
    
      I2cstart                                                    'start i2c
      I2cwbyte 160                                                'adres rtc
      I2cwbyte 5                                                  'od rejestru dni
      Temp = Dni Or Low(rokint)
      I2cwbyte Temp                                               'zapis dni i roku na raz
      Temp = Miesiace Or Weekday
      I2cwbyte Temp                                               'zapis miesiaca i dnia tygodnia na raz
      I2cstop                                                     'koniec transmisji
     Goto Main
    End Sub
    


    Pozdrawiam
  • REKLAMA
  • #3 6800562
    fliper_katrill
    Poziom 20  
    Posty: 590
    Pomógł: 15
    Ocena: 28
    już widzę błąd i sprawdziłem działanie mój adres to 160 nie 162 i teraz działa. Mam do Ciebie pytanie.... Czy bawiłeś się może formatami wyświetlania daty??
  • REKLAMA
  • #4 6801116
    karlos79
    Poziom 33  
    Posty: 1768
    Pomógł: 254
    Ocena: 77
    Witam
    Zauważyłem Twój błąd, ale nie chciałem Ci podawac odpowiedzi na "tacy".
    Cieszę się, że sam do tego doszedłeś :)
    Nie bawiłem się formatami wyświetlania daty, mam tylko dni; miesiące; lata.
    Pozdrawiam
  • #5 6804840
    fliper_katrill
    Poziom 20  
    Posty: 590
    Pomógł: 15
    Ocena: 28
    
                I2cstart                                        'inicjalizacja magistrali I2C
                I2cwbyte 160                                    'podanie adresu PCF8583 do zapisu
                I2cwbyte 0                                      'wybranie pierwszego (kontrolnego) rejestru
                I2cwbyte 8                                      'ustawienie zapisu rejestru daty
                I2cstop                                         'koniec transmisji
                I2cstart                                        'inicjalizacja magistrali I2C
                I2cwbyte 160                                    'ustawianie trybu zapisu
                I2cwbyte 2                                      'wybranie drugiego rejestru (sekund)
                I2cwbyte S                                      'zapis sekund
                I2cwbyte Ustaw_czasu_min                        'zapis minut
                I2cwbyte Ustaw_czasu_godz                       'zapis godzin
                I2cwbyte Data_dzien                             'zapis dnia
                I2cwbyte Data_miesiac                           'zapis miesiąca
                I2cwbyte Data_rok                               'zapis roku
                I2cstop
    


    zastanawia mnie jedno i bardzo interesuje, dlaczego 2 razy inicjuje się i2c i dlaczego za 1 razem jest to rejestr 8 ? przykład jest książkowy zmienione są tylko zmienne. Czy nie można zainicjować raz i podać bezpośrednio rejestr od którego ma wpisywać? dla przykładu chce wpisać najpierw godzinę to robię to tak:
    
                I2cstart                                        'inicjalizacja magistrali I2C
                I2cwbyte 160                                    'ustawianie trybu zapisu
                I2cwbyte 2                                      'wybranie drugiego rejestru (sekund)
                I2cwbyte S                                      'zapis sekund
                I2cwbyte Ustaw_czasu_min                        'zapis minut
                I2cwbyte Ustaw_czasu_godz                       'zapis godzin
                I2cstop                                         'koniec transmisji
    


    i potem data:
    
                I2cstart                                        'inicjalizacja magistrali I2C 
                I2cwbyte 160                                    'ustawianie trybu zapisu 
                I2cwbyte 8                                      'wybranie drugiego rejestru (sekund) 
                I2cwbyte Data_dzien                             'zapis dnia 
                I2cwbyte Data_miesiac                           'zapis miesiąca 
                I2cwbyte Data_rok                               'zapis roku 
                I2cstop 
    


    czy ktoś mi pomoże? :)
REKLAMA