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

AtMega8 [Bascom] + PCF8563 + Alarm

maximus22_kr 15 Paź 2011 12:20 2885 1
  • #1 10029488
    maximus22_kr
    Poziom 18  
    Witam
    Jako, że mało jest informacji o obsłudze alarmu w układzie zegarowym PCF ( a PCF8563 to już wcale ), to sam spróbowałem coś podziałać.

    
    '***********************  Obsługa alarmu
    
    Sub Getalarm()
      I2cstart
      I2cwbyte 162
      I2cwbyte &H09
      I2cstart
      I2cwbyte 163
       I2crbyte Al_mm , Ack                                     'Odczytuje minuty
       I2crbyte Al_hh , Ack                                     'Odczytuje godziny
       I2crbyte Al_dday , Ack                                   'Odczytuje dni
       I2crbyte Al_wwk , Nack                                   'Odczytuje dzień tygodnia
       I2cstop
    
    
       Al_mm = Al_mm And &B01111111                             'minuty
       Al_hh = Al_hh And &B00111111                             'godziny
       Al_dday = Al_dday And &B00111111                         'dni miesiąca
       Al_wwk = Al_wwk And &B00000111                           'dni tygodnia
    
       Al_m = Makedec(al_mm)                                    'Zamiana kodu BCD na wartość dziesiętną
       Al_h = Makedec(al_hh)                                    'Zamiana kodu BCD na wartość dziesiętną
       Al_wk = Makedec(al_wwk)                                  'Zamiana kodu BCD na wartość dziesiętną
       Al_day = Makedec(al_dday)                                'Zamiana kodu BCD na wartość dziesiętną
    
    '********************* Funkcja zamieniająca numer dnia tygodna na nazwę dnia
      Dt1 = Makedec(al_wwk)                                     'numer dnia tygodnia dla lookupstr
      Dt = Lookupstr(dt1 , Dzien_tyg )
    
      Alarm_czas = Bcd(al_hh) + ":" + Bcd(al_mm)                'Tworzenie stringa z czasem
      Alarm_data = Bcd(al_dday) + "/" + Dt                      'Tworzenie stringa z datą
    
    
    End Sub
    
    '********************* Funkcja ustawiająca Alarm w PCF8563
    Sub Setalarm
    
        Al_mm = Makebcd(23)                                     'minuty
        Al_hh = Makebcd(01)                                     'godziny
        Al_dday = Makebcd(14)                                   'dni
        Al_wwk = Makebcd(5)                                     'dni tygodnia
    
      I2cstart                                                  'warunek startu
        I2cwbyte &HA2                                           'Adres zapisu
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'ustaw bit maskowania dni i roku
        I2cstart                                                'powtórz warunek startu
        I2cwbyte &HA2                                           'Adres zapisu
        I2cwbyte 9                                              'wybór rejestru
         I2cwbyte Al_mm                                         'zapis minut
         I2cwbyte Al_hh                                         'zapis godzin
         I2cwbyte Al_dday                                       'zapis dni
         I2cwbyte Al_wwk                                        'zapis dni tygodnia
      I2cstop
      End Sub
    
    


    Ustawienie parametrów alarmu przez podprogram Setalarm działa, można je później wyświetlić na LCD przy pomocy Getalarm i jest poprawnie wyświetlane

    Niestety nie mogę sobie poradzić z aktywacją alarmu i z odczytem flagi alarmu.


    Próbowałem coś takiego - reaguje na zrównanie czasu alarmu, ale wyświetla dziwne wartości.
    
    '*********************** włączanie alarmu
    Sub Active_alarm
    
      Waitms 10
     Al_active = 1
     I2cstart                                                   'warunek startu
        I2cwbyte &HA2                                           'Adres zapisu
        I2cwbyte 0                                              'select control register
        I2cwbyte &B00001000                                     'ustaw bit maskowania
        I2cstart                                                'powtórz warunek startu
        I2cwbyte &HA2                                           'Adres zapisu
        I2cwbyte 1                                              'wybór rejestru
         I2cwbyte Al_active                                     'zapis minut
        I2cstop
    
     End Sub
    
    '***********************  Obsługa odczytu flagi alarmu
    Sub Flaga_alarm
      I2cstart
      I2cwbyte 162
      I2cwbyte &H01
      I2cstart
      I2cwbyte 163
       I2crbyte Al_flaga , Nack                                 'Odczytuje flagi alarmu
       I2cstop
    
       Al_flaga = Al_flaga And &B00001000
    
    End Sub
    
  • #2 10406734
    noel200
    Poziom 26  
    Witam, poszukując informacji na temat ustawiania alarmu w pcf8563 trafiłem dziś na twój temat. Jako, że też chciałem ustawić alarm, czytałem już wczoraj wieczorem datasheet, ale jakoś do mnie nie przemawiał. Dziś jednak przesiadłem do tego dokładniej i zmodyfikowałem twój program. Działa:
        Al_h = Makebcd(20)
        Al_mn = Makebcd(4)
        Al_d = Makebcd(16)
        Al_wd = 1
    
      I2cstart
        I2cwbyte 162
        I2cwbyte 0
        I2cwbyte 0
      I2cstop
      I2cstart
        I2cwbyte 162
        I2cwbyte 9
        I2cwbyte Al_mn
        I2cwbyte Al_h
        I2cwbyte Al_d
        I2cwbyte Al_wd
      I2cstop
    
      I2cstart
        I2cwbyte 162
        I2cwbyte 1
        I2cwbyte 2
      I2cstop


    Na górze oczywiście wpisujesz wartości. Dzień tygodnia podajesz dla rtc bez konwersji na binarny.
    Rejestr zero ustawiam na 0. Ty wpisałeś 8 i opisałeś jako maskowanie. Możesz to rozwinąć? Co to za maskowanie i o co tym chodzi? Zgodnie z datasheet 8 to testC.
    A dalej dobrze. Oczywiście pamiętaj, że flagę alarmu kasujesz programowo z atmegi.
    Jeszcze jedno właśnie odkryłem. wd w którym podajesz dzień tygodnia to tylko jeden konkretny dzień tygodnia w którym alarm się włączy. Nie liczba kolejnych dni czy coś takiego. (0 to niedziela itd)
    Pozdrawiam
REKLAMA