Below is the file 'timer.c' from this revision. You can also download the file.
/* timer.c */ #include <avr/io.h> #include <avr/interrupt.h> #include "common.h" #include "timer.h" uint8_t bounce_timer; uint8_t button; uint8_t button_port; #define BOUNCE_TIMER_RESET 10 #define PIN_OUTPUT0 0 #define PIN_OUTPUT1 1 volatile uint8_t output0; volatile uint8_t output1; uint8_t tick; volatile uint32_t seconds; void timer_init(void) { bounce_timer = 0; button = 0; button_port = 0; tick = TICKS_PER_SECOND-1; seconds = 0; TCCR0A = (1<<CTC0) | (1<<CS02); /* clk/256 */ OCR0A = TIMER_MAX; TIMSK0 = (1<<OCIE0A); output0 = 0; output1 = 0; PORTD &= ~((1<<PIN_OUTPUT0) | (1<<PIN_OUTPUT1)); DDRD |= (1<<PIN_OUTPUT0) | (1<<PIN_OUTPUT1); } ISR(TIMER0_COMPA_vect) { uint8_t port; uint8_t old_button; uint8_t button_pressed; if (tick == 0) { tick = TICKS_PER_SECOND-1; seconds++; } else tick--; old_button = button_port; port = PIND; port = (~port >> 4); /* if (bounce_timer) bounce_timer--; else */ button_port = port; if (button_port != old_button) bounce_timer = BOUNCE_TIMER_RESET; button_pressed = button_port & ~old_button; if (button_pressed & 8) button = 4; if (button_pressed & 4) button = 3; if (button_pressed & 2) button = 2; if (button_pressed & 1) button = 1; if ((TICKS_PER_SECOND-1 - tick) < output0) PORTD |= (1<<PIN_OUTPUT0); else PORTD &= ~(1<<PIN_OUTPUT0); if ((TICKS_PER_SECOND-1 - tick) < output1) PORTD |= (1<<PIN_OUTPUT1); else PORTD &= ~(1<<PIN_OUTPUT1); }