Sunteți pe pagina 1din 27

http://microcontroladores-mrelberni.

com/usart-pic-comunicacion-serial/

USART PIC Comunicacin serial

USART PIC, viene de receptor transmisor sncrono asncrono universal, es una forma de
comunicacin entre dispositivos que tengan esta capacidad, donde los datos son enviados
en grupos de 8 bits o de 9 bits pero bit por bit, esto es en serie, por eso se dice que esta
es una comunicacin serial, en esta seccin se comentar sobre este tipo de comunicacin
utilizando el mdulo USART del microcontrolador PIC, con el mdulo USART PIC el
microcontrolador puede comunicarse e intercambiar datos con el ordenador, con otros
microcontroladores, etc.
Para la comunicacin entre microcontroladores y para la comunicacin entre el
microcontrolador y el ordenador, se necesitan 2 hilos de conduccin para la transmisin y
recepcin de datos, y un hilo de conduccin para la conexin de los comunes o GND que
tienen que ser los mismos, para la comunicacin serial entre el microcontrolador y el
ordenador se seguir la norma RS232.

Si la comunicacin USART PIC es asncrona, uno de los hilos ser para la transmisin
de los datos de un dispositivo a otro y el otro hilo ser para la recepcin de datos entre un
dispositivo a otro, la transmisin y la recepcin pueden ocurrir en forma simultanea, lo
que si se tiene que cumplir es que la frecuencia de trabajo de ambos dispositivos tiene
que ser la misma, a esto se le conoce como los baudios que viene a ser la cantidad de bits
por segundo que se transmitirn entre ambos dispositivos.

Si la comunicacin USART PIC es sncrona, uno de los hilos ser utilizado tanto para
la transmisin y la recepcin de datos por lo que la transmisin no puede ocurrir en forma
simultanea, el otro hilo ser utilizado para enviar la seal de reloj de sincronizacin entre
ambos dispositivos, en este caso uno de los dispositivos es llamado maestro y el otro
esclavo, el maestro es el que controla la seal de reloj y cuando se inicia o finaliza la
comunicacin.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 1
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

El microcontrolador PIC utilizado como modelo ser el PIC16F877A, los pines de este
microcontrolador que trabajan con el mdulo USART PIC son el pin RX o pin receptor y
el pin TX o pin transmisor, los que en la imagen estn resaltados resaltados.
El pin RX es el pin para la recepcin de datos y tendr que ser configurado como una
entrada digital.

El pin TX es el pin para la transmisin de datos y tendr que ser configurado como una
salida digital.

El pin RX del PIC tiene que ser conectado al pin TX del otro dispositivo.

El pin TX del PIC tiene que ser conectado al pin RX del otro dispositivo

Los comunes de ambos dispositivos tambin tienen que estar conectados entres si.

Los niveles de tensin con los que trabajan los pines del mdulo USART PIC son de 0V y
5V un bajo ser 0V mientras que un alto ser 5V, por eso cuando la comunicacin es entre
microcontroladores la conexin entre pines se puede hacer directamente, pero cuando la
comunicacin es entre el microcontrolador y un ordenador la conexin entre pines tiene
que hacerse a travs de un conversor de nivel como el MAX232, ya que los niveles de
tensin para la comunicacin serial del ordenador son mayores que para el PIC
tpicamente entre -12V y 12V, adems de trabajar con lgica negativa, esto es para el
ordenador un bajo ser 12V mientras un alto ser -12V.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 2
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

Hay otra manera de conectar el PIC con el ordenador para la comunicacin serial mediante
resistencias y la compuerta inversora tipo Schmitt 74HC14 como se ve en la siguiente
imagen.

El socket donde se conectar el PIC con el ordenador para la comunicacin serial es del
tipo DB9 y se conoce como puerto serie, pero resulta que este tipo de puerto ya no viene
en los ordenadores porttiles que son los que hoy en da la mayora utiliza, lo que traen
ahora son puertos USB, por lo que para realizar la comunicacin serial con el mdulo
USART PIC ser necesario la utilizacin de un conversor SERIE-USB como el que se
muestra en la siguiente imagen.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 3
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

El conector DB9 es el que se utiliza para la comunicacin serial con el mdulo USART PIC,
este conector consta de de 9 pines, los hay hembra y macho, de este conector solo se
utilizarn 3 pines, uno para el pin RX, otro para el pin TX y el otro para el tierra, estos
pines tiene una numeracin que hay que respetar.

El conversor serie-USB viene con el conector DB9 macho, si el cable que trae es corto se tendr que
conseguir un cable serie DB9 del que la hembra se conectar al conector DB9 macho del conversor
serie-USB y el DB9 macho del cable serie DB9 al microcontrolador PIC ya sea a travs del MAX232 o
con el uso de la compuerta inversora como se comento lineas arriba, por lo que los pines a conectar
del DB9 macho con el mdulo USART PIC son en el siguiente orden:

