diff --git a/timer/main.c b/timer/main.c new file mode 100644 index 0000000..5614053 --- /dev/null +++ b/timer/main.c @@ -0,0 +1,61 @@ +/* + * Control PB5 with the two buttons. One button disables, the other enables. + * The board uses interrupts for this. PB5 will quickly oscilate between on and + * off to make cool sounds with a summer. + */ +#define F_CPU 16000000UL +#define __AVR_ATmega328P__ +#include +#include +#include + +#define MINUTE 60 * 1000 +const int TIME = 45 * MINUTE; + +int volatile reset = 0; + +int alarm(); + +// code for INT0 +ISR(INT0_vect) { reset = 1; } + +int main(void) { + + DDRB = 0xff; // write to B + DDRD = 0; // read from D + + PORTD |= (1 << PORTD2) | (1 << PORTD3); // pull up D2 and D3 + + PORTB = 0; // pull down port B + + // enable external interruprs + EIMSK |= (1 << INT0); + EIMSK |= (1 << INT1); + + // trigger when anything changes + EICRA |= (1 << ISC00); // for INT0 + EICRA |= (1 << ISC10); // for INT1 + + sei(); // interrupt magic macro + while (1) { + _delay_ms(TIME); + alarm(); + } +} + +int alarm(void) { + int sound = 0; + while (!reset) { + PORTB |= (1 << PORTB5); + _delay_us(sound); + PORTB &= ~(1 << PORTB5); + _delay_us(sound); + sound++; + if (sound > 1000) { + sound = 0; + } + } + reset = 0; + PORTB &= ~(1 << PORTB5); + return 0; +}