Aqui vamos estabelecer uma comunicação entre um microcontrolador ATmega8 e o Arduino Uno. A comunicação aqui estabelecida é do tipo UART (Universal Asynchronous Receiver Transmitter). É uma comunicação serial. Por meio dessa comunicação serial, os dados podem ser compartilhados entre dois controladores, o que é necessário em várias aplicações de sistema embarcado.
Em sistemas embarcados devemos ter conhecimentos básicos sobre comunicação de sistemas, por isso estamos fazendo este projeto. Neste projeto, discutiremos o sistema básico de comunicação e enviaremos alguns dados do transmissor para o receptor em série.
Neste projeto o ATMEGA8 atua como um TRANSMISSOR e ARDUINO UNO como um RECEPTOR. Na comunicação serial enviaremos dados BIT BY BIT, até que um BYTE de dados seja transferido completamente. Os dados podem ter um tamanho de 10 bits, mas vamos manter os 8 bits por enquanto.
Componentes necessários
Hardware: ATMEGA8, ARDUINO UNO, fonte de alimentação (5v), AVR-ISP PROGRAMMER, capacitor 100uF (conectado na fonte de alimentação), resistor de 1KΩ (duas peças), LED, Botão.
Software: Atmel studio 6.1, progisp ou flash magic, ARDUINO NOITE.
Diagrama de Circuito e Explicação
Antes de discutirmos o diagrama de circuito e a programação para transmissor e receptor, precisamos entender sobre a comunicação serial. O ATMEGA aqui envia dados para o UNO em série, conforme discutido anteriormente.
Possui outros modos de comunicação como a comunicação MASTER SLAVE, a comunicação JTAG mas para uma comunicação fácil optamos pelo RS232. Aqui iremos conectar o PIN TXD (transmissor) de ATMEGA8 ao PIN RXD (receptor) de ARDUINO UNO
A comunicação de dados estabelecida é programada para ter:
- Oito bits de dados
- Dois bits de parada
- Sem bit de verificação de paridade
- Taxa de transmissão de 9600 BPS (bits por segundo)
- Comunicação assíncrona (sem compartilhamento de relógio entre ATMEGA8 e UNO (ambos têm unidades de relógio diferentes))
Para estabelecer o UART entre o Arduino Uno e o ATMEGA8, precisamos programar a configuração com precisão. Para isso, precisamos manter os parâmetros mencionados acima iguais em ambas as extremidades. Neste um atua como TRANSMISSOR e o outro atua como RECEPTOR. Discutiremos as configurações de cada lado abaixo.
Agora, para a interface RS232, os seguintes recursos devem ser satisfeitos para o lado do TRANSMISSOR (ATMEGA8):
1. O pino TXD (recurso de recebimento de dados) do primeiro controlador deve ser habilitado para o TRANSMISSOR.
2. Como a comunicação é serial, precisamos saber quando o bye de dados é recebido, para que possamos interromper o programa até que o byte completo seja recebido. Isso é feito ativando uma interrupção completa de recebimento de dados.
3. OS DADOS são transmitidos e recebidos ao controlador no modo de 8 bits. Portanto, dois personagens serão enviados ao controlador por vez.
4. Não há bits de paridade, um bit de parada nos dados enviados pelo módulo.
Os recursos acima são configurados nos registros do controlador; vamos discuti-los brevemente:
DARK GREY (UDRE): Este bit não é definido durante a inicialização, mas é usado durante o trabalho para verificar se o transmissor está pronto para transmitir ou não. Veja o programa no LADO DO TRASMITTER para mais detalhes.
VOILET (TXEN): Este bit é definido para habilitar o pino do transmissor no LADO DO TRASMITTER.
AMARELO (UCSZ0, UCSZ1 e UCSZ2): Esses três bits são usados para selecionar o número de bits de dados que estamos recebendo ou enviando de uma só vez.
A comunicação entre dois SIDES é estabelecida como comunicação de oito bits. Combinando a comunicação com a tabela, temos UCSZ0, UCSZ1 a um e UCSZ2 a zero.
LARANJA (UMSEL): Este bit é definido com base em se o sistema está se comunicando de forma assíncrona (ambos usam um relógio diferente) ou de forma síncrona (ambos usam o mesmo relógio).
Ambos os SYTEMS não compartilham nenhum relógio. Já que ambos usam um relógio interno próprio. Portanto, precisamos definir UMSEL para 0 em ambos os controladores.
VERDE (UPM1, UPM0): Esses dois bits são ajustados com base na paridade de bit que estamos usando na comunicação.
O ATMEGA de dados aqui está programado para enviar dados sem paridade, como o comprimento de transmissão de dados é pequeno, podemos esperar claramente nenhuma perda de dados ou erro. Portanto, não estamos definindo nenhuma paridade aqui. Portanto, definimos UPM1 e UPM0 para zero ou eles são deixados, porque todos os bits são 0 por padrão.
AZUL (USBS): Este bit é usado para escolher o número de bits de parada que estamos usando durante a comunicação.
A comunicação estabelecida é do tipo assíncrono, portanto, para obter transmissão e recepção de dados mais precisas, precisamos usar dois bits de parada, portanto, definimos USBS para '1' no lado do TRANSMISSOR.
A taxa de transmissão é definida no controlador, escolhendo o UBRRH apropriado:
O valor UBRRH é escolhido por referência cruzada de taxa de transmissão e frequência de cristal da CPU:
Portanto, por referência cruzada o valor UBRR é visto como '6' e, portanto, a taxa de transmissão é definida.
Com isso, estabelecemos configurações no LADO DO TRANSMISSOR; vamos falar sobre RECEBER LADO agora.
A habilitação da comunicação serial no UNO pode ser feita por meio de um único comando.
|
A comunicação que presumimos estabelecer é feita por uma taxa BAUD de 9600 bits por segundo. Assim, para que o UNO estabeleça tal taxa de transmissão e para iniciar a comunicação serial, usamos o comando ”Serial.begin (9600);” Aqui 9600 é a taxa de transmissão e é mutável.
Agora tudo que resta se receber dados, se um dado for recebido pelo UNO, ele estará disponível para retirada. Esses dados são obtidos pelo comando “receiveddata = Serial.read ();”. Por meio desse comando, os dados seriais são levados para o número inteiro denominado 'dados recebidos'.
Conforme mostrado no circuito, um botão está conectado no lado do transmissor, quando este botão é pressionado um dado de oito bits é enviado pelo TRANSMISSOR (ATMEGA8) e esses dados são recebidos pelo RECEPTOR (ARDUINO UNO). Ao receber esses dados com sucesso, ele alterna o LED conectado a ele ON e OFF, para mostrar a transferência de dados com sucesso entre dois controladores.
Por meio desta comunicação UART entre o controlador ATMEGA8 e ARDUINO UNO é estabelecida com sucesso.