El pin 2 que es pin receptor RX del conector DB9 macho que viene del ordenador, se
conectar a travs del MAX232 o con el uso de la compuerta inversora y la resistencia
de 1K al pin transmisor o pin TX del microcontrolador.

El pin 3 que es pin transmisor TX del conector DB9 macho que viene del ordenador, se
conectar a travs del MAX232 o con el uso de la compuerta inversora y la resistencia
de 22K al pin receptor o pin RX del microcontrolador.

El pin 5 que es pin GND o tierra o comn del conector DB9 macho que viene del
ordenador, se conectar al pin Vss del microcontrolador.

Las conexiones del mdulo USART PIC con el ordenador a travs de la compuerta
inversora y las resistencias, con el uso del conversor serie-USB ser como se indica en la
siguiente imagen.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 4
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

USART PIC PROGRAMACIN


Para programar el mdulo USART PIC en el PIC16F877A, se utilizan los siguientes
registros: el registro TXSTA, el registro RCSTA, el registro SPBRG, el registro TXREG, el
registro RXREG, y si se utilizan interrupciones USART PIC los registros PIE1 y PIR1.

El registro TXSTA es el registro de control de la transmisin de datos.

El bit7 CSRC es til cuando se utiliza la comunicacin serial sncrona, mediante este bit
se elige la fuente de reloj esto es quien de los dispositivos ser el maestro, en la
comunicacin serial asncrona este bit no tiene efecto.
El bit6 TX9 Es para elegir si la transmisin de datos ser a 9 bits o a 8 bits, si este bit se
pone a 1 la transmisin ser a 9 bits y se este bit se pone a 0 la transmisin ser a 8 bits.

El bit5 TXEN Este es el bit que habilita la transmisin de datos, al ponerlo a 1 se habilita
la transmisin de datos y si se lo pone a 0 la transmisin de datos estar deshabilitada.

El bit4 SYNC Con este bit se elige el tipo de comunicacin serial a utilizar con el mdulo
USART PIC, al ponerlo a 1 la comunicacin serial ser sncrona y al ponerlo a 0 la
comunicacin ser asncrona.

El bit3 no se utiliza.

El bit2 BRGH Este bit es para seleccionar la velocidad de los baudios, que es la cantidad
de bits que se enviarn por segundo en el modo asncrono, si se pone a 1 ser de alta
velocidad, si se pone a 0 ser de baja velocidad.

El bit1 TRMT Este bit indica el estado del registro TSR utilizado para la transmisin de
datos, trabaja automticamente, si est a 1 indica que el registro esta vaci, si est a 0
indica que el registro est lleno.

El bit 0 TX9D Este bit ser el noveno bit se se utilizan 9 bits en la transmisin de datos.

El Registro RCSTA Es el registro de control de la recepcin de datos.

El bit7 SPEN Este bit es que permite la habilitacin del uso del mdulo USART PIC, si se
pone a 1 se habilita el uso del mdulo USART PIC, si se pone a 0 no es posible utilizar el
mdulo USART PIC.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 5
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

El bit6 RX9 Es para elegir si la recepcin de datos ser a 9 bits o a 8 bits, si este bit se
pone a 1 la recepcin ser a 9 bits y se este bit se pone a 0 la recepcin ser a 8 bits.

El bit5 SREN Este es el bit se utiliza en el modo sncrono para habilitar la recepcin
sncrona, en el modo asncrono no es utilizado.

El bit4 CREN Con este bit se habilita la recepcin continua de datos al ponerlo a 1, si se
pone a 0 la recepcin continua de datos est deshabilitada.

El bit3 ADDEN Es utilizado en el modo asncrono si la recepcin de datos es de 9 bits. Si


la recepcin de datos es a 8 bits no es utilizado

El bit2 FERR Este bit trabaja automticamente si se pone a 1 es que se ha recibido un


dato no vlido.

El bit1 OERR Este bit trabaja automticamente y se pondr a 1 si se ha producido un


error por sobreescritura del dato recibido.

El bit 0 RX9D Este bit ser el noveno bit se se utilizan 9 bits en la recepcin de datos.

El registro SPBRG Es el registro donde se debe cargar el valor con el que se elige la
velocidad de transmisin de los datos, esto es los baudios o la cantidad de bits por
segundo que se enviarn en la comunicacin serial con el mdulo USART PIC, trabaja
junto con el bit BRGH del registro TXSTA.

El valor a cargar en el registro SPBFG se calcula con las siguientes frmulas que
dependern de la velocidad elegida con el bit BRGH, de la frecuencia del oscilador utilizado
y de si la comunicacin ser sncrona o asncrona.

Los ejemplos que se harn sern para la transmisin asncrona a alta velocidad por lo que la frmula
que se utilizar ser:
Velocidad en baudios=Fosc/(16*(SPBRG+1))

Es importante recordar que la velocidad en baudios de los dispositivos que se estn


comunicando tienen que ser iguales, la mas comn es la de 9600 baudios, si en la frmula
anterior se reemplaza y se despeja se tendr:

