|
|
@ -0,0 +1,104 @@ |
|
|
|
#include <avr/io.h> |
|
|
|
#include <avr/interrupt.h> |
|
|
|
#include <avr/sleep.h> |
|
|
|
#include <stdint.h> |
|
|
|
#define F_CPU 9600000UL |
|
|
|
|
|
|
|
volatile uint8_t beep_disable = 0; |
|
|
|
volatile uint8_t beep_enable = 0; |
|
|
|
|
|
|
|
static void set_wait_timer (void); |
|
|
|
void set_beep_timer (uint8_t outport); |
|
|
|
|
|
|
|
|
|
|
|
// main function |
|
|
|
int main (void) |
|
|
|
{ |
|
|
|
|
|
|
|
DDRB = (1<<DDB1) | (1<<DDB0); // set PB0 & PB1 to output |
|
|
|
|
|
|
|
set_sleep_mode(SLEEP_MODE_IDLE); // set sleep mode |
|
|
|
|
|
|
|
set_beep_timer(0); // generate signal with beeper frequency |
|
|
|
|
|
|
|
while (beep_disable == 0) {} // wait for expired beep counter |
|
|
|
|
|
|
|
set_wait_timer(); // start timer to wait 600 secs |
|
|
|
|
|
|
|
// wait for expired wait counter |
|
|
|
while (beep_enable == 0) { |
|
|
|
sleep_mode(); // goto sleep until next interrupt |
|
|
|
} |
|
|
|
|
|
|
|
// endless loop until switch-off |
|
|
|
while(1) { |
|
|
|
set_beep_timer(0); // generate signal with beeper frequency |
|
|
|
while (beep_disable == 0) {} |
|
|
|
set_beep_timer(1); // generate signal with beeper frequency |
|
|
|
while (beep_disable == 0) {} |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// routine to set timer0 for waiting until beep |
|
|
|
static void set_wait_timer (void) |
|
|
|
{ |
|
|
|
cli(); |
|
|
|
TCCR0A = 0x00; // set timer0 to normal mode |
|
|
|
TCCR0B = (1<<CS02) | (1<<CS00); // set timer0 prescaler to 1024 |
|
|
|
TIMSK0 = (1<<TOIE0); // interrupt enable for timer0 overflow |
|
|
|
sei(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// routine to set timer0 for to generate frequency for beeper |
|
|
|
void set_beep_timer (uint8_t outport) |
|
|
|
{ |
|
|
|
cli(); |
|
|
|
if (outport == 0) { |
|
|
|
TCCR0A = (1<<COM0A0) | (1<<WGM01); // toggle OC0A on compare match , ctc mode |
|
|
|
} else { |
|
|
|
TCCR0A = (1<<COM0B0) | (1<<WGM01); // toggle OC0B on compare match , ctc mode |
|
|
|
} |
|
|
|
TCCR0B = (1<<CS00); // set timer0 prescaler to 1 (no prescaling) |
|
|
|
OCR0A = 0xE7; // set output compare register a |
|
|
|
TIMSK0 = (1<<OCIE0A); // interrupt enable for timer0 compare match a |
|
|
|
sei(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// interrupt routine for timer0 output compare match a |
|
|
|
ISR(TIM0_COMPA_vect) |
|
|
|
{ |
|
|
|
static uint16_t overflow = 0; |
|
|
|
// after count up to 1 second |
|
|
|
// deactivate beeper & disable timer0 output compare match a interrupt |
|
|
|
if (overflow <= 10920) { |
|
|
|
beep_disable = 0; |
|
|
|
overflow ++; |
|
|
|
} else { |
|
|
|
TIMSK0 &= ~(1<<OCIE0A); // interrupt disable for timer0 compare match a |
|
|
|
beep_disable = 1; |
|
|
|
overflow = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// interrupt routine for timer0 overflow |
|
|
|
ISR(TIM0_OVF_vect) |
|
|
|
{ |
|
|
|
static uint16_t overflow = 0; |
|
|
|
// after count up to 1200 seconds |
|
|
|
// activate beeper & disable timer0 overflow interrupt |
|
|
|
if (overflow <= 6000) { // for test: 30 ca. 6 sek. |
|
|
|
overflow ++; |
|
|
|
} else { |
|
|
|
beep_enable = 1; |
|
|
|
TIMSK0 &= ~(1<<TOIE0); // interrupt disable for timer0 overflow |
|
|
|
} |
|
|
|
} |
|
|
|
|