diff --git a/firmware/apps/blinker.c b/firmware/apps/blinker.c index f7d604c..af6ac12 100644 --- a/firmware/apps/blinker.c +++ b/firmware/apps/blinker.c @@ -15,7 +15,7 @@ static void init(void) { static void blinker(void) { led_inv(RIGHT); led_inv(LEFT); - _delay_ms(500); + wait_ms(500); } REGISTER(blinker, init, NULL); diff --git a/firmware/apps/music.c b/firmware/apps/music.c index be04066..3610d7c 100644 --- a/firmware/apps/music.c +++ b/firmware/apps/music.c @@ -24,16 +24,16 @@ static void run(void) { size_t i; for(i = 0; i < sizeof(notes) / sizeof(*notes); ++i) { if(notes[i] == NOTE_BREAK) { - _delay_ms(120); + wait_ms(180); } else if(notes[i] == NOTE_SHORT) { - _delay_ms(20); + wait_ms(30); } else { set_note(notes[i], 4); - _delay_ms(180); + wait_ms(500); test_stop_app(); stop_note(); - _delay_ms(10); + wait_ms(10); test_stop_app(); } } diff --git a/firmware/apps/test.c b/firmware/apps/test.c deleted file mode 100644 index 2da1f78..0000000 --- a/firmware/apps/test.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -#include -#define __DELAY_BACKWARD_COMPATIBLE__ -#include - -#include -#include - -static void tester(void) { - PORTD ^= 1 << 4; - _delay_ms(100); -} - -REG(tester); diff --git a/firmware/include/pentabug/hal.h b/firmware/include/pentabug/hal.h index a1ac34e..ce6f269 100644 --- a/firmware/include/pentabug/hal.h +++ b/firmware/include/pentabug/hal.h @@ -30,7 +30,11 @@ void led_inv(uint8_t led); // MOTOR -void motor_on(uint8_t led); -void motor_off(uint8_t led); +void motor_on(void); +void motor_off(void); + +// WAITING + +void wait_ms(uint16_t ms); #endif /* HAL_H */ diff --git a/firmware/lib/hal.c b/firmware/lib/hal.c index 444873d..5068aee 100644 --- a/firmware/lib/hal.c +++ b/firmware/lib/hal.c @@ -9,8 +9,9 @@ #include -static uint8_t ir_active = 0; +static volatile uint8_t ir_active = 0; static int int_skip = 0; +static volatile int16_t wait_time = 0; static int button_count[2]; @@ -25,7 +26,8 @@ inline static void major_interrupt(void) { ++button_count[i]; } - if(button_count[i] == 400) { + // 1s pressed + if(button_count[i] == 200) { next_app(i ? 1 : -1); PORTC ^= 1 << 2; } @@ -39,10 +41,12 @@ ISR(TIMER0_COMPA_vect) { ++int_skip; - if(int_skip >= 38 * 5) { + if(int_skip >= 64 * 5) { int_skip = 0; major_interrupt(); } + + --wait_time; } void init_hw(void) { @@ -109,3 +113,31 @@ void led_inv(uint8_t led) { } } +void motor_on(void) { + PORTB |= 1 << 6; +} + +void motor_off(void) { + PORTB &= ~(1 << 6); +} + +void wait_ms(uint16_t ms) { + // TODO: this function seems to be ~10% too fast + int32_t cycles = ms * (int32_t)64; + + while(cycles >= INT16_MAX) { + cycles -= INT16_MAX; + wait_time = INT16_MAX; + + while(wait_time > 0) { + test_stop_app(); + } + } + + wait_time = cycles; + + while(wait_time > 0) { + test_stop_app(); + } +} +