Vous êtes sur la page 1sur 21

20/05/2013

MICROCONTROLADORES II
MDULO USART
(Comunicacin Serial Asncrona)
PROF. LUIS ZURITA

INTRODUCCIN
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 comunicacin serial
asncrona mediante el mdulo USART. Dicha
comunicacin permite establecer un enlace de
comunicacin tipo Full Duplex.
RC6/TX
RC7/RX
C
Prof. Luis Zurita

TX

RX

RX

TX
GND

Dispositivo
Externo
Microcontroladores II

20/05/2013

PROTOCOLO RS-232
Este protocolo es el utilizado por los
microcontroladores y su mdulo USART.
Cada dato se enva independientemente de los
dems.
Consta de 8 9 bits de datos
Consta de 1 bit de Inicio (START)
Consta de 1 bit de Parada (STOP)

BIT INICIO

LSB

DATO

MSB

Prof. Luis Zurita

BIT PARADA
Microcontroladores II

MDULO 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,
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

20/05/2013

TRANSMISOR ASNCRONO
El dato a transmitirse se coloca en TXREG. De
inmediato pasa al registro de desplazamiento TSR,
que empieza a sacar los bits secuencialmente, segn
la frecuencia establecida. Se incluye antes de los
datos el bit de Inicio. Y despus de los bits de datos,
se agrega el bit de parada.
Como podemos ver, el corazn 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 ASNCRONO

Prof. Luis Zurita

Microcontroladores II

20/05/2013

TX9D
TX9=1

TXREG

1 bit

8 bits
REGISTRO DE DESPLAZAMIENTO DE SALIDA

RC6/TX

TX9D: 9 bits de datos transmitidos. Puede ser el bit de paridad


0

D0

D1

D2

D3

D4

D5

D6

D7

Bit start
1

Bit stop

D0

D1

D2

D3

D4

D5

D6

Bit start
Prof. Luis Zurita

D7

TX9D

1
Bit stop

Tramas a enviar

Microcontroladores II

RECEPTOR ASNCRONO
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
ms rpida que la de trabajo.
Despus de recibir el bit de Stop los datos acumulados en este
registro se cargan en el de datos RCREG (si est vaco).
Cuando la transferencia se ha completado, el bit RCIF (PIR1,5)
se pone a uno. La interrupcin 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 ledo (se "vaca" el registro).

Prof. Luis Zurita

Microcontroladores II

20/05/2013

RECEPTOR ASNCRONO

Prof. Luis Zurita

Microcontroladores II

REGISTRO DE DESPLAZAMIENTO DE SALIDA

1 bit

8 bits
Buffer

RX9=1

RX9D

RCREG

FIFO

RC7/RX

Recepcin de datos

Prof. Luis Zurita

Microcontroladores II

20/05/2013

Mdulo USART en C
Las siguientes directivas permiten una configuracin genrica
del mdulo USART:
#USE RS232 (opciones)
Esta directiva permite configurar varios parmetros del mdulo
USART, tales como la velocidad de transmisin, pines
utilizados, entre otros. Se puede modificar en cualquier parte
del programa, pero siempre despus de haber definido la
directiva #USE DELAY.
Esta directiva habilita el uso de funciones tales como GETCH,
PUTCHAR y PRINTF. Permite su uso en dispositivos que no
poseen mdulo 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

Mdulo USART en C
BAUD=X
XMIT=pin
RCV= pin
FORCE_SW

RESTART_WDT
BRGH1OK

Prof. Luis Zurita

Velocidad en Baudios
Pin de transmisin
Pin de recepcin
Usa un software UART en lugar del hardware,
an cuando se especifican los pines del
hardware.
Hace que la funcin GETC ( ) ponga a cero el
WDT mientras espera un carcter.
Permite velocidades de transmisin bajas en
chips que tienen problemas de transmisin.

Microcontroladores II

20/05/2013

Mdulo USART en C
ENABLE= pin
DEBUGGER
INVERT

PARITY= X
BITS= X
FLOAT_HIGH

El pin especificado estar a nivel alto durante la


