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   //*****************************************************************************