Comunicación PIC-PC vía RS232

15
Comunicación PIC-PC vía RS232 Introducción En ocasiones es necesario que un sistema con microcontroladores recoja información que luego ha de ser procesada, por ejemplo temperaturas, potencias consumidas, etc. siendo el sistema de recogida de información mas usual un PC. En otros casos puede ser necesario controlar mediante un PC las entradas y salidas de un dispositivo. También puede utilizarse un PC para actualizar el firmware de un dispositivo. En cualquier caso la forma mas simple de comunicar un dispositivo con microcontroladores con un PC es a través del puerto serie utilizando el estándar RS232 (EIA 232). Los ordenadores de sobremesa o fijos actuales suelen contar con un puerto serie si bien se tiende a que desaparezca y muchos equipos nuevos ya no lo incorporan. Además hace tiempo que no se incluye en los ordenadores portátiles. A pesar de lo anterior todavía sigue siendo útil. Para realizar pruebas podemos simular un puerto serie en el PC, de tal manera que creamos un puerto virtual al que pueden acceder los programas exactamente igual como si fuese uno real. Ver en Puerto serie virtual VSPD y COMPIM de Proteus . El puerto serie es accesible mediante conectores, siendo el DB9 macho (de 9 patillas) el único que aún puede encontrarse en un PC de sobremesa. Patillaje del conector RS232 en el PC: 1. CD 2. RX D 3. TX D 4. DT R 5. GN D 6. (Carr ier Detec t) Entra da (Rece ive Data) Entra da (Tran smit Data) Salid

Transcript of Comunicación PIC-PC vía RS232

Page 1: Comunicación PIC-PC vía RS232

Comunicación PIC-PC vía RS232

IntroducciónEn ocasiones es necesario que un sistema con microcontroladores recoja información que luego ha de ser procesada, por ejemplo temperaturas, potencias consumidas, etc. siendo el sistema de recogida de información mas usual un PC. En otros casos puede ser necesario controlar mediante un PC las entradas y salidas de un dispositivo. También puede utilizarse un PC para actualizar el firmware de un dispositivo.

En cualquier caso la forma mas simple de comunicar un dispositivo con microcontroladores con un PC es a través del puerto serie utilizando el estándar RS232 (EIA 232).

Los ordenadores de sobremesa o fijos actuales suelen contar con un puerto serie si bien se tiende a que desaparezca y muchos equipos nuevos ya no lo incorporan. Además hace tiempo que no se incluye en los ordenadores portátiles. A pesar de lo anterior todavía sigue siendo útil.

Para realizar pruebas podemos simular un puerto serie en el PC, de tal manera que creamos un puerto virtual al que pueden acceder los programas exactamente igual como si fuese uno real. Ver en Puerto serie virtual VSPD y COMPIM de Proteus.

El puerto serie es accesible mediante conectores, siendo el DB9 macho (de 9 patillas) el único que aún puede encontrarse en un PC de sobremesa.

Patillaje del conector RS232 en el PC:

1. CD2. RXD3. TXD4. DTR5. GND6. DSR7. RTS8. CTS

  

