Tarde que temprano va a ser necesario visualizar los datos de nuestro sistema, ya sea para depurar el código, para saber si el sistema funciona o bien solo para presentarla, esto lo podemos hacer mediante pantallas de siete segmentos, pantallas LCD o matriz led, si tu aplicación no requiere más que una comunicación simplex, con esto bastaría, la desventaja viene cuando necesitamos una comunicación bidireccional, es aquí cuando el modulo USART nos viene bien.
Por fortuna cada vez mas microcontroladores incorporan un modulo EUSART, y no solo eso, si no que también ya contamos con un amplio abanico de módulos de radiofrecuencia utilizando diferentes protocolos de comunicación, dicho de otra manera, ya tenemos todo listo para mandar datos a diestra y siniestra por el espacio radial a.k.a el aire puro y llano.
Para este tutorial voy a utilizar el pic16f1827, pero tu puedes utilizar el que tengas a la mano, solo es necesario que tenga un modulo EUSART/USART.

IMPORTANTE:

Este proyecto utiliza un microcontrolador de microchip, por lo que es necesario tener un programador de picmicros o cualquier microcontrolador con modulo EUSART.

Teoría:

¿Que es USART?
USART vine de las siglas Universal Synchronous Asynchronous Receiver Transmitter, o en español Universal Sincrono Asincrono Receptor Transmisor, su nombre ya da una idea clara de para que se utiliza, esto es, para enviar y recibir datos de manera sincrona o asincrona, lo importante esta en la palabra universal esto quiere decir que puedes controlar cualquier modulo de radiofrecuencia independientemente del protocolo de comunicación que utilice.

Si, así es, puedes utilizar cualquier modulo de RF independientemente del protocolo de comunicación, voy a poner unos cuantos módulos de ejemplo:

•Protocolo: Zigbee.
•Modulo: XBee PRO.
•Modelo: XB24-DMPIT-250.
•Fabricante: Digi.
•Interfaz de comunicación: 3.3V CMOS serial UART.
•Métodos de configuración: AT & API.
•Taza de transmisión: Up to 115.2 kbps.
Como dato el protocolo zigbee es utilizado en los televisores 3D.

•Protocolo: Bluetooth.
•Modulo: RN42
•Modelo: RN42
•Fabricante: Microchip
•Interfaz de comunicación: UART (SPP or HCI) and USB (HCI only).
•Métodos de configuración: ASCII Interface.
•Taza de transmisión: 1.5 Mbps sustained, 3.0 Mbps burst in HCI mode.

•Protocolo: TCP/IP.
•Modulo: Cortex-M4 based WiFi SoC
•Modelo: EMW3165
•Fabricante: Seeed
•Interfaz de comunicación: UART mediante firmwire.
•Métodos de configuración: Firmwire.
•Taza de transmisión: 1, 2, 5.5, 11Mbps.
Existen módulos más básicos como por ejemplo ESP8266.

Como puedes ver si un modulo indica interfaz UART/USART ese modulo puede ser controlado mediante la EUSART/USART de nuestro micocontrolador.

¿Protocolo?
Definimos (i2c) lo que es un protocolo, básicamente un protocolo de comunicación no es otra cosa más que una serie de pasos (secuencias) que se deben seguir para poderse comunicar dos o más dispositivos.

¿Diferencias entre UART, USART y EUSART?
•UART .- Universal Asincrono Receptor Transmisor, solo puede maneja protocolos Asincronos
•USART .- Universal Sincrono Asincrono Receptor Transmisor, puede manejar protocolos Sincronos o Asincronos
•EUSART .- Universal Sincrono Asincrono Receptor Transmisor Mejorado, puede manejar protocolos Sincronos o Asincronos,
cuenta con mejoras en hardware como por ejemplo detección automática de baudaje.

Por lo tanto un modulo USART/EUSART puede manejar lo mismo que un modulo UART.

El modulo EUSART/USART utiliza dos lineas de comunicación:

  • TX: Linea de transmisión.- Envía datos del microcontrolador hacia el dispositivo.
  • RX: Linea de recepción.- Recibe datos del dispositivo.

