Comunicación RS232

22
Comunicación RS232 Prueba de conexión 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 específicamente para experimentar, de manera básica, con la comunicación entre un microcontrolador PIC 16F628A y el puerto serie de una PC (estándar RS-232). El circuito tiene, además del microcontrolador, un integrado convertidor de niveles RS232 a TTL que es reemplazo del conocido MAX232 , pero cuesta más 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 señales RS232 en su entrada (que pueden ser de hasta +30/-30 V) a nivel TTL/CMOS en su salida.

Transcript of Comunicación RS232

Page 1: Comunicación RS232

Comunicación RS232Prueba de conexión 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 específicamente para experimentar, de manera básica, con la comunicación entre un microcontrolador PIC 16F628A y el puerto serie de una PC (estándar RS-232). El circuito tiene, además del microcontrolador, un integrado convertidor de niveles RS232 a TTL que es reemplazo del conocido MAX232, pero cuesta más 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

señales RS232 en su entrada (que pueden ser de hasta +30/-30 V) a nivel TTL/CMOS en su salida.

Aquí voy a hacer una pequeña disgresión sobre por qué utilizo el PIC 16F628A en esta ocasión y en gran parte de los proyectos que encaro y encararé, excepto cuando las prestaciones de este microcontrolador no sean suficientes para la función requerida. La razón principal es que es pata a pata compatible con el más antiguo pero ya

Page 2: Comunicación RS232

clásico PIC 16F84A. Y es compatible en sus programas, con la única salvedad de que la memoria RAM se encuenta en otra dirección. 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 años que se diseña sobre él, como procesador básico.

Distribución de patas (con sus funciones) del PIC 16F628A.

El PIC 16F84A puede estar muy bien como elección para comenzar, pero la única razón que va quedando para hacerlo es que la mayoría de los ejemplos de programa y de circuito que se encuentran por allí están realizados sobre él. En base a lo dicho en el párrafo anterior, entonces el PIC 16F628A es igual de elegible, ya que es un reemplazo prácticamente directo de nuestro famoso microcontrolador "de batalla". ¿Pero por qué cambiar, si ambos están disponibles en el mercado? Por una razón muy simple: el PIC 16F628A tiene más memoria de programa (el doble), más RAM, más EEPROM, más modos de uso, más timers, y más prestaciones, incluyendo la que aprovechamos en este diseño, el puerto serie implementado por hardware... y el PIC 16F628A, por lo menos en Argentina, cuesta menos... ¿Por qué no cambiar, entonces?

COMPARACIÓN

  16F84A 16F628A

Memoria programa 1K 2K

Memoria datos 68 bytes 224 bytes

EEPROM 64 bytes 128 bytes

Timers 1 3

PWM - 1

Reg. comparación/captura - sí

Page 3: Comunicación RS232

Comparadores - 2

Referencias de voltaje - 1

Oscilador interno reloj - 37 KHz / 4 MHz

Patas usables E/S 13 16

Programación a bajo voltaje - sí

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 ningún 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 pequeño programa espera a recibir un caracter, lo devuelve como eco hacia la PC, y luego lo exhibe a través de sus puertos, donde tenemos conectados LEDs indicadores. Esto nos permite comprobar la recepción de los caracteres ASCII desde la PC, cuyo código veremos sobre los LEDs. También hace que nuestro circuito cumpla la función de transformar la salida serie de la PC en una salida de 8 bits en paralelo.

A continuación se puede observar el circuito que he utilizado:

Circuito del interfaz de comunicación RS232 entre un PIC y una PC

Page 4: Comunicación RS232

Algún 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 comunicación serie?

Paciencia, todo tiene su explicación: Tal como se ha configurado el microcontrolador, el Puerto A tiene, efectivamente, ocho bits de ancho, pero por características 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 encendería 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 través del Puerto

Page 5: Comunicación RS232

B, bits 4 y 5. El "costo" de esta solución son tres o cuatro líneas de programa, nada más.

Montaje del circuito de conexión serie entre un PIC 16F628A y una PC