transmisin. Utilizado en transmisin 485.
Permite depuracin a travs del ICD. El pin por
defecto es el B3;
Invierte la polaridad de los pines serie
(normalmente no es necesario con el
convertidor de nivel, como el MAX232). No
puede usarse con el USART interno.
Donde X es N,E u O
Donde X es 5-9 (no puede usarse 5-7 con el
USART interno).
Se utiliza para las salidas de colector abierto.

Prof. Luis Zurita

Microcontroladores II

Mdulo 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 travs de la funcin 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 seal de retorno. Por defecto, para FLOAT_HIGH es XMIT y
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 colisin,
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 seal 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 deshabilitacin de interrupciones cuando se ejecuta


GETC ( ) y PUTC ( ) evitando distorsiones en los datos.

Prof. Luis Zurita

Microcontroladores II

20/05/2013

Mdulo USART en C
STOP= x
TIMEOUT= x

SYNC_SLAVE

SYNC_MASTER

UART1
UART2

Nmero de bits de stop (por defecto 1)


Para establecer el tiempo que GETC ( ) espera
un carcter (en ms). Si no se recibe carcter en
este tiempo, el RS232_ERRORS se pone a 0.
Provoca una lnea RS232 en modo esclavo
sncrono, haciendo el pin de recepcin como
entrada de reloj y la de transmisin como
entrada/salida de datos.
Provoca una lnea RS232 en modo maestro
sncrono, haciendo el pin de recepcin como
salida de reloj y la de transmisin como
entrada/salida de datos.
Configura el XMIT y RCV para el USART1
Configura el XMIT y RCV para el USART2

Prof. Luis Zurita

Microcontroladores II

Mdulo USART en C

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.
set_uart_speed (baud)
Idntica a la funcin anterior. Ejemplo:
// Se establece la velocidad mediante la combinacin 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

20/05/2013

Mdulo USART en C
Transmisin de datos:
putc (cdata)
putchar (cdata)
cdata es un carcter de 8 bits. Esta funcin enva un
carcter mediante el pin XMIT. La directiva #USE RS232
debe situarse siempre antes de utilizar esta funcin.
puts (string)
string: cadena de caracteres constante o matriz de
caracteres terminada con un 0. La funcin puts ( ) manda
los caracteres de la cadena, uno a uno, a travs del bus
RS232 utilizando la funcin PUTC ( ); detrs de la cadena
enva un RETURN (13) y un retorno de carro (10)
Prof. Luis Zurita

Microcontroladores II

Mdulo USART en C
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 funcin PUTC ( ), que
permite escribir en el bus RS232.
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

20/05/2013

Mdulo USART en C
t puede indicar:
c Carcter
s Cadena o carcter
u Entero sin signo
d Entero con signo
Lu Entero sin signo
Ld Entero largo con signo
x Entero hexadecimal (minscula)
X Entero hexadecimal (mayscula)
Lx Entero largo hexadecimal (minscula)
LX Entero largo hexadecimal (mayscula)
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 nmero de decimales.
Prof. Luis Zurita

Microcontroladores II

Mdulo USART en C
Recepcin de datos:
value= getc ( );
value= getch ( );
value= getchar ( );
value (valor) es un carcter de 8 bits. Espera recibir un
carcter por la lnea RS232 y devuelve su valor. En los
dispositivos con USART interno, se pueden almacenar
hasta tres caracteres; para evitar esperas se puede
utilizar la funcin KBHIT ( ).
valor= kbhit ( );
valor es 0 (FALSE) si GETC ( ) debe esperar a que llegue un
carcter; 1 (TRUE) si ya hay un carcter listo para ser
ledo por la funcin GETC ( ).
Prof. Luis Zurita

Microcontroladores II

10

20/05/2013

Ejemplo 1. Enviar los datos del 0 al 10, en modo asncrono, entre dos
PICS. Visualizar con un LCD, los datos enviados y los datos recibidos;
la recepcin del dato deber ser por interrupcin 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;
lcd_init();
while(1){
for (valor=0;valor<=10;valor++) {
PUTC(valor);
// Envia valor
printf(lcd_putc,"\fENVIANDO\n");
printf(lcd_putc,"%1D",valor);
delay_ms(2000);
}
}
}

