/* * 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; }