(Carrier Detect) Entrada(Receive Data) Entrada(Transmit Data) Salida(Data terminal Ready) Salida(Ground)(Data Set Ready) Entrada(Reque

    

Para comunicarse con un microcontrolador bastan con 3 líneas (visto desde el PC):

3, TXD, Transmisión de datos.

Page 2: Comunicación PIC-PC vía RS232

2, RXD, Recepción de datos. 5, GND, Masa.

La velocidad de transmisión es un dato importante, y es la cantidad de información enviada por segundo. Se expresa en baudios (bits por segundo) y en los puertos COM de un PC suele utilizarse 4800, 9600 baudios o mas.

Enviar datos en formato serie RS232 de forma asíncrona es cuestión de hacer que una salida esté a nivel alto o bajo en el momento adecuado. Normalmente, cuando no se transmite, la salida está a nivel alto (1), y cuando empieza el bit de inicio, esta pasa a ser de nivel bajo. A 4800 baudios la duración del bit debe ser de 1/4800 = 208 microsegundos. 8 bits de datos siguen al bit de inicio, cada uno de un periodo. Un nivel alto de más de un periodo es un bit de parada. Debe tenerse en cuenta que primero se mandan los bits menos significativos o LSB (Least Significant Bit).

El protocolo RS232 utiliza lógica negativa, un nivel alto (1) es de -3V a -15 voltios, y un nivel bajo (0) es de +3V a +15 voltios. Usualmente los valores son +/-12 voltios.

Puesto que un PIC utiliza niveles TTL es necesario un conversor de niveles. El mas utilizado es el circuito integrado MAX232 de Dallas Semiconductor.

El MAX232 convierte los niveles RS232 a TTL y viceversa con sólo una fuente de 5 voltios. Contiene dos driver TTL-RS232 y dos driver RS232-TTL. Necesita 5 condensadores externos de 1 uF para el MAX232 y de 100nF para el MAX232A. (Se coloca uno de los 5 condensadores entre la patilla 16 y masa).

Si se utilizan condensadores electrolíticos hay que tener cuidado y respetar la polaridad al conectarlos al circuito.

 

Page 3: Comunicación PIC-PC vía RS232

Utilizando un PIC para la comunicación tenemos dos alternativas:

PIC con hardware específico para el puerto serie, como es el caso del PIC16F876 (a sustituir por el PIC16F886), entre otros (ver patillas 17 y 18). Dispone de una UART (Universal AsynchronousReceiver-Transmitter, Transmisor-Receptor Asíncrono Universal) para controlar los puertos y dispositivos serie.

PIC que no disponen de este hardware por lo que es necesario implementar por software todos los detalles de la comunicación serie. Este es el caso por ejemplo del PIC16F84A.

Page 4: Comunicación PIC-PC vía RS232

Usaremos el PIC16F84A primero para ver un circuito que envía un mensaje ASCII del PIC al PC implementado por software.

Luego realizaremos un circuito algo más complejo para comunicar el PC con el PIC, de forma bidireccional también con el PIC16F84A.

Mas adelante se irá profundizando mas en este tema pasando por el 16F886 y el 18F2550, este último con puerto serie USB a 12 Mbit/s.

Ejemplo 1. Enviar un mensaje ASCII del PIC al PCMandaremos el mensaje "Hola mundo" como caracteres ASCII al puerto de comunicaciones serie COM de un PC.

Para enviar caracteres ASCII al PC con el PIC se conecta una salida del PIC al terminal 2 (RXD) del puerto RS232 del PC.

En la figura siguiente se muestra como se envía el dato "01001101". Con la calculadora de Windows en vista "científica" u otro medio hallamos que "01001101" en binario es "77" en decimal. Con una tabla ASCII o simplemente en una zona de texto, como el block de notas, manteniendo pulsada la tecla ALT y marcando el 77 en el teclado numérico, nos encontraremos que "77" es "M" (m mayúscula) en ASCII. Habremos enviado la "M" del PIC al PC.

Page 5: Comunicación PIC-PC vía RS232

Como la memoria de datos del PIC es escasa y difícil de usar, pondremos el mensaje a enviar en la memoria de programa. Para acceder a ella utilizaremos una tabla. En la subrutina MSGTXT cargamos en el acumulador el offset o desplazamiento que queremos representar, y este valor lo sumamos al contador del programa. Como resultado de la rutina la instrucción RETLW devolverá el valor de los caracteres en el acumulador. Un cero en offset retornará "H", un uno "o", un dos "l", etc.

MSGTXTADDWF PCL, f ; sumamos offset al PCLRETLW 0x48 ; 'H' 72dRETLW 0x6F ; 'o' 111dRETLW 0x6C ; 'l' 108dRETLW 0x61 ; 'a' 97dRETLW 0x20 ; ' ' 32dRETLW 0x6D ; 'm' 109dRETLW 0x75 ; 'u' 117dRETLW 0x6E ; 'n' 110dRETLW 0x64 ; 'd' 100dRETLW 0x6F ; 'o' 111dRETLW 0x0D ; retorno de carroRETLW 0x0A ; nueva líneaRETLW 0x00 ; indica el final del mensaje

Para imprimir una cadena de caracteres, situamos un registro que apunte al carácter inicial (MSGPTR), y llamamos repetidamente a MSGTXT incrementando el puntero cada vez. Cuando hemos alcanzado el final, la función devuelve un cero. La rutina debe inicializarse con el offset cargado en w.

OUTMSGMOVWF MSGPTR ; mueve w al puntero del mensaje

MSGLOOPMOVF MSGPTR, W ; mueve el puntero a WCALL MSGTXT ; retorna el carácter ASCIIADDLW 0 ; pone la bandera Zero a uno si W = 0BTFSC STATUS,Z ; salta si el bit Zero no está a nivel

altoRETURN ; si llegamos al final, W = 0CALL OUTCH ; llama a la rutina de comunicación

serieINCF MSGPTR, f ; apuntamos al siguiente carácterGOTO MSGLOOP ; vuelve a por más caracteres

Rutina de transmisión serie de PIC a PC

Page 6: Comunicación PIC-PC vía RS232

Al utilizar un PIC16F84 que no dispone de puertos específicos para transmisión serie, la rutina de transmisión se implementará mediante software.

La rutina que transmite los caracteres al PC vía serie se llama OUTCH. Para conseguir la duración del bit podemos usar la rutina MIC4 (ver Temporización). 52 x 4 bucles de un microsegundo permiten temporizar los 208 microsegundos del periodo de un bit a 4800 baudios. Realmente 12 microsegundos son usados en la cabecera de OUTCH, por lo que usamos los 49 bucles restantes para contar el resto de la transmisión. La subrutina es llamada con el carácter que deberá ser transmitido por el bit 0 del puerto A que estará unido a la patill 2 (RXD) del puerto serie del PC a través de un adaptador TTL-RS232.

OUTCH utiliza un registro denominado TXREG en donde se debe almacenar el dato a transmitir. La variable BITS sirve para establecer el número de bits a transmitir. Se utiliza la instrucción RRF y el CARRY para ir obteniendo los bits del registro TXREG.

OUTCHMOVWF TXREG ; coloca W en el registro de transmisiónMOVLW 8 ; 8 bits de datos serán transmitidosMOVWF BITS ; BITS es un contador para los bitsBCF PORTA,0 ; bit de inicio en la salida serie

(activo a nivel bajo)TXLOOP

MOVLW 0x31 ; Retardo de 196 microsegundos 31h = 49dCALL MIC4 ; 49 x 4 = 196 microsegundosRRF TXREG, f ; rotamos a la derecha el bit en el

acarreoBTFSC STATUS, C ; si el acarreo es 0 saltamos y ponemos

la línea a nivel bajoGOTO SETUNO ; si no, ponemos la línea a nivel alto

SETCEROBCF PORTA,0 ; Ponemos la salida serie a nivel bajo

(transmitir un 0) GOTO TDONE ; Comprobar si se han transmitido todos

los bits de TXREGSETUNO

BSF PORTA,0 ; Ponemos la salida serie a nivel alto (transmitir un 1)

NOP ; pasamos a probar si acabamos, directamenteTDONE

DECFSZ BITS, f ; se decrementa BITS por el bit transmitido y salta cuando llega a cero

GOTO TXLOOP ; quedan más bits, vamos a transmitir el siguiente

MOVLW 0x34 ; Retardo de 208 microsegundos 34h = 52dCALL MIC4 ; 52 x 4 = 208 microsegundos para el

último bit de datos que quedaBSF PORTA,0 ; Salida serie a nivel alto para el bit

de stopMOVLW 0x68 ; retardo de 104 x 4 microsegundos 68h =

104dCALL MIC4 ; 104 x 4 = 416 microsegundos para dos

bits de paradaRETURN

Rutina principal

Page 7: Comunicación PIC-PC vía RS232

Ahora tenemos casi todo el código necesario para programar un PIC que transmita el mensaje "Hola mundo". La rutina principal utiliza NMSEC (ver Temporización) y puede ser como esta.

INICIOBSF STATUS,RP0 ; Activa el banco de memoria 1.MOVLW 0 ; todos los pines de los puertos son

salidasMOVWF TRISA ; en el puerto AMOVWF TRISB ; y en el puerto BBCF STATUS,RP0 ; Activa el banco de memoria 0.BSF PORTA,0 ; ponemos a nivel alto la salida serie.

Línea en reposo.MOVLW 0xC8 ; retardo de 200 msec.CALL NMSEC ; para que no afecten las fluctuaciones

del encendidoMOVLW 0 ; offset inicial del mensajeCALL OUTMSG ; representamos el mensaje

ENDLESSGOTO ENDLESS ; nos quedamos aqui, en un bucle

infinito

Algunos comentarios acerca del algoritmo

Todos los bits de todos los puertos están configurados como salidas. Los bits de los puertos desconectados nunca deben ser puestos como entradas. Dejar entradas al aire puede provocar un funcionamiento imprevisible e incluso dañar el PIC.

Otros mensajes pueden ser añadidos a la tabla, siempre que estén en las primeras 256 posiciones de memoria de programa, que pueda ser alcanzado sumando el máximo valor al PCL (Program Counter Low).

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

Conexión del transmisor

Las conexiones que hemos puesto al PIC son pocas:

pin 3: RA0 - conexión a la patilla 2 (RXD) del conector DB9 del PC a través de un conversor TTL-RS232 con el MAX232.

pin 4: MCLR - terminal conectado a + 5 V a través de una resistencia de 10K. Entre este pin y masa se conecta un pulsador para resetear el PIC

pin 5: 0V - terminal de alimentación negativa. Además de conectarse a masa y a la fuente de alimentación, debe ser conectado a al pin 5 del conector DB9.

pin 14: +5V - terminal positivo de la alimentación. Un condensador de 100 nF debe ser conectado entre este terminal y masa. Esto previene de acoplamientos y de ruidos en la alimentación, pero no es imprescindible.

pin 15: OSC1 - Una de la salidas del oscilador. Debe ser conectado a un cristal de 4 MHz y a un condensador de 33pF. El otro terminal del condensador debe ser conectado a masa.

Page 8: Comunicación PIC-PC vía RS232

pin 16: OSC2 - La otra de las salidas del oscilador. Esta va conectada al otro terminal del cristal y a otro condensador de 33pF. El otro terminal de este condensador también va a masa.

El resto de las patillas quedan sin conectar a nada (al aire).

Es importante saber que no cualquier cable serie vale para la conexión entre el PC y el PIC. Debe utilizarse un cable macho-hembra no cruzado.

Esquema electrónico

Programa completo

El programa puede verse aquí:

Page 9: Comunicación PIC-PC vía RS232

;*************************************************************; Enviar mensajes ASCII del PIC al PC via RS232;*************************************************************;; Programa original: PIC_PC001.ASM Fecha: 20/05/2005; Revisión: 0.0; Programa para PIC16F84A; Velocidad de reloj: 4 MHz; Instrucción: 1Mz=1 us; Perro Guardián: OFF; Tipo de Reloj: XT; Protección de código: OFF; POR: ON;;*************************************************************;; DESCRIPCIÓN DEL PROGRAMA;; Este programa conecta al PIC con un PC a través del puerto serie.;; Utiliza el bit 0 del puerto A como salida serie.;; Debe utilizarse un conversor TTL-RS232, como el MAX232, para; conectar la salida del PIC a RXD en el puerto serie del PC.;; Cuando se alimenta por primera vez, o cuando se le dá un reset; envía al PC el mensaje "Hola mundo" como caracteres ASCII.;; Para recibir el mensaje puede utilizarse el programa Hyperterminal; de Windows o TerminalTOB, una aplicación propia realizada al efecto; que, además de funcionar como terminal, permite crear fácilmente; código de mensajes.; ; Configuración del puerto COM:; Bits por segundo = 4800 baudios; Bits de datos = 8; Paridad: ninguna; Bits de parada = 2; Control de flujo: ninguno; Tiempo por bit:; 4800 baudios -> 1/4800 seg -> 208,3 microsegundos

;;************************** Patillas *************************; ___________; NC - RA,2 -|1 \__/ 18|- RA,1 - NC; NC - RA,3 -|2 17|- RA,0 - A RXD del PC a través TTL-RS232; NC - RA,4 -|3 16F84A 16|- OSC1 - [XT] ; [PUL] - MCLR/ -|4 15|- OSC1 - [XT]; GND -|5 14|- Vcc; NC - RB,0 -|6 13|- RB,7 - nc; NC - RB,1 -|7 12|- RB,6 - nc; NC - RB,2 -|8 11|- RB,5 - nc; NC - RB,3 -|9________10|- RB,4 - nc;;**************************************************************

LIST P=PIC16F84A ; Pic a usar

#INCLUDE <P16F84A.INC> ; Lista de etiquetas de microchip

Page 10: Comunicación PIC-PC vía RS232

;**************************************************************

; Fuses, configuran opciones externas de hardware para la programacion

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;**************************************************************; Lista de variables para el uso del programa;**************************************************************

MSGPTR EQU 0x0C ; Puntero del mensajeTXREG EQU 0x0D ; Registro de transmisiónBITS EQU 0x0E ; Número de bits de datosCNTMSEC EQU 0x0F ; Número de milisegundos de retardo

;**************************************************************ORG 0 ;Comando que indica al Ensamblador

;la dirección de la memoria de programa;donde situar la siguiente instrucción

;**************************************************************;INICIO

BSF STATUS,RP0 ; Activa el banco de memoria 1.MOVLW 0 ; todos los pines de los puertos son

salidasMOVWF TRISA ; en el puerto AMOVWF TRISB ; y en el puerto BBCF STATUS,RP0 ; Activa el banco de memoria 0.BSF PORTA,0 ; ponemos a nivel alto la salida serie.

Línea en reposo.MOVLW 0xC8 ; retardo de 200 msec.CALL NMSEC ; para que no afecten las fluctuaciones

del encendidoMOVLW 0 ; offset inicial del mensajeCALL OUTMSG ; representamos el mensaje

ENDLESSGOTO ENDLESS ; nos quedamos aqui, en un bucle

infinito;;**************************************************************; SUBRUTINAS;**************************************************************;OUTMSG

MOVWF MSGPTR ; mueve w al puntero del mensajeMSGLOOP

MOVF MSGPTR, W ; mueve el puntero a WCALL MSGTXT ; retorna el carácter ASCIIADDLW 0 ; pone la bandera Zero a uno si W = 0BTFSC STATUS,Z ; salta si el bit Zero no está a nivel

altoRETURN ; si llegamos al final, W = 0CALL OUTCH ; llama a la rutina de comunicación

serieINCF MSGPTR, f ; apuntamos al siguiente carácterGOTO MSGLOOP ; vuelve a por más caracteres

;;**************************************************************;OUTCH

Page 11: Comunicación PIC-PC vía RS232

MOVWF TXREG ; coloca W en el registro de transmisiónMOVLW 8 ; 8 bits de datos serán transmitidosMOVWF BITS ; BITS es un contador para los bitsBCF PORTA,0 ; bit de inicio en la salida serie

(activo a nivel bajo)TXLOOP

MOVLW 0x31 ; Retardo de 196 microsegundos 31h = 49dCALL MIC4 ; 49 x 4 = 196 microsegundosRRF TXREG, f ; rotamos a la derecha el bit en el

acarreoBTFSC STATUS, C ; si el acarreo es 0 saltamos y ponemos

la línea a nivel bajoGOTO SETUNO ; si no, ponemos la línea a nivel alto

SETCEROBCF PORTA,0 ; Ponemos la salida serie a nivel bajo

(transmitir un 0) GOTO TDONE ; Comprobar si se han transmitido todos

los bits de TXREGSETUNO

BSF PORTA,0 ; Ponemos la salida serie a nivel alto (transmitir un 1)

NOP ; pasamos a probar si acabamos, directamenteTDONE

DECFSZ BITS, f ; se decrementa BITS por el bit transmitido y salta cuando llega a cero

GOTO TXLOOP ; quedan más bits, vamos a transmitir el siguiente

MOVLW 0x34 ; Retardo de 208 microsegundos 34h = 52dCALL MIC4 ; 52 x 4 = 208 microsegundos para el

último bit de datos que quedaBSF PORTA,0 ; Salida serie a nivel alto para el bit

de stopMOVLW 0x68 ; retardo de 104 x 4 microsegundos 68h =

104dCALL MIC4 ; 104 x 4 = 416 microsegundos para dos

bits de paradaRETURN

;;**************************************************************;NMSEC

MOVWF CNTMSEC ; mueve W al registro msecMSLOOP

MOVLW 0xF8 ; cuenta 8 microsegundos por encimaCALL MIC4 ; 248 * 4 + 2 = 994NOP ; realiza el resto del bucleNOP ; añade 6 microsegundosDECFSZ CNTMSEC, f ; decrementa el contador y salta cuando

llega a ceroGOTO MSLOOP ; vuelve a realizar el bucleRETURN

;;**************************************************************;MIC4

ADDLW 0xFF ; substrae 1 de WBTFSS STATUS,Z ; salta cuando llega a ceroGOTO MIC4 ; si no llega a cero vuelve a restarRETURN

;

Page 12: Comunicación PIC-PC vía RS232

;**************************************************************;MSGTXT

ADDWF PCL, f ; sumamos offset al PCLRETLW 0x48 ; 'H' 72dRETLW 0x6F ; 'o' 111dRETLW 0x6C ; 'l' 108dRETLW 0x61 ; 'a' 97dRETLW 0x20 ; ' ' 32dRETLW 0x6D ; 'm' 109dRETLW 0x75 ; 'u' 117dRETLW 0x6E ; 'n' 110dRETLW 0x64 ; 'd' 100dRETLW 0x6F ; 'o' 111dRETLW 0x0D ; retorno de carroRETLW 0x0A ; nueva líneaRETLW 0x00 ; indica el final del mensaje

;;**************************************************************;

END

El programa puede descargarse, de picpcrs232cpp/01.rar y está en "picpcrs232cpp\01\mplab\pic_pc001.asm". Los fuses se configuran con WDT desactivado, oscilador XT, sin protección y con POR activado.

El programa se ha realizado y simulado con MPLAB.