[BASCOM] I2C Led Driver PCA9551

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
ODPOWIEDZ
Awatar użytkownika
Pikczu
Posty: 392
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

[BASCOM] I2C Led Driver PCA9551

Post autor: Pikczu » 17 sie 2015, 16:26

PCA9551 jest to 8 bitowy "migacz" do ledów sterowany przez magistralę I2C.
http://www.nxp.com/documents/data_sheet/PCA9551.pdf
Wbudowane timery pozwalają na efektywniejsze wykorzystanie magistrali.

Uwaga Biblioteka przygotowana do używania w tzw. Project mode wraz z Config Submode = New.
Jak używać ??
W pliku main.bas wklejamy naszą nazwę wraz z nazwą folderu zamkniętą w cudzysłów, zaraz po ustawieniach portów, deklaracji zmiennych globalnych, stałych itp.

W moim przypadku folder nazywał się Subs.
$include "Subs\Sub Pca9551_led.inc"
$include "Subs\function Pca9551_get_PWM_0_1_dutycy.inc"
$include "Subs\Function Pca9551_get_PWM_0_1_Freq.inc"

Teraz aby włączyć np. led number 6 piszemy:
Call Pca9551_ledv(6 , 1) 'turn led ON

Wyłaczyć Led 6:
Call Pca9551_ledv2(6 , 0) 'turn led Off

Jeśli chcemy wybrać tryb PWM_0:
Call Pca9551_ledv2(6 , 2) 'led6 PWM0

Jelsi chcemy wybrać PWM_1
Call Pca9551_ledv2(6 , 3) 'led6 PWM1

W podobny sposób ustawiamy wypełnienie i częstotliwość:
Call Pca9551_pwm(pwm_mode 0 lub 1 , Freq 0 do 255, Duty 0 do 255)



