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 02:08:39 2013 +0000
Revision:
2:bd6fe6d2948d
Parent:
1:ac1550d65296
Child:
3:f566eea13f49
OK, it seems to be using the second argument, which is in R1.

Who changed what in which revision?

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