#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define F_CPU 16000000UL // Frequência do microcontrolador em Hz
#define BAUD_RATE 115200
// Macros para cálculo do valor do registrador UBRR
#define UBRR_VALUE ((F_CPU / (16UL * BAUD_RATE)) - 1)
void USART_Init() {
// Configurar a taxa de baud rate
UBRR0 = UBRR_VALUE;
// Habilitar a transmissão e recepção e a interrupção de RX
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
// Configurar o formato de dados: 8 bits de dados, 1 bit de parada
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
void USART_Write(unsigned char data) {
// Aguardar o buffer de transmissão ficar vazio
while (!(UCSR0A & (1 << UDRE0)));
// Enviar o dado
UDR0 = data;
}
void USART_Print(const char* str){
for(uint8_t i = 0 ; str[i] != '\0' ; i++){
USART_Write(str[i]);
}
}
// Função de interrupção de recepção
ISR(USART_RX_vect) {
unsigned char receivedData = UDR0; // Ler o dado recebido
// Faça algo com o dado recebido aqui, por exemplo, transmitir de volta
USART_Write(receivedData);
}
int main() {
USART_Init(); // Inicializar a UART
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sei(); // Habilitar interrupções
USART_Print("Hello World!");
while (1) {
sleep_cpu(); // O programa principal continua a ser executado aqui
}
return 0;
}