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

[Atmega8][Bascom] PCF8583 obsługa daty i alarmów.

Duch__ 09 Lip 2008 00:10 8058 4
  • #1 5325650
    Duch__
    Poziom 31  
    Witam. Znalazłem ten kod na elektrodzie i zmodyfikowałem go trochę do własnych potrzeb. Zegarek mierzy poprawnie czas z PCF 8583, ale jest problem z odczytem daty tj dzień, miesiąc, rok, dzień tygodnia. Nie wiem jak prawidłowo ustawić bity w programie. Drugą sprawą jest sposób nastawiania zegarka, otóż chciałbym w przyszłości dopisać program do budzika, a nie chce mieć 100 przycisków. Proszę o poradę.

    Poniżej kod:

    
    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input
    
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config 1wire = Portb.7                                      'Złącze do obsługi DS18b20
    Config Sda = Portc.1
    Config Scl = Portc.0
    Config I2cdelay = 10
    I2cinit
    
    
    Set Portd.0
    Set Portd.1
    Set Portd.6
    Set Portd.7
    S1 Alias Portd.0
    S2 Alias Portd.1
    S3 Alias Portd.6
    S4 Alias Portd.7
    
    Declare Sub Ustawh
    Declare Sub Ustawm
    Declare Sub Ustawd
    Declare Sub Ustawmon
    Config Debounce = 20
    
    
    
    Deflcdchar 0 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        'Znak stopnia Celsjusza
    Dim I1 As Integer , T1 As String * 6
    Dim I2 As Integer , T2 As String * 6
    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
    Dim Y 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                                                 ' czekaj na konwersję temperatury
    
       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       T1 = Format(t1 , " 0.0")
    
       I2 = I2 * 10
       I2 = I2 / 16
       T2 = Str(i2)
       T2 = Format(t2 , " 0.0")
    
       'i2c
    
       I2cstart
       I2cwbyte 160
       I2cwbyte 0
       I2cwbyte 8                                               ' włącza maskowanie roku i dnia tygodnia
       I2cstop
       I2cstart
       I2cwbyte 160
       I2cwbyte 2
       I2cstart
       I2cwbyte 161
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Ack
       I2crbyte D , Ack
       I2crbyte Mon , Ack
       I2crbyte Y , Ack
       I2cstop
    
    
    H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : D = Makedec(d) : Mon = Makedec(mon) : Y = Makedec(y)
    
     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 ; T1 ; Chr(0) ; "C"
    Locate 2 , 1
    Lcd Bcd(d) ; "/" ; Bcd(mon) ; "/" ; Bcd(y)
    Locate 2 , 11
    Lcd ; T2 ; Chr(0) ; "C"
    
    
    Home
    
    Waitms 180
    
    Debounce Pind.0 , 0 , Ustawh , Sub
    
    Debounce Pind.1 , 0 , Ustawm , Sub
    
    Debounce Pind.6 , 0 , Ustawd , Sub
    
    Debounce Pind.7 , 0 , Ustawmon , Sub
    
    Loop
    End                                                         'Koniec programu
    
    Ustawh:                                                     ' Ustaw godzinę
    S = 0
    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:                                                     ' Ustaw minuty
    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
    
    Ustawd:
    D = D + 1
    
    D = Makebcd(m)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 3
    I2cwbyte D
    I2cwbyte Mon
    I2cstop
    
    Return
    
    Ustawmon:
    Mon = Mon + 1
    Return
    
    


    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
  • Pomocny post
    #2 5325699
    dawid512
    Poziom 32  
    Niedawno robiłem taki zegarek i proponowano mi napisanie progra,owego roku niz korzystanie z tego z pcf-a.

    Najpierw musisz ustawić 3 bit w rejestrze kontrolnym np tak:
    Dim B1 As Byte
    Set B1.3
    
    I2cstart
    I2cwbyte 162
    I2cwbyte 0
    I2cwbyte B1
    I2cstop


    Potem żeby ustawić podstawowe wartości musisz je zamienić na kod bcd a następnie wysłać tak:
    I2cstart
    I2cwbyte 162
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cwbyte Day
    I2cwbyte Month
    I2cstop


    Żeby odczytać tak:
    I2cstart                                                    'inicjacja magistrali I2C
    I2cwbyte 162                                                'podaje adres dla zapisu PCF8583
    I2cwbyte 2                                                  'wybieram drugi rejestr(sekundy)
    I2cstart                                                    'powtarzam inicjalizacje
    I2cwbyte 163                                                'podaje adres do odczytu danych
    I2crbyte S , Ack                                            'odczytuje sekundy i potwierdzam transmisje
    I2crbyte M , Ack                                            'odczytuje minuty i potwierdzam
    I2crbyte H , Ack                                            'odczytuje godzine i potwierdzam
    I2crbyte Day , Ack                                          'odczytuje dzien i potwierdzam
    I2crbyte Month , Nack


    Co do alarmów to zobacz do noty katalogowej pcfa-a. Napewno tzreba ustawić jakieś bity kontrolne.

    Osobiście wolałbym zrobić programowy alarm.

    Pozdrawiam Dawid.
  • #3 5336342
    Duch__
    Poziom 31  
    Problem dalej nie został rozwiązany... otóż mam ustawione tak:

    Żeby odczytać godzinę, minuty, sekundy, dzień miesiąca, miesiąc, rok:



    
       Sub Pokaz_czas
       I2cstart
       I2cwbyte 160
       I2cwbyte 0                                             
       I2cstop
       I2cstart
       I2cwbyte 160
       I2cwbyte 2
       I2cstart
       I2cwbyte 161
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Ack
       I2crbyte Day , Ack
       I2crbyte Month , Ack
       I2crbyte Year . Nack
       I2cstop



    Teraz przejdźmy do zapisu danych do pamięci.

    Po ustawieniu godziny i minuty wysyłam takie polecenie aby zapisać to w PCF-ie (wszystko wygląda dobrze - godzina i minuty się zapisuje):

    Sub Wyslij_czas                                             
    S = Makebcd(s)
    M = Makebcd(m)
    H = Makebcd(h)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    
    I2cstop
    
    End Sub


    Po ustawieniu dnia miesiąca i miesiąca wysyłam takie polecenie aby zapisać to w PCF-ie (nie zapisuje bo bity są źle ustawione i nie wiem jakie ustawić):

    Sub Wyslij_date                                             
    Day = Makebcd(day)
    Month = Makebcd(month)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cstop
    
    End Sub 


    Po ustawieniu roku wysyłam takie polecenie aby zapisać to w PCF-ie (nie zapisuje bo bity są źle ustawione i nie wiem jakie ustawić):

    Sub Wyslij_rok                                             
    
    Year = Makebcd(year)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    
    I2cwbyte Year
    
    I2cstop
    
    End Sub


    Podpowiedzcie mi, bo mam już prawie cały program napisany i męcze się z tym.
  • #4 5336396
    Balu
    Poziom 38  
    Duch__ napisał:


    Sub Wyslij_date                                             
    Day = Makebcd(day)
    Month = Makebcd(month)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cstop
    
    End Sub 


    Podpowiedzcie mi, bo mam już prawie cały program napisany i męcze się z tym.

    Właśnie nadpisałeś sekundy i minuty dniem i miesiącem:)
    Duch__ napisał:


    Sub Wyslij_rok                                             
    
    Year = Makebcd(year)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    
    I2cwbyte Year
    
    I2cstop
    
    End Sub


    Kurde teraz nadpisałeś miesiąc i dzień który tak na prawdę i tak był sekundami i minutami ;P

    ;}

    Daruj Sobie rok w tym scalaku :P
    On tylko liczy lata do 3;)
    (żebyś wiedział który rok po przestępnym :D)

    Pozdro:)
  • #5 5336413
    dawid512
    Poziom 32  
    Cytuję sam siebie:
    Cytat:
    Najpierw musisz ustawić 3 bit w rejestrze kontrolnym np tak:
    Kod:
    
    Dim B1 As Byte
    Set B1.3
    
    I2cstart
    I2cwbyte 162
    I2cwbyte 0
    I2cwbyte B1
    I2cstop
    


    Potem żeby ustawić podstawowe wartości musisz je zamienić na kod bcd a następnie wysłać tak:
    Kod:
    
    I2cstart
    I2cwbyte 162
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cwbyte Day
    I2cwbyte Month
    I2cstop
REKLAMA