This is an example program for the PololuLedStrip library. It generates a simple moving gradient pattern.

Dependencies:   PololuLedStrip mbed LedStripGradient

Dependents:   LedStripGradient led_phare_crf

For more information, see the PololuLedStrip library.

Committer:
DavidEGrayson
Date:
Tue Feb 26 01:49:34 2013 +0000
Revision:
0:290d713ed3e1
Child:
1:ac1550d65296
This worked for blinking the LED.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DavidEGrayson 0:290d713ed3e1 1 #include "mbed.h"
DavidEGrayson 0:290d713ed3e1 2 #include "gpio_api.h"
DavidEGrayson 0:290d713ed3e1 3
DavidEGrayson 0:290d713ed3e1 4 extern "C" int my_asm(int value);
DavidEGrayson 0:290d713ed3e1 5
DavidEGrayson 0:290d713ed3e1 6 namespace Pololu
DavidEGrayson 0:290d713ed3e1 7 {
DavidEGrayson 0:290d713ed3e1 8 #ifndef _POLOLU_RGB_COLOR
DavidEGrayson 0:290d713ed3e1 9 #define _POLOLU_RGB_COLOR
DavidEGrayson 0:290d713ed3e1 10 typedef struct rgb_color
DavidEGrayson 0:290d713ed3e1 11 {
DavidEGrayson 0:290d713ed3e1 12 uint8_t red, green, blue;
DavidEGrayson 0:290d713ed3e1 13 } rgb_color;
DavidEGrayson 0:290d713ed3e1 14 #endif
DavidEGrayson 0:290d713ed3e1 15
DavidEGrayson 0:290d713ed3e1 16 class PololuLedStrip
DavidEGrayson 0:290d713ed3e1 17 {
DavidEGrayson 0:290d713ed3e1 18 static bool interruptFriendly;
DavidEGrayson 0:290d713ed3e1 19 public:
DavidEGrayson 0:290d713ed3e1 20 gpio_t gpio;
DavidEGrayson 0:290d713ed3e1 21 PololuLedStrip(PinName pin);
DavidEGrayson 0:290d713ed3e1 22 void write(rgb_color *, unsigned int count);
DavidEGrayson 0:290d713ed3e1 23 };
DavidEGrayson 0:290d713ed3e1 24
DavidEGrayson 0:290d713ed3e1 25 bool PololuLedStrip::interruptFriendly;
DavidEGrayson 0:290d713ed3e1 26
DavidEGrayson 0:290d713ed3e1 27 PololuLedStrip::PololuLedStrip(PinName pinName)
DavidEGrayson 0:290d713ed3e1 28 {
DavidEGrayson 0:290d713ed3e1 29 gpio_init(&gpio, pinName, PIN_OUTPUT);
DavidEGrayson 0:290d713ed3e1 30 }
DavidEGrayson 0:290d713ed3e1 31
DavidEGrayson 0:290d713ed3e1 32 void PololuLedStrip::write(rgb_color * colors, unsigned int count)
DavidEGrayson 0:290d713ed3e1 33 {
DavidEGrayson 0:290d713ed3e1 34 uint32_t pinValue = gpio.pin & 0x1F; // Mimicing mbed/libraries/mbed/vendor/NXP/capi/gpio_api.c
DavidEGrayson 0:290d713ed3e1 35
DavidEGrayson 0:290d713ed3e1 36 __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
DavidEGrayson 0:290d713ed3e1 37
DavidEGrayson 0:290d713ed3e1 38 while(count--)
DavidEGrayson 0:290d713ed3e1 39 {
DavidEGrayson 0:290d713ed3e1 40 /**
DavidEGrayson 0:290d713ed3e1 41 // Send a color to the LED strip.
DavidEGrayson 0:290d713ed3e1 42 // The assembly below also increments the 'colors' pointer,
DavidEGrayson 0:290d713ed3e1 43 // it will be pointing to the next color at the end of this loop.
DavidEGrayson 0:290d713ed3e1 44 __ASM volatile(
DavidEGrayson 0:290d713ed3e1 45 "ldr r12, [%0], #3\n" // Read the next color and advance the pointer.
DavidEGrayson 0:290d713ed3e1 46 "rbit r12, r12\n" // Reverse the order of the bits.
DavidEGrayson 0:290d713ed3e1 47 "rev r12, r12\n" // Reverse the order of the bytes.
DavidEGrayson 0:290d713ed3e1 48 "mov r3, #24\n" // Initialize the loop counter register.
DavidEGrayson 0:290d713ed3e1 49
DavidEGrayson 0:290d713ed3e1 50 "send_led_strip_bit%=:\n"
DavidEGrayson 0:290d713ed3e1 51 "str %[val], %[set]\n" // Drive the line high.
DavidEGrayson 0:290d713ed3e1 52 "rrxs r12, r12\n" // Rotate right through carry.
DavidEGrayson 0:290d713ed3e1 53 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 54 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 55 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 56 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 57 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 58 "nop\n"
DavidEGrayson 0:290d713ed3e1 59 "it cc\n" "strcc %[val], %[clear]\n" // If the bit to send is 0, set the line low now.
DavidEGrayson 0:290d713ed3e1 60 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 61 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 62 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 63 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 64 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 65 "it cs\n" "strcs %[val], %[clear]\n" // If the bit to send is 1, set the line low now.
DavidEGrayson 0:290d713ed3e1 66 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 67 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 68 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 69 "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
DavidEGrayson 0:290d713ed3e1 70
DavidEGrayson 0:290d713ed3e1 71 "sub r3, r3, #1\n" // Decrement the loop counter.
DavidEGrayson 0:290d713ed3e1 72 "cbz r3, led_strip_asm_end%=\n" // If we have sent 24 bits, go to the end.
DavidEGrayson 0:290d713ed3e1 73 "b send_led_strip_bit%=\n"
DavidEGrayson 0:290d713ed3e1 74
DavidEGrayson 0:290d713ed3e1 75 "led_strip_asm_end%=:\n"
DavidEGrayson 0:290d713ed3e1 76
DavidEGrayson 0:290d713ed3e1 77 : "=r" (colors)
DavidEGrayson 0:290d713ed3e1 78 : "0" (colors),
DavidEGrayson 0:290d713ed3e1 79 [set] "m" (gpio.reg_set),
DavidEGrayson 0:290d713ed3e1 80 [clear] "m" (gpio.reg_clr),
DavidEGrayson 0:290d713ed3e1 81 [val] "r" (pinValue)
DavidEGrayson 0:290d713ed3e1 82 : "r3", "r12", "cc"
DavidEGrayson 0:290d713ed3e1 83 );**/
DavidEGrayson 0:290d713ed3e1 84
DavidEGrayson 0:290d713ed3e1 85 if (interruptFriendly)
DavidEGrayson 0:290d713ed3e1 86 {
DavidEGrayson 0:290d713ed3e1 87 __enable_irq();
DavidEGrayson 0:290d713ed3e1 88 //asm volatile("nop\n");
DavidEGrayson 0:290d713ed3e1 89 __disable_irq();
DavidEGrayson 0:290d713ed3e1 90 }
DavidEGrayson 0:290d713ed3e1 91 }
DavidEGrayson 0:290d713ed3e1 92 __enable_irq(); // Re-enable interrupts now that we are done.
DavidEGrayson 0:290d713ed3e1 93 //delayMicroseconds(24); // Hold the line low for 24 microseconds to send the reset signal.
DavidEGrayson 0:290d713ed3e1 94 }
DavidEGrayson 0:290d713ed3e1 95
DavidEGrayson 0:290d713ed3e1 96 }
DavidEGrayson 0:290d713ed3e1 97
DavidEGrayson 0:290d713ed3e1 98 using namespace Pololu;
DavidEGrayson 0:290d713ed3e1 99
DavidEGrayson 0:290d713ed3e1 100 DigitalOut myled(LED1);
DavidEGrayson 0:290d713ed3e1 101
DavidEGrayson 0:290d713ed3e1 102 PololuLedStrip ledStrip(p9);
DavidEGrayson 0:290d713ed3e1 103
DavidEGrayson 0:290d713ed3e1 104 int main() {
DavidEGrayson 0:290d713ed3e1 105 while(1) {
DavidEGrayson 0:290d713ed3e1 106 //myled = 1;
DavidEGrayson 0:290d713ed3e1 107 my_asm(1);
DavidEGrayson 0:290d713ed3e1 108 wait(0.2);
DavidEGrayson 0:290d713ed3e1 109 my_asm(0);
DavidEGrayson 0:290d713ed3e1 110 //myled = 0;
DavidEGrayson 0:290d713ed3e1 111 wait(1);
DavidEGrayson 0:290d713ed3e1 112 }
DavidEGrayson 0:290d713ed3e1 113 }