#include <avr/io.h>
#include <avr/interrupt.h>
volatile int signal = 10; // Variable para almacenar la señal (0 o 1)
int blinkCount; // Contador de parpadeos
ISR(INT0_vect)
{
signal = 0; // Se establece la señal en 0
blinkCount = 0; // Se reinicia el contador de parpadeos
}
ISR(INT1_vect)
{
signal = 1; // Se establece la señal en 1
blinkCount = 0; // Se reinicia el contador de parpadeos
}
ISR(TIMER1_COMPA_vect)
{
if (blinkCount <= 5) // Se verifica si no se ha alcanzado el número máximo de parpadeos
{
if (signal == 0) // Si la señal es 0
{
PORTC ^= (1 << 0); // Se realiza un parpadeo en el pin 0 del puerto C
}
if (signal == 1) // Si la señal es 1
{
PORTC ^= (1 << 1); // Se realiza un parpadeo en el pin 1 del puerto C
}
if (blinkCount == 5) // Si se ha alcanzado el número máximo de parpadeos
{
PORTC &= ~((1 << 0) | (1 << 1)); // Se apagan ambos LEDs
}
blinkCount++; // Se incrementa el contador de parpadeos
}
}
int main(void)
{
// Configuración del temporizador 1 (TIMER1)
TCCR1A = (0b10 << COM1A0); // Configuración de la salida del comparador del temporizador 1
TCCR1B = (0b011 << CS10); // Configuración del preescalador del temporizador 1
TIMSK1 = (1 << OCIE1A); // Habilitar la interrupción de comparación del temporizador 1
OCR1AH = 0x00; // Configuración del valor de comparación alto del temporizador 1
OCR1AL = 0x170; // Configuración del valor de comparación bajo del temporizador 1
// Configuración de los pines y puertos
DDRC |= (1 << 0); // Pin 0 del puerto C como salida (LED)
PORTC &= ~(1 << 0); // Apagar el LED conectado al pin 0 del puerto C
DDRC |= (1 << 1); // Pin 1 del puerto C como salida (LED)
PORTC &= ~(1 << 1); // Apagar el LED conectado al pin 1 del puerto C
DDRD &= ~(1<<2); // Pin 2 del puerto D como entrada
PORTD |= (1<<2); // Activar resistencia de pull-up en el pin 2 del puerto D
DDRD &= ~(1<<3); // Pin 3 del puerto D como entrada
PORTD |= (1<< 3); // Activar resistencia de pull-up en el pin 3 del puerto D
EICRA = 0b00000101; // Configuración de la interrupción externa INT0 y INT1 para que se activen en el flanco de subida
EIMSK = 0b00000011; // Habilitar las interrupciones externas INT0 y INT1
EIFR = 0b00000000; // Limpiar los flags de interrupción externa
sei(); // Habilitar todas las interrupciones
while (1)
{
// Bucle infinito para que el programa siga ejecutándose
}
}