PIC18F25K22 & XC8: Uso de la UART1 con interrupciones para envio y recepción de datos


Saludos!! Siguiendo con ejemplos sobre el PIC18F25K22 hoy retomaremos una publicación anterior "PIC18F25K22 & XC8: Uso básico de la UART1 - Envio y recepción de datos" en el cual se realizo una comunicación serial del PIC-PC utilizando la UART1 de este microcontrolador. Para este ejemplo se ha cofigurado la UART para procesar el envio y la recepción de datos a través de las interrupciones dejando libre el MCU para otras actividades cuando no movimiento en Tx y Rx. 

Sponsor: PCBWay
Empresa manufacturera de PCBs y ensambles ubicada en China, con ya varios años en el mercado. Esta empresa nos permite realizar prototipos rápidos para nuestros desarrollos a medida., pero también permite realizar grandes producciones para proyectos comerciales. A continuación algunas características, si deseas saber mas o adquirir un servicio te recomiendo revisar su página.
  • Servicio de PCBs por tan solo $5 (USD) las 10 unidades, de 1 o 2 caras.
  • Cada nuevo miembro recibe un bono de $5(USD), más servicio express de 24Hs o 48Hs.
  • Servicio de ensamblado de PCBs por $30(USD)
  • Fabricación de esténcil, componentes y mas.
Circuito:
Como ya hemos venido haciendo en otros ejemplos estaré usando la PIC18BT MCE Development Board v1.0 para testear el codigo, pero el circuito es muy sencillo no requiere mucha explicación como monitor serial estaré usando el modulo chino "USB TO TTL CH340" que ya hemos usado en otros ejemplos en el blog. La conexión es la siguiente (recordar que las lineas de datos son cruzados):

MODULO CH340                 PIC18F25K22
        GND                                     GND
        RX                                     TX1/RC6
        TX                                     RX1/RC7

Ademas tenemos tres LEDs conectados en los pines RC2, RC3, RC4 respectivamente, con sus debidas resistencias.

Código:
Con respecto al codigo, se ha modificado el archivo "uart1.c" y "uart1.h" en donde están las funciones necesarias para realizar una comunicación.
  • void UART1_Initialize(long baudRate); Función para inicializar la UART y los inicializar pines, ademas se ha implementado unas condicionales para seleccionar automáticamente el valor de SPBRG dependiendo del baudrate seleccionado. 
  • void UART1_RxISR(void); Esta función procesa la interrupción cuando se recibe datos. Cabe mencionar que tenemos UART1_RX_BUFFER_SIZE = 64bytes esto quiere decir que es el máximo de datos que podemos recibir antes de que la misma función sobrescriba los datos en rxBuffer (esto por la mecánica de usar un buffer circular para procesar los datos). 
  • void UART1_TxISR(void); Esta función se encarga de enviar el txBuffer cuando se tenga algún datos o datos. 
  • void UART1_Write(char data); Función para llenar txBuffer. Recordar también que para enviar se tiene UART1_TX_BUFFER_SIZE = 64bytes antes de que se vuelva a reescribir los datos.
  • bool UART1_RxAvailable(void); Esta función retorna true si se tiene por lo menos un dato en txBuffer.
  • char UART1_ReadBuffer(void); Función para leer el dato actual recibido por Tx, si quieres conocer el todos los datos recibidos se tiene que procesar rxBuffer.
  • void UART1_PutStr(const char* dataStr); Función para escribir una string.
Para este demo vamos a enviar un string después de inicializar la UART y esperar un dato, dependiendo del dato recibido se cambia el estatus de los LEDs y retorna un mensaje, para cualquier dato que no entre en las condicionales simplemente retornamos un eco (el mismo dato). El codigo es el siguiente:

Resultado:
Para la computadora he usado el  proyecto "MRC SerialPortCtrl" como monitor serial, aca os dejo una captura de pantalla con los datos recibidos por el puerto COM.


Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.



Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.


Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.

Links:

Publicar un comentario

0 Comentarios