Detalle de montaje del circuito de conexión serie

Page 6: Comunicación RS232

Introducción:Al vernos frente a la necesidad de desarrollar una aplicación para la comunicación entre un microcontrolador y la computadora, pensamos en un sistema de control digital de lazo cerrado, y que los datos relevantes de éste proceso sean enviados a la PC y procesados de alguna manera para el monitoreo y control a distancia del proceso.Para tal fin se montó el control de velocidad de un motor de continua a partir del método de modulación de ancho de pulso (PWM) aprovechando el módulo específico de los PIC16F87X, la herramienta del conversor A/D de 10 bits, y el bloque TX/RX para comunicación serie con la PC. Utilizando además, una Macro editada con Visual Basic como interface para el sistema de adquisición de datos. Seleccionando a la velocidad de referencia, la velocidad real, y el Duty del PWM como los datos relevantes a monitorear, y la velocidad de referencia como la variable a controlar con posibilidad de modificarla a través de la PC.

Page 7: Comunicación RS232

Hardware:

Para poder controlar éste motor de continua a partir del método de modulación de ancho de pulso, se pensó en montar un sistema que básicamente esté compuesto por:

-El motor a controlar.

- Un motor mucho más pequeño que cumpla la función de transductor de la velocidad del motor a valores de tensión continua, el cual esté vinculado al motor principal a través de algún vínculo mecánico, en éste caso una correa. El valor de tensión que éste motor (que oficia de un pequeño generador) entregue, nos servirá como el “valor actual” medido a comparar con el “valor deseado” el cual se cargará inicialmente en el software, al programar el PIC.

Para poder ser utilizado como transductor, el motorcito debió ser ensayado y se obtuvo las siguientes mediciones (se ensayó alimentando al motor principal con una fuente variable, midiendo el número de revoluciones del motor principal con un tacómetro láser y la tensión en bornes del transductor con un

Page 8: Comunicación RS232

multímetro digital):

TRANSDUCTOR [V] RPM RPM/V3,7 3100 837,832,9 2450 844,82

2,26 1870 827,432,04 1700 833,331,57 1280 815,281,03 850 825,240,71 560 788,730,17 145 852,94

