Hola amigos, en este tutorial veremos cómo crear librerías para el manejo de módulos externos, específicamente para la comunicación serial asíncrona revisada en el tutorial anterior.
¿Qué es una librería?
Cuando realizamos varios proyectos con microcontroladores, nos damos cuenta que ciertas actividades son repetitivas. Por ejemplo, al momento de enviar un dato por el USART siempre iniciamos el puerto, cargamos enviamos el ASCII y revisamos si la bandera de envío está activada (como se observó en el tutorial anterior); o cuando leemos el dato de un conversor analógico digital siempre se inicializa el conversor, se carga el valor en binario y se lo convierte a un tipo de dato que sea procesable o se pueda visualizar de mejor manera. Así, una librería es una porción de código que puede reutilizarse en todo proyecto y permite realizar actividades repetitivas evitando que escribamos todo nuevamente.
Librería usart.h
En el estricto sentido de la palabra, crearemos una clase más no una librería. Pero esto es el principio de funcionamiento de las mismas, pues en una librería se agrega código más completo para soportar diferentes tipos de microcontroladores, diferentes condiciones iniciales, etc.
Init_UART()
TRISBbits.TRISB1=1;
TRISBbits.TRISB2=1;
unsigned int x;
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
TXSTAbits.TX9=0; //transmisión 8 bits
TXSTAbits.TXEN=1; //transmisión habilitada
TXSTAbits.SYNC=0; // modo asíncrono
TXSTAbits.BRGH=1; // modo alta velocidad
TXSTAbits.TRMT=1; // borrar bandera de estado
RCSTAbits.SPEN=1; // habilitar puerto serial
RCSTAbits.RX9=0; //recepción en 8 bits
RCSTAbits.CREN=1; //habilitar recepción contínua
SPBRG = x; //cargar el valor para el baudrate
Write_UART()
void Write_UART(char data)
{
while(!TXIF); // escribir únicamente si el buffer no está ocupado
TXREG = data;
}
Write_Text_UART()
void Write_Text_UART(char *text)
{
int i;
for(i=0;text[i]!=\0;i++) //escribir hasta que el final de la cadena
{
Write_UART(text[i]);
}
}
Read_UART()
char Read_UART()
{
while(!RCIF); //leer únicamente si el buffer no está ocupado
return RCREG;
}
Read_Text_UART()
void Read_Text_UART(char *Output, unsigned int length)
{
unsigned int i;
for(int i=0;i<length;i++)
{
Output[i] = Read_UART();
}
}
void Init_UART(const long int baudrate)
{
unsigned int x;
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
TXSTAbits.TX9=0; //transmisión 8 bits
TXSTAbits.TXEN=1; //transmisión habilitada
TXSTAbits.SYNC=0; // modo asíncrono
TXSTAbits.BRGH=1; // modo alta velocidad
TXSTAbits.TRMT=1; // borrar bandera de estado
RCSTAbits.SPEN=1; // habilitar puerto serial
RCSTAbits.RX9=0; //recepción en 8 bits
RCSTAbits.CREN=1; //habilitar recepción contínua
SPBRG = x; //cargar el valor para el baudrate
}
char Read_UART()
{
while(!RCIF); //leer únicamente si el buffer no está ocupado
return RCREG;
}
void Read_Text_UART(char *Output, unsigned int length)
{
unsigned int i;
for(int i=0;i<length;i++)
{
Output[i] = Read_UART();
}
}
void Write_UART(char data)
{
while(!TXIF); // escribir únicamente si el buffer no está ocupado
TXREG = data;
}
void Write_Text_UART(char *text)
{
int i;
for(i=0;text[i]!=\0;i++) //escribir hasta que el final de la cadena
{
Write_UART(text[i]);
}
}
Utilizar la librería


#define _XTAL_FREQ 20000000 //declaración del cristal
#include <stdio.h>
#include <stdlib.h>
#include "confbits.h"
#include <xc.h>
#include "uart.h" //incluir la librería
int main(void)
{
Init_UART(9600); //inicializar la librería uart a 9600 baudios
while(1)
{
Write_Text_UART("Hola mundo \r\n");
}
}
Finalmente podemos utilizar 2 microcontroladores para probar tanto la escritura como lectura de datos. Para esto se conecta el TX del microcontrolador que envía el dato al RX del que lo recibe.

#define _XTAL_FREQ 20000000 //declaración del cristal
#include <stdio.h>
#include <stdlib.h>
#include "confbits.h"
#include <xc.h>
#include "uart.h" //incluir la librería
int main(void)
{
Init_UART(9600); //inicializar la librería uart a 9600 baudios
while(1)
{
Write_Text_UART("Hola mundo \r\n");
__delay_ms(1000);
}
}
#define _XTAL_FREQ 20000000 //declaración del cristal
#include <stdio.h>
#include <stdlib.h>
#include "confbits.h"
#include <xc.h>
#include "uart.h" //incluir la librería
int main(void)
{
Init_UART(9600); //inicializar la librería uart a 9600 baudios
unsigned char cadenarx[10];
while(1)
{
if (RCIF==0){
Read_Text_UART(cadenarx,10);
}
Write_Text_UART(cadenarx);
__delay_ms(1000);
}
}
La librería no es perfecta y puede completarse de muchas maneras. Por ejemplo se puede adicionar un control de tráfico en el puerto, crear un buffer de lectura dinámico que cierre la variable cuando reciba un caracter especial, etc. Sin embargo el propósito de este turorial es conocer cómo se realiza una librería básica para luego adaptarla a las necesidades de cada proyecto. Además, Microchip en sus librerías (plib) tiene desarrollada una especial para el manejo de USART la cual puede ser utilizada en series 18.
El proyecto completo y la simulación en Proteus lo puedes descargar a continuación. Descarga ejemplo
Es todo por hoy, espero la información haya sido de ayuda. Si te gustó por favor comparte la página, suscríbete y comenta.