diff options
Diffstat (limited to 'usb-i2c-sl018/ledmatrix.c')
-rw-r--r-- | usb-i2c-sl018/ledmatrix.c | 105 |
1 files changed, 87 insertions, 18 deletions
diff --git a/usb-i2c-sl018/ledmatrix.c b/usb-i2c-sl018/ledmatrix.c index f0b4ba8..c5d729a 100644 --- a/usb-i2c-sl018/ledmatrix.c +++ b/usb-i2c-sl018/ledmatrix.c @@ -34,52 +34,106 @@ ledmatrix_mode_t mode = off; -void ledmatrix_off(void) +void ledmatrix_start_timer(void) +{ + TCCR3A = 0; // prescaler 1:1024, WGM = 4 (CTC) + TCCR3B = 1<<WGM32 | 1<<CS32 | 1<<CS30; // + OCR3A = 1561; // (1+1561)*1024 = 1599488 -> ~100 ms @ 16 MHz + TCNT3 = 0; + TIMSK3 = 1<<OCIE3A; +} + +void ledmatrix_stop_timer(void) +{ + TCCR3B = 0; + TIMSK3 = 0; +} + +void ledmatrix_off_init(void) { LEDMATRIX_PORT = LEDMATRIX_MASK; LEDMATRIX_PORT |= 1<<LEDMATRIX_RED | 1<<LEDMATRIX_GREEN; } -void ledmatrix_red(void) + +void ledmatrix_red_init(void) { LEDMATRIX_PORT = LEDMATRIX_MASK | 1<<LEDMATRIX_GREEN; LEDMATRIX_PORT &= ~(1<<LEDMATRIX_RED); } -void ledmatrix_red_moving(void) + +void ledmatrix_red_moving_init(void) +{ + +} + +void ledmatrix_red_moving_handle(void) { } -void ledmatrix_red_blink(void) + +void ledmatrix_red_blink_init(void) { + ledmatrix_red_init(); + ledmatrix_start_timer(); +} +void ledmatrix_red_blink_handle(void) +{ + LEDMATRIX_PORT ^= 1<<LEDMATRIX_RED; } -void ledmatrix_green(void) + +void ledmatrix_green_init(void) { LEDMATRIX_PORT = LEDMATRIX_MASK | 1<<LEDMATRIX_RED; LEDMATRIX_PORT &= ~(1<<LEDMATRIX_GREEN); } -void ledmatrix_green_moving(void) + +void ledmatrix_green_moving_init(void) +{ + +} + +void ledmatrix_green_moving_handle(void) { } -void ledmatrix_green_blink(void) + +void ledmatrix_green_blink_init(void) { + ledmatrix_green_init(); + ledmatrix_start_timer(); +} +void ledmatrix_green_blink_handle(void) +{ + LEDMATRIX_PORT ^= 1<<LEDMATRIX_GREEN; } -void ledmatrix_rg_moving(void) + +void ledmatrix_rg_moving_init(void) { +} +void ledmatrix_rg_moving_handle(void) +{ } -void ledmatrix_rg_blink(void) + +void ledmatrix_rg_blink_init(void) { + ledmatrix_red_init(); + ledmatrix_start_timer(); +} +void ledmatrix_rg_blink_handle(void) +{ + LEDMATRIX_PORT ^= ~(LEDMATRIX_MASK); } @@ -92,17 +146,32 @@ void init_ledmatrix(void) void ledmatrix(ledmatrix_mode_t m) { mode = m; + ledmatrix_stop_timer(); switch(mode) { - case off: ledmatrix_off(); break; - case red: ledmatrix_red(); break; - case red_moving: ledmatrix_red_moving(); break; - case red_blink: ledmatrix_red_blink(); break; - case green: ledmatrix_green(); break; - case green_moving: ledmatrix_green_moving(); break; - case green_blink: ledmatrix_green_blink(); break; - case rg_moving: ledmatrix_rg_moving(); break; - case rg_blink: ledmatrix_rg_blink(); break; + case off: ledmatrix_off_init(); break; + case red: ledmatrix_red_init(); break; + case red_moving: ledmatrix_red_moving_init(); break; + case red_blink: ledmatrix_red_blink_init(); break; + case green: ledmatrix_green_init(); break; + case green_moving: ledmatrix_green_moving_init(); break; + case green_blink: ledmatrix_green_blink_init(); break; + case rg_moving: ledmatrix_rg_moving_init(); break; + case rg_blink: ledmatrix_rg_blink_init(); break; + } +} + +ISR(TIMER3_COMPA_vect) +{ + switch(mode) + { + case red_moving: ledmatrix_red_moving_handle(); break; + case red_blink: ledmatrix_red_blink_handle(); break; + case green_moving: ledmatrix_green_moving_handle(); break; + case green_blink: ledmatrix_green_blink_handle(); break; + case rg_moving: ledmatrix_rg_moving_handle(); break; + case rg_blink: ledmatrix_rg_blink_handle(); break; + default: break; } } |