// CUESTION 3
// Definir la secuencia deseada como un valor binario
unsigned int secuencia = 0b1000; //Secuencia inicial
int i = 0;
bool ascendente = true;
void setup() {
// Configurar los pines 8 al 11 como salidas
DDRB |= 0b00001111;
// Configurar el Timer1 para generar interrupciones cada 1 segundo
TCCR1A = 0b00000000; //
TCCR1B = 0b00001011; // Preescolar 256 y CTC
TIMSK1 |= (1 << OCIE1A); // Habilitar la interrupción de comparación A del Timer1
// Establecer el valor de comparación para generar una interrupción cada 1 segundo
OCR1A = 65000; // Frecuencia de interrupción: 16 MHz / (256 * (62500)) ≈ 1 Hz
}
void loop() {
// No es necesario tener código en el loop principal ya que la secuencia se maneja en la interrupción del Timer1
}
// Rutina de interrupción del Timer1
ISR(TIMER1_COMPA_vect) {
PORTB &= 0b11110000; // Apagar todos los LEDs
// Encender el LED correspondiente según el bit en la secuencia
if (ascendente) {
// Enciende el LED correspondiente en función del valor de 'i' en la secuencia inicial
PORTB |= (secuencia >> i) & 0b00001111; // Uso de máscaras para aislar un bit específico
i++;
// Si 'i' llega a 4, reiniciar en 2 y cambiar la dirección a descendente
if (i == 4) {
i = 2;
ascendente = false;
}
} else {
// Enciende el LED correspondiente en función del valor de 'i' en la secuencia inicial
PORTB |= (secuencia >> i) & 0b00001111;
i--;
// Si 'i' llega a -1, reiniciar en 1 y cambiar la dirección a ascendente
if (i == -1) {
i = 1;
ascendente = true;
}
}
}