Muy bien hasta este punto supongo que ya no hay dudas de para que sirve el modulo EUSART/USART, ahora vamos a la parte de los protocolos.

Protocolo síncrono.- Requiere sincronizarse con el dispositivo para establecer un intercambio de datos.

El recuadro rojo muestra el bit de inicio, mientras que el recuadro azul muestra los datos, eso de sincronizarse se refiere a que cada pulso (Tx) corresponde un dato (Rx), la "desventaja" de este tipo de protocolo es que son necesarias dos lineas, en este caso la linea de reloj va a ser Tx, y la linea de datos va a ser Rx, si quieres saber más sobre el protocolo sincrono te recomiendo que revises el tutorial i2c .

Protocolo Asincrono.- No requiere sincronizarse con el dispositivo para establecer un intercambio de datos.

El recuadro azul muestra el bit de inicio seguido de los datos, la ventaja es que solo se necesita una solo linea, es por eso que el protocolo asincrono es utilizado por la mayoría de los módulos de comunicación.

Hardware:

El diagrama de conexión está creado en diptrace, presiona sobre la imagen para descargarlo.

Lista de materiales:

• Microcontrolador (PIC16F1827)
• Modulo Bluetooth (Hc-05)
• Regulador de voltaje (78RM33)
• 2 resistencias de 330 Ω @ 1/4 watt
• 2 Diodos emisores de luz (LED)
• Capacitor electrolítico de 1µF @ 16 Volts
• Pila o batería de 9 Volts
Características del modulo HC-05:
• Typical -80dBm sensitivity
• Up to +4dBm RF transmit power
• Low Power 1.8V Operation ,1.8 to 3.6V I/O
• UART interface with programmable baud rate
• With integrated antenna

IMPORTANTE:

El modulo utiliza 3.3 Volts por lo tanto usamos el 78RM33, si lo utilizan a 5V es posible que se dañe el modulo de comunicación.

Código ASM:

NOTA: El código no utiliza las definiciones del archivo inc.

Si has leído los tutoriales anteriores lo más seguro es que ya te acostumbraste y ya no lo necesites, pero de todas maneras a la derecha dejo el nombre del registro correspondiente.

Por parte de la aplicación vamos a hacer el típico "hola mundo" pero en forma digital, esto es, encender y apagar un led mediante bluetooth.

Empezamos por configurar y calibrar el reloj interno.

;Configurando el reloj a 8MHZ
bsf 0x08,0 ;Banco 1
movlw 0x72
movwf 0x99 ;OSCCON
btfss 0x9A,4;OSCSTAT
goto $-1
btfss 0x9A,3
goto $-1
btfss 0x9A,0
goto $-1

Una de las características de la serie 182X, es la posibilidad de modificar el funcionamiento de ciertos pines.

En este caso los pines que nos interesan son los correspondientes a la USART, por parte del receptor Rx puede ser RB1 o RB2 y el transmisor Tx puede ser RB2 o RB5, pues bueno, voy a dejar Rx en RB1 y Tx en RB2 por lo tanto no es necesaria ninguna configuración adicional por default ya están configurados de esta manera.

;Configurando puertos
clrf 0x8C ;TRISA
clrf 0x8D ;TRISB
bsf 0x08,1 ;Banco 3
clrf 0x18C ;ANSELA
clrf 0x18D ;ANSELB

Ahora vamos a configurar el modulo EUSART en modo transmisión/recepción asíncrono UART.
El fabricante del modulo bluetooth nos da las siguientes especificaciones:

Default Baud rate: 38400, Data bits:8, Stop bit:1,Parity:No parity, Data control: has.
Supported baud rate: 9600,19200,38400,57600,115200,230400,460800.

Yo lo voy a utilizar en 9600:N:8:1 (Baud rate:9600, Parity: No parity, Data bits: 8 bits, Stop bit: 1)

