Skip to content

Commit 32969fa

Browse files
committed
0.6.1 PCA9635
1 parent f4aa828 commit 32969fa

File tree

11 files changed

+246
-200
lines changed

11 files changed

+246
-200
lines changed

libraries/PCA9635/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88

9+
## [0.6.1] - 2025-05-08
10+
- fix #34, Sync PCA9634 / 32
11+
- rename setLedDriverMode() => setLedDriverModeAll()
12+
- add **writeAll(arr)**
13+
- add **allOff()**
14+
- remove old defines, all are now PCA963X_xxxx
15+
- update readme.md
16+
- update examples
17+
- minor edits
18+
919
## [0.6.0] - 2024-01-18
1020
- fix #32, setLedDriverMode(uint8_t mode)
1121
- minor edits (examples)

libraries/PCA9635/LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2016-2024 Rob Tillaart
3+
Copyright (c) 2016-2025 Rob Tillaart
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

libraries/PCA9635/PCA9635.cpp

Lines changed: 78 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// FILE: PCA9635.cpp
33
// AUTHOR: Rob Tillaart
44
// DATE: 23-apr-2016
5-
// VERSION: 0.6.0
5+
// VERSION: 0.6.1
66
// PURPOSE: Arduino library for PCA9635 I2C LED driver, 16 channel PWM, 8 bit
77
// URL: https://github.com/RobTillaart/PCA9635
88

@@ -75,6 +75,33 @@ uint8_t PCA9635::channelCount()
7575
//
7676
// LED DRIVER MODE
7777
//
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+
78105
uint8_t PCA9635::setLedDriverMode(uint8_t channel, uint8_t mode)
79106
{
80107
if (channel >= _channelCount)
@@ -93,8 +120,8 @@ uint8_t PCA9635::setLedDriverMode(uint8_t channel, uint8_t mode)
93120
uint8_t shift = (channel & 0x03) * 2; // 0,2,4,6 places
94121
uint8_t setmask = mode << shift;
95122
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);
98125
_error = PCA963X_OK;
99126
return _error;
100127
}
@@ -111,7 +138,7 @@ uint8_t PCA9635::getLedDriverMode(uint8_t channel)
111138

112139
uint8_t reg = PCA963X_LEDOUT_BASE + (channel >> 2);
113140
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;
115142
_error = PCA963X_OK;
116143
return value;
117144
}
@@ -125,7 +152,7 @@ uint8_t PCA9635::writeMode(uint8_t reg, uint8_t value)
125152
{
126153
if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
127154
{
128-
writeReg(reg, value);
155+
writeRegister(reg, value);
129156
return PCA963X_OK;
130157
}
131158
_error = PCA963X_ERR_REG;
@@ -139,7 +166,7 @@ uint8_t PCA9635::readMode(uint8_t reg)
139166
if ((reg == PCA963X_MODE1) || (reg == PCA963X_MODE2))
140167
{
141168
_error = PCA963X_OK;
142-
uint8_t value = readReg(reg);
169+
uint8_t value = readRegister(reg);
143170
return value;
144171
}
145172
_error = PCA963X_ERR_REG;
@@ -149,53 +176,55 @@ uint8_t PCA9635::readMode(uint8_t reg)
149176

150177
uint8_t PCA9635::setMode1(uint8_t value)
151178
{
152-
return writeMode(PCA963X_MODE1, value);
179+
writeRegister(PCA963X_MODE1, value);
180+
return PCA963X_OK;
153181
}
154182

155183

156184
uint8_t PCA9635::setMode2(uint8_t value)
157185
{
158-
return writeMode(PCA963X_MODE2, value);
186+
writeRegister(PCA963X_MODE2, value);
187+
return PCA963X_OK;
159188
}
160189

161190

162191
uint8_t PCA9635::getMode1()
163192
{
164-
return readMode(PCA963X_MODE1);
193+
return readRegister(PCA963X_MODE1);
165194
}
166195

167196

168197
uint8_t PCA9635::getMode2()
169198
{
170-
return readMode(PCA963X_MODE2);
199+
return readRegister(PCA963X_MODE2);
171200
}
172201

173202

174203
/////////////////////////////////////////////////////
175204
//
176-
// GROUP PWM
205+
// GROUP REGISTERS
177206
//
178-
void PCA9635::setGroupPWM(uint8_t value)
207+
uint8_t PCA9635::setGroupPWM(uint8_t value)
179208
{
180-
writeReg(PCA963X_GRPPWM, value);
209+
return writeRegister(PCA963X_GRPPWM, value);
181210
}
182211

183212

184213
uint8_t PCA9635::getGroupPWM()
185214
{
186-
return readReg(PCA963X_GRPPWM);
215+
return readRegister(PCA963X_GRPPWM);
187216
}
188217

189218

190-
void PCA9635::setGroupFREQ(uint8_t value)
219+
uint8_t PCA9635::setGroupFREQ(uint8_t value)
191220
{
192-
writeReg(PCA963X_GRPFREQ, value);
221+
return writeRegister(PCA963X_GRPFREQ, value);
193222
}
194223

195224

196225
uint8_t PCA9635::getGroupFREQ()
197226
{
198-
return readReg(PCA963X_GRPFREQ);
227+
return readRegister(PCA963X_GRPFREQ);
199228
}
200229

201230

@@ -246,6 +275,19 @@ uint8_t PCA9635::writeN(uint8_t channel, uint8_t* arr, uint8_t count)
246275
}
247276