SPBRG=(Fosc/(16*9600))-1

de donde:

SPBRG=(Fosc/153600)-1

Por ejemplo si el oscilador es de 4MHz se tendr

SPBRG=(4000000/153600)-1=25

Por lo que para obtener un una velocidad de 9600 baudios se tendr que cargar el registro
SPBRG con 25.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 6
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

Hay un cuadro en la hoja de datos donde se tienen algunos valores a cargar en este
registro para el modo sncrono y asncrono dependiendo de la frecuencia del oscilador
utilizado y de la velocidad elegida.

El registro TXREG Es el registro donde se debe escribir el dato que se quiera enviar el la
comunicacin serial con el mdulo USART PIC.
El registro RCREG Es el registro donde se debe leer al recibir algn dato en la
comunicacin serial con el mdulo USART PIC.

El registro PIE1 Al poner el bit4 de este registro a 1 se habilita el uso de interrupciones


por la finalizacin de la transmisin del dato y al poner el bit5 de este registro a 1 se
habilita el uso de las interrupciones por la finalizacin de la recepcin del dato.

El registro PIR1 El bit bit4 de este registro se pondr a 1 cuando se ha terminado la


transmisin del dato, luego se pondr automticamente a 0, si esta habilitada la
interrupcin por finalizacin de la transmisin del dato este bit ser el que indica que ha
ocurrido la interrupcin. El bit5 de este registro se pondr a 1 cuando se ha terminado la
recepcin del dato, luego se pondr automticamente a 0, si esta habilitada la
interrupcin por finalizacin de la recepcin del dato este bit ser el que indica que ha
ocurrido la interrupcin.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 7
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

USART PIC PROGRAMACIN en el XC8


Para la programacin del mdulo USART PIC se utilizar el XC8, ya que este permite
trabajar directamente con los registros y esto es de gran ayuda para conocer mucho mas
sobre el manejo de los microcontroladores PIC, en este caso se comentar como se puede
proceder para utilizar el mdulo USART PIC del PIC16F877A, lo aqu comentado es muy
similar para otros microcontroladores PIC

Para iniciar el mdulo USART PIC.

Los pines del PIC116F877A para el manejo del mdulo USART PIC son el pin RC7 para la
recepcin de datos por lo que en este caso se le llama pin RX, y el pin RC6 para la
transmisin de datos, en este caso se le llama pin TX, el pin RX se tiene que configurar
como una entrada digital y el pin TX se tiene que configurar como una salida digital, esto
en el XC8 se puede hacer as:

TRISCbits.TRISC7=1;//pin RX como una entrada digital

TRISCbits.TRISC6=0;//pin RX como una salida digital

Configuracin del registro TXSTA para el control de la transmisin de datos, en este


caso se har para que la transmisin sea a 8 bits en forma asncrona de alta velocidad por
lo que:

El bit7 en modo asncrono no se usa por lo que se pondr a 0.

El bit6 se pondr a 0 para que la transmisin sea a 8 bits.

El bit5 se pondr a 1 para que est habilitada la transmisin de datos.

El bit4 se pondr a 0 porque la transmisin ser asncrona.

El bit3 no se utiliza por lo que se lo pondr a 0.

El bit2 se pondr a 1 para que el mdulo USART PIC trabaje a alta velocidad.
El bit1 es un bit de estado trabaja automticamente e indica cuando el registro donde se
coloca el dato a transmitir est lleno o vaco, se lo puede poner a 1 o a 0 para iniciar, en
este caso se lo pondr a 1 porque se est iniciando y tendra que estar vaco.

El bit0 no se utiliza porque es el bit de paridad cuando se utiliza la transmisin de 9 bits


pero como se utilizar la transmisin a 8 bits no influye y se lo pondr a 0.

Luego en la inicializacin del mdulo USART PIC el registro TXSTA en el XC8 quedar as:

TXSTA=0b00100110;// 8bits, transmisin habilitada, asncrono, alta velocidad

Configuracin del registro RCSTA para el control de la recepcin de datos, en este caso
se har para que la recepcin sea a 8 bits en forma asncrona de alta velocidad por lo que:

El bit7 se pondr a 1 para habilitar el uso del mdulo USART PIC.

El bit6 se pondr a 0 para que la recepcin sea a 8 bits.

El bit5 se pone a 0 porque no se usa en la comunicacin asncrona.

El bit4 se pone a 1 para habilitar la recepcin de datos.

El bit3 se pone a 0 porque la recepcin ser a 8 bit.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 8
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

El bit2 este bit trabaja automticamente cuando se pone a 1 indica que se ha recibido un
dato no vlido.

El bit1 este bit trabaja automticamente cuando se pone a 1 indica que se ha producido
un error por sobreescritura de algn dato recibido.

El bit0 no se utiliza porque es el bit de paridad cuando se utiliza la recepcin de 9 bits


pero como se utilizar la recepcin a 8 bits no influye y se lo pondr a 0.