En las hojas de datos podemos encontrar la formula para calcular el valor de los registros SPBRGH y SPBRGL, así como la tabla para los bits BRGH y BRG16, pero al menos que estés utilizando un baudaje especifico la manera mas rápida y cómoda es utilizar la tabla de valores que te proporciona microchip.

En la tabla de la hoja de datos vienen muchos datos y tal vez no sabes cual elegir, pero no te preocupes es más fácil de lo que crees, en primer lugar nos fijamos en el tipo de transmisión, en este caso es asíncrono, luego buscamos nuestra frecuencia de trabajo Fosc, en este caso son 8Mhz, por último el baudaje que queremos, en este caso son 9600, si ves que en todos los parámetros sale una raya "--", eso quiere decir que la frecuencia de trabajo no soporta ese baudaje o bien tienes que modificar los bits BRGH y BRG16.
Para que sirva de ejemplo busca en la imagen de arriba la frecuencia de 8Mhz para transmitir a 9600, la tabla especifica lo siguiente:
• Actual Rate: 9615
• % Error: 0.16
• SPBRG value: 12
Muy bien esto quiere decir que con 8Mhz solo podemos transmitir a 9615 bps con un error del 16%, para este caso el error es tolerable no pasa de que el modulo vuelva a mandar el dato, si queremos 0% de error tendríamos que transmitir a 10417 bps.
NOTA: SPBRG = SPBRGH(MSB)+SPBRGL(LSB)
Configuración de los registros:
• Sync = 0.
• BRGH = 0.
• BRG16 = 0.
Estos serian los valores de los registros que tenemos que poner en la configuración de la EUSART para que transmita a 9600bps.

;Configurando EUSART
movlw .12 ;Valor encontrado en tablas
movwf 0x19B ;SPBRGL
bsf 0x19D,7 ;RCSTA (SPEN=1)
bsf 0x19D,4 ;RCSTA (CREN=1)
bsf 0x19E,5 ;TXSTA (TXEN=1)

Por último configuramos la interrupción de recepción para atender cuando queramos encender, apagar o saber el estado del led.

;Configurando interrupciones
bcf 0x08,1 ;Banco 1
bsf 0x91,5 ;PIE1 (RCIE)
movlw 0xC0
movwf 0x0B ;INTCON

Con esto queda configurado el modulo EUSART, antes de seguir adelante debemos atener algo primero, el modulo por defecto se llama HC-05, si por algún motivo alguien hace un barrido con su celular o computadora y ve este nombre puede ser que sepa la contraseña, la cual es 1234, si la sabe ganaría acceso a nuestro microcontrolador, ya solo necesita saber los comandos para prender y apagar el led sin nuestro consentimiento, por lo tanto es vital cambiar tanto el nombre como la contraseña, o por lo menos el nombre.
El modulo se configura mediante comandos AT, pero para poder entrar en modo de comandos hay que hacer lo siguientes paso tal cual los pongo:

IMPORTANTE: El modulo utiliza 3.3 Volts por lo tanto no lo conectes a pines cuya salida sea de 5V, si lo haces es posible que se dañe el modulo de comunicación.

• Poner en bajo el PIN34.
• Encender la fuente.
• Poner en alto el PIN34.

Si compraste el modulo por ebay, o alguna otra tienda, estos vienen con un microswitch, si este es tu caso has lo siguiente:

• Manten presionado el switch.
• Enciende la fuente.
• Deja de presionar el switch.

Si lo hiciste bien el led (PIN31) debe parpadear aproximadamente a 1Hz mientras que en modo normal parpadea a 2Hz.
Lo que no indican (al menos en la hoja de datos que tengo) son los tiempo de espera, yo intente mandar el dato una solo vez pero no conseguía configurar el modulo, por lo tanto hice un bucle y lo deje alrededor de 5 segundos y ya quedo configurado.
Podría hacer una interfaz ASCII para configurar el modulo pero como solo tengo planeado configurarlo una sola vez la verdad no le veo el caso, que claro, si lo van a estar configurando cada cierto tiempo tal vez si les convenga crear una interfaz mas amigable y no hacerlo mediante fuerza bruta como yo lo hice.

