Sunteți pe pagina 1din 14

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 conocido MAX232, 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.

Comunicacin RS232

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 Memoria programa Memoria datos EEPROM Timers 1K 68 bytes 64 bytes 1 16F628A 2K 224 bytes 128 bytes 3

PWM Reg. comparacin/captura Comparadores Referencias de voltaje Oscilador interno reloj Patas usables E/S Programacin a bajo voltaje Precio en Buenos Aires (Cika)

13 us$ 3,51 (4 MHz) us$ 7,02 (20 MHz)

1 s 2 1 37 KHz / 4 MHz 16 s
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 sistema decimal #include "P16F628A.INC" PIC16F628A ; Usar el PIC16F628 y ; Incluye datos de

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 EQU EQU 0x28 0x29 ; variable ; dato serie desde la PC

;********************************************************** ********* ORG 0x000 ;********************************************************** ********* ; Inhibe comparadores ;********************************************************** ********* movlw 7 movwf CMCON comparadores ; CMCON=7 inhibir los 0x000 ; El programa empieza en

;********************************************************** ********* ; Inicializar Puertos ;********************************************************** *********

movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB bsf STATUS,RP0 movlw b'00000000' movwf TRISA ; en LEDS) ; ; drain, y ; entrada movlw b'11001011' ; ; ; ; ; a LEDS a LEDS

; valor inicial portA ; valor inicial portB ; Pg 1 RAM salidas (para mostrar el dato de estas salidas, no usaremos PORTA 4, que tiene salida open PORTA 5, que slo puede ser RB0 RB1 RB2 RB3 RB2 entrada (RX) = entrada (TX) = salida = entrada = salida del bit 4 del dato

; RB5 = salida del bit 5 del dato ; 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 ; habilita la transmisin Async bcf STATUS,RP0 movlw b'10010000' ; RAM PAGE 0 ; habilita de recepcin

Async movwf RCSTA ;********************************************************** ********* ; TIEMPO DE ESTABILIZACION ;********************************************************** ********* clrf contador estab decfsz contador,F goto estab movf RCREG,W movf RCREG,W movf RCREG,W recepcin call Bienvenida bienvenida

; vaca el buffer de ; enva mensaje de

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

;********************************************************** ********* ; RECIBE CARACTER SERIE - RS232 - DESDE LA PC ;********************************************************** *********

recibeRS232 movf RCREG,W acumulador return

; guarda dato recibido en

;********************************************************** ********* ; 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 movwf PORTA btfss dato_serie,4 bit 4 que es bcf PORTB,4 btfsc dato_serie,4 salida; bsf PORTB,4 PORTB. btfss dato_serie,5 5 que es bcf PORTB,5 tenemos que poner btfsc dato_serie,5 salida; bsf PORTB,5 PORTB. ; recupera el dato guardado ; exhibe el dato en LEDS en PORTA ; pero, como el PORTA tiene el ; open drain, nos conviene poner ; el bit 4 del dato en otra ; lo hacemos en el bit 4 del ; y , como el PORTA tiene el bit ; slo usable como entrada, ; el bit 5 del dato en alguna ; lo hacemos en el bit 5 del

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 'a' call enviaRS232 movlw 'm' call enviaRS232 movlw 'i' call enviaRS232 movlw 'g' call enviaRS232 movlw 'o' call enviaRS232 msgCR movlw 0x0D call enviaRS232 movlw 0x0A

goto END

enviaRS232

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 del PIC 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.

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