Luego en la inicializacin del mdulo USART PIC el registro RCSTA en el XC8 quedar as:

RCSTA=0b10010000;//habilitado el USART PIC, recepcin 8 bits, habilitada, asncrono

Carga del registro SPBRG para los baudios o la cantidad de bits por segundo para la
comunicacin serial, como ser a alta velocidad por lo que el bit BRGH del registro TXSTA
se puso a 1 y en forma asncrona, se utilizar la frmula.

Velocidad en baudios=baudios=Fosc/(16*(SPBRG+1))

Al despejar se tendr SPBRG=(Fosc/(16*baudios))-1

En los ejemplos que se harn se utilizar una Fosc de 4Mhz y la velocidad ser de 9600
baudios, por lo que al reemplazar se tendr que el valor a cargar en el registro SPBRG
ser de 25, luego en el XC8 ser:

SPBRG=25;//para una velocidad de 9600baudios con un oscilador de 4Mhz

Entonces se puede iniciar el mdulo USART PIC en el XC8 de la siguiente manera:

//inicializacin del mdulo USART PIC en el XC8 modo asncrono, a 8bits,


//a 9600 baudios
TRISCbits.TRISC7=1;//pin RX como una entrada digital
TRISCbits.TRISC6=0;//pin TX como una salida digital
TXSTA=0b00100110;// 8bits, transmisin habilitada, asncrono, alta velocidad
RCSTA=0b10010000;//habilitado el USART PIC, recepcin 8 bits,
//habilitada, asncrono
SPBRG=25;//para una velocidad de 9600baudios con un oscilador de 4Mhz

La inicializacin podra hacerse dentro de una funcin a la que se le puede dar el nombre
que se quiera, en este caso se la llamar iniciar_usart() lo que en el XC8 ser as:

//inicializacin del mdulo USART PIC modo asncrono


//en una funcin, a 8bits,a 9600 baudios
/////////////////////////////////////////////////////
void iniciar_usart(){
TRISCbits.TRISC7=1;//pin RX como una entrada digital
TRISCbits.TRISC6=0;//pin RX como una salida digital
TXSTA=0b00100110;// 8bits, transmisin habilitada, asncrono, alta velocidad
RCSTA=0b10010000;//habilitado el USART PIC, recepcin 8 bits, habilitada, asncrono
SPBRG=25;//para una velocidad de 9600baudios con un oscilador de 4Mhz
}

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 9
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

Para la recepcin de datos con el mdulo USART PIC.


Los datos que se reciben son de tipo caracter, cuando se va recibir un dato a travs del pin
RX se tendr que esperar a que el bit5 del registro PIR1 se ponga a 1, este bit indica que
se ha completado la recepcin del dato, el dato recibido es de tipo caracter char y estar
en el registro RCREG, cuando se lee el dato guardndolo en alguna variable de tipo
caracter char este bit se pondr automticamente a 0, la recepcin de los datos en el XC8
se har en una funcin a la que se le puede llamar como se desee, en este caso se le
llamar recibe_caracter_usart().

///////////////////////////////////////////////

//recepcin de datos del mdulo USART PIC modo asncrono


////////////////////////////////////////////////////////////
unsigned char recibe_caracter_usart(){
if(PIR1bits.RCIF==1){//si el bit5 del registro PIR1 se ha puesto a 1
return RCREG;//devuelve el dato almacenado en el registro RCREG
}
else//sino
return;//retorna sin hacer nada
}

Para la transmisin de datos con el mdulo USART PIC.

Los datos que se transmiten son de tipo caracter, cuando se va transmitir un dato a travs
del pin TX se tendr que esperar a que el registro TSR donde se ponen los datos que se
van a enviar est vaco, esto se hace esperando a que el bit1 TRMT del registro TXSTA se
ponga a 1, este bit indica que se ha completado la transmisin de un dato anterior
mientras el dato que est en espera se coloca en el registro TXREG, cuando se vace el
registro TSR se podr enviar el otro dato que est esperando en el registro TXREG
pasndolo en forma automtica al registro TSR, el dato transmitido es de tipo caracter
char, cuando se pasa el dato del registro TXREG al registro TSR este bit se pondr
automticamente a 0, la transmisin de los datos en el XC8 se har en una funcin a la
que se le puede llamar como se desee, en este caso se le
llamar envia_caracter_usart().
///////////////////////////////////////////////

//transmisin de datos del mdulo USART PIC modo asncrono


///////////////////////////////////////////////
void envia_caracter_usart(unsigned char caracter){
while(TXSTAbits.TRMT==0);// mientras el registro TSR est lleno espera
TXREG = caracter;//cuando el el registro TSR est vacio se envia el caracter
}

Para la transmisin de cadenas de caracteres con el mdulo USART PIC se puede


utilizar la funcin vista anteriormente para la transmisin de caracteres para enviar
cadenas de caracteres, para ello se crear otra funcin que se puede llamar como se
desee pero en este caso se le llamar envia_cadena_usart().

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 10
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

