#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#ifndef XPCU
#define XPCU 16000000UL
#endif
int buzzer_status = 0;
unsigned long int frequency = 880;
int duty = 60 ;
int prescaler = 1;
unsigned int high_delay = 0, low_delay = 0;
int stop_buzzer = 0;
ISR(TIMER1_COMPA_vect) {
if (stop_buzzer == 0) {
PORTB ^= (1 << PB7); // Alternar el estado del pin PB7 (toggle)
}
}
void calcular_delay(unsigned long int frequency, int duty, int prescaler) {
unsigned long int period = XPCU / (prescaler * frequency);
unsigned int high_time = (period * duty) / 100;
unsigned int low_time = period - high_time;
high_delay = (high_time * F_CPU) / XPCU;
low_delay = (low_time * F_CPU) / XPCU;
}
int main(void) {
DDRB |= (1 << PB7); // Configurar PB7 como salida
TCCR1A = 0x00;
TCCR1B = (1 << WGM12) | (1 << CS10); // Modo CTC, prescaler 1
OCR1A = F_CPU / (prescaler * frequency) - 1; // Valor de comparación para la frecuencia
TIMSK1 = (1 << OCIE1A); // Habilitar interrupción en comparación OCR1A
sei();
while (1) {
calcular_delay(frequency, duty, prescaler);
stop_buzzer = 0; // Activar el buzzer
}
return 0;
}