Neste tutorial vamos estabelecer uma comunicação serial entre dois microcontroladores ATMEGA8. A comunicação aqui estabelecida é do tipo UART (Universal Asynchronous Receiver Transmitter). Por meio dessa comunicação serial, os dados podem ser compartilhados entre dois microcontroladores, o que é necessário em vários sistemas embarcados.
Componentes necessários
Hardware: ATMEGA8 (2 peças), 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.
Diagrama de Circuito e Explicação
Vamos entender a comunicação serial em microcontroladores AVR. Aqui, ATMEGA envia dados para o outro ATMEGA em série. Possui outro modo de comunicação, mas para facilitar a comunicação, optamos pelo RS232. O pino RS232 do primeiro ATMEGA8 é conectado ao pino RXD do segundo ATMEGA8.
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 2.400 BPS (bits por segundo)
- Comunicação assíncrona (sem compartilhamento de relógio entre dois ATMEGA8)
Portanto, temos dois registradores definidos para dois ATMEGA8 de forma diferente, onde um atua como TRANSMISSOR e o outro como RECEPTOR.
Agora, para a interface RS232 entre dois microcontroladores ATmega, os seguintes recursos devem ser satisfeitos para o TRANSMISSOR e RECEPTOR:
1. O pino TXD (recurso de recebimento de dados) do primeiro controlador deve ser habilitado para o TRANSMISSOR e o pino RXD do segundo controlador deve ser habilitado para o RECEPTOR.
2. Como a comunicação é serial, precisamos saber quando o byte 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): (TRASMITTER SIDE) 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.
CINZA CLARO (RXC): (LADO DE RECEBIMENTO) Este bit não foi definido durante a inicialização, mas é usado durante o trabalho para verificar se o receptor está pronto para receber dados ou não. Veja o programa no LADO DE RECEPÇÃO para mais detalhes.
VOILET (TXEN): (LADO TRASMITTER) Este bit é definido para habilitar o pino do transmissor no LADO TRASMITTER.
VERMELHO (RXEN): (LADO DE RECEPÇÃO) Este bit representa o recurso de recebimento de dados, este bit deve ser definido para que os dados do módulo sejam recebidos pelo controlador, ele também habilita o pino RXD do controlador.
BROWN (RXCIE): Este bit deve ser definido para obter uma interrupção após a recepção de dados com sucesso. Ao habilitar este bit, ficamos sabendo, logo após o recebimento dos dados de 8 bits. Não vamos usar este bit aqui, por isso é deixado sozinho.
PINK (URSEL): Este bit deve ser definido antes de habilitar outros bits no UCSRC, depois de definir outros bits necessários no UCSRC; URSEL deve ser desativado ou zerado. Não vamos usar este bit aqui, por isso é deixado sozinho.
AMARELO (UCSZ0, UCSZ1, UCSZ2): (LADO RECEPTOR E LADO TRASMITTER) Estes 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 ATMEGA é estabelecida como comunicação de oito bits. Combinando a comunicação com a tabela, temos UCSZ0, UCSZ1 a um e UCSZ2 a zero.
Temos que configurá-los no lado da recepção e da transmissão.
LARANJA (UMSEL): (RECEBENDO LADO E LADO TRASMITTER) Este bit é definido com base em se o sistema está se comunicando de forma assíncrona (ambos usam relógios diferentes) ou síncrona (ambos usam o mesmo relógio).
Ambos os controladores 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): (RECEPÇÃO DO LADO E DO LADO DO TRASMITOR) Esses dois bits são ajustados com base na paridade de bit que estamos usando na comunicação.
O ATMEGA está programado para enviar dados sem paridade, como o comprimento da 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, UPM0 para zero ou eles são deixados, porque todos os bits são 0 por padrão.
AZUL (USBS): (LADO DE RECEPÇÃO E LADO DO TRASMITTER) Este bit é usado para escolher o número de bits de parada que estamos usando durante a comunicação.
A comunicação estabelecida aqui é 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 como '1' em ambos os controladores.
A taxa de transmissão é definida no controlador escolhendo o UBRRH apropriado.
O valor UBRRH é escolhido pela taxa de transmissão de referência cruzada e frequência de cristal da CPU.
Portanto, por referência cruzada, o valor UBRR é visto como '25' e, portanto, a taxa de transmissão é definida.
Conforme mostrado no circuito, um botão é conectado no lado do transmissor. Quando este botão é pressionado, dados de oito bits são enviados pelo TRANSMISSOR e esses dados são recebidos pelo RECEPTOR. Ao receber esses dados com sucesso, ele alterna o LED conectado a ele ON e OFF, o que mostra a transferência de dados bem-sucedida entre dois controladores.