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.

main.cpp

Committer:
DavidEGrayson
Date:
2013-02-26
Revision:
2:bd6fe6d2948d
Parent:
1:ac1550d65296
Child:
3:f566eea13f49

File content as of revision 2:bd6fe6d2948d:

#include "mbed.h"
#include "gpio_api.h"

//extern "C" int my_asm(volatile uint32_t * set, int value);
extern "C" int my_asm(int x, int value);

namespace Pololu
{
  #ifndef _POLOLU_RGB_COLOR
  #define _POLOLU_RGB_COLOR
  typedef struct rgb_color
  {
    uint8_t red, green, blue;
  } rgb_color;
  #endif

  class PololuLedStrip
  {
    static bool interruptFriendly;
    public:
    gpio_t gpio;
    PololuLedStrip(PinName pin);
    void write(rgb_color *, unsigned int count);
  };

  bool PololuLedStrip::interruptFriendly;

  PololuLedStrip::PololuLedStrip(PinName pinName)
  {
    gpio_init(&gpio, pinName, PIN_OUTPUT);
  }

  void PololuLedStrip::write(rgb_color * colors, unsigned int count)
  {
    uint32_t pinValue = gpio.pin & 0x1F;  // Mimicing mbed/libraries/mbed/vendor/NXP/capi/gpio_api.c
    
    __disable_irq();   // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
    
    while(count--)
    {
    /**
      // Send a color to the LED strip.
      // The assembly below also increments the 'colors' pointer,
      // it will be pointing to the next color at the end of this loop.
      __ASM volatile(
        "ldr r12, [%0], #3\n"   // Read the next color and advance the pointer.
        "rbit r12, r12\n"       // Reverse the order of the bits.
        "rev r12, r12\n"        // Reverse the order of the bytes.
        "mov r3, #24\n"         // Initialize the loop counter register.

        "send_led_strip_bit%=:\n"
        "str %[val], %[set]\n"            // Drive the line high.
        "rrxs r12, r12\n"                 // Rotate right through carry.
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n"
        "it cc\n" "strcc %[val], %[clear]\n"  // If the bit to send is 0, set the line low now.
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "it cs\n" "strcs %[val], %[clear]\n"  // If the bit to send is 1, set the line low now.
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"
        "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n"

        "sub r3, r3, #1\n"                // Decrement the loop counter.
        "cbz r3, led_strip_asm_end%=\n"   // If we have sent 24 bits, go to the end.
        "b send_led_strip_bit%=\n"
        
        "led_strip_asm_end%=:\n"

      : "=r" (colors)
      : "0" (colors),
        [set] "m" (gpio.reg_set),
        [clear] "m" (gpio.reg_clr),
        [val] "r" (pinValue)
      : "r3", "r12", "cc"
      );**/
      
      if (interruptFriendly)
      {
        __enable_irq();
        //asm volatile("nop\n");
        __disable_irq();
      }
    }
    __enable_irq();          // Re-enable interrupts now that we are done.
    //delayMicroseconds(24);  // Hold the line low for 24 microseconds to send the reset signal.
  }

}

using namespace Pololu;

DigitalOut myled(LED1);
DigitalOut myled2(LED2);

PololuLedStrip ledStrip(p9);

int main() {
    gpio_t gpio;
    gpio_init(&gpio, LED1, PIN_OUTPUT);

    while(1) {
        myled2 = 1;
        my_asm(0, 1);
        wait(0.2);
        my_asm(1, 0);
        myled2 = 0;
        wait(1);
    }
}