1 |   //***************************************************************************** |
2 |   // |
3 |   //  File  Name    :  'ledI2C.c' |
4 |   //  Title                :  Itronove  hodiny  |
5 |   #define  __PIC18F8720A__ |
6 |   //  Author              :  http://www.prochazka.zde.cz  -&rsaquo   hacesoft  2017 |
7 |   //  Created            :  24-05-2017,  13:38 |
8 |   //  Revised            :  24-05-2017,  14:09 |
9 |   //  Version            :  1.0 |
10 |   //  Target  MCU   :  PIC  18F8720 |
11 |   // |
12 |   //  This  code  is  distributed  under  the  GNU  Public  License |
13 |   //  Vsechny  informace  jsou  zahrnuty  pod  GPL  licenci,  pokud  není  explicitne  uveden  jiný  typ  licence. |
14 |   //  Pouzivání  techto  stránek  ke  komercním  úcelum  lze  jen  se  souhlasem  autora. |
15 |   //  Vsechna  práva  vyhrazena  (c)  1997  -  2017  hacesoft. |
16 |   // |
17 |   //***************************************************************************** |
18 |   |
19 |   |
20 |   #include &lsaquo xc.h&rsaquo |
21 |   #include  "hsv.h" |
22 |   #include  "i2c.h" |
23 |   #include &lsaquo stdint.h&rsaquo   //uint8_t,  uint16_t,  uint32_t |
24 |   #include  "ledI2C.h" |
25 |   |
26 |   |
27 |   |
28 |   void  InitIO_PCA9633_HW(uint8_t  IO_adress){ |
29 |        |
30 |        I2C_Start(_HW); |
31 |        |
32 |        I2C_Write(_HW,IO_adress);    //write  slave  address |
33 |        //  MODE1  -  Mode  register  1  (address  00h)  bit  description |
34 |        I2C_Write(_HW,0b10000000);   //pocatecni  adresa  registru  0x0 |
35 |        //  vynulovat  registr |
36 |        I2C_Write(_HW,0b00000000);  |
37 |        |
38 |        I2C_ReStart(_HW); |
39 |        |
40 |        I2C_Write(_HW,IO_adress);   //write  slave  address  ALL |
41 |        |
42 |        //  Control  register |
43 |        //Auto-Increment  for  all  registers.  D[4:0]  roll  over  to  ?0  0000?  after  the  last  register  (1  1011)  is  accessed. |
44 |        I2C_Write(_HW,0b10000110);  //pocatecni  adresa  registru  0x6 |
45 |        |
46 |        //  Reg  0x6  -  Skupina  PWM  -  by  nevadí |
47 |        //GRPPWM  -  Group  brightness  control  register  (address  12h)  bit  description |
48 |        I2C_Write(_HW,0xFF);   |
49 |        |
50 |        //  Reg  0x7  -  Skupina  Freq  -  by  nevadí |
51 |        //GRPFREQ  -  Group  Frequency  register  (address  13h)  bit  description |
52 |        I2C_Write(_HW,0x00); |
53 |        |
54 |        //  Reg  0x14-0x17  -  LED  výstupu  státní  kontrole  -  v?echny  0xAA  (stav  výstupu  pro  ka?dou  LED  =  0x2)LDRx  =  00  ?  LED  driver  x  is  off  (default  power-up  state). |
55 |        //LDRx  =  01  ?  LED  driver  x  is  fully  on  (individual  brightness  and  group  dimming/blinking  not  controlled). |
56 |        //LDRx  =  10  ?  LED  driver  x  individual  brightness  can  be  controlled  through  its  PWMx  register. |
57 |        //LDRx  =  11  ?  LED  driver  x  individual  brightness  and  group  dimming/blinking  can  be  controlled  through  its  PWMx  register  and  the  GRPPWM  registers. |
58 |        I2C_Write(_HW,0b10101010);   //LEDOUT  register  (LED  fully  ON) |
59 |        |
60 |        I2C_Stop(_HW);  |
61 |   } |
62 |   //***************************************************************************** |
63 |   |
64 |   void  InitIO_PCA9633_SW(uint8_t  IO_adress){ |
65 |        I2C_Start(_SW); |
66 |        |
67 |        I2C_Write(_SW,IO_adress);   //write  slave  address |
68 |        //  MODE1  -  Mode  register  1  (address  00h)  bit  description |
69 |        I2C_Write(_SW,0b10000000); |
70 |      |
71 |        //  vynulovat  registr |
72 |        I2C_Write(_SW,0b00000000); |
73 |        |
74 |        I2C_ReStart(_SW); |
75 |        I2C_Write(_SW,IO_adress);   //write  slave  address |
76 |        |
77 |        //  Control  register |
78 |        //Auto-Increment  for  all  registers.  D[4:0]  roll  over  to  ?0  0000?  after  the  last  register  (1  1011)  is  accessed. |
79 |        I2C_Write(_SW,0b10000110);//pocatecni  adresa  registru  0x6 |
80 |      |
81 |        //  Reg  0x6  -  Skupina  PWM  -  by  nevadí |
82 |        //GRPPWM  -  Group  brightness  control  register  (address  12h)  bit  description |
83 |        I2C_Write(_SW,0xFF); |
84 |   |
85 |        //  Reg  0x7  -  Skupina  Freq  -  by  nevadí |
86 |        //GRPFREQ  -  Group  Frequency  register  (address  13h)  bit  description |
87 |        I2C_Write(_SW,0x00); |
88 |   |
89 |        //  Reg  0x14-0x17  -  LED  výstupu  státní  kontrole  -  v?echny  0xAA  (stav  výstupu  pro  ka?dou  LED  =  0x2)LDRx  =  00  ?  LED  driver  x  is  off  (default  power-up  state). |
90 |        //LDRx  =  01  ?  LED  driver  x  is  fully  on  (individual  brightness  and  group  dimming/blinking  not  controlled). |
91 |        //LDRx  =  10  ?  LED  driver  x  individual  brightness  can  be  controlled  through  its  PWMx  register. |
92 |        //LDRx  =  11  ?  LED  driver  x  individual  brightness  and  group  dimming/blinking  can  be  controlled  through  its  PWMx  register  and  the  GRPPWM  registers. |
93 |        I2C_Write(_SW,0b10101010); |
94 |        |
95 |       I2C_Stop(_SW);  |
96 |   } |
97 |   //***************************************************************************** |
98 |   void  setRGB_PCA9633(uint8_t  type,uint8_t  IO_adress,  uint8_t  R,  uint8_t  G,  uint8_t  B){ |
99 |        if  (type  ==  _SW){setRGB_PCA9633_SW(IO_adress,R,G,B);} |
100 |        else  setRGB_PCA9633_HW(IO_adress,R,G,B); |
101 |   } |
102 |   //***************************************************************************** |
103 |   void  setRGB_PCA9633_SW(uint8_t  IO_adress,  uint8_t  R,  uint8_t  G,  uint8_t  B){ |
104 |        //uint8_t  PWMa  =  0b10100000  |  Reg; |
105 |        I2C_Start(_SW); |
106 |        I2C_Write(_SW,IO_adress);   //write  slave  address  ALL |
107 |        I2C_Write(_SW,0b10100011);  //pocatecni  adresa  PWM  registru  je  PWM1 |
108 |        I2C_Write(_SW,R); |
109 |        I2C_Write(_SW,G); |
110 |        I2C_Write(_SW,B); |
111 |   |
112 |        I2C_Stop(_SW);  |
113 |   } |
114 |   //***************************************************************************** |
115 |   void  setRGB_PCA9633_HW(uint8_t  IO_adress,  uint8_t  R,  uint8_t  G,  uint8_t  B){ |
116 |        //uint8_t  PWMa  =  0b10100000  |  Reg; |
117 |        I2C_Start(_HW); |
118 |        I2C_Write(_HW,IO_adress);   //write  slave  address  ALL |
119 |        I2C_Write(_HW,0b10100011);  //pocatecni  adresa  PWM  registru  je  PWM1 |
120 |        I2C_Write(_HW,R); |
121 |        I2C_Write(_HW,G); |
122 |        I2C_Write(_HW,B); |
123 |   |
124 |        I2C_Stop(_HW);  |
125 |   } |
126 |   //***************************************************************************** |
127 |   int  ABS(int  a){ |
128 |           if(a &lsaquo   0) |
129 |                   return  -a; |
130 |           return  a; |
131 |   } |
132 |   //***************************************************************************** |
133 |   void  SetLightHua  (void){ |
134 |        RgbColor  rgb; |
135 |   |
136 |        rgb  =  HsvToRgb(PoleLedHSL.IC2_PWM); |
137 |        setRGB_PCA9633(_HW,adress_LED_IC2,  rgb.r,  rgb.g,  rgb.b); |
138 |        rgb  =  HsvToRgb(PoleLedHSL.IC3_PWM); |
139 |        setRGB_PCA9633(_HW,adress_LED_IC3,  rgb.r,  rgb.g,  rgb.b); |
140 |        rgb  =  HsvToRgb(PoleLedHSL.IC4_PWM); |
141 |        setRGB_PCA9633(_HW,adress_LED_IC4,  rgb.r,  rgb.g,  rgb.b); |
142 |        rgb  =  HsvToRgb(PoleLedHSL.IC5_PWM); |
143 |        setRGB_PCA9633(_HW,adress_LED_IC5,  rgb.r,  rgb.g,  rgb.b); |
144 |        rgb  =  HsvToRgb(PoleLedHSL.IC6_PWM); |
145 |        setRGB_PCA9633(_SW,adress_LED_IC6,  rgb.r,  rgb.g,  rgb.b); |
146 |        rgb  =  HsvToRgb(PoleLedHSL.IC7_PWM); |
147 |        setRGB_PCA9633(_SW,adress_LED_IC7,  rgb.r,  rgb.g,  rgb.b);   |
148 |   } |
149 |   //***************************************************************************** |