En este tutorial vamos a establecer una comunicación serial entre dos microcontroladores ATMEGA8. La comunicación establecida aquí es de tipo UART (Transmisor Receptor Asíncrono Universal). Mediante esta comunicación en serie, los datos se pueden compartir entre dos microcontroladores, lo que se requiere en varios sistemas integrados.
Componentes requeridos
Hardware: ATMEGA8 (2 piezas), fuente de alimentación (5v), PROGRAMADOR AVR-ISP, condensador de 100uF (conectado a través de la fuente de alimentación), resistencia de 1KΩ (dos piezas), LED, Botón.
Software: Atmel studio 6.1, progisp o flash magic.
Diagrama de circuito y explicación
Entendamos la comunicación en serie en los microcontroladores AVR. Aquí ATMEGA envía datos al otro ATMEGA en serie. Tiene otro modo de comunicación pero para facilitar la comunicación elegimos RS232. El pin RS232 del primer ATMEGA8 está conectado al pin RXD del segundo ATMEGA8.
La comunicación de datos establecida está programada para tener:
- Ocho bits de datos
- Dos bits de parada
- Sin bit de control de paridad
- Tasa de baudios de 2400 BPS (bits por segundo)
- Comunicación asíncrona (sin reloj compartido entre dos ATMEGA8)
Entonces tenemos dos registros establecidos para dos ATMEGA8 de manera diferente, donde uno actúa como TRANSMISOR y el otro actúa como RECEPTOR.
Ahora, para la interfaz RS232 entre dos microcontroladores ATmega, se deben cumplir las siguientes características para el TRANSMISOR y el RECEPTOR:
1. El pin TXD (función de recepción de datos) del primer controlador debe estar habilitado para TRANSMISOR y el pin RXD del segundo controlador debe estar habilitado para RECEIVER.
2. Dado que la comunicación es serial, necesitamos saber cuándo se recibe el byte de datos, de modo que podamos detener el programa hasta que se reciba el byte completo. Esto se hace habilitando una interrupción completa de la recepción de datos.
3. Los DATOS se transmiten y reciben al controlador en modo de 8 bits. Por lo tanto, se enviarán dos caracteres al controlador a la vez.
4. No hay bits de paridad, un bit de parada en los datos enviados por el módulo.
Las características anteriores se establecen en los registros del controlador; vamos a discutirlos brevemente,
GRIS OSCURO (UDRE): (LADO TRANSMISOR) Este bit no se establece durante el arranque pero se usa durante el trabajo para verificar si el transmisor está listo para transmitir o no. Vea el programa en TRASMITTER SIDE para más detalles.
GRIS CLARO (RXC): (LADO RECEPTOR) Este bit no se establece durante el inicio pero se usa durante el trabajo para verificar si el receptor está listo para recibir datos o no. Vea el programa en LADO RECEPTOR para más detalles.
VOILET (TXEN): (LADO DEL TRANSMISOR) Este bit está configurado para habilitar el pin del transmisor en el LADO DEL TRANSMISOR.
ROJO (RXEN): (LADO RECEPTOR) Este bit representa la función de recepción de datos, este bit debe establecerse para que el controlador reciba los datos del módulo, también habilita el pin RXD del controlador.
MARRÓN (RXCIE): Este bit debe establecerse para obtener una interrupción después de una recepción de datos exitosa. Al habilitar este bit, nos damos cuenta, justo después de recibir los datos de 8 bits. No vamos a utilizar este bit aquí, por lo que se deja solo.
ROSA (URSEL): este bit debe establecerse antes de habilitar otros bits en UCSRC, después de establecer otros bits necesarios en UCSRC; URSEL debe desactivarse o ponerse a cero. No vamos a utilizar este bit aquí, por lo que se deja solo.
AMARILLO (UCSZ0, UCSZ1, UCSZ2): (LADO RECEPTOR Y LADO TRANSMISOR) Estos tres bits se utilizan para seleccionar el número de bits de datos que estamos recibiendo o enviando de una sola vez.
La comunicación entre dos ATMEGA se establece como comunicación de ocho bits. Al hacer coincidir la comunicación con la tabla tenemos, UCSZ0, UCSZ1 a uno y UCSZ2 a cero.
Tenemos que configurarlos tanto en el lado de recepción como en el de transmisión.
NARANJA (UMSEL): (LADO RECEPTOR Y LADO TRANSMISOR) Este bit se establece en función de si el sistema se está comunicando de forma asíncrona (ambos usan un reloj diferente) o sincrónicamente (ambos usan el mismo reloj).
Ambos controladores no comparten ningún reloj. Dado que ambos usan su propio reloj interno. Por lo tanto, debemos establecer UMSEL en 0 en ambos controladores.
VERDE (UPM1, UPM0): (LADO RECEPTOR Y LADO TRANSMISOR) Estos dos bits se ajustan en función de la paridad de bits que estamos usando en la comunicación.
El ATMEGA está programado para enviar datos sin paridad, ya que la longitud de transmisión de datos es pequeña, claramente no podemos esperar pérdida de datos ni errores. Por tanto, aquí no establecemos ninguna paridad. Así que configuramos UPM1, UPM0 a cero o se dejan, porque todos los bits son 0 por defecto.
AZUL (USBS): (LADO RECEPTOR Y LADO TRANSMISOR) Este bit se usa para elegir el número de bits de parada que estamos usando durante la comunicación.
La comunicación establecida aquí es de tipo asíncrono, por lo que para obtener una transmisión y recepción de datos más precisa, necesitamos usar dos bits de parada, por lo tanto, configuramos USBS en '1' en ambos controladores.
La velocidad en baudios se establece en el controlador eligiendo el UBRRH apropiado.
El valor de UBRRH se elige por referencia cruzada de velocidad en baudios y frecuencia de cristal de CPU.
Entonces, por referencia cruzada, el valor UBRR se ve como '25', por lo que se establece la velocidad en baudios.
Como se muestra en el circuito, un botón está conectado en el lado del transmisor. Cuando se presiona este botón, el TRANSMISOR envía datos de ocho bits y el RECEPTOR los recibe. Al recibir estos datos con éxito, enciende y apaga el LED conectado a él, lo que muestra la transferencia de datos exitosa entre dos controladores.