Para la transmisin de cadenas de caracteres con el mdulo USART PIC se puede


utilizar la funcin vista anteriormente para la transmisin de caracteres para enviar
cadenas de caracteres, para ello se crear otra funcin que se puede llamar como se
desee pero en este caso se le llamar envia_cadena_usart().

///////////////////////////////////////////////

//transmisin de cadenas de caracteres con el mdulo USART PIC modo asncrono


///////////////////////////////////////////////
void envia_cadena_usart(char* cadena){//cadena de caracteres de tipo char
while(*cadena !=0x00){//mientras el ltimo valor de la cadena sea diferente
//de el caracter nulo
envia_caracter_usart(*cadena);//transmite los caracteres de cadena
cadena++;//incrementa la ubicacin de los caracteres en cadena
//para enviar el siguiente caracter de cadena
}
}

ARCHIVO DE CABECERA PARA EL USO DEL MDULO USART PIC


EN EL XC8
Se puede agrupar todas la funciones vistas anteriormente para el uso del mdulo USART
PIC en el XC8 en forma asncrona, 8 bits y a 9600 baudios en un archivo de cabecera al
que se le llamar en este caso usart.h, aunque se le puede dar el nombre que se desee,
se har uso de este archivo de cabecera en los ejemplos que se realizarn con el
PIC16F877A, si se utiliza otro pic u otra velocidad de comunicacin es fcil hacer los
cambios que se necesiten dentro del archivo usart.h, se ver algn ejemplo.

////////////////////////////////////////////////////////////////////

//Archivo de cabecera para el uso del mdulo USART PIC con el XC8///
///////////////////////////////////////////////////////////////////

#ifndef USART_H
#define USART_H

void iniciar_usart();//funcin para iniciar el USART PIC asncron, 8 bits, 9600 baudios
unsigned char recibe_caracter_usart();//funcin para la recepcin de caracteres
void envia_caracter_usart(unsigned char);//funcin para la transmisin de caracteres
void envia_cadena_usart(char*);//funcin para la transmisin de cadenas de caracteres

///////////////////////////////////////////////
//inicializacin del mdulo USART PIC modo asncrono
//en una funcin, a 8bits,a 9600 baudios
/////////////////////////////////////////////////////
void iniciar_usart(){

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 11
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

TRISCbits.TRISC7=1;//pin RX como una entrada digital


TRISCbits.TRISC6=0;//pin TX como una salida digital
TXSTA=0b00100110;// 8bits, transmisin habilitada, asncrono, alta velocidad
RCSTA=0b10010000;//habilitado el USART PIC, recepcin 8 bits, habilitada, asncrono
SPBRG=25;//para una velocidad de 9600baudios con un oscilador de 4Mhz
}

///////////////////////////////////////////////
//recepcin de datos del mdulo USART PIC modo asncrono
////////////////////////////////////////////////////////////
unsigned char recibe_caracter_usart(){
if(PIR1bits.RCIF==1){//si el bit5 del registro PIR1 se ha puesto a 1
return RCREG;//devuelve el dato almacenado en el registro RCREG
}
else//sino
return;//retorna sin hacer nada
}

///////////////////////////////////////////////
//transmisin de datos del mdulo USART PIC modo asncrono
///////////////////////////////////////////////
void envia_caracter_usart(unsigned char caracter){
while(TXSTAbits.TRMT==0);// mientras el registro TSR est lleno espera
TXREG = caracter;//cuando el el registro TSR est vacio se envia el caracter
}

///////////////////////////////////////////////
//transmisin de cadenas de caracteres con el mdulo USART PIC modo asncrono
///////////////////////////////////////////////
void envia_cadena_usart(char* cadena){//cadena de caracteres de tipo char
while(*cadena !=0x00){//mientras el ltimo valor de la cadena sea diferente
//de el caracter nulo
envia_caracter_usart(*cadena);//transmite los caracteres de cadena
cadena++;//incrementa la ubicacin de los caracteres en cadena
//para enviar el siguiente caracter de cadena
}
}

#endif /* USART_H */

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 12
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

USART PIC PROGRAMACIN Ejemplos en


el XC8
Para ver los ejemplos del manejo del mdulo USART PIC visitar este enlace.

USART PIC EJEMPLOS

USART PIC ejemplos 1 En este primer ejemplo se realizar la comunicacin serial entre
2 microcontroladores PIC16F877A, mediante dos pulsadores conectados en los pines RA0
y RA1 de uno de los PIC se podr encender o apagar un led conectado en el pin RB1 del
otro PIC.

Para utilizar los pines RA0 y RA1 como entradas digitales, aparte configurarlos con el
registro TRISA, es necesario poner el registro ADCON1 del mdulo ADC a 6, esto es
ADCON1=6.

El ejemplo es sencillo para no complicar el cdigo, pero se puede hacer lo que se quiera
mediante la comunicacin serial, la idea ser la misma si se quiere hacer cualquier tipo de
control de un microcontrolador con otro microcontrolador.