248277

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+
249291
uint8_t PCA9635::writeN_noStop(uint8_t channel, uint8_t* arr, uint8_t count)
250292
{
251293
if (channel + count > _channelCount)
@@ -291,7 +333,7 @@ int PCA9635::lastError()
291333

292334
/////////////////////////////////////////////////////
293335
//
294-
// SUB CALL - ALL CALL
336+
// SUB CALL
295337
//
296338
bool PCA9635::enableSubCall(uint8_t nr)
297339
{
@@ -346,7 +388,7 @@ bool PCA9635::setSubCallAddress(uint8_t nr, uint8_t address)
346388
// _error = ?? TODO
347389
return false;
348390
}
349-
writeReg(PCA963X_SUBADR(nr), address);
391+
writeRegister(PCA963X_SUBADR(nr), address);
350392
return true;
351393
}
352394

@@ -358,11 +400,15 @@ uint8_t PCA9635::getSubCallAddress(uint8_t nr)
358400
// _error = ?? TODO
359401
return 0;
360402
}
361-
uint8_t address = readReg(PCA963X_SUBADR(nr));
403+
uint8_t address = readRegister(PCA963X_SUBADR(nr));
362404
return address;
363405
}
364406

365407

408+
/////////////////////////////////////////////////////
409+
//
410+
// ALL CALL
411+
//
366412
bool PCA9635::enableAllCall()
367413
{
368414
uint8_t prev = getMode1();
@@ -394,20 +440,20 @@ bool PCA9635::disableAllCall()
394440
bool PCA9635::isEnabledAllCall()
395441
{
396442
uint8_t mask = getMode1();
397-
return mask & PCA963X_MODE1_ALLCALL;
443+
return (mask & PCA963X_MODE1_ALLCALL) > 0;
398444
}
399445

400446

401447
bool PCA9635::setAllCallAddress(uint8_t address)
402448
{
403-
writeReg(PCA963X_ALLCALLADR, address);
449+
writeRegister(PCA963X_ALLCALLADR, address);
404450
return true;
405451
}
406452

407453

408454
uint8_t PCA9635::getAllCallAddress()
409455
{
410-
uint8_t address = readReg(PCA963X_ALLCALLADR);
456+
uint8_t address = readRegister(PCA963X_ALLCALLADR);
411457
return address;
412458
}
413459

@@ -485,51 +531,33 @@ int PCA9635::I2C_SoftwareReset(uint8_t method)
485531
uint8_t PCA9635::writeLedOut(uint8_t reg, uint8_t mask)
486532
{
487533
if (reg > 3) return PCA963X_ERROR;
488-
writeReg(PCA963X_LEDOUT_BASE + reg, mask);
534+
writeRegister(PCA963X_LEDOUT_BASE + reg, mask);
489535
return PCA963X_OK;
490536
}
491537

492538

493539
uint8_t PCA9635::readLedOut(uint8_t reg)
494540
{
495541
if (reg > 3) return 0x00;
496-
return readReg(PCA963X_LEDOUT_BASE + reg);
542+
return readRegister(PCA963X_LEDOUT_BASE + reg);
497543
}
498544

499545

500-
// TODO move to right section after testing.
546+
/////////////////////////////////////////////////////
547+
//
548+
// OBSOLETE
549+
//
501550
uint8_t PCA9635::setLedDriverMode(uint8_t mode)
502551
{
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);
525553
}
526554

527555

528556
/////////////////////////////////////////////////////
529557
//
530558
// PRIVATE
531559
//
532-
uint8_t PCA9635::writeReg(uint8_t reg, uint8_t value)
560+
uint8_t PCA9635::writeRegister(uint8_t reg, uint8_t value)
533561
{
534562
_wire->beginTransmission(_address);
535563
_wire->write(reg);
@@ -542,7 +570,7 @@ uint8_t PCA9635::writeReg(uint8_t reg, uint8_t value)
542570
}
543571

544572

545-
uint8_t PCA9635::readReg(uint8_t reg)
573+
uint8_t PCA9635::readRegister(uint8_t reg)
546574
{
547575
_wire->beginTransmission(_address);
548576
_wire->write(reg);

0 commit comments

Comments
 (0)