Wybór led oraz trybu pracy :
  1. $nocompile
  2.     '*****************************************************************************************
  3.     '**********PCA9551 ver 1.0  by Pawel Labedz aka Pikczu 2014*******************************
  4.     '*********************Pawel.labedz@gmail.com**********************************************
  5.     '*****************************************************************************************
  6.     '-----------------------------------------------------------------------------------------
  7.     'Name to include: "Sub Pca9551_led.inc"
  8.     'Syntax:  Call Pca9551_ledv2(led number  , mode 0 or 1 or 2 or 3 )
  9.     'Make sure you add constant in to main.bas
  10.     'Const Led0_on = &B11111100
  11.     'Const Led0_off = &B00000001
  12.     'Const Led0_pwm0 = &B00000010                                ' make sure you send first off mask then
  13.     'Const Led0_pwm1 = &B00000011                                'use OR  after default condition 01010101 to change to  PWM1
  14.     'Const Led1_on = &B11110011
  15.     'Const Led1_off = &B00000100
  16.     'Const Led1_pwm0 = &B00001000
  17.     'Const Led1_pwm1 = &B00001100                                'use OR  after default condition 01010101 to change to  PWM1
  18.     'Const Led2_on = &B11001111
  19.     'Const Led2_off = &B00010000
  20.     'Const Led2_pwm0 = &B00100000
  21.     'Const Led2_pwm1 = &B00110000                                'use OR  after default condition 01010101 to change to  PWM1
  22.     'Const Led3_on = &B00111111
  23.     'Const Led3_off = &B01000000
  24.     'Const Led3_pwm0 = &B10000000
  25.     'Const Led3_pwm1 = &B11000000                                'use OR  after default condition 01010101 to change to  PWM1
  26.     'Const Led4_on = &B11111100
  27.     'Const Led4_off = &B00000001
  28.     'Const Led4_pwm0 = &B00000010
  29.     'Const Led4_pwm1 = &B00000011                                'use OR  after default condition 01010101 to change to  PWM1
  30.     'Const Led5_on = &B11110011
  31.     'Const Led5_off = &B00000100
  32.     'Const Led5_pwm0 = &B00001000
  33.     'Const Led5_pwm1 = &B00001100                                'use OR  after default condition 01010101 to change to  PWM1
  34.     'Const Led6_on = &B11001111
  35.     'Const Led6_off = &B00010000
  36.     'Const Led6_pwm0 = &B00100000
  37.     'Const Led6_pwm1 = &B00110000                                'use OR  after default condition 01010101 to change to  PWM1
  38.     'Const Led7_on = &B00111111
  39.     'Const Led7_off = &B01000000
  40.     'Const Led7_pwm0 = &B01000000
  41.     'Const Led7_pwm1 = &B11000000                                'use OR  after default condition 01010101 to change to  PWM1
  42.     'Const 0to3led_off = &B01010101
  43.     'Const 0to3led_on = &B00000000
  44.     'Const 4to7led_off = &B01010101
  45.     'Const 4to7led_on = &B00000000
  46.     '-----------------------------------------------------------------------------------------
  47.      
  48.     'PCA9551 Led driver with PWM
  49.     Sub Pca9551_led(byval Led As Byte , Byval Led_mode As Byte )
  50.        Dbg
  51.        'Const Pca9551rd = 193
  52.        'Const Pca9551wr = 192
  53.        Local Bufor_1 As Byte
  54.        Local Bufor_2 As Byte
  55.        Bufor_1 = 0
  56.        Bufor_2 = 0
  57.        I2cstart
  58.        I2cwbyte Pca9551wr
  59.        I2cwbyte &B00010101
  60.        I2crepstart
  61.        I2cwbyte Pca9551rd
  62.        I2crbyte Bufor_1 , Ack                                   'led 0 to 3
  63.        I2crbyte Bufor_2 , Nack                                  'led 4 to 7
  64.        I2cstop
  65.        I2cstart
  66.        I2cwbyte Pca9551wr
  67.        If Led > 3 Then
  68.           I2cwbyte 6
  69.        Else
  70.           I2cwbyte 5
  71.        End If
  72.        Select Case Led
  73.      
  74.           Case 0
  75.              Select Case Led_mode
  76.                 Case 0                                          ' led0_off
  77.                    Bufor_1 = Bufor_1 And Led0_on                'AND zerowanie
  78.                    Bufor_1 = Bufor_1 Or Led0_off                ' OR ustwianie
  79.                 Case 1                                          'led0_on
  80.                    Bufor_1 = Bufor_1 And Led0_on                'AND zerowanie
  81.                 Case 2                                          'led0 PWM0
  82.                    Bufor_1 = Bufor_1 And Led0_on
  83.                    Bufor_1 = Bufor_1 Or Led0_pwm0
  84.                 Case 3                                          'led0 pwm1
  85.                    Bufor_1 = Bufor_1 Or Led0_pwm1
  86.              End Select
  87.           Case 1                                                'led 1
  88.              Select Case Led_mode
  89.                 Case 0                                          ' led1_off
  90.                    Bufor_1 = Bufor_1 And Led1_on                'AND zerowanie
  91.                    Bufor_1 = Bufor_1 Or Led1_off                ' OR ustwianie
  92.                 Case 1                                          'led1_on
  93.                    Bufor_1 = Bufor_1 And Led1_on                'AND zerowanie
  94.                 Case 2                                          'led1 PWM0
  95.                    Bufor_1 = Bufor_1 And Led1_on
  96.                    Bufor_1 = Bufor_1 Or Led1_pwm0
  97.                 Case 3                                          'led1 pwm1
  98.                    Bufor_1 = Bufor_1 Or Led1_pwm1
  99.              End Select
  100.           Case 2                                                'led 2
  101.              Select Case Led_mode
  102.                 Case 0                                          ' led2_off
  103.                    Bufor_1 = Bufor_1 And Led2_on                'AND zerowanie
  104.                    Bufor_1 = Bufor_1 Or Led2_off                ' OR ustwianie
  105.                 Case 1                                          'led2_on
  106.                    Bufor_1 = Bufor_1 And Led2_on                'AND zerowanie
  107.                 Case 2                                          'led2 PWM0
  108.                    Bufor_1 = Bufor_1 And Led2_on
  109.                    Bufor_1 = Bufor_1 Or Led2_pwm0
  110.                 Case 3                                          'led2 pwm1
  111.                    Bufor_1 = Bufor_1 Or Led2_pwm1
  112.              End Select
  113.           Case 3                                                'led3
  114.              Select Case Led_mode
  115.                 Case 0                                          ' led3_off
  116.                    Bufor_1 = Bufor_1 And Led3_on                'AND zerowanie
  117.                    Bufor_1 = Bufor_1 Or Led3_off                ' OR ustwianie
  118.                 Case 1                                          'led3_on
  119.                    Bufor_1 = Bufor_1 And Led3_on                'AND zerowanie
  120.                 Case 2                                          'led3 PWM0
  121.                    Bufor_1 = Bufor_1 And Led3_on
  122.                    Bufor_1 = Bufor_1 Or Led3_pwm0
  123.                 Case 3                                          'led3 pwm1
  124.                    Bufor_1 = Bufor_1 Or Led3_pwm1
  125.              End Select
  126.           Case 4                                                'led 4
  127.              Select Case Led_mode
  128.                 Case 0                                          ' led4_off
  129.                    Bufor_2 = Bufor_2 And Led4_on                'AND zerowanie
  130.                    Bufor_2 = Bufor_2 Or Led4_off                ' OR ustwianie
  131.                 Case 1                                          'led4_on
  132.                    Bufor_2 = Bufor_2 And Led4_on                'AND zerowanie
  133.                 Case 2                                          'led4 PWM0
  134.                    Bufor_2 = Bufor_2 And Led4_on
  135.                    Bufor_2 = Bufor_2 Or Led4_pwm0
  136.                 Case 3                                          'led4 pwm1
  137.                    Bufor_2 = Bufor_2 Or Led4_pwm1
  138.              End Select
  139.           Case 5                                                'led 5
  140.              Select Case Led_mode
  141.                 Case 0                                          ' led5_off
  142.                    Bufor_2 = Bufor_2 And Led5_on                'AND zerowanie
  143.                    Bufor_2 = Bufor_2 Or Led5_off                ' OR ustwianie
  144.                 Case 1                                          'led5_on
  145.                    Bufor_2 = Bufor_2 And Led5_on                'AND zerowanie
  146.                 Case 2                                          'led5 PWM0
  147.                    Bufor_2 = Bufor_2 And Led5_on
  148.                    Bufor_2 = Bufor_2 Or Led5_pwm0
  149.                 Case 3                                          'led3 pwm1
  150.                    Bufor_2 = Bufor_2 Or Led5_pwm1
  151.              End Select
  152.           Case 6                                                'led 6
  153.              Select Case Led_mode
  154.                 Case 0                                          ' led6_off
  155.                    Bufor_2 = Bufor_2 And Led6_on                'AND zerowanie
  156.                    Bufor_2 = Bufor_2 Or Led6_off                ' OR ustwianie
  157.                 Case 1                                          'led6_on
  158.                    Bufor_2 = Bufor_2 And Led6_on                'AND zerowanie
  159.                 Case 2                                          'led6 PWM0
  160.                    Bufor_2 = Bufor_2 And Led6_on
  161.                    Bufor_2 = Bufor_2 Or Led6_pwm0
  162.                 Case 3                                          'led6 pwm1
  163.                    Bufor_2 = Bufor_2 Or Led6_pwm1
  164.              End Select
  165.           Case 7                                                'led 7
  166.              Select Case Led_mode
  167.                 Case 0                                          ' led7_off
  168.                    Bufor_2 = Bufor_2 And Led7_on                'AND zerowanie
  169.                    Bufor_2 = Bufor_2 Or Led7_off                ' OR ustwianie
  170.                 Case 1                                          'led7_on
  171.                    Bufor_2 = Bufor_2 And Led7_on                'AND zerowanie
  172.                 Case 2                                          'led7 PWM0
  173.                    Bufor_2 = Bufor_2 And Led7_on
  174.                    Bufor_2 = Bufor_2 Or Led7_pwm0
  175.                 Case 3                                          'led7 pwm1
  176.                    Bufor_2 = Bufor_2 Or Led7_pwm1
  177.              End Select
  178.      
  179.        End Select
  180.      
  181.        If Led > 3 Then
  182.           I2cwbyte Bufor_2
  183.        Else
  184.           I2cwbyte Bufor_1
  185.        End If
  186.        I2cstop
  187.     End Sub
  188.     '-----------------------------------------------------------------------------------------

