#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_BUILTIN PB5
volatile unsigned long millis_count = 0;
const long interval = 1000;
unsigned long previousMillis = 0;
// Configurando o Timer0 como contador de tempo
void millis_init()
{
// Configurando o prescaler como 64
TCCR0B |= (1 << CS01) | (1 << CS00);
// Habilitando a interrupção de comparação
TIMSK0 |= (1 << OCIE0A);
// Configurando a contagem de comparação para contar em milissegundos
OCR0A = 249;
// Habilitando as interrupções
sei();
}
// Interrupção de comparação
ISR(TIMER0_COMPA_vect)
{
millis_count++;
}
unsigned long millis()
{
return millis_count;
}
int main()
{
// Configurando o pino do LED como saída
DDRB |= (1 << LED_BUILTIN);
// Define o nível lógico da porta como baixo (0)
PORTB &= ~(1 << LED_BUILTIN);
millis_init();
// while (1) {
// unsigned long currentMillis = millis();
// if (currentMillis - previousMillis >= interval) {
// // Alternando o estado do pino do LED
// PORTB ^= (1 << LED_BUILTIN);
// previousMillis = currentMillis;
// }
// }
while (1) {
// Alternando o estado do pino do LED de acordo com o resultado da expressão
PORTB = (((millis() / interval) % 2) == 0) ?
PORTB & ~(1 << LED_BUILTIN) : PORTB | (1 << LED_BUILTIN);
}
return 0;
}