K=828,2[RPMSiendo K la constante que utilizaremos para relacionar a lo largo del trabajo, las revoluciones del motor principal con la tensión en bornes del transductor.-Y siendo 2450 r.p.m la velocidad establecida como “deseada” para el giro del motor principal (ya que para esa velocidad, estamos dentro de las tensiones nominales de funcionamiento del motor y en una zona en donde la constante seleccionada es bastante próxima a la real)

- Un motor de las mismas características que el principal, el cual se vinculará mecánicamente, también, al motor principal, para que trabaje como generador, significándole así una carga mecánica al mismo. Y luego, al cargar eléctricamente a éste generador con unas lamparitas incandescentes, producir una carga

Page 9: Comunicación RS232

mecánica variable en el rotor del motor principal. Y así poder ensayar al mismo bajo diversas condiciones.

- El micro controlador que generará la señal de control a partir de comparar la tensión generada por el transductor con el valor de señal de referencia cargado, aumentando o disminuyendo el tiempo de encendido de la señal según sea necesario. En el caso que la velocidad del motor descienda del valor deseado, la tensión del transductor disminuirá, y el PIC comenzará a incrementar el ancho de pulso de la tensión que alimenta al motor hasta que vuelva a igualarse la señal generada por el transductor con el valor programado, y viceversa.Además transmitirá la cadena de datos que luego será recibida y procesada por la PC a partir de la aplicación.Aparte, tendrá habilitada la posibilidad de recibir un dato de 8 bits que modifique la velocidad de referencia, lo que se verá traducido en un cambio en la velocidad del giro del motor.Y esto último será capaz gracias a la transformación de tensiones TTL del PIC a señal RS232 con el uso del integrado MAX232.

Page 10: Comunicación RS232

CIRCUITO:

Software:Para el desarrollo del código fuente se pensó en unificar tres tipos de bloques de programa:

-El bloque que se refiere a la implementación de la modulación del ancho de pulso ó PWM.

-El que respecta a la conversión analógica digital a partir de la señal brindada por el

transductor.

Page 11: Comunicación RS232

-Y el bloque que se refiere a la comunicación con la PC por el puerto RX-TX del PIC.

Bloque PWM:

Para la implementación del bloque PWM se parte por configurar el módulo CCP1 para trabajar en modo PWM emparentándose así con el Timer 2.A partir del registro PR2 se fijará el período de la señal :

Ts = ctte = (PR2+1) * 4 * Tosc * TMR2 prescaler

En nuestro caso estamos utilizando un cristal de 18.432 MHz y seteamos al PR2 en 255 con el prescaler del TMR2 en 1:1, de manera que resulta en un ciclo de 18 KHz constante (Lo definimos así para poder salir del intervalo audible)

Siendo el CCPR1L el registro que definirá el Duty de la señal (a partir de su registro de sólo lectura CCPR1H),el cual estará siendo continuamente “refrescado” para cumplir con la misión de controlar la velocidad del motor de continua.

Ton = var = CCPR1L * 4 * Tosc * TMR2 prescaler

Luego se configurará el módulo CCP2 en el modo comparación, el cual estará emparentado con el Timer 1 y definirá el período de tiempo (Tk) con el cual se llevará a cabo la interrupción que permita un llamado a conversión analógica digital.

Tk= ctte = CCPR2* Tosc*4*TMR1 Prescaler

En nuestro caso al CCPR2 lo hemos “seteado” en 25.000 (CCPR2H y CCPR2L), y el preescaler del TMR1 se encuentra en 1:1 de manera que resulta un período de detección de velocidad de Tk = 5.42ms (25000*4*(1/18.432Mhz) = 5.42msec).Y esto es así sabiendo que el conversor A/D precisa de un mínimo de 2*TAD (2*1.6 ms = 3.2 ms) para llevar a cabo una conversión segura, luego: Tk > 2*TAD.El valor numérico 4 que figura en las expresiones (Ts, Tk y Ton) resulta de haber configurado al TMR1 y al TMR2 en modo

Page 12: Comunicación RS232

síncrono con el reloj interno del PIC (Fosc/4) funcionando ambos como temporizadores.

Habiéndose configurado así el bloque PWM el sistema estará generando continuamente una señal de período constante y Duty fijo hasta que el overflow del TMR1 llame a una conversión analógica digital y como resultado se “refresque” el valor del registro que fija el Duty.

Bloque A/D:

Para programar el bloque del conversor se partió de establecer el reloj del conversor como Fosc/32 ya que esto es lo que recomienda el manual del PIC para cristales de 20 MHz (nosotros trabajamos con uno de 18.342 MHz).Configuramos a AN0 como la única entrada anlógica, el resultado de la conversión en ADRESH y tomar sólo los 8 bits de mayor peso los cuales serán cotejados con el valor de referencia deseado el cual se encuentra almacenado en la variable SPEED y de la comparación con ésta variable resultará el control sumándole o restándole al valor del registro CCPR1L el valor de la variable CHANGE que en nuestro caso está en 1.

Bloque RX/TX:

Page 13: Comunicación RS232

Se configuro la comunicación USART en el pic con la posibilidad de enviar y recibir datos de la pc a una velocidad de 9600 Baudios.Para lograr esto se debió calcular que valor debía ser cargado en el registro SPBRG de la siguiente manera:

BAUD RATE = Fosc/ (16*(X+1))

Despejando X el valor a cargarse en SPBRG es de 119 (decimal).

Una vez configurado esto y mediante un programa escrito en Visual basic para Excel se logra la comunicación pic-pc.

Desde la pc se realiza la adquisición de datos (“duty cicle”, “velocidad del motor en rpm”, “velocidad deseada”) y se puede modificar la velocidad deseada del motor o dicho de otra forma modificar el valor de la variable SPEED en el microcontrolador.

Ahora alimentamos el circuito. El mensaje 'Hola mundo' debe aparecer en la pantalla. Cada vez que se resetee el PIC el mensaje se imprimirá de nuevo.

Page 14: Comunicación RS232

Cuando cerremos el programa además de preguntarnos si queremos desconectarnos nos pregunta si deseamos guardar la conexión. Si elegimos que sí la próxima vez que queramos utilizar la configuración que hemos establecido en la conexión basta que en Inicio/Todos los programas/Accesorios/Comunicaciones/Hyperterminal/picrs232.ht

Los archivos de hyperterminal (*.ht) en Windows XP se guardan en:

C:\Documents and Settings\...nombreusuario...\Menú Inicio\Programas\Accesorios\Comunicaciones\HyperTerminal\

Si vamos a esta carpeta y damos doble click al archivo se nos abrirá la conexión. Además se crea un acceso directo a la conexión en dicha carpeta que podemos pegar en el escritorio para obtener un rápido acceso.

TerminalTOB

Tambien se ha desarrollado un programa de terminal en Visual Basic, que además permite crear código en ensamblador para enviar mensajes, y que se encuentra aquí TerminalTOB.zip.

Page 15: Comunicación RS232

 

Cominicación bidireccional del PIC al PC vía RS232.Se trata de utilizar el puerto serie RS232 de un PC para comunicar el PC con el PIC, de forma bidireccional. Considerando el uso de un PIC16F84 vamos a establecer:

VDD: +5V. Terminal positivo de alimentación. Un condensador de 100 nF debe ser conectado entre este terminal y masa lo mas cerca posible del microcontrolador. Esto previene acoplamientos con ruidos en la alimentación.

VSS: 0V. Terminal de alimentación negativa (masa).  

OSC1: Entrada del oscilador. Conectado a un cristal de 4 MHz y a un condensador de 22 pf. El otro terminal del condensador debe ser conectado a masa.

OSC2: Salida del oscilador. Conectada al otro terminal del cristal y a otro condensador de 22 pF. El otro terminal de este condensador también va a masa (Para 4 MHz ambos condensadores pueden ser de 15 a

Page 16: Comunicación RS232

33pF pero han de ser iguales). MCLR: Conectado a  un circuito de

reset/programación ICSP. RA0: Salida. Conexión a la patilla 2 (RXD)

del conector DB9 del PC a través de un MAX232.

RA1: Entrada: Conexión a la patilla 3 (TXD) del conector DB9 del PC a través de un MAX232.

RA2 a RA4: Salida o entrada según la aplicación.

RB1 a RB7: Salida o entrada según la aplicación. RB6 y RB7 utilizados para programación ICSP.

Nota: El pin 5 del conector DB9 debe ser conectado a masa.

El circuito base será el siguiente:

El software necesario para la comunicación PIC-PC es:

Page 17: Comunicación RS232

Programa en el PIC que incluya subrutinas de control del puerto RS232. Programa en el ordenador que gestione la comunicación, como

HyperTerminal de Windows, TerminalTOB o programas hechos específicamente, por ejemplo en Visual Basic o C++.

Es importante destacar que la configuración del formato de transmisión y recepción debe ser la misma tanto para el programa en el PIC como para el programa en el PC. En nuestro caso tomaremos:

Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.

Un bit de inicio o Start a nivel bajo. Dato de 8 bits. Sin paridad. Dos bits de final o Stop a nivel alto.

Librerías para RS232La mejor forma para afrontar el programa a desarrollar es utilizando archivos INCLUDE con las subrutinas necesarias.

RS232.INC

Esta librería incluye subrutinas de control para el PIC16F84 para la comunicación RS232:

RS232_Inicializa: Configura la comunicación RS232 para el PIC. RS232_LeeDato: El PIC lee un dato por la línea de entrada. RS232_EnviaDato: El PIC envía un dato por la línea de salida.

La librería puede verse aquí, rs232.inc.

RS232MEN.INC

Esta librería incluye subrutinas para enviar mensajes de texto del PIC al PC:

RS232_Mensaje: Muestra en el PC un mensaje grabado en el PIC. RS232_LineasBlanco: Muestra líneas en blanco en el PC.

La librería puede verse aquí, rs232men.inc.

RETARDOS.INC

Incluye subrutinas para realizar retardos, desde 4 microsegundos hasta 20 segundos. Se han calculado para un sistema microcontrolador con un PIC

Page 18: Comunicación RS232

trabajando con un cristal de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada ciclo máquina tarda 4 x 1/4MHz = 1 µs.

La librería puede verse aquí, retardos.inc.

Ejemplo 2. Control desde PCPICRS232Sal.asm

Control de salidas mediante un PC y RS232: Desde el teclado de un ordenador se desea controlar el puerto B, según la siguiente tabla:

TECLA SALIDA

0 RB0 = 1

1 RB1 = 1

2 RB2 = 1

3 RB3 = 1

4 RB4 = 1

5 RB5 = 1

6 RB6 = 1

7 RB7 = 1

Espacio Todas a 0

La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente,

Sólo se activa una salida cada vez.

El estado de las salidas aparece reflejado en un mensaje en la pantalla del ordenador.

El proyecto en MPLAB y el circuito en Proteus con COMPIM puede descargarse de picpcrs232cpp/03.rar.

Los fuses se configuran con WDT desactivado, oscilador XT, sin protección y con POR activado.

Prueba del programa

El programa lo podemos simular o probar físicamente, en cuyo caso seguiremos los siguientes pasos.

Sin conectar el circuito a la fuente de alimentación se programa el PIC con ICPROG y JDMD con ICSP.

A continuación se conecta al puerto serie de un PC y se alimenta el circuito.

Page 19: Comunicación RS232

Para probar el funcionamiento del programa, puede ejecutarse un programa de terminal en el PC, como Hyperterminal de Windows o también puede utilizarse TerminalTOB.

Debe configurarse a 9600 baudios, 8 bits de datos, dos de parada y sin bit de paridad. Y muy importante, el flujo de datos debe ser: ninguno.

Ejemplo 3. Monitorización de datosSe trata de leer el estado de las entradas conectadas a las líneas <RB7:RB4> del Puerto B y enviarlo por el puerto RS232 a un terminal para monitorizar el estado de los mismos. Se utilizan las interrupciones por cambio de nivel en una línea del Puerto B, por ello las entradas deben conectarse a la parte alta del Puerto B.

También se activan las resistencias de pull-up del puerto B, así que basta con dejarlas al aire para ponerlas a 1 o a masa para ponerlas a 0.

El programa puede verse aquí, de picpcrs232cpp/picmonitor.rar. Los fuses se configuran con WDT desactivado, oscilador XT, sin protección y con POR activado.

El orden de las subrutinas no importa; la rutina principal debe ser la primera rutina ejecutada a partir de la dirección 0000. Cualquier caso vale, tanto si lo

Page 20: Comunicación RS232

ponemos directamente, o como si en la dirección 0000 ponemos un 'GOTO INICIO' antes de las instrucciones., de esta manera podríamos saltar la posición de memoria 0004, que podemos reservar para una subrutina de interrupción.

El programa se ha realizado y simulado con MPLAB.

Los bits de los puertos desconectados nunca deben ser puestos como entradas, sino que han de configurarse como salidas. Dejar entradas al aire puede provocar un funcionamiento imprevisible e incluso dañar el PIC.

Prueba del programa

El programa lo podemos simular o probar físicamente, en cuyo caso seguiremos los siguientes pasos.

Sin conectar el circuito a la fuente de alimentación se programa el PIC con ICPROG y JDMD con ICSP.

A continuación se conecta al puerto serie de un PC y se alimenta el circuito.

Para probar el funcionamiento del programa, puede ejecutarse Hyperterminal de Windows o TerminalTOB.zip.

Configúrelo a 9600 baudios, 8 bits de datos, dos de parada, sin bit de paridad y sin control de flujo.