Code fonctionnel pour le chenillard de led du phare GE1
Dependencies: mbed LedStripGradient PololuLedStrip
main.cpp@1:ac1550d65296, 2013-02-26 (annotated)
- Committer:
- DavidEGrayson
- Date:
- Tue Feb 26 02:04:07 2013 +0000
- Revision:
- 1:ac1550d65296
- Parent:
- 0:290d713ed3e1
- Child:
- 2:bd6fe6d2948d
Added a second parameter to the assembly, but I am not sure how to access it.
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:ac1550d65296 | 112 | my_asm(1, 1); |
DavidEGrayson | 1:ac1550d65296 | 113 | wait(0.2); |
DavidEGrayson | 1:ac1550d65296 | 114 | my_asm(0, 0); |
DavidEGrayson | 1:ac1550d65296 | 115 | myled2 = 0; |
DavidEGrayson | 1:ac1550d65296 | 116 | wait(1); |
DavidEGrayson | 1:ac1550d65296 | 117 | } |
DavidEGrayson | 1:ac1550d65296 | 118 | } |