Este documento trata sobre el módulo USART y la comunicación serial asíncrona. Introduce el protocolo RS-232, explica cómo funcionan el transmisor y receptor asíncronos a nivel de hardware, y describe la configuración y uso del módulo USART en el lenguaje C, incluyendo funciones para la transmisión y recepción de datos.
2. INTRODUCCIÓN
• En los sistemas con microcontroladores puede existir
la necesidad de conectarse con el mundo exterior, y
esto se logra mediante las comunicaciones seriales y
paralelas.
• En este tema se tratará la comunicación serial• En este tema se tratará la comunicación serial
asíncrona mediante el módulo USART. Dicha
comunicación permite establecer un enlace de
comunicación tipo Full Duplex.
Dispositivo
Externo
TX
TX
RX
RX
GND
RC6/TX
RC7/RX
µC
Prof. Luis Zurita Microcontroladores II
3. PROTOCOLO RS-232
• Este protocolo es el utilizado por los
microcontroladores y su módulo USART.
• Cada dato se envía independientemente de los
demás.
• Consta de 8 ó 9 bits de datos• Consta de 8 ó 9 bits de datos
• Consta de 1 bit de Inicio (START)
• Consta de 1 bit de Parada (STOP)
BIT INICIO BIT PARADA
DATOLSB MSB
Prof. Luis Zurita Microcontroladores II
4. MÓDULO USART
1. Circuito de Muestreo (RC7/RX)
2. Generador de Baudios
La frecuencia en baudios (bits por segundos) es la
velocidad a la que se realiza la transferencia de
datos. Valores normalizados: 330, 600, 1200, 2400,datos. Valores normalizados: 330, 600, 1200, 2400,
4800, 9600, 19200, 38400, otros.
• El USART tiene un generador de Frecuencia en
baudios, BRG. Su valor es controlado por el
Registro SPBRG.
• La frecuencia en baudios del generador depende
del bit BRGH del registro TXSTA (2).
Prof. Luis Zurita Microcontroladores II
5. TRANSMISOR ASÍNCRONO
• El dato a transmitirse se coloca en TXREG. De
inmediato pasa al registro de desplazamiento TSR,
que empieza a sacar los bits secuencialmente, según
la frecuencia establecida. Se incluye antes de los
datos el bit de Inicio. Y después de los bits de datos,
se agrega el bit de parada.se agrega el bit de parada.
• Como podemos ver, el corazón del transmisor lo
constituye el TSR, cuyo contenido es cargado con el
Dato a transmitir desde el TXREG.
• Lo va sacando bit a bit desde el LSB hasta el MSB.
Prof. Luis Zurita Microcontroladores II
7. TX9D
TX9=1 1 bit
TXREG
REGISTRO DE DESPLAZAMIENTO DE SALIDA
8 bits
RC6/TX
TX9D: 9 bits de datos transmitidos. Puede ser el bit de paridad
D0 D1 D2 D3 D4 D5 D6 D7
1 10
Bit start Bit stop
D0 D1 D2 D3 D4 D5 D6 D7
1 10
Bit start Bit stopTX9D
Tramas a enviarProf. Luis Zurita Microcontroladores II
8. RECEPTOR ASÍNCRONO
• Los datos se reciben en serie, bit a bit, por el pin RC7/RX, y se
van introduciendo secuencialmente en el registro de
desplazamiento RSR, que opera a una frecuencia 16 veces
más rápida que la de trabajo.
• Después de recibir el bit de Stop los datos acumulados en este
registro se cargan en el de datos RCREG (si está vacío).
Cuando la transferencia se ha completado, el bit RCIF (PIR1,5)
registro se cargan en el de datos RCREG (si está vacío).
Cuando la transferencia se ha completado, el bit RCIF (PIR1,5)
se pone a uno. La interrupción puede habilitarse o
deshabilitarse colocando a uno o borrando, respectivamente,
el bit RCIE (PIE1,5). El bit RCIF se borra cuando el registro
RCREG se ha leído (se "vacía" el registro).
Prof. Luis Zurita Microcontroladores II
10. REGISTRO DE DESPLAZAMIENTO DE SALIDA
8 bits
RC7/RX
1 bit
Recepción de datos
RX9=1
Buffer
RX9D RCREG
FIFO
Prof. Luis Zurita Microcontroladores II
11. Módulo USART en C
• Las siguientes directivas permiten una configuración genérica
del módulo USART:
#USE RS232 (opciones)
Esta directiva permite configurar varios parámetros del módulo
USART, tales como la velocidad de transmisión, pines
utilizados, entre otros. Se puede modificar en cualquier parte
del programa, pero siempre después de haber definido la
directiva #USE DELAY.directiva #USE DELAY.
Esta directiva habilita el uso de funciones tales como GETCH,
PUTCHAR y PRINTF. Permite su uso en dispositivos que no
poseen módulo USART mediante software USART.
Cuando se utilizan dispositivos con USART, si no se puede
alcanzar una tasa de baudios dentro del 3 % del valor deseado
utilizando la frecuencia de reloj actual, se generará un error.
Prof. Luis Zurita Microcontroladores II
12. Módulo USART en C
BAUD=X Velocidad en Baudios
XMIT=pin Pin de transmisión
RCV= pin Pin de recepción
FORCE_SW Usa un software UART en lugar del hardware,
aún cuando se especifican los pines del
hardware.hardware.
RESTART_WDT Hace que la función GETC ( ) ponga a cero el
WDT mientras espera un carácter.
BRGH1OK Permite velocidades de transmisión bajas en
chips que tienen problemas de transmisión.
Prof. Luis Zurita Microcontroladores II
13. Módulo USART en C
ENABLE= pin El pin especificado estará a nivel alto durante la
transmisión. Utilizado en transmisión 485.
DEBUGGER Permite depuración a través del ICD. El pin por
defecto es el B3;
INVERT Invierte la polaridad de los pines serie
(normalmente no es necesario con el(normalmente no es necesario con el
convertidor de nivel, como el MAX232). No
puede usarse con el USART interno.
PARITY= X Donde X es N,E u O
BITS= X Donde X es 5-9 (no puede usarse 5-7 con el
USART interno).
FLOAT_HIGH Se utiliza para las salidas de colector abierto.
Prof. Luis Zurita Microcontroladores II
14. Módulo USART en C
ERRORS Indica al compilador que guarde los errores recibidos en la
variable RS232_ERRORS para restablecerlos cuando se
producen.
SAMPLE_EARLY No se puede utilizar con el USART interno. Provoca que el
muestreo del dato a través de la función GETC ( ) se realice al
principio de un bit de tiempo.
RETURN= pin Para FLOAT_HIGH y MULTI_MASTER, este pin se usa para leer
la señal de retorno. Por defecto, para FLOAT_HIGH es XMIT y
para MULTIMASTER es RCV.para MULTIMASTER es RCV.
MULTI_MASTER Usa el pin de RETURN para determinar si otro master en el bus
está transmitiendo al mismo tiempo. Si se detecta una colisión,
el bit 6 se pone a 1 en RS232_ERRORS y todos los posibles
PUTC ( ) son ignorados hasta que el bit 6 esté a 0. La señal es
comprobada al final y al principio de cada bit de tiempo. No se
puede utilizar con USART interno.
LONG_DATA Permite manejar INT16 a las funciones GETC ( ) y PUTC ( ). En
formatos de datos de 9 bits.
DISABLE_INTS Provoca la deshabilitación de interrupciones cuando se ejecuta
GETC ( ) y PUTC ( ) evitando distorsiones en los datos.
Prof. Luis Zurita Microcontroladores II
15. Módulo USART en C
STOP= x Número de bits de stop (por defecto 1)
TIMEOUT= x Para establecer el tiempo que GETC ( ) espera
un carácter (en ms). Si no se recibe carácter en
este tiempo, el RS232_ERRORS se pone a 0.
SYNC_SLAVE Provoca una línea RS232 en modo esclavo
síncrono, haciendo el pin de recepción como
entrada de reloj y la de transmisión comoentrada de reloj y la de transmisión como
entrada/salida de datos.
SYNC_MASTER Provoca una línea RS232 en modo maestro
síncrono, haciendo el pin de recepción como
salida de reloj y la de transmisión como
entrada/salida de datos.
UART1 Configura el XMIT y RCV para el USART1
UART2 Configura el XMIT y RCV para el USART2
Prof. Luis Zurita Microcontroladores II
16. Ejemplos:
#use delay (clock=20000000);
#use rs232 (BAUD=9600 , XMIT=PIN_C6 , RCV=PIN_C7 , BITS=8)
#use rs232 (BAUD=9600 , XMIT=PIN_A2 , RCV=PIN_A3)
Setup_uart(baud)
baud es una constante que define la velocidad. Un 1 enciende el
USART y un 0 lo apaga. Con cualquier valor de velocidad, el USART
se enciende.
Módulo USART en C
se enciende.
set_uart_speed (baud)
Idéntica a la función anterior. Ejemplo:
// Se establece la velocidad mediante la combinación de los pines B0
y B1:
switch (input_b ( ) & 3){
case 0: set_uart_speed(2400); break;
case 1: set_uart_speed(4800); break;
case 2: set_uart_speed(9600); break;
case 3: set_uart_speed(19200); break;
Prof. Luis Zurita Microcontroladores II
17. Transmisión de datos:
putc (cdata)
putchar (cdata)
cdata es un carácter de 8 bits. Esta función envía un
carácter mediante el pin XMIT. La directiva #USE RS232
debe situarse siempre antes de utilizar esta función.
Módulo USART en C
debe situarse siempre antes de utilizar esta función.
puts (string)
string: cadena de caracteres constante o matriz de
caracteres terminada con un 0. La función puts ( ) manda
los caracteres de la cadena, uno a uno, a través del bus
RS232 utilizando la función PUTC ( ); detrás de la cadena
envía un RETURN (13) y un retorno de carro (10)
Prof. Luis Zurita Microcontroladores II
18. printf (fname, cstring, values…)
cstring: es una cadena de caracteres (constante) o matriz
de caracteres terminada con un cero.
fname: las funciones a utilizar para escribir la cadena
indicada; por defecto se utiliza la función PUTC ( ), que
permite escribir en el bus RS232.
values: valores a incluir en la cadena separados por comas;
Módulo USART en C
values: valores a incluir en la cadena separados por comas;
se debe indicar %nt. El formato es %nt, donde n es
opcional y puede ser:
1-9 para especificar cuantos caracteres deben ser
especificados;
01-09 para indicar la cantidad de ceros a la izquierda.
1.1-9.9 para coma flotante.
Prof. Luis Zurita Microcontroladores II
19. Módulo USART en C
t puede indicar:
c Carácter
s Cadena o carácter
u Entero sin signo
d Entero con signo
Lu Entero sin signo
Ld Entero largo con signoLd Entero largo con signo
x Entero hexadecimal (minúscula)
X Entero hexadecimal (mayúscula)
Lx Entero largo hexadecimal (minúscula)
LX Entero largo hexadecimal (mayúscula)
f Flotante con truncado
g Flotante con redondeo
e Flotante en formato exponencial
w Entero sin signo con decimales insertados. La 1ra cifra
indica el total, la 2da el número de decimales.
Prof. Luis Zurita Microcontroladores II
20. Recepción de datos:
value= getc ( );
value= getch ( );
value= getchar ( );
value (valor) es un carácter de 8 bits. Espera recibir un
carácter por la línea RS232 y devuelve su valor. En los
dispositivos con USART interno, se pueden almacenar
Módulo USART en C
dispositivos con USART interno, se pueden almacenar
hasta tres caracteres; para evitar esperas se puede
utilizar la función KBHIT ( ).
valor= kbhit ( );
valor es 0 (FALSE) si GETC ( ) debe esperar a que llegue un
carácter; 1 (TRUE) si ya hay un carácter listo para ser
leído por la función GETC ( ).
Prof. Luis Zurita Microcontroladores II
21. Ejemplo 1. Enviar los datos del 0 al 10, en modo asíncrono, entre dos
PICS. Visualizar con un LCD, los datos enviados y los datos recibidos;
la recepción del dato deberá ser por interrupción del USART.
// PIC MAESTRO
#include <16F877.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#include <LCD.C>
void main() {
int valor;int valor;
lcd_init();
while(1){
for (valor=0;valor<=10;valor++) {
PUTC(valor); // Envia valor
printf(lcd_putc,"fENVIANDOn");
printf(lcd_putc,"%1D",valor);
delay_ms(2000);
}
}
}
Prof. Luis Zurita Microcontroladores IIProf. Luis Zurita Microcontroladores II
22. // PIC ESCLAVO
#include <16F877.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05
int valor;
#int_RDA
RDA_isr() {
valor=GETC();} //Recibe valorvalor=GETC();} //Recibe valor
void main() {
bit_clear(TRISA,0);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for (;;) {
lcd_gotoxy(1,1);
printf(lcd_putc,"recibiendo=%1D",valor);
}
}
Prof. Luis Zurita Microcontroladores II
23. Con el “Virtual Terminal”, presionando el
botón derecho del mouse y seleccionando
Hex display mode, podemos visualizar los
datos que se están recibiendo.
Prof. Luis Zurita Microcontroladores II
24. La norma RS232
• Es la más básica de las comunicaciones serie. Comunica un
equipo terminal de datos (DTE) con el equipo de
comunicación de datos (DCE).
• Las características eléctricas de la señal en esta norma
establecen que la longitud máxima entre dos equipos no
debe ser superior a 15 metros, sin embargo, el autor hadebe ser superior a 15 metros, sin embargo, el autor ha
realizado pruebas de campo que permiten alcanzar los 30
metros. La velocidad máxima de transmisión es de 20 kbps.
Los niveles lógicos no son compatibles con los niveles TTL,
ya que se situan dentro de los siguientes rangos: 1 lógico
entre -3 v a -15 v y 0 lógico entre +3 v a +15 v.
• Se utilizan conectores DB9 y DB25.
Prof. Luis Zurita Microcontroladores II
25. • Para una comunicación full duplex desde el USART
del PIC, se debe conectar un mínimo número de
señales, a saber: TXD, RXD y tierra (GND). Los PICS
utilizan señal TTL en el módulo USART, por lo que
debe utilizarse un convertidor de niveles a RS232,
como el circuito integrado MAX232
La norma RS232
como el circuito integrado MAX232
MAX232
RX
RX
TX
TX
GND GND
NIVELES TTL NIVELES RS232
Prof. Luis Zurita Microcontroladores II
27. • En la actualidad, las computadoras desde el año 1996 han ido
erradicando el puerto serie con el conector DB9 y DB25, por el
puerto USB (Universal Serial Port).
• Una solución ha sido la implementación de cables de
conversión USB-232.
• Sin embargo, los microcontroladores de la familia PIC18,
integran un módulo USB para comunicaciones como protocolo
de comunicación.
PIC
Módulo
USART
PIC
Módulo
USB
Convertidor
USB-232
Familia PIC18Familia PIC16F87X
Prof. Luis Zurita Microcontroladores II
28. • La selección de las órdenes se realiza mediante un
teclado y se visualizan en una pantalla LCD en el
Maestro.
• Si se presiona 1, el Maestro envía el dato: 17H, el
esclavo activa el led Rojo y muestra en una pantalla
LCD: ORDEN1.
• Si se presiona 4, el Maestro envía el dato: 2DH, el
esclavo activa el led amarillo y muestra en una
Ejemplo 2. Realizar un sistema Maestro-Esclavo multi-
selector.
• Si se presiona 4, el Maestro envía el dato: 2DH, el
esclavo activa el led amarillo y muestra en una
pantalla LCD: ORDEN2.
• Si se presiona 7 el Maestro envía el dato: 64H, el
esclavo activa el led verde y muestra en una pantalla
LCD: ORDEN3.
• Si se presiona cualquier otra tecla, el Maestro envía
el dato: C2H, el esclavo desactiva todos los leds y
muestra en una pantalla LCD: TODOS OFF.
Prof. Luis Zurita Microcontroladores II
29. #include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (CLOCK = 4000000)
#use rs232(baud=9600, xmit=pin_c6,
rcv=pin_c7)
#define use_portb_kbd TRUE
#define use_portd_lcd TRUE
#include <lcd.c>
#include <kbd.c>
if (k!=0) {
if (x==1)
{valor=0x17;
PUTC(valor);
printf(lcd_putc,"fORDEN 1");}
else if (x==4)
{valor=0x2D;
PUTC(valor);
printf(lcd_putc,"fORDEN 2");}
else if (x==7)
Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Programa del Maestro:
void main() {
char k;
int x;
int valor;
lcd_init();
kbd_init();
port_b_pullups(TRUE);
printf(lcd_putc,"fPRESIONE FUNCION");
OUTPUT_C(0x00);
while (TRUE) {
k=kbd_getc();
x=k-48;
else if (x==7)
{valor=0x64;
PUTC(valor);
printf(lcd_putc,"fORDEN 3");}
else
{valor=0xC2;
PUTC(valor);
printf(lcd_putc,"fTODOS OFF");
delay_ms(1000);}
}
}
}
Prof. Luis Zurita Microcontroladores II
30. #include <16f877.h>
#fuses XT,NOWDT
#use delay(CLOCK=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,
bits=8)
#define use_portd_lcd TRUE
#include <lcd.c>
int valor;
#int_RDA
RDA_isr(void){
delay_ms(50);}
else if (valor==0x2D)
{printf(lcd_putc,"fORDEN 2");
output_low (PIN_C0);
output_high (PIN_C1);
output_low (PIN_C2);
delay_ms(50);}
else if (valor==0X64)
{printf(lcd_putc,"fORDEN 3");
output_low (PIN_C0);
output_low (PIN_C1);
Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Programa del Esclavo:
RDA_isr(void){
valor=GETC();}
void main() {
set_tris_c(0x80);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (TRUE) {
if (valor==0x17)
{printf(lcd_putc,"fORDEN 1");
output_high (PIN_C0);
output_low (PIN_C1);
output_low (PIN_C2);
output_low (PIN_C1);
output_high (PIN_C2);
delay_ms(50);}
else if (valor==0XC2)
{printf(lcd_putc,"fTODOS OFF");
output_low (PIN_C0);
output_low (PIN_C1);
output_low (PIN_C2);
delay_ms(50);}
else{
}
}
}
Prof. Luis Zurita Microcontroladores II
31. Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
32. Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
33. PROGRAMA DEL PIC MAESTRO:
#include <16F877A.h>
#device ADC=10
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use standard_io(c)
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6,
for (;;) {
set_adc_channel(0); // Conversión
//de la señal del potenciómetro
delay_ms(10); // Espera el TADQ
valor = read_adc(); // Lee el valor
de //la conversión
p=valor*0.098; // Factor escalar
Ejemplo 3. Realizar una conversión A/D de una señal proveniente de
un potenciómetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), además de
poder controlar el puerto B de un PIC16F873 desde la computadora.
#use rs232(baud=9600, xmit=pin_c6,
rcv=pin_c7, bits=8, parity=N)
#BYTE TRISA=0X85
#BYTE PORTA=0X05
void main() {
int16 valor;
int p;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
p=valor*0.098; // Factor escalar
//para pasar de 0-1023 a 0-100
putc(p);
delay_ms(200); //Tiempo de
//muestreo
}
}
Prof. Luis Zurita Microcontroladores II
34. PROGRAMA DEL PIC ESCLAVO:
#include <16F873A.h>
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use standard_io(c)
#use fast_io(b)
#use delay(clock=4000000)
void main() {
set_tris_b(0x00);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (1){
Ejemplo 3. Realizar una conversión A/D de una señal proveniente de
un potenciómetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), además de
poder controlar el puerto B de un PIC16F873 desde la computadora.
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6,
rcv=pin_c7, bits=8, parity=N)
int valor;
#int_RDA //Interrupción por RX de datos
RDA_isr(void){
valor=GETC();}
while (1){
output_b(valor);}
}
Prof. Luis Zurita Microcontroladores II
37. Puerto Serie en PROTEUS
• El ISIS del PROTEUS proporciona un componente que
permite la simulación a través del puerto serie:
COMPIM.
• Utilizando este componente no se necesita colocar un
MAX232 para la simulación, debido a que el propio
componente gestiona la comunicación con el puerto decomponente gestiona la comunicación con el puerto de
la computadora.
• Podemos entonces comunicarnos con nuestra propia
computadora. Si se tiene 2 puertos serie o 1 serie y
varios USB, con su respectivo cable convertidor, y así
manejar los datos que provienen del PIC con diferentes
programas de aplicación como Visual C, LABVIEW, entre
otros.
Prof. Luis Zurita Microcontroladores II
38. ERROR
TXD
3
RXD
2
CTS
8
RTS
7
DSR
6
DTR
4
DCD
1
RI
9
P1
Puerto Serie en PROTEUS
ERROR
COMPIM
La configuración del puerto se realiza como cualquier otro componente
y se pueden cambiar virtualmente todas las propiedades de un puerto
serie: número de puerto, velocidad, paridad, número de bits, entre
otros.
Prof. Luis Zurita Microcontroladores II
39. Para este ejercicio, se envían los datos del PIC al COMPIM 1. Para simular que los
datos se reciben en otro puerto (la computadora), se utiliza otro simulador
de puerto (COMPIM 2):
#include <16F877.h>
#device ADC=10
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
Ejemplo 4. Realizar una conversión A/D de una señal proveniente de
un potenciómetro y enviarlo al puerto serie de una computadora.
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD.C>
void main() {
int16 valor=0;
float p=0.0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
Prof. Luis Zurita Microcontroladores II
40. Continuación del ejercicio:
for (;;) {
set_adc_channel(0); // Conversión de la señal del potenciómetro
delay_us(10); // Espera el TADQ
valor = read_adc(); // Lee el valor de la conversión
p =5.0 * valor / 1024.0;// Convierte el valor decimal a voltaje
//Es lo mismo que utilizar p=0.004883*valor;
Ejemplo 4. Realizar una conversión A/D de una señal proveniente de
un potenciómetro y enviarlo al puerto serie de una computadora.
//Es lo mismo que utilizar p=0.004883*valor;
printf(lcd_putc, "fADC =%LUn",valor);
printf(lcd_putc,"VOLTAJE = %01.2fV",p);
printf("ADC = %4ld ",valor); //Envío de información a la computadora
printf("VOLTAJE = %01.2fVr", p); // El r permite cambiar de línea.
delay_ms(100);
}
}
Prof. Luis Zurita Microcontroladores II
42. Recibe
Transmite
Recibe
En este ejemplo no se recibe nada,
puesto que no se pudo conectar un
cable USB entre dos puertos de la
misma computadora.
Prof. Luis Zurita Microcontroladores II