Prof. 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 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

11

20/05/2013

Con el Virtual Terminal, presionando el


botn derecho del mouse y seleccionando
Hex display mode, podemos visualizar los
datos que se estn recibiendo.

Prof. Luis Zurita

Microcontroladores II

La norma RS232
Es la ms bsica de las comunicaciones serie. Comunica un
equipo terminal de datos (DTE) con el equipo de
comunicacin de datos (DCE).
Las caractersticas elctricas de la seal en esta norma
establecen que la longitud mxima entre dos equipos no
debe ser superior a 15 metros, sin embargo, el autor ha
realizado pruebas de campo que permiten alcanzar los 30
metros. La velocidad mxima de transmisin es de 20 kbps.
Los niveles lgicos no son compatibles con los niveles TTL,
ya que se situan dentro de los siguientes rangos: 1 lgico
entre -3 v a -15 v y 0 lgico entre +3 v a +15 v.
Se utilizan conectores DB9 y DB25.
Prof. Luis Zurita

Microcontroladores II

12

20/05/2013

La norma RS232
Para una comunicacin full duplex desde el USART
del PIC, se debe conectar un mnimo nmero de
seales, a saber: TXD, RXD y tierra (GND). Los PICS
utilizan seal TTL en el mdulo USART, por lo que
debe utilizarse un convertidor de niveles a RS232,
como el circuito integrado MAX232
RX
TX
GND

NIVELES TTL

TX

MAX232

RX
GND

NIVELES RS232

Prof. Luis Zurita

Microcontroladores II

Circuito integrado MAX232

Prof. Luis Zurita

Microcontroladores II

13

20/05/2013

En la actualidad, las computadoras desde el ao 1996 han ido


erradicando el puerto serie con el conector DB9 y DB25, por el
puerto USB (Universal Serial Port).
Una solucin ha sido la implementacin de cables de
conversin USB-232.
Sin embargo, los microcontroladores de la familia PIC18,
integran un mdulo USB para comunicaciones como protocolo
de comunicacin.

Convertidor
USB-232
Familia PIC16F87X
Prof. Luis Zurita

Mdulo
USART

Mdulo
USB

PIC

PIC

Familia PIC18
Microcontroladores II

Ejemplo 2. Realizar un sistema Maestro-Esclavo multiselector.


La seleccin de las rdenes se realiza mediante un
teclado y se visualizan en una pantalla LCD en el
Maestro.
Si se presiona 1, el Maestro enva el dato: 17H, el
esclavo activa el led Rojo y muestra en una pantalla
LCD: ORDEN1.
Si se presiona 4, el Maestro enva el dato: 2DH, el
esclavo activa el led amarillo y muestra en una
pantalla LCD: ORDEN2.
Si se presiona 7 el Maestro enva el dato: 64H, el
esclavo activa el led verde y muestra en una pantalla
LCD: ORDEN3.
Si se presiona cualquier otra tecla, el Maestro enva
el dato: C2H, el esclavo desactiva todos los leds y
muestra en una pantalla LCD: TODOS OFF.
Prof. Luis Zurita

Microcontroladores II

14

20/05/2013

Ejemplo 2. Sistema Maestro-Esclavo multi- selector.


Programa del Maestro:
#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)
{valor=0x64;
PUTC(valor);
printf(lcd_putc,"\fORDEN 3");}
else
{valor=0xC2;
PUTC(valor);
printf(lcd_putc,"\fTODOS OFF");
delay_ms(1000);}
}
}

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;

Prof. Luis Zurita

Microcontroladores II

Ejemplo 2. Sistema Maestro-Esclavo multi- selector.


Programa del Esclavo:
#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){
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);
Prof. Luis Zurita output_low (PIN_C2);

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);
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{
}

Microcontroladores II

15

20/05/2013

Ejemplo 2. Sistema Maestro-Esclavo multi- selector.


Simulacin del Programa:

Prof. Luis Zurita

Microcontroladores II

Ejemplo 2. Sistema Maestro-Esclavo multi- selector.


