Aquí vamos a establecer una comunicación entre un microcontrolador ATmega8 y Arduino Uno. La comunicación establecida aquí es de tipo UART (Transmisor Receptor Asíncrono Universal). Es una comunicación en serie. Mediante esta comunicación en serie, los datos se pueden compartir entre dos controladores, lo cual es necesario en varias aplicaciones del sistema integrado.
En sistemas embebidos debemos tener conocimientos básicos sobre las comunicaciones del sistema, por eso estamos haciendo este proyecto. En este proyecto discutiremos el sistema de comunicación básico y enviaremos algunos datos del transmisor al receptor en serie.
En este proyecto ATMEGA8 actúa como TRANSMISOR y ARDUINO UNO actúa como RECEPTOR. En comunicación serial enviaremos datos BIT POR BIT, hasta que un BYTE de datos sea transferido por completo. Los datos pueden tener un tamaño de 10 bits, pero por ahora nos mantendremos en 8 BITS.
Componentes requeridos
Hardware: ATMEGA8, ARDUINO UNO, 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, ARDUINO NIGHTLY.
Diagrama de circuito y explicación
Antes de discutir el diagrama del circuito y la programación del transmisor y el receptor, debemos comprender la comunicación en serie. El ATMEGA aquí envía datos al UNO en serie como se discutió anteriormente.
Tiene otros modos de comunicación como comunicación MASTER SLAVE, comunicación JTAG pero para facilitar la comunicación estamos eligiendo RS232. Aquí conectaremos el PIN TXD (Transmisor) de ATMEGA8 al PIN RXD (Receptor) de ARDUINO UNO
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 9600 BPS (bits por segundo)
- Comunicación asíncrona (sin reloj compartido entre ATMEGA8 y UNO (ambos tienen diferentes unidades de reloj))
Para establecer UART entre Arduino Uno y ATMEGA8, necesitamos programar la configuración con precisión. Para ello, debemos mantener los mismos parámetros mencionados anteriormente en ambos extremos. En éste actúa como TRANSMISOR y el otro actúa como RECEPTOR. Discutiremos la configuración de cada lado a continuación.
Ahora, para la interfaz RS232, se deben cumplir las siguientes características para el lado TRANSMISOR (ATMEGA8):
1. El pin TXD (función de recepción de datos) del primer controlador debe estar habilitado para TRANSMISOR.
2. Dado que la comunicación es serial, necesitamos saber cuándo se recibe el bye de datos, para poder 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): 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.
VOILET (TXEN): Este bit está configurado para habilitar el pin del transmisor en el LADO DEL TRANSMISOR.
AMARILLO (UCSZ0, UCSZ1 y UCSZ2): estos tres bits se utilizan para seleccionar la cantidad de bits de datos que estamos recibiendo o enviando de una sola vez.
La comunicación entre dos LADOS 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.
NARANJA (UMSEL): este bit se establece en función de si el sistema se comunica de forma asíncrona (ambos usan un reloj diferente) o de forma síncrona (ambos usan el mismo reloj).
Ambos SISTEMAS 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): estos dos bits se ajustan en función de la paridad de bits que estamos usando en la comunicación.
Los datos ATMEGA aquí están programados para enviar datos sin paridad, ya que la longitud de transmisión de datos es pequeña, claramente podemos esperar que no se pierdan datos ni se produzcan 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): Este bit se usa para elegir el número de bits de parada que usamos durante la comunicación.
La comunicación establecida en ella es de tipo asíncrono, por lo que para obtener una transmisión y recepción de datos más precisas, necesitamos usar dos bits de parada. Por lo tanto, configuramos USBS en '1' en el lado del TRANSMISOR.
La velocidad en baudios se establece en el controlador eligiendo el UBRRH apropiado:
El valor 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 '6', por lo que se establece la velocidad en baudios.
Con esto hemos establecido ajustes en LADO TRANSMISOR; ahora hablaremos del LADO RECEPTOR.
La habilitación de la comunicación serie en UNO se puede realizar mediante un solo comando.
|
La comunicación que supusimos establecer se realiza a una tasa de baudios de 9600 bits por segundo. Entonces, para que UNO establezca dicha velocidad en baudios e inicie la comunicación en serie, usamos el comando ”Serial.begin (9600);”. Aquí 9600 es la velocidad en baudios y se puede cambiar.
Ahora todo queda si para recibir datos, uno de los datos es recibido por la UNO, estará disponible para tomar. Estos datos son recogidos por el comando "iveddata = Serial.read (); ". Mediante este comando, los datos en serie se llevan a 'datos recibidos' llamado entero.
Como se muestra en el circuito, un botón está conectado en el lado del transmisor, cuando este botón está presionado, el TRANSMISOR (ATMEGA8) envía un dato de ocho bits y el RECEPTOR (ARDUINO UNO) recibe estos datos. Al recibir estos datos con éxito, enciende y apaga el LED conectado para mostrar la transferencia de datos exitosa entre dos controladores.
Mediante este UART la comunicación entre el controlador ATMEGA8 y ARDUINO UNO se establece con éxito.