This library lets you control the addressable RGB LED strips from Pololu Robotics. Forked to add selectable colour order (Support RGB or GRB Leds)

Fork of PololuLedStrip by David Grayson

Committer:
DavidEGrayson
Date:
Thu Sep 08 23:14:02 2016 +0000
Revision:
22:5368af3ff07d
Parent:
19:46d7ab0ba3e7
Child:
23:881d93b8749a
Updated the mbed library and fixed an incorrect assembly instruction.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DavidEGrayson 1:102307d9b701 1 #include "PololuLedStrip.h"
DavidEGrayson 1:102307d9b701 2
DavidEGrayson 1:102307d9b701 3 bool PololuLedStrip::interruptFriendly = false;
DavidEGrayson 1:102307d9b701 4
DavidEGrayson 19:46d7ab0ba3e7 5 // The two timed delays, in units of half-cycles.
DavidEGrayson 19:46d7ab0ba3e7 6 uint8_t led_strip_write_delays[2];
DavidEGrayson 4:d3b60bd43811 7
DavidEGrayson 7:9a088f042ee0 8 void PololuLedStrip::calculateDelays()
DavidEGrayson 7:9a088f042ee0 9 {
DavidEGrayson 15:d69eebdee025 10 int f_mhz = SystemCoreClock / 1000000; // Clock frequency in MHz.
DavidEGrayson 14:672baf3cf941 11
DavidEGrayson 14:672baf3cf941 12 if (f_mhz <= 48)
DavidEGrayson 14:672baf3cf941 13 {
DavidEGrayson 19:46d7ab0ba3e7 14 // The delays below result in 360/1120 ns pulses and a 1880 ns period on the mbed NXP LPC11U24.
DavidEGrayson 14:672baf3cf941 15 led_strip_write_delays[0] = 0;
DavidEGrayson 14:672baf3cf941 16 led_strip_write_delays[1] = 0;
DavidEGrayson 14:672baf3cf941 17 }
DavidEGrayson 14:672baf3cf941 18 else
DavidEGrayson 14:672baf3cf941 19 {
DavidEGrayson 22:5368af3ff07d 20 // Try to generally compute what the delays should be for a wide range of clock frequencies.
DavidEGrayson 14:672baf3cf941 21
DavidEGrayson 14:672baf3cf941 22 // The fudge factors below were experimentally chosen so that we would have
DavidEGrayson 19:46d7ab0ba3e7 23 // ~100/840 ns pulses and a ~1430 ns period on the mbed NXP LPC1768 (96 MHz Cortex-M3).
DavidEGrayson 17:91fb934a2166 24 // There seem to be some ~100 ns inconsistencies in the timing depending on which example program is
DavidEGrayson 17:91fb934a2166 25 // running; the most likely explanation is some kind of flash caching that affects the timing.
DavidEGrayson 14:672baf3cf941 26 // If you ever change these numbers, it is important to check the the subtractions below
DavidEGrayson 19:46d7ab0ba3e7 27 // will not overflow in the worst case (smallest possible f_mhz).
DavidEGrayson 19:46d7ab0ba3e7 28 led_strip_write_delays[0] = 750*f_mhz/1000 - 33;
DavidEGrayson 19:46d7ab0ba3e7 29 led_strip_write_delays[1] = 550*f_mhz/1000 - 20;
DavidEGrayson 15:d69eebdee025 30 }
DavidEGrayson 15:d69eebdee025 31
DavidEGrayson 15:d69eebdee025 32 // Convert from units of cycles to units of half-cycles; it makes the assembly faster.
DavidEGrayson 22:5368af3ff07d 33 led_strip_write_delays[0] <<= 1;
DavidEGrayson 22:5368af3ff07d 34 led_strip_write_delays[1] <<= 1;
DavidEGrayson 7:9a088f042ee0 35 }
DavidEGrayson 6:9d0530b7dae2 36
DavidEGrayson 1:102307d9b701 37 PololuLedStrip::PololuLedStrip(PinName pinName)
DavidEGrayson 1:102307d9b701 38 {
DavidEGrayson 22:5368af3ff07d 39 gpio_init_out(&gpio, pinName);
DavidEGrayson 1:102307d9b701 40 }
DavidEGrayson 1:102307d9b701 41
DavidEGrayson 1:102307d9b701 42 void PololuLedStrip::write(rgb_color * colors, unsigned int count)
DavidEGrayson 1:102307d9b701 43 {
DavidEGrayson 8:1578776ceac5 44 calculateDelays();
DavidEGrayson 8:1578776ceac5 45
DavidEGrayson 1:102307d9b701 46 __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
DavidEGrayson 7:9a088f042ee0 47
DavidEGrayson 1:102307d9b701 48 while(count--)
DavidEGrayson 1:102307d9b701 49 {
DavidEGrayson 9:6ffb85d69eaf 50 led_strip_write_color(colors, gpio.reg_set, gpio.reg_clr, gpio.mask);
DavidEGrayson 9:6ffb85d69eaf 51 colors++;
DavidEGrayson 9:6ffb85d69eaf 52
DavidEGrayson 1:102307d9b701 53 if (interruptFriendly)
DavidEGrayson 1:102307d9b701 54 {
DavidEGrayson 1:102307d9b701 55 __enable_irq();
DavidEGrayson 1:102307d9b701 56 __nop();
DavidEGrayson 1:102307d9b701 57 __nop();
DavidEGrayson 1:102307d9b701 58 __nop();
DavidEGrayson 1:102307d9b701 59 __disable_irq();
DavidEGrayson 1:102307d9b701 60 }
DavidEGrayson 1:102307d9b701 61 }
DavidEGrayson 1:102307d9b701 62
DavidEGrayson 1:102307d9b701 63 __enable_irq(); // Re-enable interrupts now that we are done.
DavidEGrayson 1:102307d9b701 64 wait_us(24); // Hold the line low for 24 microseconds to send the reset signal.
DavidEGrayson 9:6ffb85d69eaf 65
DavidEGrayson 9:6ffb85d69eaf 66 //*(gpio.reg_set) = gpio.mask;
DavidEGrayson 9:6ffb85d69eaf 67 //*(gpio.reg_clr) = gpio.mask;
DavidEGrayson 9:6ffb85d69eaf 68
DavidEGrayson 1:102307d9b701 69 }