mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.2.0 TLC5917
This commit is contained in:
parent
76bdcc7125
commit
13df84efc4
@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
|
||||||
|
## [0.2.0] - 2024-07-12
|
||||||
|
- fix deviceCount in **write()**.
|
||||||
|
- fix allocation buffer for channels in constructor.
|
||||||
|
- update performance sketch.
|
||||||
|
- add demo_setChannel sketch (array param).
|
||||||
|
- rename blank to **outputEnable**.
|
||||||
|
- update readme.md.
|
||||||
|
- minor edits.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
## [0.1.2] - 2024-06-02
|
## [0.1.2] - 2024-06-02
|
||||||
- add **TLC5917_NORMAL_MODE** and **TLC5917_SPECIAL_MODE**
|
- add **TLC5917_NORMAL_MODE** and **TLC5917_SPECIAL_MODE**
|
||||||
- add **uint8_t getMode()**
|
- add **uint8_t getMode()**
|
||||||
|
@ -21,12 +21,13 @@ TLC5917 is an Arduino library for TLC5917 8-Channel Constant-Current LED Sink Dr
|
|||||||
The **TLC5917** library allows control over the 8 channels (outputs) of a TLC5917 device.
|
The **TLC5917** library allows control over the 8 channels (outputs) of a TLC5917 device.
|
||||||
This library also support more than one device in a daisy chain (see below).
|
This library also support more than one device in a daisy chain (see below).
|
||||||
|
|
||||||
The library allows to set the channels (outputs) individually or a group in one call.
|
The library allows to set the channels (outputs) on/off individually or as a group in one call.
|
||||||
Furthermore it allows to set a current gain for all devices connected.
|
Furthermore it allows to set a current gain for all devices connected.
|
||||||
|
|
||||||
The **TLC5916** is a derived class that is functional identical to the TLC5917 (for now).
|
The **TLC5916** is a derived class that is functional identical to the TLC5917.
|
||||||
When implementation proceeds this might change, the difference is in support for fetching
|
When implementation proceeds this might change, the difference is in support for fetching
|
||||||
the status and error modi. This is not supported by the library
|
the status and error modi. This functionality is not supported by the library yet,
|
||||||
|
so there is no difference between the **TLC5916** and **TLC5917** for now.
|
||||||
|
|
||||||
The library needs more testing with hardware.
|
The library needs more testing with hardware.
|
||||||
Please share your experiences.
|
Please share your experiences.
|
||||||
@ -34,22 +35,30 @@ Please share your experiences.
|
|||||||
(Changes of the interface are definitely possible).
|
(Changes of the interface are definitely possible).
|
||||||
|
|
||||||
|
|
||||||
#### Daisy chaining
|
### Breaking changes
|
||||||
|
|
||||||
This library supports daisy chaining of TLC5917 modules.
|
The 0.2.0 version fixed an internal storage bug which allocated way to much memory
|
||||||
|
in version 0.1.x. So these versions can be considered obsolete.
|
||||||
|
The performance of the library **write()** call improved a lot.
|
||||||
|
|
||||||
|
|
||||||
|
### Daisy chaining
|
||||||
|
|
||||||
|
This library supports daisy chaining of multiple **TLC5917** modules.
|
||||||
A constructor takes the number of devices as parameter and
|
A constructor takes the number of devices as parameter and
|
||||||
an internal buffer is allocated (8 elements per device).
|
an internal buffer is allocated (8 channels per device).
|
||||||
This internal buffer is clocked into the devices with **write()**.
|
This internal buffer is clocked into the devices with the **write()** call.
|
||||||
|
So **setChannel()** calls can be changed until last moment.
|
||||||
|
|
||||||
|
|
||||||
#### Related
|
### Related
|
||||||
|
|
||||||
- https://www.adafruit.com/product/1429
|
- https://www.adafruit.com/product/1429
|
||||||
- https://github.com/RobTillaart/TLC5917
|
- https://github.com/RobTillaart/TLC5917
|
||||||
- https://github.com/RobTillaart/TLC5947
|
- https://github.com/RobTillaart/TLC5947
|
||||||
- https://github.com/RobTillaart/PCA9634 (I2C)
|
- https://github.com/RobTillaart/PCA9634 (I2C, PWM)
|
||||||
- https://github.com/RobTillaart/PCA9635 (I2C)
|
- https://github.com/RobTillaart/PCA9635 (I2C, PWM)
|
||||||
- https://github.com/RobTillaart/PCA9685 (I2C)
|
- https://github.com/RobTillaart/PCA9685 (I2C, PWM)
|
||||||
|
|
||||||
|
|
||||||
## Interface
|
## Interface
|
||||||
@ -58,36 +67,38 @@ This internal buffer is clocked into the devices with **write()**.
|
|||||||
#include TLC5917.h
|
#include TLC5917.h
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Constructor
|
### Constructor
|
||||||
|
|
||||||
- **TLC5917(uint8_t clock, uint8_t data, uint8_t latch, uint8_t blank)** constructor.
|
- **TLC5917(uint8_t clock, uint8_t data, uint8_t latch, uint8_t outputEnable)** constructor.
|
||||||
Single device constructor.
|
Single device constructor.
|
||||||
Defines the pins used for uploading / writing the PWM data to the module.
|
Defines the pins used for uploading / writing the data to the device.
|
||||||
The blank pin is explained in more detail below.
|
The outputEnable pin is explained in more detail below.
|
||||||
- **TLC5917(int deviceCount, uint8_t clock, uint8_t data, uint8_t latch, uint8_t blank)** constructor.
|
- **TLC5917(int deviceCount, uint8_t clock, uint8_t data, uint8_t latch, uint8_t outputEnable)** constructor.
|
||||||
To be used for multiple devices, typical 2 or more.
|
To be used for multiple devices, typical 2 or more.
|
||||||
Defines the pins used for uploading / writing the PWM data to the module.
|
Defines the pins used for uploading / writing the data to the device.
|
||||||
The blank pin is explained in more detail below.
|
The outputEnable pin is explained in more detail below.
|
||||||
- **~TLC5917()** destructor. Frees the allocated memory.
|
- **~TLC5917()** destructor. Frees the allocated memory.
|
||||||
|
|
||||||
#### Base
|
### Base
|
||||||
|
|
||||||
- **bool begin()** set the pinModes of the pins and their initial values.
|
- **bool begin()** set the pinMode of the pins used and their initial values.
|
||||||
The TLC is disabled by default, as the device has random values in its grey-scale register.
|
The TLC5917 is disabled by default, as the device has random values in its register.
|
||||||
One must call **enable()** explicitly.
|
Therefore one must call **enable()** explicitly.
|
||||||
- **int channelCount()** return the amount of channels == 8 x number of devices.
|
- **int channelCount()** return the amount of channels == 8 x number of devices.
|
||||||
|
|
||||||
|
|
||||||
#### Set/Get channels
|
### Set/Get channels
|
||||||
|
|
||||||
- **bool setChannel(uint8_t channel, bool on)** set a channel on or off in the
|
- **bool setChannel(uint8_t channel, bool on)** set a channel on or off in the
|
||||||
internal buffer. The value is not written yet to the device(s).
|
internal buffer. The value is not written immediately to the device(s).
|
||||||
|
One has to call **write()** for that.
|
||||||
- **bool setChannel(uint8_t \* array)** copy a preset of channel settings in one call.
|
- **bool setChannel(uint8_t \* array)** copy a preset of channel settings in one call.
|
||||||
The user has to take care the the size of array holds the right amount of bytes.
|
The user has to take care that the size of array holds the right amount of bytes.
|
||||||
|
Typical amount is deviceCount (or more).
|
||||||
- **bool setAll(bool on)** set all channels on or off.
|
- **bool setAll(bool on)** set all channels on or off.
|
||||||
- **bool getChannel(uint8_t channel)** get current state of a channel in the cached buffer.
|
- **bool getChannel(uint8_t channel)** get current state of a channel from the cached buffer.
|
||||||
- **void write()** writes the whole buffer (deviceCount x 8 values) to the device(s).
|
- **void write()** writes the whole buffer (deviceCount x 8 values) to the device(s).
|
||||||
- **void write(int n)** writes a part of the internal buffer (only **n** values) to the device.
|
- **void write(int channels)** writes a part of the internal buffer (only **channels** values) to the device.
|
||||||
Typical used to speed up if less than max number e.g. only 17 channels are used
|
Typical used to speed up if less than max number e.g. only 17 channels are used
|
||||||
and needs to be updated.
|
and needs to be updated.
|
||||||
**experimental, might have side effects**
|
**experimental, might have side effects**
|
||||||
@ -99,34 +110,41 @@ channels as fast as possible.
|
|||||||
See also **TLC5917_performance.ino** for an indication of time needed.
|
See also **TLC5917_performance.ino** for an indication of time needed.
|
||||||
|
|
||||||
|
|
||||||
#### Blank line TODO CHECK
|
### OutputEnable line
|
||||||
|
|
||||||
The blank pin (OE line) is used to set all channels on or off.
|
The **outputEnable** pin (OE or blank) is used to set all channels on or off.
|
||||||
This allows to "preload" the registers with values and enable them all at once
|
This allows to "preload" the registers with values and enable them all at once
|
||||||
with very precise timing.
|
with very precise timing.
|
||||||
|
|
||||||
Default a TLC device is disabled (by begin), so one should enable it "manually".
|
Default a TLC device is disabled, by **begin()**, so one should enable it "manually".
|
||||||
(P13 datasheet)
|
(P13 datasheet)
|
||||||
|
|
||||||
- **void enable()** all channels reflect last PWM values written.
|
- **void enable()** all channels reflect last values written.
|
||||||
- **void disable()** all channels are off / 0.
|
- **void disable()** all channels are off / 0.
|
||||||
- **bool isEnabled()** returns status of blank line.
|
- **bool isEnabled()** returns status of outputEnable line.
|
||||||
|
|
||||||
The library only supports one **enable() / blank line**. If you want
|
The library only supports one **enable() line**.
|
||||||
a separate **enable()** per device you might need to connect the devices
|
If you want a separate **enable()** per device you might need to connect the devices
|
||||||
"in parallel" instead of "in series" (daisy chained).
|
"in parallel" instead of "in series" (daisy chained).
|
||||||
The blank parameter in the constructor should be set to -1 (out of range value).
|
The outputEnable parameter in the constructor should be set to -1 (out of range value).
|
||||||
|
|
||||||
It might be possible to use a PWM pin on the OE line to dim the LEDS.
|
#### PWM
|
||||||
This is neither tested or supported by the library.
|
|
||||||
|
It might be possible to use a PWM pin on the **outputEnable** line to dim the LEDS.
|
||||||
|
This is neither tested nor supported by the library.
|
||||||
|
Note that writing to the TLC5917 needs a HIGH **outputEnable** so the PWM value needs
|
||||||
|
to be set again.
|
||||||
|
|
||||||
|
|
||||||
#### Configure gain
|
### Configure gain
|
||||||
|
|
||||||
See datasheet page 23 for details.
|
See datasheet page 23 for details.
|
||||||
|
|
||||||
- **void setNormalMode()** to send the data for the LEDS.
|
- **void setNormalMode()** switch to normal mode (default) to send the data for the IO pins.
|
||||||
- **void setSpecialMode()** to configure the gain.
|
- **void setSpecialMode()** switch to special mode to configure the gain.
|
||||||
|
|
||||||
|
Note that calling **setSpecialMode()** and **setNormalMode()** disables the output.
|
||||||
|
So one should enable it again if one wants to.
|
||||||
|
|
||||||
|
|
||||||
The special mode needs to be set for the following functions:
|
The special mode needs to be set for the following functions:
|
||||||
@ -176,7 +194,41 @@ Actual current depends on Rext == external resistor (see datasheet).
|
|||||||
|
|
||||||
## Performance
|
## Performance
|
||||||
|
|
||||||
See **TLC5917_performance.ino** for an indicative test.
|
Based upon **TLC5917_performance.ino** for an indicative test.
|
||||||
|
and issue #9 for the LGT8F328 data
|
||||||
|
|
||||||
|
Timing in microseconds, 800 channels = 100 devices.
|
||||||
|
|
||||||
|
| Version | Function | UNO 1.8.19 | LGT8F328 | other |
|
||||||
|
|:-------:|:-----------------|:----------:|:--------:|:--------:|
|
||||||
|
| 0.2.0 | SETCHANNEL TRUE | 2572 | 1152 |
|
||||||
|
| 0.2.0 | SETCHANNEL FALSE | 2840 | 1296 |
|
||||||
|
| 0.2.0 | SETALL TRUE | 236 | 108 |
|
||||||
|
| 0.2.0 | SETALL FALSE | 232 | - |
|
||||||
|
| 0.2.0 | WRITE optimized | 1772 | - |
|
||||||
|
| 0.2.0 | WRITE normal | 9420 | - |
|
||||||
|
|
||||||
|
_The "WRITE optimized" is AVR only._
|
||||||
|
|
||||||
|
So setting and writing 8 channels (e.g. a single 7 segment display) takes
|
||||||
|
28.40 + 17.72 = 46.12 < 50 microseconds.
|
||||||
|
So in theory an UNO could update it roughly 20K times per second.
|
||||||
|
|
||||||
|
|
||||||
|
## Hardware SPI
|
||||||
|
|
||||||
|
First investigations show that **write()** could be a hardware SPI transaction.
|
||||||
|
However the **setNormalMode()**, **setSpecialMode()** and especially the
|
||||||
|
**writeConfiguration()** function are no standard 8 bit SPI transactions.
|
||||||
|
This of course includes the **gain** functions that use these.
|
||||||
|
To solve this one still has to provide the CLOCK, LATCH and OUTPUT ENABLE pins.
|
||||||
|
Especially the CLOCK pin is part of the SPI pins, and it would depend on the
|
||||||
|
board and optional number of HW SPI ports of the board.
|
||||||
|
To prevent this complexity the library does not have a hardware SPI constructor.
|
||||||
|
|
||||||
|
It looks like it is possible to create a simplified class (stripped version)
|
||||||
|
without the gain control that might work well with HW SPI for many application.
|
||||||
|
The added value is however limited as the (optimized) SW is pretty fast already.
|
||||||
|
|
||||||
|
|
||||||
## Future
|
## Future
|
||||||
@ -184,29 +236,31 @@ See **TLC5917_performance.ino** for an indicative test.
|
|||||||
#### Must
|
#### Must
|
||||||
|
|
||||||
- update documentation
|
- update documentation
|
||||||
- buy hardware
|
- do hardware test test test ...
|
||||||
- test test test
|
|
||||||
|
|
||||||
#### Should
|
#### Should
|
||||||
|
|
||||||
- investigate daisy chaining. (hardware needed).
|
- investigate daisy chaining. (extra hardware needed).
|
||||||
- max CLOCK speed when chained (50% DutyCycle)
|
- max CLOCK speed when chained (50% DutyCycle)
|
||||||
- what is clock in practice (e.g. an ESP32 240 MHz)
|
- what is clock in practice (e.g. an ESP32 240 MHz)
|
||||||
- now the CurrentGain is set to the same value for all devices.
|
- now the CurrentGain is set to the same value for all devices.
|
||||||
- needs array, one value (uint8_t or float) per device, investigate.
|
- needs array, one value (uint8_t) per device, investigate.
|
||||||
|
|
||||||
#### Could
|
#### Could
|
||||||
|
|
||||||
- **index operator []** to get set channels, might be better?
|
- **index operator []** to get set channels, might be better?
|
||||||
- reading error codes from SDO
|
- reading error codes from SDO
|
||||||
|
- do brightness test with analogWrite(OE, value);
|
||||||
|
- it would be mandatory to have OE be a PWM pin.
|
||||||
|
|
||||||
#### Wont (unless needed)
|
#### Wont (unless needed)
|
||||||
|
|
||||||
- **void getChannel(uint8_t array)** fill an array with current data.
|
- redo constructor,
|
||||||
|
- move deviceCount to last place with default = 1 (one constructor less).
|
||||||
|
- **void getChannel(uint8_t \* array)** fill an array with current data.
|
||||||
- error handling in special mode
|
- error handling in special mode
|
||||||
- over-temperature, open-load, short to GND, short to VLED (5917 only).
|
- over-temperature, open-load, short to GND, short to VLED (TLC5917 only).
|
||||||
- investigate if hardware SPI is possible
|
- implement hardware SPI, see above.
|
||||||
- which mode?
|
|
||||||
|
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//
|
//
|
||||||
// FILE: TLC5917.cpp
|
// FILE: TLC5917.cpp
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.1.2
|
// VERSION: 0.2.0
|
||||||
// DATE: 2024-03-17
|
// DATE: 2024-03-17
|
||||||
// PURPOSE: Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
// PURPOSE: Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
||||||
// URL: https://github.com/RobTillaart/TLC5917
|
// URL: https://github.com/RobTillaart/TLC5917
|
||||||
@ -25,7 +25,7 @@ TLC5917::TLC5917(int deviceCount, uint8_t clock, uint8_t data, uint8_t LE, uint8
|
|||||||
_le = LE;
|
_le = LE;
|
||||||
_oe = OE;
|
_oe = OE;
|
||||||
_mode = TLC5917_NORMAL_MODE;
|
_mode = TLC5917_NORMAL_MODE;
|
||||||
_buffer = (uint8_t *) calloc(_channelCount, sizeof(uint8_t));
|
_buffer = (uint8_t *) calloc(deviceCount, sizeof(uint8_t));
|
||||||
_configuration = 0xFF; // page 23 datasheet
|
_configuration = 0xFF; // page 23 datasheet
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,10 +108,10 @@ void TLC5917::write()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TLC5917::write(int chan)
|
void TLC5917::write(int channels)
|
||||||
{
|
{
|
||||||
if (chan > _channelCount) chan = _channelCount;
|
if (channels < 0) return;
|
||||||
if (chan < 0) return;
|
int devices = (channels > _channelCount) ? _channelCount / 8 : channels / 8;
|
||||||
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
|
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
|
||||||
@ -127,11 +127,11 @@ void TLC5917::write(int chan)
|
|||||||
uint8_t cbmask1 = digitalPinToBitMask(_clock);
|
uint8_t cbmask1 = digitalPinToBitMask(_clock);
|
||||||
uint8_t cbmask2 = ~cbmask1;
|
uint8_t cbmask2 = ~cbmask1;
|
||||||
|
|
||||||
for (int channel = chan - 1; channel >= 0; channel--)
|
for (int dev = devices - 1; dev >= 0; dev--)
|
||||||
{
|
{
|
||||||
for (uint8_t mask = 0x80; mask; mask >>= 1)
|
for (uint8_t mask = 0x80; mask; mask >>= 1)
|
||||||
{
|
{
|
||||||
if (_buffer[channel] & mask)
|
if (_buffer[dev] & mask)
|
||||||
{
|
{
|
||||||
*_dataOutRegister |= outmask1; // digitalWrite(_dat, HIGH);
|
*_dataOutRegister |= outmask1; // digitalWrite(_dat, HIGH);
|
||||||
}
|
}
|
||||||
@ -146,17 +146,17 @@ void TLC5917::write(int chan)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// also write when blank == LOW
|
// also write when outputEnable == LOW
|
||||||
// to "preload the registers"
|
// to "preload the registers"
|
||||||
// local variables to maximize speed.
|
// local variables to maximize speed.
|
||||||
uint8_t _clk = _clock;
|
uint8_t _clk = _clock;
|
||||||
uint8_t _dat = _data;
|
uint8_t _dat = _data;
|
||||||
|
|
||||||
for (int channel = chan - 1; channel >= 0; channel--)
|
for (int dev = devices - 1; dev >= 0; dev--)
|
||||||
{
|
{
|
||||||
for (uint8_t mask = 0x80; mask; mask >>= 1)
|
for (uint8_t mask = 0x80; mask; mask >>= 1)
|
||||||
{
|
{
|
||||||
digitalWrite(_dat, _buffer[channel] & mask ? HIGH : LOW);
|
digitalWrite(_dat, _buffer[dev] & mask ? HIGH : LOW);
|
||||||
digitalWrite(_clk, HIGH);
|
digitalWrite(_clk, HIGH);
|
||||||
digitalWrite(_clk, LOW);
|
digitalWrite(_clk, LOW);
|
||||||
}
|
}
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
//
|
//
|
||||||
// FILE: TLC5917.h
|
// FILE: TLC5917.h
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// VERSION: 0.1.2
|
// VERSION: 0.2.0
|
||||||
// DATE: 2024-03-17
|
// DATE: 2024-03-17
|
||||||
// PURPOSE: Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
// PURPOSE: Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
||||||
// URL: https://github.com/RobTillaart/TLC5917
|
// URL: https://github.com/RobTillaart/TLC5917
|
||||||
|
|
||||||
|
|
||||||
#define TLC5917_LIB_VERSION (F("0.1.2"))
|
#define TLC5917_LIB_VERSION (F("0.2.0"))
|
||||||
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
@ -39,8 +39,11 @@ class TLC5917
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// single device constructor
|
// single device constructor
|
||||||
|
// LE = Latch Enable
|
||||||
|
// OE = Output Enable
|
||||||
TLC5917(uint8_t clock, uint8_t data, uint8_t LE, uint8_t OE);
|
TLC5917(uint8_t clock, uint8_t data, uint8_t LE, uint8_t OE);
|
||||||
// multi device constructor - for daisy chaining)
|
// multi device constructor
|
||||||
|
// - for daisy chaining
|
||||||
TLC5917(int deviceCount, uint8_t clock, uint8_t data, uint8_t LE, uint8_t OE);
|
TLC5917(int deviceCount, uint8_t clock, uint8_t data, uint8_t LE, uint8_t OE);
|
||||||
virtual ~TLC5917();
|
virtual ~TLC5917();
|
||||||
|
|
||||||
@ -49,15 +52,16 @@ public:
|
|||||||
|
|
||||||
bool setChannel(uint8_t channel, bool on);
|
bool setChannel(uint8_t channel, bool on);
|
||||||
// size array must be equal or larger than deviceCount.
|
// size array must be equal or larger than deviceCount.
|
||||||
|
// one bit per channel.
|
||||||
bool setChannel(uint8_t * array);
|
bool setChannel(uint8_t * array);
|
||||||
bool setAll(bool on);
|
bool setAll(bool on);
|
||||||
bool getChannel(uint8_t channel);
|
bool getChannel(uint8_t channel);
|
||||||
|
|
||||||
// write the buffer to the TLC5917 device(s).
|
// write the internal buffer to the TLC5917 device(s).
|
||||||
void write(int n);
|
void write(int channels);
|
||||||
void write();
|
void write();
|
||||||
|
|
||||||
// control the blank (OE) line.
|
// control the outputEnable (OE) line.
|
||||||
void enable();
|
void enable();
|
||||||
void disable();
|
void disable();
|
||||||
bool isEnabled(); // returns status
|
bool isEnabled(); // returns status
|
||||||
|
@ -8,13 +8,13 @@
|
|||||||
#include "TLC5917.h"
|
#include "TLC5917.h"
|
||||||
|
|
||||||
|
|
||||||
int DEVICES = 1;
|
const int DEVICES = 1;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LATCH = 11;
|
const int LATCH = 11;
|
||||||
const int BLANK = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, BLANK);
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
@ -8,13 +8,13 @@
|
|||||||
#include "TLC5917.h"
|
#include "TLC5917.h"
|
||||||
|
|
||||||
|
|
||||||
const int DEVICES = 2;
|
const int DEVICES = 1;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LE = 11;
|
const int LATCH = 11;
|
||||||
const int OE = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5917 tlc(DEVICES, CLOCK, DATA, LE, OE);
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@ -37,20 +37,29 @@ void setup()
|
|||||||
Serial.println(tlc.channelCount());
|
Serial.println(tlc.channelCount());
|
||||||
|
|
||||||
tlc.enable();
|
tlc.enable();
|
||||||
|
|
||||||
for (int ch = 0; ch < tlc.channelCount(); ch++)
|
|
||||||
{
|
|
||||||
tlc.setChannel(ch, true);
|
|
||||||
tlc.write();
|
|
||||||
delay(100);
|
|
||||||
tlc.setChannel(ch, false);
|
|
||||||
}
|
|
||||||
tlc.write();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
Serial.println("ON");
|
||||||
|
for (int ch = 0; ch < tlc.channelCount(); ch++)
|
||||||
|
{
|
||||||
|
Serial.println(ch);
|
||||||
|
tlc.setChannel(ch, true);
|
||||||
|
tlc.write();
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("OFF");
|
||||||
|
|
||||||
|
for (int ch = 0; ch < tlc.channelCount(); ch++)
|
||||||
|
{
|
||||||
|
Serial.println(ch);
|
||||||
|
tlc.setChannel(ch, false);
|
||||||
|
tlc.write();
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// PURPOSE: demo writeConfiguration() to set gain.
|
// PURPOSE: demo writeConfiguration() to set gain.
|
||||||
// URL: https://github.com/RobTillaart/TLC5917
|
// URL: https://github.com/RobTillaart/TLC5917
|
||||||
|
//
|
||||||
|
// needs investigation.
|
||||||
|
|
||||||
#include "TLC5917.h"
|
#include "TLC5917.h"
|
||||||
|
|
||||||
@ -11,10 +12,10 @@
|
|||||||
const int DEVICES = 1;
|
const int DEVICES = 1;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LE = 11;
|
const int LATCH = 11;
|
||||||
const int OE = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5917 tlc(DEVICES, CLOCK, DATA, LE, OE);
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@ -34,53 +35,57 @@ void setup()
|
|||||||
Serial.print("Channels: ");
|
Serial.print("Channels: ");
|
||||||
Serial.println(tlc.channelCount());
|
Serial.println(tlc.channelCount());
|
||||||
|
|
||||||
|
// set gain level
|
||||||
|
tlc.setSpecialMode();
|
||||||
|
tlc.writeConfiguration(255);
|
||||||
|
|
||||||
// set all leds ON
|
// set all leds ON
|
||||||
|
tlc.setNormalMode();
|
||||||
tlc.enable();
|
tlc.enable();
|
||||||
|
|
||||||
for (int ch = 0; ch < tlc.channelCount(); ch++)
|
for (int ch = 0; ch < tlc.channelCount(); ch++)
|
||||||
{
|
{
|
||||||
tlc.setChannel(ch, true);
|
tlc.setChannel(ch, true);
|
||||||
}
|
}
|
||||||
tlc.write();
|
tlc.write();
|
||||||
|
delay(1000);
|
||||||
|
|
||||||
Serial.print("MODE:\t");
|
Serial.print("MODE:\t");
|
||||||
Serial.println(tlc.getMode());
|
Serial.println(tlc.getMode());
|
||||||
tlc.setSpecialMode();
|
tlc.setSpecialMode();
|
||||||
Serial.print("MODE:\t");
|
Serial.print("MODE:\t");
|
||||||
Serial.println(tlc.getMode());
|
Serial.println(tlc.getMode());
|
||||||
|
|
||||||
uint32_t start = millis();
|
uint32_t start = millis();
|
||||||
for (int conf = 0; conf < 256; conf++)
|
for (int conf = 0; conf < 256; conf++)
|
||||||
{
|
{
|
||||||
tlc.writeConfiguration(conf);
|
tlc.writeConfiguration(conf);
|
||||||
delay(100);
|
|
||||||
}
|
}
|
||||||
uint32_t stop = millis();
|
uint32_t stop = millis();
|
||||||
tlc.setNormalMode();
|
|
||||||
Serial.print("TIME:\t");
|
Serial.print("TIME:\t");
|
||||||
Serial.println(stop - start);
|
Serial.println(stop - start);
|
||||||
Serial.print("MODE:\t");
|
Serial.print("MODE:\t");
|
||||||
Serial.println(tlc.getMode());
|
Serial.println(tlc.getMode());
|
||||||
|
|
||||||
Serial.println("\ndone...");
|
Serial.println("25%");
|
||||||
|
tlc.writeConfiguration(0); // very low.
|
||||||
|
tlc.setNormalMode();
|
||||||
|
tlc.enable();
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
tlc.setSpecialMode();
|
tlc.setSpecialMode();
|
||||||
|
tlc.writeConfiguration(255); // MAX!
|
||||||
|
tlc.setNormalMode();
|
||||||
|
tlc.enable();
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
Serial.println("\ndone...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
// increase gain
|
|
||||||
for (int conf = 0; conf < 256; conf++)
|
|
||||||
{
|
|
||||||
tlc.writeConfiguration(conf);
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
// decrease gain
|
|
||||||
for (int conf = 255; conf > 0; conf--)
|
|
||||||
{
|
|
||||||
tlc.writeConfiguration(conf);
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
//
|
||||||
|
// FILE: TLC5917_demo_setChannel.ino
|
||||||
|
// AUTHOR: Rob Tillaart
|
||||||
|
// PURPOSE: demo basic usage
|
||||||
|
// URL: https://github.com/RobTillaart/TLC5917
|
||||||
|
|
||||||
|
|
||||||
|
#include "TLC5917.h"
|
||||||
|
|
||||||
|
|
||||||
|
const int DEVICES = 1;
|
||||||
|
const int CLOCK = 13;
|
||||||
|
const int DATA = 12;
|
||||||
|
const int LATCH = 11;
|
||||||
|
const int ENABLE = 10;
|
||||||
|
|
||||||
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println(__FILE__);
|
||||||
|
Serial.print("TLC5917_LIB_VERSION: \t");
|
||||||
|
Serial.println(TLC5917_LIB_VERSION);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.println(sizeof(tlc));
|
||||||
|
|
||||||
|
if (tlc.begin() == false)
|
||||||
|
{
|
||||||
|
Serial.println("error");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("Channels: ");
|
||||||
|
Serial.println(tlc.channelCount());
|
||||||
|
|
||||||
|
tlc.enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
uint8_t arr[DEVICES];
|
||||||
|
for (int idx = 0; idx < DEVICES; idx++)
|
||||||
|
{
|
||||||
|
arr[idx] = random(256);
|
||||||
|
}
|
||||||
|
tlc.setChannel(arr);
|
||||||
|
tlc.write();
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -- END OF FILE --
|
@ -12,10 +12,10 @@
|
|||||||
const int DEVICES = 1;
|
const int DEVICES = 1;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LE = 11;
|
const int LATCH = 11;
|
||||||
const int OE = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5917 tlc(DEVICES, CLOCK, DATA, LE, OE);
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
@ -7,13 +7,14 @@
|
|||||||
|
|
||||||
#include "TLC5917.h"
|
#include "TLC5917.h"
|
||||||
|
|
||||||
|
|
||||||
const int DEVICES = 100;
|
const int DEVICES = 100;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LATCH = 11;
|
const int LATCH = 11;
|
||||||
const int BLANK = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5916 tlc(DEVICES, CLOCK, DATA, LATCH, BLANK);
|
TLC5916 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
uint32_t start, stop;
|
uint32_t start, stop;
|
||||||
|
|
||||||
@ -24,6 +25,7 @@ void setup()
|
|||||||
Serial.println(__FILE__);
|
Serial.println(__FILE__);
|
||||||
Serial.print("TLC5917_LIB_VERSION: \t");
|
Serial.print("TLC5917_LIB_VERSION: \t");
|
||||||
Serial.println(TLC5917_LIB_VERSION);
|
Serial.println(TLC5917_LIB_VERSION);
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
if (tlc.begin() == false)
|
if (tlc.begin() == false)
|
||||||
{
|
{
|
||||||
@ -60,6 +62,7 @@ void testSetChannel()
|
|||||||
stop = micros();
|
stop = micros();
|
||||||
Serial.print("SETCHANNEL TRUE:\t");
|
Serial.print("SETCHANNEL TRUE:\t");
|
||||||
Serial.println(stop - start);
|
Serial.println(stop - start);
|
||||||
|
tlc.write();
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
start = micros();
|
start = micros();
|
||||||
@ -70,6 +73,7 @@ void testSetChannel()
|
|||||||
stop = micros();
|
stop = micros();
|
||||||
Serial.print("SETCHANNEL FALSE:\t");
|
Serial.print("SETCHANNEL FALSE:\t");
|
||||||
Serial.println(stop - start);
|
Serial.println(stop - start);
|
||||||
|
tlc.write();
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
start = micros();
|
start = micros();
|
||||||
@ -77,6 +81,15 @@ void testSetChannel()
|
|||||||
stop = micros();
|
stop = micros();
|
||||||
Serial.print("SETALL TRUE:\t\t");
|
Serial.print("SETALL TRUE:\t\t");
|
||||||
Serial.println(stop - start);
|
Serial.println(stop - start);
|
||||||
|
tlc.write();
|
||||||
|
delay(100);
|
||||||
|
|
||||||
|
start = micros();
|
||||||
|
tlc.setAll(false);
|
||||||
|
stop = micros();
|
||||||
|
Serial.print("SETALL FALSE:\t\t");
|
||||||
|
Serial.println(stop - start);
|
||||||
|
tlc.write();
|
||||||
delay(100);
|
delay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,6 +102,7 @@ void testWrite()
|
|||||||
stop = micros();
|
stop = micros();
|
||||||
Serial.print("WRITE:\t\t\t");
|
Serial.print("WRITE:\t\t\t");
|
||||||
Serial.println(stop - start);
|
Serial.println(stop - start);
|
||||||
|
delay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
Arduino UNO
|
||||||
|
IDE: 1.8.19
|
||||||
|
|
||||||
|
(AVR optimized write() on UNO)
|
||||||
|
TLC5917_performance\TLC5917_performance.ino
|
||||||
|
TLC5917_LIB_VERSION: 0.2.0
|
||||||
|
|
||||||
|
Channels: 800
|
||||||
|
SETCHANNEL TRUE: 2572
|
||||||
|
SETCHANNEL FALSE: 2840
|
||||||
|
SETALL TRUE: 236
|
||||||
|
SETALL FALSE: 232
|
||||||
|
WRITE: 1772
|
||||||
|
|
||||||
|
Done...
|
||||||
|
|
||||||
|
|
||||||
|
(default write() on UNO for reference)
|
||||||
|
TLC5917_LIB_VERSION: 0.1.3
|
||||||
|
|
||||||
|
Channels: 800
|
||||||
|
SETCHANNEL TRUE: 2572
|
||||||
|
SETCHANNEL FALSE: 2848
|
||||||
|
SETALL TRUE: 236
|
||||||
|
SETALL FALSE: 232
|
||||||
|
WRITE: 9420
|
||||||
|
|
||||||
|
Done...
|
||||||
|
|
@ -11,10 +11,10 @@
|
|||||||
const int DEVICES = 1;
|
const int DEVICES = 1;
|
||||||
const int CLOCK = 13;
|
const int CLOCK = 13;
|
||||||
const int DATA = 12;
|
const int DATA = 12;
|
||||||
const int LE = 11;
|
const int LATCH = 11;
|
||||||
const int OE = 10;
|
const int ENABLE = 10;
|
||||||
|
|
||||||
TLC5917 tlc(DEVICES, CLOCK, DATA, LE, OE);
|
TLC5917 tlc(DEVICES, CLOCK, DATA, LATCH, ENABLE);
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/RobTillaart/TLC5917.git"
|
"url": "https://github.com/RobTillaart/TLC5917.git"
|
||||||
},
|
},
|
||||||
"version": "0.1.2",
|
"version": "0.2.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"frameworks": "*",
|
"frameworks": "*",
|
||||||
"platforms": "*",
|
"platforms": "*",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name=TLC5917
|
name=TLC5917
|
||||||
version=0.1.2
|
version=0.2.0
|
||||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||||
sentence=Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
sentence=Arduino library for TLC5917 8-Channel Constant-Current LED Sink Drivers.
|
||||||
|
Loading…
Reference in New Issue
Block a user