You are on page 1of 14

Comunicacin RS232

Prueba de conexin serie entre un PIC y una


PC
Circuito convertidor serie-paralelo para el
port serie de la PC
por Eduardo J. Carletti
Presento aqu la prueba de laboratorio de un circuito realizado
especficamente para experimentar, de manera bsica, con la
comunicacin entre un microcontrolador PIC 16F628A y el puerto
serie de una PC (estndar RS-232). El circuito tiene, adems del
microcontrolador, un integrado convertidor de niveles RS232 a TTL
que es reemplazo del conocidoMAX232, pero cuesta ms barato
en el mercado argentino. Se trata del HIN232CP de Intersil, que
en Buenos Aires se puede comprar en Cika a un valor de u$s 1,1
+ 10,5% de IVA.

Integrado HIN232CP: Los circuitos con letra T son "Transmitters", que trasladan nivel TTL/CMOS en
su entrada a nivel RS232 en su salida. Los circuitos con letra R son "Receivers", que trasladan
seales RS232 en su entrada (que pueden ser de hasta +30/-30 V) a nivel TTL/CMOS en su salida.

Aqu voy a hacer una pequea disgresin sobre por qu utilizo


el PIC 16F628A en esta ocasin y en gran parte de los proyectos
que encaro y encarar, excepto cuando las prestaciones de este

microcontrolador no sean suficientes para la funcin requerida. La


razn principal es que es pata a pata compatible con el ms
antiguo pero ya clsico PIC 16F84A. Y es compatible en sus
programas, con la nica salvedad de que la memoria RAM se
encuenta en otra direccin. Transformar un programa hecho para
el PIC 16F84A para utilizarlo en este microcontrolador es una
cosa de segundos. Y hay miles de ejemplos en Internet y en libros
y revistas para el 16F84A, porque hace aos que se disea sobre
l, como procesador bsico.

Distribucin de patas (con sus funciones) del PIC 16F628A.

El PIC 16F84A puede estar muy bien como eleccin para


comenzar, pero la nica razn que va quedando para hacerlo es
que la mayora de los ejemplos de programa y de circuito que se
encuentran por all estn realizados sobre l. En base a lo dicho en
el prrafo anterior, entonces el PIC 16F628A es igual de elegible,
ya que es un reemplazo prcticamente directo de nuestro famoso
microcontrolador "de batalla". Pero por qu cambiar, si ambos
estn disponibles en el mercado? Por una razn muy simple:
el PIC 16F628A tiene ms memoria de programa (el doble), ms
RAM, ms EEPROM, ms modos de uso, ms timers, y ms
prestaciones, incluyendo la que aprovechamos en este diseo, el
puerto serie implementado por hardware... y el PIC 16F628A,
por lo menos en Argentina, cuesta menos... Por qu no cambiar,
entonces?
COMPARACIN
16F84A

16F628A

Memoria programa

1K

2K

Memoria datos

68 bytes

224 bytes

EEPROM

64 bytes

128 bytes

Timers

PWM

Reg. comparacin/captura

Comparadores

Referencias de voltaje

Oscilador interno reloj

37 KHz / 4 MHz

Patas usables E/S

13

16

Programacin a bajo voltaje

Precio en Buenos Aires (Cika)

us$ 3,51 (4 MHz)


us$ 7,02 (20 MHz)

u$s 3 (20 MHz)

Ahora volvamos al circuito de esta prueba


El microcontrolador se comunica utilizando su puerto serie. He
programado este puerto a una velocidad de 9600 baudios, un
formato de dato de 8 bits, sin paridad, un bit de parada, y sin
ningn control de flujo. El programa en el microcontrolador se
inicia enviando un mensaje a la PC que dice Hola amigo. Luego la
rutina principal de este pequeo programa espera a recibir un
caracter, lo devuelve como eco hacia la PC, y luego lo exhibe a
travs de sus puertos, donde tenemos conectados LEDs
indicadores. Esto nos permite comprobar la recepcin de los
caracteres ASCII desde la PC, cuyo cdigo veremos sobre los
LEDs. Tambin hace que nuestro circuito cumpla la funcin de
transformar la salida serie de la PC en una salida de 8 bits en
paralelo.
A continuacin se puede observar el circuito que he utilizado:
Circuito del interfaz de comunicacin RS232 entre un PIC y
una PC

Algn lector observador habr notado que no se utiliza el Puerto A


completo (1 byte) para manejar los LEDs que exhiben el caracter
que se ha recibido desde la PC. Los bits 4 y 5 del Puerto A no se
utilizan, y a cambio los LEDs que corresponden a estos bits se
conectan al Puerto B. Por qu complicarse as? No es mejor
escribir un byte completo en un puerto, sin tener que manejar dos
bits por separado en otro puerto, que para peor tiene dos bits
afectados a la comunicacin serie?
Paciencia, todo tiene su explicacin: Tal como se ha configurado el
microcontrolador, el Puerto A tiene, efectivamente, ocho bits de
ancho, pero por caractersticas de circuito no se pueden utilizar los
ocho como salida. El bit 5 solamente se puede utilizar como
entrada, y el bit 4 tiene un circuito de salida de drenaje abierto, es
decir, cuando est en alto no entrega corriente, de manera que no
encendera el LED con el circuito que estamos utilizando. Antes
que ponerme a hacer algunos malabarismos con el circuito, prefer

