Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PCA9633 by
PCA9633.cpp@1:f95d80e0f84a, 2018-06-21 (annotated)
- Committer:
- mederic
- Date:
- Thu Jun 21 07:28:23 2018 +0000
- Revision:
- 1:f95d80e0f84a
- Parent:
- 0:39b243509a43
- Child:
- 2:651ace168465
first released
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mederic | 0:39b243509a43 | 1 | #include "PCA9633.h" |
| mederic | 0:39b243509a43 | 2 | #include <math.h> |
| mederic | 0:39b243509a43 | 3 | |
| mederic | 0:39b243509a43 | 4 | //***********************************/************************************ |
| mederic | 0:39b243509a43 | 5 | // Constant // |
| mederic | 0:39b243509a43 | 6 | //***********************************/************************************ |
| mederic | 1:f95d80e0f84a | 7 | #define PCA9633_ADD_SWRST 0x06 // Software Reset Call Address (0x03<<1) |
| mederic | 0:39b243509a43 | 8 | #define PCA9633_REG_SWRST 0xa5 // Software Reset register |
| mederic | 0:39b243509a43 | 9 | #define PCA9633_VAL_SWRST 0x5a // Software Reset register |
| mederic | 0:39b243509a43 | 10 | |
| mederic | 0:39b243509a43 | 11 | // Register addr (with auto increment) |
| mederic | 0:39b243509a43 | 12 | #define PCA9633_REG_MODE1 0x80 // Mode register 1 |
| mederic | 0:39b243509a43 | 13 | #define PCA9633_REG_MODE2 0x81 // Mode register 2 |
| mederic | 0:39b243509a43 | 14 | #define PCA9633_REG_PWM0 0x82 // brightness control LED0 |
| mederic | 0:39b243509a43 | 15 | #define PCA9633_REG_GRPPWM 0x86 // group duty cycle control |
| mederic | 0:39b243509a43 | 16 | #define PCA9633_REG_GRPFREQ 0x87 // group frequency |
| mederic | 0:39b243509a43 | 17 | #define PCA9633_REG_LEDOUT 0x88 // LED output state |
| mederic | 0:39b243509a43 | 18 | |
| mederic | 0:39b243509a43 | 19 | //PCA9633 MODE2 register bit |
| mederic | 0:39b243509a43 | 20 | #define PCA9633_BIT_DMBLNK 0x05 |
| mederic | 0:39b243509a43 | 21 | #define PCA9633_BIT_INVRT 0x04 |
| mederic | 0:39b243509a43 | 22 | #define PCA9633_BIT_OUTDRV 0x02 |
| mederic | 0:39b243509a43 | 23 | |
| mederic | 0:39b243509a43 | 24 | //***********************************/************************************ |
| mederic | 0:39b243509a43 | 25 | // Constructors // |
| mederic | 0:39b243509a43 | 26 | //***********************************/************************************ |
| mederic | 0:39b243509a43 | 27 | PCA9633::PCA9633(I2C *i2c, char addr, bool invert, bool openDrain):_i2c(i2c){ |
| mederic | 0:39b243509a43 | 28 | _addr = addr<<1; |
| mederic | 0:39b243509a43 | 29 | softReset(); |
| mederic | 0:39b243509a43 | 30 | /* SLEEP=0 Normal Mode |
| mederic | 0:39b243509a43 | 31 | SUB1 =0 PCA9633 does not respond to I2C-bus subaddress 1. |
| mederic | 0:39b243509a43 | 32 | SUB2 =0 PCA9633 does not respond to I2C-bus subaddress 2. |
| mederic | 0:39b243509a43 | 33 | SUB3 =0 PCA9633 does not respond to I2C-bus subaddress 3. |
| mederic | 0:39b243509a43 | 34 | ALLCAL =0 PCA9633 does not respond to LED All Call I2C-bus address.*/ |
| mederic | 1:f95d80e0f84a | 35 | char buf[2] = {PCA9633_REG_MODE1,0}; |
| mederic | 1:f95d80e0f84a | 36 | _i2c->write(_addr,buf,2); |
| mederic | 0:39b243509a43 | 37 | config(invert, openDrain); |
| mederic | 0:39b243509a43 | 38 | } |
| mederic | 0:39b243509a43 | 39 | |
| mederic | 0:39b243509a43 | 40 | void PCA9633::config(bool invert, bool openDrain){ |
| mederic | 1:f95d80e0f84a | 41 | char buf[2] = {PCA9633_REG_MODE2,0}; |
| mederic | 1:f95d80e0f84a | 42 | buf[1] = (invert<<PCA9633_BIT_INVRT ) | (openDrain<<PCA9633_BIT_OUTDRV); |
| mederic | 1:f95d80e0f84a | 43 | _i2c->write(_addr,buf,2); |
| mederic | 0:39b243509a43 | 44 | } |
| mederic | 0:39b243509a43 | 45 | |
| mederic | 0:39b243509a43 | 46 | void PCA9633::softReset(void){ |
| mederic | 1:f95d80e0f84a | 47 | char buf[2] = {PCA9633_REG_SWRST,PCA9633_VAL_SWRST}; |
| mederic | 1:f95d80e0f84a | 48 | _i2c->write(0x06,buf,2); |
| mederic | 0:39b243509a43 | 49 | } |
| mederic | 0:39b243509a43 | 50 | |
| mederic | 0:39b243509a43 | 51 | void PCA9633::pwm(char bright, char pos){ |
| mederic | 1:f95d80e0f84a | 52 | char buf[5] = {PCA9633_REG_PWM0,bright,bright,bright,bright}; |
| mederic | 0:39b243509a43 | 53 | char len = 5; |
| mederic | 0:39b243509a43 | 54 | if(pos<PCA9633::ALL){ |
| mederic | 0:39b243509a43 | 55 | len=2; |
| mederic | 1:f95d80e0f84a | 56 | buf[0]+=pos; |
| mederic | 0:39b243509a43 | 57 | } |
| mederic | 1:f95d80e0f84a | 58 | _i2c->write(_addr,buf,len); |
| mederic | 0:39b243509a43 | 59 | } |
| mederic | 0:39b243509a43 | 60 | |
| mederic | 1:f95d80e0f84a | 61 | void PCA9633::dim(char val){; |
| mederic | 1:f95d80e0f84a | 62 | char buf[2] = {PCA9633_REG_MODE2,0}; |
| mederic | 1:f95d80e0f84a | 63 | _i2c->write(_addr,buf,1); //cmd to read mode2 |
| mederic | 1:f95d80e0f84a | 64 | _i2c->read(_addr, &buf[1],1); //stock in buf[1] |
| mederic | 1:f95d80e0f84a | 65 | buf[1] &= ~(1<<PCA9633_BIT_DMBLNK); //set dimming in mode2 |
| mederic | 1:f95d80e0f84a | 66 | _i2c->write(_addr,buf,2); //write mode2 |
| mederic | 0:39b243509a43 | 67 | |
| mederic | 1:f95d80e0f84a | 68 | buf[0] = PCA9633_REG_GRPPWM; |
| mederic | 1:f95d80e0f84a | 69 | buf[1] = val; |
| mederic | 1:f95d80e0f84a | 70 | _i2c->write(_addr,buf,2); //dimming |
| mederic | 0:39b243509a43 | 71 | } |
| mederic | 0:39b243509a43 | 72 | |
| mederic | 0:39b243509a43 | 73 | void PCA9633::blink(char duty, float period){ |
| mederic | 1:f95d80e0f84a | 74 | char buf[3] = {PCA9633_REG_MODE2,0,0}; |
| mederic | 0:39b243509a43 | 75 | _i2c->write(_addr,buf,1); //cmd to read mode2 |
| mederic | 0:39b243509a43 | 76 | _i2c->read(_addr, &buf[1],1); //stock in buf[1] |
| mederic | 0:39b243509a43 | 77 | buf[1] |= (1<<PCA9633_BIT_DMBLNK); //set blink in mode2 |
| mederic | 0:39b243509a43 | 78 | _i2c->write(_addr,buf,2); //write mode2 |
| mederic | 0:39b243509a43 | 79 | |
| mederic | 0:39b243509a43 | 80 | buf[0] = PCA9633_REG_GRPPWM; |
| mederic | 0:39b243509a43 | 81 | buf[1] = duty; |
| mederic | 0:39b243509a43 | 82 | buf[2] = char(rint((period*24.0)-1)); |
| mederic | 0:39b243509a43 | 83 | _i2c->write(_addr,buf,3); |
| mederic | 0:39b243509a43 | 84 | |
| mederic | 0:39b243509a43 | 85 | } |
| mederic | 0:39b243509a43 | 86 | |
| mederic | 0:39b243509a43 | 87 | void PCA9633::ledout(char state, char pos){ |
| mederic | 1:f95d80e0f84a | 88 | char buf[2] = {PCA9633_REG_LEDOUT,0}; |
| mederic | 0:39b243509a43 | 89 | _i2c->write(_addr,buf,1); //cmd to read ledout |
| mederic | 0:39b243509a43 | 90 | _i2c->read(_addr, &buf[1],1); //stock in buf[1] |
| mederic | 0:39b243509a43 | 91 | |
| mederic | 0:39b243509a43 | 92 | if(pos<PCA9633::ALL){ |
| mederic | 1:f95d80e0f84a | 93 | buf[1] &= ~(0x03<<(pos<<1)); // erase 2 state bit of selected position |
| mederic | 1:f95d80e0f84a | 94 | buf[1] |= (state<<(pos<<1)); // set state at position |
| mederic | 0:39b243509a43 | 95 | } |
| mederic | 0:39b243509a43 | 96 | else{ |
| mederic | 0:39b243509a43 | 97 | for(int i=0;i<PCA9633::ALL;i++){ |
| mederic | 1:f95d80e0f84a | 98 | buf[1] &= ~(0x03<<(i<<1)); // erase 2 state bit of selected position |
| mederic | 1:f95d80e0f84a | 99 | buf[1] |= (state<<(i<<1)); // set state at position |
| mederic | 0:39b243509a43 | 100 | } |
| mederic | 0:39b243509a43 | 101 | } |
| mederic | 0:39b243509a43 | 102 | _i2c->write(_addr,buf,2); //write LEDOUT |
| mederic | 0:39b243509a43 | 103 | } |
