[BASCOM] Integracja PCF8583 z DateTime Bascom`a

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

[BASCOM] Integracja PCF8583 z DateTime Bascom`a

Post autor: niveasoft » 28 maja 2016, 14:38

Te zegarek jest stary jak Swiat, ale dalej wciąż wiele osób go wybiera do swoich projektów i często musiałem coś tworzyć od nowa by to połaczyć z programem. Samo obliczenie dnia tygodnia i różne inne rzeczy.. po co nad tym myśleć co raz, jesli w Bascom jest wbudowana biblioteka DateTime.
Potrafi obliczyć na podstawie daty jaki jest dzień tygodnia i dużo więcej. Trzeba tylko włączyć Clock = User i zapodac dane do zmiennych _sec, _min, _hour, _day, _month i _year.


Temu służa właśnie te dwa dołączone do postu pliki ;)
  1. '*********************************************************
  2. '*                                                       *
  3. '*      INTEGRATING PCF8583 WITH $TIME and $DATE         *
  4. '*                                                       *
  5. '*      18.01.2016 BARTek niveasoft(at)tlen.pl           *
  6. '*                                                       *
  7. '* DECLARATION FILE SHOULD BE INCLUDED AFTER I2C CONFIG  *
  8. '*                                                       *
  9. '*      $include "user_clock_pcf8583_declarations.inc"   *
  10. '*                                                       *
  11. '*      Dim ....                                         *
  12. '*                                                       *
  13. '*      Do                                               *
  14. '*      .......                                          *
  15. '*      Loop                                             *
  16. '*      End                                              *
  17. '*                                                       *
  18. '*      $include "user_clock_pcf8583_routines.inc"       *
  19. '*                                                       *
  20. '*********************************************************
  21.  
  22.  
  23. $nocompile
  24.  
  25.  
  26. Config Clock = User
  27. Config Date = Dmy , Separator = /
  28.  
  29. ' adresy układu PCF8583
  30. ' jeżeli noga A0 układ PCF8583 jest podłączony do GND to:
  31. ' adres do odczytu = &HA1
  32. ' adres do zapisu = &HA0
  33. ' jeżeli noga A0 układ PCF8583 jest podłączony do VCC to:
  34. ' adres do odczytu = &HA3
  35. ' adres do zapisu = = &HA2
  36.  
  37. Const Pcf8583r = &HA1                                       'PCF address for read
  38. Const Pcf8583w = &HA0                                       'PCF address for write
  39.  
  40. Dim Rtc_year_date As Byte , Rtc_weekdays_months As Byte , Temp_b As Byte
  41. Dim Pcf8583_kalendarz_baza As Byte , Pcf8583_year_old As Byte
  42.  
  43. Sub Store_year
  44.  
  45.  I2cstart
  46.   I2cwbyte Pcf8583w
  47.   I2cwbyte 16
  48.   I2cwbyte Pcf8583_kalendarz_baza
  49.  
  50. End Sub
  51.  
  52. Sub Read_year
  53.  
  54.  I2cstart
  55.   I2cwbyte Pcf8583w
  56.   I2cwbyte 16
  57.   I2crbyte Pcf8583_kalendarz_baza , Nack
  58.  I2cstop
  59.  
  60. End Sub
  61.  Call Read_year
  1. '*********************************************************
  2. '*                                                       *
  3. '*      INTEGRATING PCF8583 WITH $TIME and $DATE         *
  4. '*                                                       *
  5. '*      18.01.2016 BARTek niveasoft(at)tlen.pl           *
  6. '*                                                       *
  7. '* DECLARATION FILE SHOULD BE INCLUDED AFTER I2C CONFIG  *
  8. '*                                                       *
  9. '*      $include "user_clock_pcf8583_declarations.inc"   *
  10. '*                                                       *
  11. '*      Dim ....                                         *
  12. '*                                                       *
  13. '*      Do                                               *
  14. '*      .......                                          *
  15. '*      Loop                                             *
  16. '*      End                                              *
  17. '*                                                       *
  18. '*      $include "user_clock_pcf8583_routines.inc"       *
  19. '*                                                       *
  20. '*********************************************************
  21.  
  22.  
  23. $nocompile
  24.  
  25. Getdatetime:
  26.  
  27. 'called when date or time is read
  28.  
  29.   I2cstart
  30.   If Err = 0 Then
  31.     I2cwbyte Pcf8583w
  32.     If Err = 0 Then
  33.       I2cwbyte 2
  34.       If Err = 0 Then
  35.         I2cstart
  36.         If Err = 0 Then
  37.          I2cwbyte Pcf8583r
  38.          I2crbyte _sec , Ack                                'sec
  39.          I2crbyte _min , Ack                                'min
  40.          I2crbyte _hour , Ack                               'hour
  41.          I2crbyte Rtc_year_date , Ack                       'date
  42.          I2crbyte Rtc_weekdays_months , Nack                'date
  43.  
  44.          _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  45.  
  46.          Temp_b = Rtc_year_date                             ' rok
  47.           Shift Temp_b , Right , 6
  48.           Temp_b = Makedec(temp_b)
  49.  
  50.           _year = Pcf8583_kalendarz_baza + Temp_b           '  baza + wartość kalendarza czteroletniego
  51.  
  52.             If Pcf8583_year_old <> Temp_b Then              ' jeżeli zmienił się rok
  53.  
  54.                If Temp_b = 0 And Pcf8583_year_old = 3 Then  ' jeżeli skończył się kalendarz czteroletni
  55.                   Pcf8583_kalendarz_baza = Pcf8583_kalendarz_baza + 4       ' zmień bazę kalendarza
  56.                End If
  57.  
  58.                 Pcf8583_year_old = Temp_b                   'dopiero tu może dostać nowa wartość
  59.  
  60.                'zapisz dane o aktualnym roku w układzie PCF8583
  61.  
  62.                  Call Store_year
  63.  
  64.             End If
  65.  
  66.             Temp_b = Rtc_year_date And &B0011_1111          ' dzień
  67.             _day = Makedec(temp_b)
  68.  
  69.  
  70.             Temp_b = Rtc_weekdays_months And &B0001_1111    ' miesiąc
  71.             _month = Makedec(temp_b)
  72.  
  73.  
  74.          End If
  75.       End If
  76.     End If
  77.    I2cstop
  78.   End If
  79.  
  80.  
  81. Return
  82.  
  83. Setdate:
  84.  
  85.    Rtc_year_date = Makebcd(_day)                            'w bajcie zapisz dzień w kodzie BCD
  86.  
  87.    Temp_b = _year Mod 4
  88.    Temp_b = Makebcd(temp_b)
  89.  
  90.    Pcf8583_year_old = Temp_b                                'zapamietaj bo przyda sie kiedy rok w PCF się zmieni
  91.    Pcf8583_kalendarz_baza = _year - Temp_b
  92.  
  93.    Shift Temp_b , Left , 6
  94.    Rtc_year_date = Rtc_year_date Or Temp_b
  95.  
  96.    Rtc_weekdays_months = Makebcd(_month)                    ' dzień tygodnia i miesiąc
  97.    Temp_b = Dayofweek()
  98.    Temp_b = Makebcd(temp_b)
  99.    Shift Temp_b , Left , 5
  100.    Rtc_weekdays_months = Rtc_weekdays_months Or Temp_b
  101.  
  102.   I2cstart
  103.    I2cwbyte Pcf8583w
  104.    I2cwbyte 5
  105.    I2cwbyte Rtc_year_date
  106.    I2cwbyte Rtc_weekdays_months
  107.  
  108.    Call Store_year
  109.   I2cstop
  110.  
  111. Return
  112.  
  113. Settime:
  114.  
  115.    _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  116.  
  117.   I2cstart                                                  '
  118.    I2cwbyte Pcf8583w
  119.    I2cwbyte 2
  120.    I2cwbyte _sec
  121.    I2cwbyte _min                                            '
  122.    I2cwbyte _hour
  123.   I2cstop
  124.  
  125. Return
