Code fonctionnel pour le chenillard de led du phare GE1
Dependencies: mbed LedStripGradient PololuLedStrip
main.cpp@0:290d713ed3e1, 2013-02-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |