//Bibliotecas:
#define __AVR_ATmega2560__
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdint.h>
#include <util/delay.h>
//---------------------------------------------------------------------------------------------
// Programa para 1) configurar a USART0, 2) enviar e receber caracteres pela
// USART0 e 3) transmitir strings da memória FLASH e RAM.
// Veja página 206 do manual de especificações do ATMega2560
/**
@brief Configura o periférico USART no modo assíncrono e quadros no formato 8N1. A taxa de transmissão é 57600 BAUD,
considerando uma frequência de relógio de 16 MHz. Habilita a USART para receber e transmittir (full-duplex)
*/
// Página 220 para as informações de USART0_configura
void USART0_configura(void)
{
UBRR0 = 0x022; //UBRR0H = 0 e UBRR0H = 0x22
UCSR0A = 0x02; // RXC0=0, TXC0=0, UDRE0=0, FE0=0, DOR0=0, UPE0=0, U2X0=1 e MPCM0 = 0
UCSR0B = 0x18; // RXCIE0=0, TXCIE0=0, UDRIE0=0, RXEN0=1, TXEN0=1, UCSZ0[2]=0, RXB80=0 e TXB80=0
UCSR0C = 0x06; //UMSEL0[1:0]=00, UPM0[1:0]=00, USBS0=0, UCSZ0[1:0]=11 e UCPOL0=0
}
// Veja a página 207 do manual de especificações do ATMega2560
void USART0_transmite(uint8_t dado)
{
while (!(UCSR0A & (1 << UDRE0))) // esperamos o buffer de transmissão ficar vazio
;
UDR0 = dado; // colocamos o dado a ser transmitido no buffer de transmissão
}
// Veja a página 210 do manual de especificações do ATMega2560
uint8_t USART0_recebe(void)
{
while (!(UCSR0A & (1 << RXC0))) // espera o dado ser recebido
;
return UDR0; // retorna o dado recebido no buffer de recepção
}
void USART0_transmite_string_RAM(uint8_t *str)
{
uint8_t ch;
// Este laço while é executado até que o caractere ch = 0x00, marcando o final da string
while (ch = *str++) // carregamos um caractere da string e apontamos para o próximo caractere
{
USART0_transmite(ch); // transmite o caractere pelo terminal TX da USART0
}
}
int main(void)
{
uint8_t click;
uint8_t atual;
uint8_t anterior;
DDRB = DDRB & (~(1 << DDB0)); //In
PORTB = PORTB | (1 << PORTB0); //Habilita o Pull-up
USART0_configura (); //configuramos a USART0 para receber e transmitir a 57600 BAUD
atual = 0x01;
USART0_transmite_string_RAM("Aguardando alguma ação...\n"); // enviamos uma string da memória RAM
while (1){// Laço infinito que será executado
_delay_ms(25); //tempo para tirar repique da chave.
anterior = atual;
atual = (PINB & (1 << PINB0) == 0x01); // leitura do PB0
click= ((atual == 0x00) && (anterior == 0x01)); //detecta a mudança
if(click) { //se houver click
USART0_transmite_string_RAM("Você apertou o botão!!\n\n"); // enviamos uma string da memória RAM
USART0_transmite_string_RAM("Aguardando alguma ação...\n"); // enviamos uma string da memória RAM
}
}
return 0;
}