solucionar esto por programa y "sacar" los dos bits faltantes a


travs del Puerto B, bits 4 y 5. El "costo" de esta solucin son tres
o cuatro lneas de programa, nada ms.
Montaje del circuito de conexin serie entre un PIC
16F628A y una PC

Detalle de montaje del circuito de conexin serie

Programa

;
*********************************************
**********************
; INTERFAZ SERIE RS232 - ECO Y DISPLAY EN
LEDS
; CONVERTIDOR SERIE RS232 - PARALELO 8 BITS
;
*********************************************
**********************
LIST P=16F628, R=DEC
PIC16F628 y sistema decimal
#include "P16F628A.INC"
datos de PIC16F628A

; Usar el
; Incluye

CONFIG
_CP_OFF & _WDT_OFF & _LVP_OFF
& _PWRTE_ON & _INTRC_OSC_NOCLKOUT &
_MCLRE_OFF
;

*********************************************
**********************
; CONFIGURACION
;
*********************************************
**********************
; El PIC es configurado para usar todas las
entradas y salidas
; posibles = 16. Por eso no se usa el
oscilador con cristal externo,
; lo que deja libres las patas 15 y 16 para
usar como bits de puerto.
; Se define el clock interno a 4 MHz. No se
usa el master reset
; (pata 4), que queda convertida en el Puerto
A, bit 5 (entrada).
;
*********************************************
**********************
; VARIABLES
;
*********************************************
**********************
contador
dato_serie
la PC

EQU
EQU

0x28
0x29

; variable
; dato serie desde

;
*********************************************
**********************
ORG
0x000
empieza en 0x000

; El programa

;
*********************************************
**********************
; Inhibe comparadores
;
*********************************************
**********************
movlw 7
movwf CMCON
los comparadores
;

; CMCON=7 inhibir

*********************************************
**********************
; Inicializar Puertos
;
*********************************************
**********************
movlw b'00000000'

; valor inicial

portA
movwf PORTA
movlw b'00000000'
inicial portB
movwf PORTB

; valor

bsf STATUS,RP0

; Pg 1 RAM

movlw b'00000000'
movwf TRISA
;
mostrar el dato en LEDS)
;
no usaremos
;
tiene salida open drain, y
;
puede ser entrada