To taka podstawowa wersja. Mam inna rozbudowana o kontrolę błedów. Ta jednak ma pokazać jak to zrobić w najprostszy sposób.

Przykład jak można tego użyć nie pisząc od nowa całej obsługi PCF8583
  1. $regfile = "m32adef.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 64
  6.  
  7. Config Submode = New
  8.  
  9. ' I2C config
  10. $lib "i2c_twi.lbx"
  11.  
  12. Config Scl = Portc.0
  13. Config Sda = Portc.1
  14. I2cinit
  15. Config Twi = 100000
  16.  
  17. $include "user_clock_pcf8583_declarations.inc"
  18.  
  19. Dim Day_nr As Byte , Day_str As String * 15
  20.  
  21. Do
  22.  
  23.    Lcd Time$                                                'odczytuje czas - uzywac co jakiś czas a nie wkółko w petli
  24.  
  25.    Locate 1 , 11 : Lcd Date$
  26.  
  27.    Day_nr = Dayofweek()                                     'oblicz który to dzień tygodnia
  28.  
  29.    Day_str = Lookupstr(day_nr , Dni_tygodnia)               'pobierz napis z tabeli
  30.  
  31.    Locate 2 , 1 : Lcd Day_str                               'wyswietl napis w drugiej linii
  32.  
  33.     Waitms 500
  34.  
  35.  
  36. Loop
  37.  
  38. End
  39.  
  40. $include "user_clock_pcf8583_routines.inc"
  41.  
  42. Dni_tygodnia:
  43. Data "Poniedzia{001}ek" , "Wtorek" , "Sroda" , "Czwartek" , "Pi{004}tek" , "Sobota" , "Niedziela"
  44.  
Jest to tylko wycinek innego programu z użyciem tych plików. Co komu będzi epotrzebne to sobie zadeklaruje.

Chodzi o to że Bascom, kiedy używamy funkcji $Time lub $Date to automatycznie użyje Subów Getdatetime Setdate lub Settime ;)

Tak więc by ustawić zegarek czasem wystarczy napisać $Time = 23:50:00 i ..gotowe :)

Można osobno ustawić sobie _min = 40 _hour = 2 i zrobić Gosub Settime i ...gotowe! :D
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

Re: Integracja PCF8583 z DateTime Bascom`a

Post autor: kaktus » 09 cze 2016, 22:19

Sama bibliotek oblicza też lata przestępne.
Do kompletu brakuje jedynie przełączania na czas letni.
teraz życie można rozdzielić między NOP i SLEEP
ODPOWIEDZ