En este ejemplo lo que se busca es que se vea como utilizar el archivo de


cabecera usart.h ya que ser el utilizado en los siguientes USART PIC ejemplos.

En la siguiente imagen se ha creado un proyecto llamado usart1, con el archivo fuente


llamado usart_pic_ejemplos1.c, el la parte resaltada Header Files se hace click
derecho y en New se selecciona C Header File,en la ventana que aparece dentro
de File Name se le da el nombre de usart en Extension debe estar selecciona da la
opcin h, y se pulsa sobre Finish as se crear el archivo llamado usart.h, luego se hace
doble click sobre el archivo usart.h creado para que abrir el editor usart.h, se borra todo
lo que el programa genere, que quede limpio, se copia el contenido mostrado lineas arriba
y se pega dentro de usart.h, el resultado debe ser similar al que se ve en la siguiente
imagen.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 13
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

A partir de este momento ya se puede utilizar el archivo de cabecera usart.h para realizar
la comunicacin serial con el mdulo USART PIC

El circuito utilizado para el USART PIC ejemplos 1 es el siguiente:

Con el pulsador del pin RA0 del PIC 1 se encender el led del pin RB1 del PIC 2, con el
pulsador del pin RA1 del PIC 1 se apagar el led del pin RB1 del PIC 2.

En el cdigo para el PIC 1 se tiene que hacer que al presionar el pulsador para encender el
led se transmitir el caracter e al PIC 2, al presionar el pulsador para apagar el led se
transmitir el caracter a al PIC 2, el siguiente ser el cdigo para el PIC 1.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 14
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

///////////////////////////////////////////////

///////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 1 cdigo para el PIC 1* //
///////********************************///////

//bits de configuracin del PIC16F877A


#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit S
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CP = OFF // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 4000000


#include <xc.h>
#include "usart.h"//incluye el archivo de cabecera el que se ha creado
//en Header Files, para el uso del mdulo USART PIC

void main(void)
{
ADCON1=6;//para que RA0 y RA1 sean entradas digitales

TRISAbits.TRISA0=1;//como entrada para el pulsador de encender el led


TRISAbits.TRISA1=1;//como entrada para el pulsador de apagar el led

iniciar_usart();//inicia el mdulo USART PIC

while(1){
if(PORTAbits.RA0==0){//si se preciona el pulsador para encender el led
envia_caracter_usart('e');//se transmitir el caracter 'e' hacia PIC 2
}
if(PORTAbits.RA1==0){//si se preciona el pulsador para apagar el led
envia_caracter_usart('a');//se transmitir el caracter 'a' hacia PIC 2
}
}
return;
}

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 15
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

En el cdigo para el PIC 2 se tiene que hacer que cuando reciba el caracter e el led se
encienda y cuando reciba el caracter a el led se apague. El siguiente ser el cdigo para
el PIC 2

///////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 1 cdigo para el PIC 2* //
///////********************************///////
//bits de configuracin del PIC16F877A
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit S
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CP = OFF // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 4000000


#include <xc.h>
#include "usart.h"//incluye el archivo de cabecera el que se ha creado
//en Header Files, para el uso del mdulo USART PIC
void main(void)
{
unsigned char dato;//para guardar el dato de tipo caracter recibido

TRISBbits.TRISB1=0;//como salida para conectar el led


PORTBbits.RB1=0;//el led inicia apagado

iniciar_usart();//inicia el mdulo USART PIC

while(1){
dato=recibe_caracter_usart();//para leer el caracter recibido de PIC 1

if(dato=='e'){//si el dato recibido es el caracter 'e'


PORTBbits.RB1=1;//enciende el led
}
if(dato=='a'){//si el dato recibido es el caracter 'a'
PORTBbits.RB1=0;//apaga el led
}
}
return;
}

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 16
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

USART PIC ejemplos 2 En este segundo ejemplo se realizar la comunicacin serial


entre 2 microcontroladores PIC, uno de ellos ser el PIC16F88 y el otro ser el
PIC16F877A, en el PIC16F88 se crear una variable cuyo valor aumentar en una unidad
cada medio segundo, el tiempo estar controlado por la interrupcin por desborde del
timer1 del PIC16F88, cada 2 segundos se transmitir un caracter que puede ser 1, 2, 3
o 4 al PIC16F877A, de acuerdo al caracter recibido por el PIC16F877A se encender un
led en el puerto D de este.

Para el PIC16F88 ser necesario modificar en el archivo de cabecera usart.h dentro de la


funcin iniciar_usart() la ubicacin de los pines TX y RX del PIC16F88, modificando el
registro tris correspondiente, el pin RX est en el pin RB2 y el pin TX est en el pin RB5.

El circuito utilizado para el USART PIC ejemplos 2 es el siguiente:

En el cdigo para el PIC16F88 se crear la variable que aumentar en una unidad cada
medio segundo, cuando aumente en cuatro unidades se transmitir un caracter al
PIC16F877A, el cdigo es el siguiente:

//////////////////////////////////////////////////

/////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 2 cdigo para el PIC16F88 * //
///////********************************///////

//bits de configuracin para el PIC16F88


#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 17
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit


#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0 // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit
#pragma config IESO = ON

#define _XTAL_FREQ 4000000 //fracuenciadel oscilador del PIC16F88


#include <xc.h>
#include <stdint.h> //para utilizar uint8_t
#include "usart.h" //incluye el archivo de cabecera el que se ha creado
//en Header Files, para el uso del mdulo USART PIC, se
//se tiene que modificar los pines para RX y TX en el PIC16F88

uint8_t i=0;//variable auxiliar entera de 8 bits

void main(void) {
OSCCON=0b01101110;//selecciona oscilador interno del PIC16F88 a 4MHz

INTCON=0b11000000;//habilita uso de interrupciones


PIE1bits.TMR1IE=1;//habilita el uso de la interrupcin por desborde del timer1
PIR1bits.TMR1IF=0;//bandera indicadora de interrupcin del timer1 a 0

T1CON=0b00110001;//timer1 como temporizador prescaler de 8


TMR1=3035;//se inicia a este valor para obtener 500ms

iniciar_usart();//inicia el mdulo USART PIC para el PIC16F88

while(1){//ciclo del programa


if(i>=0&&i<4){//si la variable auxiliar esta entre 0 y 4
envia_caracter_usart('1');//transmite el caracter '1' al PIC16F877A
}
if(i>=4&&i<8){
envia_caracter_usart('2');
}
if(i>=8&&i<12){
envia_caracter_usart('3');
}

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 18
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

if(i>=12&&i<16){
envia_caracter_usart('4');
}
if(i==16)
i=0;

}
return;
}

void interrupt int_timer1(){//Rutina de atencin a las interrupciones


if(PIR1bits.TMR1IF){//si ha ocurrido la interrupcin por desborde del timer1
TMR1=3035;//se carga con este valor para temporizar 500ms
i++;//en cada interrupcin se incrementa en una unidad

PIR1bits.TMR1IF=0;//bandera nuevamente a 0 para seguir detectando la


//interrupcin timer1 por desborde
}
}

En el cdigo para el PIC16F877A se encender un led en el puerto D dependiendo del


caracter recibido del PIC16F88, el cdigo para el PIC161F877A es el siguiente:

//////////////////////////////////////////////////

/////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 2 cdigo para el PIC16F877A * //
///////********************************///////

//bits de configuracin para el PIC16F877A


#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000 //fracuencia del oscilador del PIC16F877A


#include <xc.h>
#include "usart.h" //incluye el archivo de cabecera, el que se ha creado

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 19
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

//en Header Files, para el uso del mdulo USART PIC16F877A

void main(void)
{
unsigned char dato;//variable tipo char para guardar el caracter recibido
TRISD&=~((1<<4)|(1<<5)|(1<<6)|(1<<7));//RD4, RD5, RD6 y RD7 como salidas digitales
PORTD&=~((1<<4)|(1<<5)|(1<<6)|(1<<7));//leds inician apagador

iniciar_usart();//inicia el mdulo USART PIC para el PIC16F877A

while(1){//ciclo de programa
dato=recibe_caracter_usart();//para leer el caracter recibido del PIC16F877A

switch(dato){
case '1'://En caso el caracter recibido sea 1
PORTD|=(1<<4);//enciende el led en el pin RD4
PORTD&=~((1<<5)|(1<<6)|(1<<7));//leds en RD5, RD6 y RD7 apagados
break;
case '2'://En caso el caracter recibido sea 2
PORTD|=(1<<5);//enciende el led en el pin RD5
PORTD&=~((1<<4)|(1<<6)|(1<<7));//leds en RD4, RD6 y RD7 apagados
break;
case '3'://En caso el caracter recibido sea 3
PORTD|=(1<<6);//enciende el led en el pin RD6
PORTD&=~((1<<4)|(1<<5)|(1<<7));//leds en RD4, RD5 y RD7 apagados
break;
case '4'://En caso el caracter recibido sea 4
PORTD|=(1<<7);//enciende el led en el pin RD7
PORTD&=~((1<<4)|(1<<5)|(1<<6));//leds en RD4, RD5 y RD6 apagados
break;
}

}
return;
}

USART PIC ejemplos 3 En este tercer ejemplo se realizar la comunicacin serial


entre el microcontrolador PIC16F877A y el ordenador utilizando el archivo de cabecera
usart.h, en este caso solo se enviar un mensaje para ser visto en el ordenador.

Se necesitar una ventana conocida como terminal donde se podr ver lo que se transmite
del microcontrolador al ordenador, y tambin para ver los datos que se transmiten del
ordenador al microcontrolador.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 20
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

Si se esta programando en Windows XP se utilizar el hyper terminal, si se esta


