root / trunk / code / projects / colonet / testing / robot_routine_reg_test / lights.c @ 13
History | View | Annotate | Download (2.33 KB)
1 | 13 | emarinel | /*
|
---|---|---|---|
2 | lights.c
|
||
3 | Controls led_user (small green LED) and the ORB (big light)
|
||
4 | |||
5 | author: CMU Robotics Club, Colony Project
|
||
6 | */
|
||
7 | |||
8 | //#include "lights.h"
|
||
9 | #include "firefly+_lib.h" |
||
10 | |||
11 | // the below comment may not be correct
|
||
12 | // Initializes timer2 to count every 0.5 us, overflowing every 16.32 ms (because we set the counter to start at 0x8000)
|
||
13 | void orb_init()
|
||
14 | { |
||
15 | |||
16 | //enable the data direction register on the 3 orb LEDs
|
||
17 | DDRE |= _BV(REDLED) | _BV(GREENLED) | _BV(BLUELED); |
||
18 | |||
19 | TCCR3A = 0xA9; // COM## set to noninvert, WGM 1:0 set to 1 |
||
20 | TCCR3B = 0x0C; // High bits to 0, WGM 3:2 set to 1, prescaler to 8 |
||
21 | |||
22 | // clear Output Compare Registers
|
||
23 | OCR3AH=0x00;
|
||
24 | OCR3AL=0x00;
|
||
25 | OCR3BH=0x00;
|
||
26 | OCR3BL=0x00;
|
||
27 | OCR3CH=0x00;
|
||
28 | OCR3CL=0x00;
|
||
29 | } |
||
30 | |||
31 | // Sets the red, green and blue elements of the LED with 8-bit resolution
|
||
32 | void orb_set(unsigned int red_led, unsigned int green_led, unsigned int blue_led) |
||
33 | { |
||
34 | OCR3AL = red_led; |
||
35 | OCR3BL = green_led; |
||
36 | OCR3CL = blue_led; |
||
37 | } |
||
38 | |||
39 | void orb_set_color(int col) |
||
40 | { |
||
41 | int red, green, blue;
|
||
42 | |||
43 | red = ((col & 0xE0) >> 5) * 36; |
||
44 | green = ((col & 0x1C) >> 2) * 36; |
||
45 | blue = (col & 0x03) * 85; |
||
46 | |||
47 | orb_set(red, green, blue); |
||
48 | } |
||
49 | |||
50 | // Disables the timer1 interrupt, disabling the Orb's color fading capabilities
|
||
51 | // You can still turn the red, green, and blue leds on and off with set_orb_dio
|
||
52 | void orb_disable()
|
||
53 | { |
||
54 | TCCR3A = 0x01; // COM## disconnected, WGM 1:0 set to 1 |
||
55 | } |
||
56 | |||
57 | // Enables the timer1 interrupt, enabling the Orb's color fading capabilities
|
||
58 | void orb_enable()
|
||
59 | { |
||
60 | TCCR3A = 0xA9; // COM## set to noninvert, WGM 1:0 set to 1 |
||
61 | } |
||
62 | |||
63 | |||
64 | /*
|
||
65 | This function turns each Orb element on or off
|
||
66 | Useful for using the Orb for debugging purposes without
|
||
67 | the overhead of the software PWM routine used for color fading.
|
||
68 | */
|
||
69 | void orb_set_dio(int red, int green, int blue) |
||
70 | { |
||
71 | if(red == 0) |
||
72 | PORTE &= (0xFF - _BV(REDLED));
|
||
73 | else
|
||
74 | PORTE |= _BV(REDLED); |
||
75 | |||
76 | |||
77 | if(green == 0) |
||
78 | PORTE &= (0xFF - _BV(GREENLED));
|
||
79 | else
|
||
80 | PORTE |= _BV(GREENLED); |
||
81 | |||
82 | |||
83 | if(blue == 0) |
||
84 | PORTE &= (0xFF - _BV(BLUELED));
|
||
85 | else
|
||
86 | PORTE |= _BV(BLUELED); |
||
87 | } |
||
88 | |||
89 | |||
90 | /////////////////////////////////////////
|
||
91 | /////////// user LED ///////////////
|
||
92 | /////////////////////////////////////////
|
||
93 | void led_init( void ) |
||
94 | { |
||
95 | DDRG |= _BV(USERLED); |
||
96 | } |
||
97 | |||
98 | void led_user(int value) |
||
99 | { |
||
100 | if(value == 0) |
||
101 | PORTG &= (0xFF - _BV(USERLED));
|
||
102 | else
|
||
103 | PORTG |= _BV(USERLED); |
||
104 | } |