#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint16_t timer_count = 0;
void configura_sistema(void)
{
// Configura PB0 e PB3 como entradas e PB2 e PB7 como saídas
DDRB = DDRB & ~((1 << DDB0) | (1 << DDB3));
DDRB = DDRB | (1 << DDB2) | (1 << DDB7);
// Configura o Timer/Counter 0 (TC0) para gerar interrupções a cada 2 ms
TCCR0A = 0x00; // Modo normal
TCCR0B = (1 << CS01) | (1 << CS00); // Prescaler de 64
TCNT0 = 0; // Inicializa o contador
TIMSK0 = (1 << TOIE0); // Habilita interrupção de overflow
}
void configura_interrupcoes(void)
{
sei(); // Habilita interrupções globais
}
ISR(TIMER0_OVF_vect)
{
timer_count++;
// Verifica a cada 2 ms
if (timer_count >= 2)
{
timer_count = 0;
// Verifica se PB0 e PB3 são iguais a 1
if ((PINB & (1 << PINB0)) && (PINB & (1 << PINB3)))
{
PORTB |= (1 << PORTB2); // Liga o LED em PB2
}
else
{
PORTB &= ~(1 << PORTB2); // Desliga o LED em PB2
}
// Pisca o LED em PB7 a 2 Hz (cada 500 ms)
PORTB ^= (1 << PORTB7);
}
}
int main(void)
{
configura_sistema();
configura_interrupcoes();
while (1)
{
// O código principal não precisa fazer nada
}
return 0;
}