Konfiguracja PWM-ów
  1. $nocompile
  2.     '*****************************************************************************************
  3.     '**********PCA9551 ver 1.0  by Pawel Labedz aka Pikczu 2014*******************************
  4.     '*********************Pawel.labedz@gmail.com**********************************************
  5.     '*****************************************************************************************
  6.     '-----------------------------------------------------------------------------------------
  7.      
  8.     ' Name to include : "Sub pca9551_pwm.inc"
  9.     'syntax: PCA9551_PWM(0 or 1 , 0 to 255, 0 to 255)
  10.          
  11.     Sub Pca9551_pwm(byval Pwm_0_1 As Byte , Byval Freq_pres As Byte , Byval Duty_cyc As Byte)
  12.     Dbg    
  13.        If Pwm_0_1 > 1 Then Pwm_0_1 = 1
  14.        I2cstart
  15.        I2cwbyte Pca9551wr
  16.        Select Case Pwm_0_1
  17.           Case 0
  18.              I2cwbyte &B00010001                                '10001 sub adres  plus auto increment  bit  4
  19.              I2cwbyte Freq_pres
  20.              I2cwbyte Duty_cyc
  21.           Case 1
  22.              I2cwbyte &B00010011                                '10001 sub adres  plus auto increment  bit  4
  23.              I2cwbyte Freq_pres
  24.              I2cwbyte Duty_cyc
  25.      
  26.        End Select
  27.        I2cstop          
  28.     End Sub