programando en el Windows 7 u 8 no se tendr el hyper terminal, y habr que buscarse
algn programa que cumpla la funcin del hyper terminal, en nuestro caso se est
programando en Windows 8 y este no tiene el hyper terminal, por lo que se utilizar
el TERA TERM el que se puede descargar desde aqu, en la siguiente imagen se puede
ver el tera term.

Se utilizar el conversor serial-usb para la comunicacin entre el PIC16F877A y el


ordenador; en el tera term se ir a setup luego a serial port para configurar el puerto
serial donde se ubica el conversor serial-usb, normalmente lo detecta solo, tambin se
puede establecer la comunicacin serial utilizando el visual basic, el java, el matlab y
muchos mas, pero para empezar se usar el tera term.

El circuito a utilizar ser el siguiente, hay que ser muy cuidadoso en cuanto a las
conexiones a realizar entre el ordenador, el conversor serial-usb, la compuerta inversora,
las resistencias y el microcontrolador.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 21
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

a imagen siguiente es el circuito montado en el protoboar con el conversor serial-usb

En el cdigo realizado en el XC8 para este ejemplo se enviar un mensaje al ordenador


mediante la funcin enviar_cadena_usart() que se encuentra dentro del archivo de
cabecera usart.h, el cdigo es el siguiente:

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 22
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

//////////////////////////////////////////////////

/////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 3 cdigo para el PIC16F877A * //
///////********************************///////

//bits de configuracin para el PIC16F877A


#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000 //frecuencia del oscilador del PIC16F877A


#include <xc.h>
#include "usart.h" //incluye el archivo de cabecera, el que se ha creado
//en Header Files, para el uso del mdulo USART PIC16F877A

void main(void)
{
iniciar_usart();//inicia el mdulo USART PIC

while(1){
envia_cadena_usart("microcontroladores-mrelberni.com");//mensaje a enviar al ordenador
//que ser visto en el tera term

envia_caracter_usart(13);//para el salto de linea


__delay_ms(200);//el mensaje ser enviado cada 200ms
}

return;
}

La siguiente es la imagen del mensaje visto en pantalla en el tera term

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 23
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

USART PIC ejemplos 4 En este cuarto ejemplo se realizar la comunicacin serial


entre el microcontrolador PIC16F877A y el ordenador utilizando el archivo de
cabecera usart.h, se encender y apagar un led conectado en el microcontrolador, al
presionar la tecla + del ordenador se encender el led, al presionar la tecla del
ordenador se apagar el led, se utilizar el TERA TERM para realizar la comunicacin.

El circuito a utilizar ser el siguiente, hay que ser muy cuidadoso en cuanto a las
conexiones a realizar entre el ordenador, el conversor serial-usb, la compuerta inversora,
las resistencias y el microcontrolador.

En el cdigo realizado en el XC8 se utilizar la funcin recibe_caracter_usart() que est


dentro de la funcin de cabecera usart.h para recibir el caracter transmitido por el
ordenador, cuando el caracter sea + se encender el led conectado al pin RD1, cuando el
caracter sea - se apagar el led. El cdigo es el siguiente:

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 24
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

//////////////////////////////////////////////////

/////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* USART PIC ejemplos 4 cdigo para el PIC16F877A * //
///////********************************///////

//bits de configuracin para el PIC16F877A


#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CP = OFF // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 4000000 //fracuencia del oscilador del PIC16F877A


#include <xc.h>
#include "usart.h" //incluye el archivo de cabecera, el que se ha creado
//en Header Files, para el uso del mdulo USART PIC16F877A

void main(void)
{
unsigned char dato;//para guardar el caracter recibido del ordenador

TRISDbits.TRISD1=0;//RD1 como salida donde se conectar el led a controlar


PORTDbits.RD1=0;//El led inicia apagado
iniciar_usart();//inicia el mdulo USART PIC

while(1){
dato=recibe_caracter_usart();//guarda en daato el caracter recibido del
//ordenador
if(dato=='+'){//si el caracter recibido es '+'
PORTDbits.RD1=1;//se enciende el led
envia_cadena_usart("led encendido");//mensaje a enviar al ordenador
//que ser visto en el tera term
envia_caracter_usart(13);//para retorno de carro
envia_caracter_usart(10);//para nueva linea
}

else if(dato=='-'){//sino si el caracter recibido es '-'

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 25
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

PORTDbits.RD1=0;//se apaga el led


envia_cadena_usart("led apagao");//mensaje a enviar al ordenador
//que ser visto en el tera term
envia_caracter_usart(13);//para retorno carro
envia_caracter_usart(10);//para nueva linea
}

return;
}

La siguiente es la imagen del caracter enviado por el ordenador y del mensaje visto en
pantalla en el tera term, para poder ver el caracter enviado, en el tera term hay que ir a
setup -> terminal y habilitar Local echo.

El mdulo USART PIC tambin puede ser utilizado mediante interrupciones, la forma de
proceder en este caso se puede ver aqu.

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 26
http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/

http://microcontroladores-mrelberni.com/usart-pic-comunicacion-serial/ pgina 27

S-ar putea să vă placă și