salidas (para
de estas salidas,
PORTA 4, que
PORTA 5, que slo

movlw b'11001011' ; RB0 entrada


; RB1 (RX) =
entrada
; RB2 (TX) = salida
; RB3 = entrada
; RB2 = salida del
bit 4 del dato a LEDS
; RB5 = salida del
bit 5 del dato a LEDS
; RB6 y RB7 =
entradas
movwf TRISB
;
*********************************************
**********************
; BAUD RATE para la comunicacin RS232
; y otras definiciones para USART
;
*********************************************
**********************
; Baud Rate = 9600, Sin Paridad, 1 Bit parada
;
movlw 0x19
; 0x19=9600

bps (0x0C=19200 bps)


movwf SPBRG
movlw b'00100100'
movwf TXSTA
transmisin Async
bcf STATUS,RP0
movlw b'10010000'
recepcin Async
movwf RCSTA

;
; habilita la
; RAM PAGE 0
; habilita de

;
*********************************************
**********************
; TIEMPO DE ESTABILIZACION
;
*********************************************
**********************
clrf contador
estab decfsz contador,F
goto estab
movf RCREG,W
movf RCREG,W
movf RCREG,W
buffer de recepcin
call Bienvenida
mensaje de bienvenida

; vaca el
; enva

;
*********************************************
**********************
; LAZO PRINCIPAL
;
*********************************************
**********************
loop
clrw
btfss PIR1,RCIF
; (5) se fija
si hay dato RS232
goto loop
; no, no lleg
call recibeRS232
; s, hay
movwf dato_serie
; guarda dato (para
uso de cualquier rutina)
call enviaRS232
; enva el
eco a la PC

call muestra
; muestra el
caracter recibido en LEDS
goto loop
;
*********************************************
**********************
; RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;
*********************************************
**********************
recibeRS232
movf RCREG,W
recibido en acumulador
return

; guarda dato

;
*********************************************
**********************
; ENVIA CARACTER SERIE - RS232 - A LA PC Y
ESPERA A QUE HAYA SALIDO
;
*********************************************
**********************
enviaRS232
movwf TXREG
; envo el dato
en acunulador w
bsf STATUS,RP0
; Pg 1 RAM
Espere
btfss TXSTA,TRMT
;
transmision completa si es alto
goto Espere
bcf STATUS,RP0
; Pg 0
RAM
return
;
*********************************************
**********************
; MUESTRA DATO
;
*********************************************
**********************
muestra
movf dato_serie,w
guardado
movwf PORTA
LEDS en PORTA

; recupera el dato
; exhibe el dato en

btfss dato_serie,4 ; pero, como el


PORTA tiene el bit 4 que es
bcf PORTB,4
; open drain, nos
conviene poner
btfsc dato_serie,4 ; el bit 4 del dato
en otra salida;
bsf PORTB,4
; lo hacemos en el
bit 4 del PORTB.
btfss dato_serie,5 ; y , como el PORTA
tiene el bit 5 que es
bcf PORTB,5
; slo usable como
entrada, tenemos que poner
btfsc dato_serie,5 ; el bit 5 del dato
en alguna salida;
bsf PORTB,5
; lo hacemos en el
bit 5 del PORTB.
return
;
*********************************************
**********************
; MENSAJES
;
*********************************************
**********************
Bienvenida
; los primeros caracteres 0x00 son
; para estabilizacin del circuito
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
call msgCR
movlw 'H'
call enviaRS232
movlw 'o'
call enviaRS232
movlw 'l'
call enviaRS232
movlw 'a'
call enviaRS232
movlw ' '
call enviaRS232

movlw
call
movlw
call
movlw
call
movlw
call
movlw
call

'a'
enviaRS232
'm'
enviaRS232
'i'
enviaRS232
'g'
enviaRS232
'o'
enviaRS232

movlw
call
movlw
goto

0x0D
enviaRS232
0x0A
enviaRS232

msgCR

END
Bajar el programa en formato ASM (puede usar el botn derecho
de su mouse)
Bajar el programa en formato HEX (puede usar el botn derecho
de su mouse)
Por las dudas, el archivo incluido P16f628a.inc (puede usar el
botn derecho de su mouse)

Uso del programa "HyperTerminal" para la comunicacin


desde la PC
Para establecer la comunicacin serie desde la PC, se debe utilizar
el programa HyperTerminal que viene con el sistema operativo
Windows, o cualquier otra aplicacin de terminal bsica que usted
desee.
Aqu se puede ver una explicacin de Microsoft sobre cmo utilizar
el programa HyperTerminal.
En la configuracin de la conexin, usted debe indicar que se va a
conectar "Directo a COM", indicando cul es el puerto COM de la
PC que va a utilizar en esta comunicacin (generalmente es el
COM1... pero cada PC es un mundo aparte).
Esto se define en la seccin "Configurar".

Bits por segundo = 9600

Bits de datos = 8

Paridad = Ninguna

Bits de parada = 1

Control de flujo = Ninguno

Ver las imgenes. (A la izquierda, las propiedades de la conexin


nombrada por m como "robots", a la derecha, la pantallita
"Configurar" del puerto elegido en esta conexin, el COM1).

Algunas cosas que observ

El uso de los bits de puerto adicionales del PIC


16F628A luego de convertir por configuracin las lneas
para el cristal del oscilador de reloj y la de Master Clear en
bits del Puerto A me caus, al principio, algunos
problemas. En concreto, el de los bits 4 y 5 del Puerto A,
tema ya explicado arriba. Esto demuestra que se debe leer
bien la hoja de datos y nunca dar nada por sobreentendido.
La conclusin es que si se utiliza el puerto serie interno
delPIC 16F628A (que ocupa dos bits en el Puerto B) no
hay disponible, lamentablemente, un puerto completo para
manejar un byte entero de salida. No s si es muy
importante, pero en la programacin se hace un poco ms
engorroso "sacar" un byte entero.

Por lo dicho en el punto anterior, si se desea utilizar de

algn modo un byte de salida en paralelo que no sea para


exhibirlo en LEDs, se debe implementar un pulso de aviso
(strobe) que anuncie que el dato es vlido, ya que este
byte de salida se actualiza por partes.

El programa es bsico y no tiene ninguna comprobacin de


confirmaciones en el protocolo de comunicacin, as que si
se envan datos a mucha velocidad desde la PC se pueden
perder datos e incluso puede quedar "colgado" el PIC,
situacin que a m no se me ha presentado... pero puede
pasar.

Segn todas las teoras, usando esta configuracin en la


que se genera internamente un pulso de reloj de 4 MHZ sin
cristal, podra haber algn problema de corrimiento de la
frecuencia del reloj y, por ende, de la velocidad de
transferencia del puerto serie del PIC (baudios). Sin
embargo, no he notado dificultades de comunicacin.

No es difcil implementar esta comunicacin por


interrupcin, tarea que encarar en una prxima prueba.
No quise hacerlo aqu para no complicar un ejemplo que, a
mi entender, debe ser bsico.

Datos adicionales:
PIC 16F628A
El microcontrolador PIC 16F828A lo compr en Cika, donde
cuesta us$ 3 ms 10,5% de IVA.
HIN232CP
El integrado HIN232CP lo compr en Cika, donde cuesta us$
1,1 ms 10,5% de IVA.

2007, 2014 Robots Argentina

You might also like