Funkcja zwracająca wartość wypełnienia PWM:
  1. $nocompile
  2.     '*****************************************************************************************
  3.     '**********PCA9551 ver 1.0  by Pawel Labedz aka Pikczu 2014*******************************
  4.     '*********************Pawel.labedz@gmail.com**********************************************
  5.     '*****************************************************************************************
  6.      
  7.      'name to include : "function Pca9551_get_PWM_0_1_dutycy.inc"
  8.     'syntax: yourvariable= Pca9551_get_pwm_0_1_dutycy(0 or 1)
  9.     '-----------------------------------------------------------------------------------------
  10.     'PCA9551 Led driver with PWM  reading dutycycle for pwm 0 or 1
  11.     Function Pca9551_get_pwm_0_1_dutycy(byval Pwms As Byte ) As Byte
  12.     Dbg
  13.        'Const Pca9551rd = 193'this is address
  14.        'Const Pca9551wr = 192' this is address setup in main code
  15.        Local Bufor_1 As Byte
  16.        'Local Bufor_2 As Byte
  17.        Bufor_1 = 0
  18.        'Bufor_2 = 0
  19.        If Pwms > 1 Then Pwms = 1
  20.      
  21.        I2cstart
  22.        I2cwbyte Pca9551wr
  23.        Select Case Pwms
  24.           Case 0
  25.              I2cwbyte &B00000010
  26.              I2crepstart
  27.              I2cwbyte Pca9551rd
  28.              I2crbyte Bufor_1 , Nack                            'led 0 to 3
  29.           Case 1
  30.           I2cwbyte &B00000100
  31.              I2crepstart
  32.              I2cwbyte Pca9551rd
  33.              I2crbyte Bufor_1 , Nack                            'led 0 to 3
  34.        End Select
  35.        I2cstop
  36.     Pca9551_get_pwm_0_1_dutycy = Bufor_1
  37.     End Function

Funkcja zwracająca wartość częstotliwości:
  1. $nocompile
  2.     '*****************************************************************************************
  3.     '**********PCA9551 ver 1.0  by Pawel Labedz aka Pikczu 2014*******************************
  4.     '*********************Pawel.labedz@gmail.com**********************************************
  5.     '*****************************************************************************************
  6.     '-----------------------------------------------------------------------------------------
  7.      'name to include : "function Pca9551_get_PWM_0_1_Freq.inc"
  8.     ' syntax:  yourvariable=Pca9551_get_pwm_0_1_freq(0 or 1 )
  9.     '-----------------------------------------------------------------------------------------
  10.     'PCA9551 Led driver with PWM  reading frequency for fwm 0 or 1
  11.     Function Pca9551_get_pwm_0_1_freq(byval Pwm_number As Byte ) As Byte
  12.     Dbg
  13.        'Const Pca9551rd = 193'this is address
  14.        'Const Pca9551wr = 192' this is address setup in main code
  15.        Local Bufor_1 As Byte
  16.        'Local Bufor_2 As Byte
  17.        Bufor_1 = 0
  18.        'Bufor_2 = 0
  19.        If Pwm_number > 1 Then Pwm_number = 1
  20.          
  21.        I2cstart
  22.        I2cwbyte Pca9551wr
  23.        Select Case Pwm_number
  24.           Case 0    
  25.              I2cwbyte &B00000001
  26.              I2crepstart
  27.              I2cwbyte Pca9551rd
  28.              I2crbyte Bufor_1 , Nack                            'led 0 to 3
  29.                Case 1
  30.           I2cwbyte &B00000011
  31.              I2crepstart
  32.              I2cwbyte Pca9551rd
  33.              I2crbyte Bufor_1 , Nack                            'led 0 to 3
  34.        End Select
  35.      
  36.        I2cstop
  37.     Pca9551_get_pwm_0_1_freq = Bufor_1
  38.     End Function


Edit------------------------- poprawiłem wyświetlanie bo się wszystko rozjechało.
Pikczu
Ostatnio zmieniony 01 gru 2018, 16:24 przez Pikczu, łącznie zmieniany 6 razy.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: I2C Led Driver PCA9551

Post autor: niveasoft » 17 sie 2015, 20:40

Dzięki za udostępnienie. Teraz zakasuję rękawy i postaram się pokolorować składnię :D
ODPOWIEDZ