/******************************************************************************************* * alarm.c * * based on hello.ftdi.c and hello.H-bridge.44.DC.c by Neil Gershenfeld * and button44 by Rob Hart * set lfuse to 0x5E for 20 MHz xtal * * Recieves data as 1/0 and sounds alarm when active * * Brian Plancher * 12/7/16 * ********************************************************************************************/ #include #include #include #include // helper defs #define input(directions,pin) (directions &= (~pin)) // set port direction for input #define output(directions,pin) (directions |= pin) // set port direction for output #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define on_delay() _delay_us(3) // PWM on time #define fast_off_delay() _delay_us(1) // PWM fast off time #define medium_off_delay() _delay_us(3) // PWM medium off time #define slow_off_delay() _delay_us(5) // PWM slow off time #define cycle_delay() _delay_us(2) // cycle delay #define PWM_count 20000 // number of PWM cycles #define cycle_count 5 // number of speed cycles // hbridge outputs for speakers #define speaker_port PORTB // speaker port #define speaker_direction DDRB // speaker direction #define MOSFET (1 << PB2) #define SPEAKER_HZ 520 // want to cycle at 520 HZ because google says that is ideal alarm sound #define XTAL 20000000 // 20 mHz #define SPEAKER_PERIOD (XTAL / 1024 / SPEAKER_HZ) // prescaler of 1024 #define SPEAKER_HALF_PERIOD (SPEAKER_PERIOD / 2) // input for control #define input_port PORTA #define input_direction DDRA #define input_pins PINA #define input_in (1 << PA3) uint8_t off(){ clear(speaker_port, MOSFET); return 0; } uint8_t on(){ set(speaker_port, MOSFET); return 1; } int main(void) { // set clock divider to /1 CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // initialize input pin input(input_direction, input_in); volatile uint8_t active = 0; // set speaker for output and timers output(speaker_direction, MOSFET); clear(speaker_port,MOSFET); volatile uint8_t state = 0; // start timer1 with /1024 prescaler -- means count to 19531.25 for one second // and set the initial value to 0 TCCR1B = (1<= SPEAKER_HALF_PERIOD){ if (state){ state = off(); TCNT1 = 0x00; } else{ state = on(); TCNT1 = 0x00; } } } }