Code fonctionnel pour le chenillard de led du phare GE1
Dependencies: mbed LedStripGradient PololuLedStrip
main.cpp@8:a179aad4fa2e, 2013-02-26 (annotated)
- Committer:
- DavidEGrayson
- Date:
- Tue Feb 26 03:12:26 2013 +0000
- Revision:
- 8:a179aad4fa2e
- Parent:
- 7:242f14ed9055
- Child:
- 9:b1c530cad69b
First attempt at a gradient pattern. Tested only on the oscilloscope.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DavidEGrayson | 8:a179aad4fa2e | 1 | #include "mbed.h" |
DavidEGrayson | 8:a179aad4fa2e | 2 | |
DavidEGrayson | 8:a179aad4fa2e | 3 | namespace Pololu |
DavidEGrayson | 8:a179aad4fa2e | 4 | { |
DavidEGrayson | 8:a179aad4fa2e | 5 | #ifndef _POLOLU_RGB_COLOR |
DavidEGrayson | 8:a179aad4fa2e | 6 | #define _POLOLU_RGB_COLOR |
DavidEGrayson | 8:a179aad4fa2e | 7 | typedef struct rgb_color |
DavidEGrayson | 8:a179aad4fa2e | 8 | { |
DavidEGrayson | 8:a179aad4fa2e | 9 | uint8_t red, green, blue; |
DavidEGrayson | 8:a179aad4fa2e | 10 | } rgb_color; |
DavidEGrayson | 8:a179aad4fa2e | 11 | #endif |
DavidEGrayson | 8:a179aad4fa2e | 12 | |
DavidEGrayson | 8:a179aad4fa2e | 13 | extern "C" int led_strip_write_color(rgb_color *, volatile uint32_t * set, volatile uint32_t * clear, uint32_t mask); |
DavidEGrayson | 8:a179aad4fa2e | 14 | |
DavidEGrayson | 8:a179aad4fa2e | 15 | class PololuLedStrip |
DavidEGrayson | 8:a179aad4fa2e | 16 | { |
DavidEGrayson | 8:a179aad4fa2e | 17 | static bool interruptFriendly; |
DavidEGrayson | 8:a179aad4fa2e | 18 | public: |
DavidEGrayson | 8:a179aad4fa2e | 19 | gpio_t gpio; |
DavidEGrayson | 8:a179aad4fa2e | 20 | PololuLedStrip(PinName pin); |
DavidEGrayson | 8:a179aad4fa2e | 21 | void write(rgb_color * colors, unsigned int count); |
DavidEGrayson | 8:a179aad4fa2e | 22 | }; |
DavidEGrayson | 8:a179aad4fa2e | 23 | |
DavidEGrayson | 8:a179aad4fa2e | 24 | bool PololuLedStrip::interruptFriendly; |
DavidEGrayson | 8:a179aad4fa2e | 25 | |
DavidEGrayson | 8:a179aad4fa2e | 26 | PololuLedStrip::PololuLedStrip(PinName pinName) |
DavidEGrayson | 8:a179aad4fa2e | 27 | { |
DavidEGrayson | 8:a179aad4fa2e | 28 | gpio_init(&gpio, pinName, PIN_OUTPUT); |
DavidEGrayson | 8:a179aad4fa2e | 29 | } |
DavidEGrayson | 8:a179aad4fa2e | 30 | |
DavidEGrayson | 8:a179aad4fa2e | 31 | void PololuLedStrip::write(rgb_color * colors, unsigned int count) |
DavidEGrayson | 8:a179aad4fa2e | 32 | { |
DavidEGrayson | 8:a179aad4fa2e | 33 | __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up. |
DavidEGrayson | 8:a179aad4fa2e | 34 | |
DavidEGrayson | 8:a179aad4fa2e | 35 | while(count--) |
DavidEGrayson | 8:a179aad4fa2e | 36 | { |
DavidEGrayson | 8:a179aad4fa2e | 37 | led_strip_write_color(colors++, gpio.reg_set, gpio.reg_clr, gpio.mask); |
DavidEGrayson | 8:a179aad4fa2e | 38 | |
DavidEGrayson | 8:a179aad4fa2e | 39 | if (interruptFriendly) |
DavidEGrayson | 8:a179aad4fa2e | 40 | { |
DavidEGrayson | 8:a179aad4fa2e | 41 | __enable_irq(); |
DavidEGrayson | 8:a179aad4fa2e | 42 | __nop(); |
DavidEGrayson | 8:a179aad4fa2e | 43 | __nop(); |
DavidEGrayson | 8:a179aad4fa2e | 44 | __nop(); |
DavidEGrayson | 8:a179aad4fa2e | 45 | __disable_irq(); |
DavidEGrayson | 8:a179aad4fa2e | 46 | } |
DavidEGrayson | 8:a179aad4fa2e | 47 | } |
DavidEGrayson | 8:a179aad4fa2e | 48 | __enable_irq(); // Re-enable interrupts now that we are done. |
DavidEGrayson | 8:a179aad4fa2e | 49 | wait_us(24); // Hold the line low for 24 microseconds to send the reset signal. |
DavidEGrayson | 8:a179aad4fa2e | 50 | } |
DavidEGrayson | 8:a179aad4fa2e | 51 | } |
DavidEGrayson | 8:a179aad4fa2e | 52 | |
DavidEGrayson | 8:a179aad4fa2e | 53 | using namespace Pololu; |
DavidEGrayson | 8:a179aad4fa2e | 54 | |
DavidEGrayson | 8:a179aad4fa2e | 55 | #define LED_COUNT 60 |
DavidEGrayson | 8:a179aad4fa2e | 56 | rgb_color colors[LED_COUNT]; |
DavidEGrayson | 8:a179aad4fa2e | 57 | |
DavidEGrayson | 8:a179aad4fa2e | 58 | PololuLedStrip ledStrip(p8); |
DavidEGrayson | 8:a179aad4fa2e | 59 | |
DavidEGrayson | 8:a179aad4fa2e | 60 | DigitalOut led2(LED2); |
DavidEGrayson | 8:a179aad4fa2e | 61 | |
DavidEGrayson | 8:a179aad4fa2e | 62 | Timer timer; |
DavidEGrayson | 8:a179aad4fa2e | 63 | |
DavidEGrayson | 8:a179aad4fa2e | 64 | int main() |
DavidEGrayson | 8:a179aad4fa2e | 65 | { |
DavidEGrayson | 8:a179aad4fa2e | 66 | timer.start(); |
DavidEGrayson | 8:a179aad4fa2e | 67 | |
DavidEGrayson | 8:a179aad4fa2e | 68 | while(1) |
DavidEGrayson | 8:a179aad4fa2e | 69 | { |
DavidEGrayson | 8:a179aad4fa2e | 70 | uint8_t time = timer.read_ms() >> 2; |
DavidEGrayson | 8:a179aad4fa2e | 71 | for(uint8_t i = 0; i < LED_COUNT; i++) |
DavidEGrayson | 8:a179aad4fa2e | 72 | { |
DavidEGrayson | 8:a179aad4fa2e | 73 | uint8_t x = time - 8*i; |
DavidEGrayson | 8:a179aad4fa2e | 74 | colors[i] = (rgb_color){ x, 255 - x, x }; |
DavidEGrayson | 8:a179aad4fa2e | 75 | } |
DavidEGrayson | 8:a179aad4fa2e | 76 | |
DavidEGrayson | 8:a179aad4fa2e | 77 | led2 = !led2.read(); |
DavidEGrayson | 8:a179aad4fa2e | 78 | ledStrip.write(colors, LED_COUNT); |
DavidEGrayson | 8:a179aad4fa2e | 79 | wait_ms(10); |
DavidEGrayson | 8:a179aad4fa2e | 80 | } |
DavidEGrayson | 8:a179aad4fa2e | 81 | } |