#include <string.h>
#define F_CPU 16000000UL //16MHz
#define UART_BAUDRATE 9600
#define MYUBRR (((F_CPU/16)/UART_BAUDRATE)-1)
volatile char usart_rx_buffer[50];
volatile unsigned int frame_status = 0;
static void _sei( void )
{
sei(); //Habilitar a chave geral das interrupções AVR-GCC;
/* cli(); //Desabilita a chave geral das interrupções; */
//Habilitar a interrupção da recepção serial (UART0);
UCSR0B |= (1 << RXCIE0); //Setar (1),
}
/**
* Vetor de Interrupção USART RX
* ORG 0x0018
*/
ISR(USART_RX_vect)
{
unsigned char data;
static unsigned int indice = 0; //Variável que será utilizada como indice do buffer;
/**
* Verifica se houve erro durante a recepção serial;
* FE0 = Frame Error;
* DOR0 = Data OverRun;
* UPE0 = USART Parity Error; //save context ISR
*/
data = UDR0; //buffer de recepção serial; É o registrador que armazena o byte recebido;
if((UCSR0A & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) == 0)
{
/**
* Buffer cheio? Caso sim, reinicia indice
*/
if(indice >= sizeof(usart_rx_buffer))
{
indice = 0;
}
/**
* Caractere indicador de fim de frame;
*/
if( data == '\n' )
{
usart_rx_buffer[indice] = '\0'; //
frame_status = 1;
indice = 0;
//void (*ptr)() = &serial_received;
//(*ptr)( usart_rx_buffer);
//if( serial_event )
//serial_event( usart_rx_buffer );
}
/* Armazena os bytes recebidos no buffer */
else {
usart_rx_buffer[indice++] = data;
}
}
}
void serial_init( void )
{
UBRR0H = (uint8_t)(MYUBRR>>8);
UBRR0L = (uint8_t)(MYUBRR);
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (3<<UCSZ00);
}
void serial_chr( unsigned char data )
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
unsigned char serial_read( void )
{
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
void setup() {
serial_init();
//serial_chr('A');
_sei();
}
//strcmp | memcmp | strstr |
//Modifique o programa para ligar o led builting pelo comando "ligar".
//Faça o mesmo para o comando "desligar"; ENTER ("\r\n")
void loop() {
if(frame_status == 1) { //Indica que podemos ler os bytes recebidos e armazenados em
//usart_rx_buffer.
DDRB |= (1<<PB5); //Seta (1); Configura como saída;
//PB5 é o led builting do Arduino;
PORTB ^= (1<<PB5); //Toggle, ou seja, inverte o estado lógico de PB5;
frame_status = 0; //apaga para receber novamente um novo frame;
if(memcmp(usart_rx_buffer, "ligar", strlen("ligar")) == 0) {
DDRD |= (1<<PD3); //Configura como saída PD3 (3);
PORTD |= (1<<PD3); //ligar o relé;
} else
if(memcmp(usart_rx_buffer, "desligar", strlen("desligar")) == 0) {
DDRD |= (1<<PD3); //Configura como saída PD3 (3);
PORTD &= ~(1<<PD3); //desligar o relé;
}
}
}