Simulacin del Programa:

Prof. Luis Zurita

Microcontroladores II

16

20/05/2013

Ejemplo 3. Realizar una conversin A/D de una seal proveniente de


un potencimetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), adems de
poder controlar el puerto B de un PIC16F873 desde la computadora.
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,
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);
Prof. Luis Zurita

for (;;) {
set_adc_channel(0); // Conversin
//de la seal del potencimetro
delay_ms(10);
// Espera el TADQ
valor = read_adc(); // Lee el valor
de //la conversin
p=valor*0.098; // Factor escalar
//para pasar de 0-1023 a 0-100
putc(p);
delay_ms(200); //Tiempo de
//muestreo
}

Microcontroladores II

Ejemplo 3. Realizar una conversin A/D de una seal proveniente de


un potencimetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), adems de
poder controlar el puerto B de un PIC16F873 desde la computadora.
PROGRAMA DEL PIC ESCLAVO:
#include <16F873A.h>

void main() {
set_tris_b(0x00);
#FUSES XT,NOWDT,NOPROTECT,NOLVP
enable_interrupts(INT_RDA);
#use standard_io(c)
enable_interrupts(GLOBAL);
#use fast_io(b)
while (1){
#use delay(clock=4000000)
output_b(valor);}
#use rs232(baud=9600, xmit=pin_c6,
}
rcv=pin_c7, bits=8, parity=N)

int valor;

#int_RDA //Interrupcin por RX de datos


RDA_isr(void){
valor=GETC();}
Prof. Luis Zurita

Microcontroladores II

17

20/05/2013

Informacin obtenida en LABVIEW

Prof. Luis Zurita

Microcontroladores II

Informacin obtenida en LABVIEW

Prof. Luis Zurita

Microcontroladores II

18

20/05/2013

Puerto Serie en PROTEUS


El ISIS del PROTEUS proporciona un componente que
permite la simulacin a travs del puerto serie:
COMPIM.
Utilizando este componente no se necesita colocar un
MAX232 para la simulacin, debido a que el propio
componente gestiona la comunicacin 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 aplicacin como Visual C, LABVIEW, entre
otros.
Prof. Luis Zurita

Microcontroladores II

Puerto Serie en PROTEUS


P1
1
6
2
7
3
8
4
9

DCD
DSR
RXD
RTS
TXD
CTS
DTR
RI

ERROR
COMPIM

La configuracin del puerto se realiza como cualquier otro componente


y se pueden cambiar virtualmente todas las propiedades de un puerto
serie: nmero de puerto, velocidad, paridad, nmero de bits, entre
otros.
Prof. Luis Zurita

Microcontroladores II

19

20/05/2013

Ejemplo 4. Realizar una conversin A/D de una seal proveniente de


un potencimetro y enviarlo al puerto serie de una computadora.
Para este ejercicio, se envan 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)
#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

Ejemplo 4. Realizar una conversin A/D de una seal proveniente de


un potencimetro y enviarlo al puerto serie de una computadora.
Continuacin del ejercicio:
for (;;) {
set_adc_channel(0); // Conversin de la seal del potencimetro
delay_us(10);
// Espera el TADQ
valor = read_adc();
// Lee el valor de la conversin
p =5.0 * valor / 1024.0;// Convierte el valor decimal a voltaje
//Es lo mismo que utilizar p=0.004883*valor;
printf(lcd_putc, "\fADC =%LU\n",valor);
printf(lcd_putc,"\VOLTAJE = %01.2fV",p);
printf("ADC = %4ld ",valor); //Envo de informacin a la computadora
printf("VOLTAJE = %01.2fV\r", p); // El \r permite cambiar de lnea.
delay_ms(100);
}
}
Prof. Luis Zurita

Microcontroladores II

20

20/05/2013

Configuracin del COMPIM

Prof. Luis Zurita

Microcontroladores II

Recibe

En este ejemplo no se recibe nada,


puesto que no se pudo conectar un
cable USB entre dos puertos de la
misma computadora.

Transmite
Prof. Luis Zurita

Microcontroladores II

21

Vous aimerez peut-être aussi