;Configurando el modulo
;Cambiando de nombre al modulo
movlw 0x03
movwf 0x08 ;Banco 3
Loop clrf 0x1A0 ;Indice
AT movf 0x1A0,0
call _AT
movwf 0x19A ;TXREG
btfss 0x19E,1
goto $-1
incf 0x1A0,1
movf 0x1A0,0
xorlw .19
btfss 0x03,2
goto AT 
goto Loop
_AT addwf 0x02,1
dt "AT+NAME=edx-Twin3",0x0D,0x0A

IMPORTANTE: Todos los comandos deben terminar con \r\n = 0x0D 0x0A Para el caso del password es lo mismo, solo cambien en _AT la cadena AT+NAME=edx-twin3 por AT+PSWD=SU_PASSWORD.
Aquí les dejo la hoja de datos con todos los comandos:HC-05.pdf

Una vez que cambiamos el nombre y password del modulo, hacemos la rutina de atención a la interrupción.

org 0x04
movlw 0x03
movwf 0x08 ;Banco 3
movf 0x199,0 ;(RCREG)
movwf 0x1A0
movlw 0x41 ;(A)
xorwf 0x1A0,0
btfss 0x03,2
goto $+2
goto apagar
movlw 0x45 ;(E)
xorwf 0x1A0,0
btfss 0x03,2
goto $+2
goto encender
movlw 0x53 ;(S)
xorwf 0x1A0,0
btfss 0x03,2
goto salida
goto estado
apagar movlw 0x02
movwf 0x08
bcf 0x10D,3
goto salida 

encender movlw 0x02
movwf 0x08
bsf 0x10D,3
goto salida

estado clrf 0x08
btfss 0x0D,3
goto CERO
goto UNO

UNO movlw 0x03
movwf 0x08
clrf 0x1A0
loop movf 0x1A0,0
call _UNO
movwf 0x19A ;TXREG
btfss 0x19E,1
goto $-1
incf 0x1A0,1
movf 0x1A0,0
xorlw 0x0B
btfss 0x03,2
goto loop
goto salida

_UNO addwf 0x02,1
dt "Encendido",0x0D,0x0A

CERO movlw 0x03
movwf 0x08
clrf 0x1A0
loop1 movf 0x1A0,0
call _CERO
movwf 0x19A ;TXREG
btfss 0x19E,1
goto $-1
incf 0x1A0,1
movf 0x1A0,0
xorlw 0x09
btfss 0x03,2
goto loop1
goto salida

_CERO addwf 0x02,1
dt "Apagado",0x0D,0x0A

salida bcf 0x11,5 ;PIR1 (RCIF=0)
retfie

Por último el programa principal.

goto $+0

Resultado y palabras finales:

Aquí les dejo el vídeo donde se comprueba el funcionamiento del circuito y el código.

IMPORTANTE: Para poder enviar y recibir comandos es necesario utilizar terminales VT-100, pueden encontrarlas prácticamente para todos los sistemas operativos así como para dispositivos móviles.
Si por algún motivo no obtuvieron el mismo resultado les dejo los archivos para que lo prueban en su hardware.
Archivo con código asm: usart.asm
Archivo Hex: usart.hex

Esto sería todo en cuanto a este tutorial del modulo EUSART, si entendieron su funcionamiento prácticamente ya pueden utilizar cualquier modulo de radio frecuencia, solo recuerden, con un gran poder viene una gran responsabilidad, que la fuerza los acompañe y la verdad esta ahí afuera.
No se olviden de recomendar esta pagina en facebook, twitter, google plus o cualquier otra red social, foro, pagina web, o medio de comunicación, también pueden seguirme en twitter @edx_twin3 donde pongo las ultimas noticias sobre la página.
Como siempre cualquier duda, sugerencia, comentario, etc ...., la pueden enviar ya sea mediante la pagina de contacto, mediante correo electrónico edx@edx-twin3.org o utilizando el blog.
Por último pero no menos importante cualquier donativo es de gran ayuda para seguir haciendo tutoriales como este, gracias :1.