2
2
// FILE: PCA9635.cpp
3
3
// AUTHOR: Rob Tillaart
4
4
// DATE: 23-apr-2016
5
- // VERSION: 0.6.0
5
+ // VERSION: 0.6.1
6
6
// PURPOSE: Arduino library for PCA9635 I2C LED driver, 16 channel PWM, 8 bit
7
7
// URL: https://github.com/RobTillaart/PCA9635
8
8
@@ -75,6 +75,33 @@ uint8_t PCA9635::channelCount()
75
75
//
76
76
// LED DRIVER MODE
77
77
//
78
+ uint8_t PCA9635::setLedDriverModeAll (uint8_t mode)
79
+ {
80
+ if (mode > 3 ) return PCA963X_ERR_MODE;
81
+ uint8_t mask = 0b00000000 ;
82
+ switch (mode)
83
+ {
84
+ case PCA963X_LEDGRPPWM:
85
+ mask = 0b11111111 ;
86
+ break ;
87
+ case PCA963X_LEDPWM:
88
+ mask = 0b10101010 ;
89
+ break ;
90
+ case PCA963X_LEDON:
91
+ mask = 0b01010101 ;
92
+ break ;
93
+ default :
94
+ mask = 0b00000000 ;
95
+ break ;
96
+ }
97
+ for (int reg = 0 ; reg < 4 ; reg++)
98
+ {
99
+ writeLedOut (reg, mask);
100
+ }
101
+ return PCA963X_OK;
102
+ }
103
+
104
+
78
105
uint8_t PCA9635::setLedDriverMode (uint8_t channel, uint8_t mode)
79
106
{
80
107
if (channel >= _channelCount)
@@ -93,8 +120,8 @@ uint8_t PCA9635::setLedDriverMode(uint8_t channel, uint8_t mode)
93
120
uint8_t shift = (channel & 0x03 ) * 2 ; // 0,2,4,6 places
94
121
uint8_t setmask = mode << shift;
95
122
uint8_t clrmask = ~(0x03 << shift);
96
- uint8_t value = (readReg (reg) & clrmask) | setmask;
97
- writeReg (reg, value);
123
+ uint8_t value = (readRegister (reg) & clrmask) | setmask;
124
+ writeRegister (reg, value);
98
125
_error = PCA963X_OK;
99
126
return _error;
100
127
}
@@ -111,7 +138,7 @@ uint8_t PCA9635::getLedDriverMode(uint8_t channel)
111
138
112
139
uint8_t reg = PCA963X_LEDOUT_BASE + (channel >> 2 );
113
140
uint8_t shift = (channel & 0x03 ) * 2 ; // 0, 2, 4, 6 places
114
- uint8_t value = (readReg (reg) >> shift ) & 0x03 ;
141
+ uint8_t value = (readRegister (reg) >> shift ) & 0x03 ;
115
142
_error = PCA963X_OK;
116
143
return value;
117
144
}
@@ -125,7 +152,7 @@ uint8_t PCA9635::writeMode(uint8_t reg, uint8_t value)
125
152
{
126
153
if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
127
154
{
128
- writeReg (reg, value);
155
+ writeRegister (reg, value);
129
156
return PCA963X_OK;
130
157
}
131
158
_error = PCA963X_ERR_REG;
@@ -139,7 +166,7 @@ uint8_t PCA9635::readMode(uint8_t reg)
139
166
if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
140
167
{
141
168
_error = PCA963X_OK;
142
- uint8_t value = readReg (reg);
169
+ uint8_t value = readRegister (reg);
143
170
return value;
144
171
}
145
172
_error = PCA963X_ERR_REG;
@@ -149,53 +176,55 @@ uint8_t PCA9635::readMode(uint8_t reg)
149
176
150
177
uint8_t PCA9635::setMode1 (uint8_t value)
151
178
{
152
- return writeMode (PCA963X_MODE1, value);
179
+ writeRegister (PCA963X_MODE1, value);
180
+ return PCA963X_OK;
153
181
}
154
182
155
183
156
184
uint8_t PCA9635::setMode2 (uint8_t value)
157
185
{
158
- return writeMode (PCA963X_MODE2, value);
186
+ writeRegister (PCA963X_MODE2, value);
187
+ return PCA963X_OK;
159
188
}
160
189
161
190
162
191
uint8_t PCA9635::getMode1 ()
163
192
{
164
- return readMode (PCA963X_MODE1);
193
+ return readRegister (PCA963X_MODE1);
165
194
}
166
195
167
196
168
197
uint8_t PCA9635::getMode2 ()
169
198
{
170
- return readMode (PCA963X_MODE2);
199
+ return readRegister (PCA963X_MODE2);
171
200
}
172
201
173
202
174
203
// ///////////////////////////////////////////////////
175
204
//
176
- // GROUP PWM
205
+ // GROUP REGISTERS
177
206
//
178
- void PCA9635::setGroupPWM (uint8_t value)
207
+ uint8_t PCA9635::setGroupPWM (uint8_t value)
179
208
{
180
- writeReg (PCA963X_GRPPWM, value);
209
+ return writeRegister (PCA963X_GRPPWM, value);
181
210
}
182
211
183
212
184
213
uint8_t PCA9635::getGroupPWM ()
185
214
{
186
- return readReg (PCA963X_GRPPWM);
215
+ return readRegister (PCA963X_GRPPWM);
187
216
}
188
217
189
218
190
- void PCA9635::setGroupFREQ (uint8_t value)
219
+ uint8_t PCA9635::setGroupFREQ (uint8_t value)
191
220
{
192
- writeReg (PCA963X_GRPFREQ, value);
221
+ return writeRegister (PCA963X_GRPFREQ, value);
193
222
}
194
223
195
224
196
225
uint8_t PCA9635::getGroupFREQ ()
197
226
{
198
- return readReg (PCA963X_GRPFREQ);
227
+ return readRegister (PCA963X_GRPFREQ);
199
228
}
200
229
201
230
@@ -246,6 +275,19 @@ uint8_t PCA9635::writeN(uint8_t channel, uint8_t* arr, uint8_t count)
246
275
}
247
276
248
277
278
+ uint8_t PCA9635::writeAll (uint8_t * arr)
279
+ {
280
+ return writeN (0 , arr, 16 );
281
+ }
282
+
283
+
284
+ uint8_t PCA9635::allOff ()
285
+ {
286
+ uint8_t arr[16 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
287
+ return writeN (0 , arr, 16 );
288
+ }
289
+
290
+
249
291
uint8_t PCA9635::writeN_noStop (uint8_t channel, uint8_t * arr, uint8_t count)
250
292
{
251
293
if (channel + count > _channelCount)
@@ -291,7 +333,7 @@ int PCA9635::lastError()
291
333
292
334
// ///////////////////////////////////////////////////
293
335
//
294
- // SUB CALL - ALL CALL
336
+ // SUB CALL
295
337
//
296
338
bool PCA9635::enableSubCall (uint8_t nr)
297
339
{
@@ -346,7 +388,7 @@ bool PCA9635::setSubCallAddress(uint8_t nr, uint8_t address)
346
388
// _error = ?? TODO
347
389
return false ;
348
390
}
349
- writeReg (PCA963X_SUBADR (nr), address);
391
+ writeRegister (PCA963X_SUBADR (nr), address);
350
392
return true ;
351
393
}
352
394
@@ -358,11 +400,15 @@ uint8_t PCA9635::getSubCallAddress(uint8_t nr)
358
400
// _error = ?? TODO
359
401
return 0 ;
360
402
}
361
- uint8_t address = readReg (PCA963X_SUBADR (nr));
403
+ uint8_t address = readRegister (PCA963X_SUBADR (nr));
362
404
return address;
363
405
}
364
406
365
407
408
+ // ///////////////////////////////////////////////////
409
+ //
410
+ // ALL CALL
411
+ //
366
412
bool PCA9635::enableAllCall ()
367
413
{
368
414
uint8_t prev = getMode1 ();
@@ -394,20 +440,20 @@ bool PCA9635::disableAllCall()
394
440
bool PCA9635::isEnabledAllCall ()
395
441
{
396
442
uint8_t mask = getMode1 ();
397
- return mask & PCA963X_MODE1_ALLCALL;
443
+ return ( mask & PCA963X_MODE1_ALLCALL) > 0 ;
398
444
}
399
445
400
446
401
447
bool PCA9635::setAllCallAddress (uint8_t address)
402
448
{
403
- writeReg (PCA963X_ALLCALLADR, address);
449
+ writeRegister (PCA963X_ALLCALLADR, address);
404
450
return true ;
405
451
}
406
452
407
453
408
454
uint8_t PCA9635::getAllCallAddress ()
409
455
{
410
- uint8_t address = readReg (PCA963X_ALLCALLADR);
456
+ uint8_t address = readRegister (PCA963X_ALLCALLADR);
411
457
return address;
412
458
}
413
459
@@ -485,51 +531,33 @@ int PCA9635::I2C_SoftwareReset(uint8_t method)
485
531
uint8_t PCA9635::writeLedOut (uint8_t reg, uint8_t mask)
486
532
{
487
533
if (reg > 3 ) return PCA963X_ERROR;
488
- writeReg (PCA963X_LEDOUT_BASE + reg, mask);
534
+ writeRegister (PCA963X_LEDOUT_BASE + reg, mask);
489
535
return PCA963X_OK;
490
536
}
491
537
492
538
493
539
uint8_t PCA9635::readLedOut (uint8_t reg)
494
540
{
495
541
if (reg > 3 ) return 0x00 ;
496
- return readReg (PCA963X_LEDOUT_BASE + reg);
542
+ return readRegister (PCA963X_LEDOUT_BASE + reg);
497
543
}
498
544
499
545
500
- // TODO move to right section after testing.
546
+ // ///////////////////////////////////////////////////
547
+ //
548
+ // OBSOLETE
549
+ //
501
550
uint8_t PCA9635::setLedDriverMode (uint8_t mode)
502
551
{
503
- if (mode > 3 ) return PCA963X_ERR_MODE;
504
- uint8_t mask = 0b00000000 ;
505
- switch (mode)
506
- {
507
- case PCA963X_LEDGRPPWM:
508
- mask = 0b11111111 ;
509
- break ;
510
- case PCA963X_LEDPWM:
511
- mask = 0b10101010 ;
512
- break ;
513
- case PCA963X_LEDON:
514
- mask = 0b01010101 ;
515
- break ;
516
- default :
517
- mask = 0b00000000 ;
518
- break ;
519
- }
520
- for (int reg = 0 ; reg < 4 ; reg++)
521
- {
522
- writeLedOut (reg, mask);
523
- }
524
- return PCA963X_OK;
552
+ return setLedDriverModeAll (mode);
525
553
}
526
554
527
555
528
556
// ///////////////////////////////////////////////////
529
557
//
530
558
// PRIVATE
531
559
//
532
- uint8_t PCA9635::writeReg (uint8_t reg, uint8_t value)
560
+ uint8_t PCA9635::writeRegister (uint8_t reg, uint8_t value)
533
561
{
534
562
_wire->beginTransmission (_address);
535
563
_wire->write (reg);
@@ -542,7 +570,7 @@ uint8_t PCA9635::writeReg(uint8_t reg, uint8_t value)
542
570
}
543
571
544
572
545
- uint8_t PCA9635::readReg (uint8_t reg)
573
+ uint8_t PCA9635::readRegister (uint8_t reg)
546
574
{
547
575
_wire->beginTransmission (_address);
548
576
_wire->write (reg);
0 commit comments