From acfd46aa60f27c8a2e4025e452f8ed5650fdc44f Mon Sep 17 00:00:00 2001 From: Michael Killough Date: Sun, 16 Aug 2020 12:19:32 +0100 Subject: [PATCH] Fix full on/off in pca9685. It's currently not possible to toggle between full off and full on, as switching to full on leaves the full off control bit set. The full off control bit takes precedence according to the datasheet, which means the signal remains off. The 'normal' branch does correctly clear full off/full on, as it writes 0s to the `LEDn_ON` registers unconditionally and writes 0 to the control bit in `LEDn_OFF`. --- extras/pca9685/pca9685.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extras/pca9685/pca9685.c b/extras/pca9685/pca9685.c index b115170..8b8605a 100644 --- a/extras/pca9685/pca9685.c +++ b/extras/pca9685/pca9685.c @@ -185,6 +185,7 @@ void pca9685_set_pwm_value(i2c_dev_t *dev, uint8_t channel, uint16_t val) if (val == 0) { // Full off + // Takes precedence over full on. write_reg(dev, reg + OFFS_REG_LED_OFF, LED_FULL_ON_OFF); } else if (val < 4096) @@ -195,6 +196,8 @@ void pca9685_set_pwm_value(i2c_dev_t *dev, uint8_t channel, uint16_t val) } else { + // Clear full off, as it takes precedence over full on. + write_reg(dev, reg + OFFS_REG_LED_OFF, 0); // Full on write_reg(dev, reg + OFFS_REG_LED_ON, LED_FULL_ON_OFF); }