MICROCONTROLADORES II
MÓDULO USARTMÓDULO USART
(Comunicación Serial Asíncrona)
TEMA 5
PROF. LUIS ZURITA
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
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
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
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
TRANSMISOR ASÍNCRONO
Prof. Luis Zurita Microcontroladores II
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
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
RECEPTOR ASÍNCRONO
Prof. Luis Zurita Microcontroladores II
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
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
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
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
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
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
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
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
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
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
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
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
// 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
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
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
• 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
Circuito integrado MAX232
Prof. Luis Zurita Microcontroladores II
• 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
• 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
#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
#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
Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
Ejemplo 2. Sistema Maestro-Esclavo multi- selector.
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
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
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
Información obtenida en LABVIEW
Prof. Luis Zurita Microcontroladores II
Información obtenida en LABVIEW
Prof. Luis Zurita Microcontroladores II
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
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
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
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
Configuración del COMPIM
Prof. Luis Zurita Microcontroladores II
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

Micro2 tema 5

  • 1.
    MICROCONTROLADORES II MÓDULO USARTMÓDULOUSART (Comunicación Serial Asíncrona) TEMA 5 PROF. LUIS ZURITA
  • 2.
    INTRODUCCIÓN • En lossistemas 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 • Esteprotocolo 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. Circuitode 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 • Eldato 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
  • 6.
    TRANSMISOR ASÍNCRONO Prof. LuisZurita Microcontroladores II
  • 7.
    TX9D TX9=1 1 bit TXREG REGISTRODE 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 • Losdatos 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
  • 9.
    RECEPTOR ASÍNCRONO Prof. LuisZurita Microcontroladores II
  • 10.
    REGISTRO DE DESPLAZAMIENTODE 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 enC • 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 enC 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 enC 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 enC 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 enC 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); #users232 (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 enC 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. Enviarlos 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 “VirtualTerminal”, 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 unacomunicació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
  • 26.
    Circuito integrado MAX232 Prof.Luis Zurita Microcontroladores II
  • 27.
    • En laactualidad, 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ónde 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 #usedelay (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 #usedelay(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. SistemaMaestro-Esclavo multi- selector. Simulación del Programa: Prof. Luis Zurita Microcontroladores II
  • 32.
    Ejemplo 2. SistemaMaestro-Esclavo multi- selector. Simulación del Programa: Prof. Luis Zurita Microcontroladores II
  • 33.
    PROGRAMA DEL PICMAESTRO: #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 PICESCLAVO: #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
  • 35.
    Información obtenida enLABVIEW Prof. Luis Zurita Microcontroladores II
  • 36.
    Información obtenida enLABVIEW Prof. Luis Zurita Microcontroladores II
  • 37.
    Puerto Serie enPROTEUS • 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 enPROTEUS 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
  • 41.
    Configuración del COMPIM Prof.Luis Zurita Microcontroladores II
  • 42.
    Recibe Transmite Recibe En este ejemplono se recibe nada, puesto que no se pudo conectar un cable USB entre dos puertos de la misma computadora. Prof. Luis Zurita Microcontroladores II