Вы находитесь на странице: 1из 7

RS232 en el PIC: UART por software

Pgina 1 de 7

CRySoL (/)
About (/about.html)

Archive (/archive.html)

Recipes (/recipes.html)

Users (/users.html)

(/)

this
author: oscarah (/users.html#oscarah)
created: 2007-05-17
source / (https://github.com/CRySoL/web.source/raw/master/_posts/migrated/2007-05-17-rs232-enel-pic-uart-por-software.html)edit (https://github.com/CRySoL/web.source/edit/master/_posts/migrated/200705-17-rs232-en-el-pic-uart-por-software.html)
categories: recipe (/categories.html#recipe-ref)
migrated from node/689 (http://crysol.org/node/689)
tags: embedded (/tags.html#embedded-ref)

(/tags.html#embedded-ref)
10
related
Compilacin cruzada de IceServices para arquitecturas ARM (/recipe/2011-02-28/compilacin-cruzada-deiceservices-para-arquitecturas-arm)
Creando ejecutables vlidos para cualquier PSP... como Sony! (/2011-01-21/creando-ejecutables-vlidos-paracualquier-psp-como-sony)
Kit de desarrollo libre para PS3 (/recipe/2010-12-09/kit-de-desarrollo-libre-para-ps3)
Crear una imagen Emdebian para tu FriendlyARM (/recipe/2010-07-21/crear-una-imagen-emdebian-para-tufriendlyarm)
FoxG20 (/2010-07-16/foxg20)

recent
passwd/shadow inconsistencies (/recipe/2015-04-24/authentication-failure-ignored)

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 2 de 7

apt-mirror: the debian mirror that just works (/recipe/2014-11-20/apt-mirror)


schroot: snapshot chroots (/recipe/2014-11-11/schroot-snapshots)
Introduccin a Ogre3D (/recipe/2014-10-08/introduction-to-ogre3d)
nautilus: list folder before files (/recipe/2014-09-28/nautilus-sort-directories-first)

RS232 en el PIC: UART por software


La comunicacin entre dispositivos es vital para disear sistemas ms complejos. En
este tema, uno de los primeros pasos cuando se trabaja con el PIC es la comunicacin
con el PC usando el puerto serie.
A continuacin veremos las posibilidades disponibles y una implementacin de una UART
(http://es.wikipedia.org/wiki/UART) en ensamblador para el PIC.

Escenario
Por supuesto, existen muchos microcontroladores que integran entre sus perifricos una
UART. En estos casos es mucho ms sencilla la comunicacin con el PC o con otros
perifricos, pues la UART se encarga de casi todo. El problema surge cuando el micro que
usamos no tiene el hardware adecuado (por problemas de espacio, de costo, etc.). En esos
casos, es posible utilizar UART's hardware externas, pero que presentan el problema de
tener que usar ms hardware (encarecimiento, volumen...), por lo que quiz tampoco sea
una solucin. Para estas situaciones (u otras que se puedan presentar) tenemos la
posibilidad de disear nosotros mismos la UART e implementarla en software. Veamos un
ejemplo de esta implementacin.

Ingredientes
Lo que vamos a hacer es conectar un PIC al PC para enviar informacin entre ambos
dispositivos. Usaremos el puerto serie (http://es.wikipedia.org/wiki/Puerto_serie) del PC, que
emplea la norma RS232 (http://es.wikipedia.org/wiki/RS232). Para hacer esto, tenemos que
convertir los niveles de seal entre los que usa el PIC (TTL) y los del puerto serie (RS232).
Para ello, necesitaremos un conversor. En este caso, usaremos el DS275
(http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2929). Para el conexionado y las seales,
te remito a: La consola de la fonera: DS275 (http://netandtech.wordpress.com/hardware/laconsola-de-la-fonera-ds275/). Si no quieres leer mucho, estos son los pines a conectar
(usando un DB-9 para el RS232):

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 3 de 7

RS232
DS275
PIC
-------------------------RxD(2)
TXout(5)
TxD(3)
RXin (7)
RXout(1)
TXin (3)

RxD
TxD

En cuanto a hardware, slo eso. Necesitars tambin una protoboard, pines... lo normal en
estos casos. El software lo haremos nosotros ;-) .

Comunicacin serie
Antes de seguir, nos sera til saber cmo funciona una comunicacin serie, en este caso la
que se usa en el puerto serie de nuestro PC (o Fonera...). Serie nos indica uno detrs de
otro, y en efecto, cuando transmitimos algo en serie, lo hacemos bit a bit. En el caso del
PIC, si queremos transmitir algo, hemos de usar uno de los pines configurado como salida.
Para transmitir un '1' lgico, ponemos el pin en nivel alto (+5V por ejemplo) y si queremos
enviar un '0', ponemos el pin en nivel bajo (cerca del nivel GND). As, variando en el tiempo
el estado del pin, podemos enviar todos los datos que queramos. La pregunta que surge es:
cunto tiempo mantenemos el nivel? La respuesta es obvia: dependiendo de la velocidad
con que estemos transmitiendo. En el RS232 mediremos la velocidad en bps (bits por
segundo). As pues, tenemos diferentes velocidades 'estndar': 600, 1200, 2400... En
nuestro ejemplo usaremos 9600 bps, pero si es necesario podramos llegar a velocidades
de casi 1 Mbps. Luego veremos cuanto ha de durar cada bit para enviar a esa velocidad.
Vemos que si cada bit tiene una duracin fija, constante, no es necesario un reloj que
marque los cambios de bit. Cierto, no es necesario, es implcito. Pero esto implica que si se
comete un error en la transmisin de un bit, el resto de la comunicacin sera basura.
Existen por tanto ciertos mtodos y bits bandera para que esto no ocurra. En primer lugar,
el estado del pin de envio mientras no se est enviando es fijo (deber ser '1'). As, cuando
se empieza la transmisin, enviamos un bit de inicio (que es un '0'). Despus, se acuerda
entre emisor y receptor cuantos bits van a conformar los datos: 5, 6, 7 u 8. Lo normal es 8
(un byte). Se envan respetando los tiempos de cada bit. Una vez enviados los datos, el
siguiente bit es opcional y se usa como mecanismo para evitar errores: la paridad. Consiste
en un bit que indicar si el nmero de unos o ceros en los datos es par o impar. Aqu no lo
usaremos. Para terminar, enviamos uno o dos bits de parada, de forma que el pin de
transmisin se quede en el nivel lgico '1'. As, se termina la transmisin de nuestro dato.
Nos quedamos con la velocidad (9600 bps), los bits de datos (8bits), la paridad (N) y el bit
de stop (1): 9600 8N1 Podemos verlo todo un poco ms claro en el siguiente cronograma:

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 4 de 7

(http://crysol.inf-

cr.uclm.es/files/cronograma.jpg)

UART software
Ahora lo que haremos ser implementar unas rutinas que nos simplifiquen el envio de datos
por el puerto serie. Antes de nada, convenir que pines usaremos. El PORTA,0 ser el pin
TxD mientras que el PORTA,1 ser el RxD. Usaremos el PIC16F84, as lo configuramos:
list
p=16f84
include <p16f84.inc>

; Procesador a usar.

;;; Configuracin
;;; Oscilador: cristal de cuarzo
;;; WatchDogTimer: apagado
;;; CodeProtection: desactivado
;;; PoWeR up Timer activado
__CONFIG _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON

Tambin podemos definir las constantes que usarn las rutinas:


;;; Constantes
tx_port equ
tx_pin equ
rx_port equ
rx_pin equ

PORTA
0x0
PORTA
0x1

;
;
;
;

data_tx equ
data_rx equ

0xd
0xf

; Datos a enviar
; Datos recibidos

count_d equ
count_p equ

0xc
0x10

; Contador para el retardo


; Contador para el nmero de bits

Puerto
Pin de
Puerto
Pin de

de tranmisin
transmisin
de recepcin
recepcin

Ahora podemos definir la rutina de retardo, que ser la que marque el tiempo que
consideraremos de un bit. Como hemos dicho, la velocidad de transmisin ser 9600bps.
Tambin hay un comentario que indica que el reloj que usaremos ser de 4 MHz, lo que
indica que tendremos un ciclo de reloj de 1 us. Si dividimos 9600/1s = 104 us. Luego la
duracin de cada bit ha de ser de 104 us. Nuestro bucle ser as:
rs232_d:
movlw
movwf
decfsz
goto
return

D'32'
count_d
count_d, F
$-1

;
;
;
;

1
1
1
2

us (algo menos de 33)


us
us (+ 1 en caso de skip)
us

; 2 us

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 5 de 7

Y como vemos, se ejecuta una media de 3 veces ms 5 ciclos de inicializacin y retorno.


Luego haciendo un clculo rpido vemos que con justo 33 veces conseguimos que rs232_d
dure 104 us. En la prctica, no nos es til acercarnos tanto al lmite, por lo que si usamos
32, funciona mejor. Ahora, cada vez que enviamos un bit, hemos de esperar el tiempo
marcado por rs232_d. Veamos la rutina de envio:
send_b:
movwf
movlw
movwf

data_tx
d'8'
count_p

; Guargamos el dato a enviar


; Enviaremos 8 bits

bcf
call

tx_port,tx_pin
rs232_d

; enviamos el bit de inicio

btfss
bcf
btfsc
bsf

data_tx,0
tx_port,tx_pin
data_tx,0
tx_port,tx_pin

; comprobamos el primer bit


; si es un 0 enviamos un 0

call

rs232_d

; mantenemos el bit el tiempo necesario

rrf

data_tx,F

; movemos los bits a la derecha

decfsz
goto

count_p,F
s_loop

; si no se han enviado 8 bits...


; seguimos

bsf
call
return

tx_port,tx_pin
rs232_d

; si se han enviado, enviamos el bit de stop

s_loop:

; si es un 1 enviamos un 1

NOTA: enviamos el LSB (least significative bit) primero, el bit 0. Antes de llamar a esta
rutina, debes poner en W el byte que quieras enviar. Este byte se guarda en un registro, as
como el nmero de bits de datos. Se envia el bit de inicio y despus el resto de bits. Una
vez terminado, nos queda poner el bit de stop y retornar. Sencillo, verdad? Pues la de
recepcin no es mucho ms complicada:
recv_b:
movlw
movwf
clrf
btfsc
return

d'8'
count_p
data_rx
; daremos por hecho que son todo 0's
rx_port, rx_pin ; comprobamos bit de inicio
; datos errneos

rrf
call

data_rx,F
rs232_d

btfsc
bsf
decfsz
goto

rx_port, rx_pin ; solo cambiamos si es un 1


data_rx,7
count_p, F
r_loop

movf
return

data_rx, W

r_loop:
; rotamos a la derecha (primero LSB)
; esperamos el tiempo adecuado

; retornamos el dato leido, en W

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 6 de 7

Antes de llamar a esta rutina, es necesario que compruebes el pin RxD en espera del bit de
inicio. Inmediatamente despus de cambiar de estado el pin RxD, se ha de llamar a esta
rutina. Es posible retardarse un lapso de tiempo mximo de rs232_d/2, pero no mucho
mayor, si se quiere leer algo. Lo ms aconsejable es usar como pin RxD uno que sea
sensible a cambios de estado mediante interrupciones, y llamar a la rutina de lectura desde
el vector de interrupcin. As se evita el hacer un polling al pin RxD.

Ejemplo de uso
Como ejemplo de uso, veremos un simple servicio de echo en el puerto serie: cada byte
que se enva desde el PC al PIC es retornado de nuevo al PC. Es algo muy sencillo:
;;;
;;;
;;;
;;;

-*- coding: utf-8 -*Prueba de comunicacin con el puerto RS232 de


un pc. Se establece la comunicacin a
9600bps, 8N1, con un cristal de 4MHz

;;; Author: Oscar Acena, (c) 2006, 2007


;;; License: GPL
list
p=16f84
include <p16f84.inc>

; Procesador a usar.

;;; Configuracin
;;; Oscilador: cristal de cuarzo
;;; WatchDogTimer: apagado
;;; CodeProtection: desactivado
;;; PoWeR up Timer activado
__CONFIG _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON
;;; Constantes
tx_port equ
tx_pin equ
rx_port equ
rx_pin equ

PORTA
0x0
PORTA
0x1

;
;
;
;

data_tx equ
data_rx equ

0xd
0xf

; Datos a enviar
; Datos recibidos

count_d equ

0xc

; Contador para el retardo

Puerto
Pin de
Puerto
Pin de

de tranmisin
transmisin
de recepcin
recepcin

En este caso, tengo puesto un LED en el PORTB,3, que se enciende cuando hay
comunicacin. Lo puedes probar con el minicom, o mejor con algo hexadecimal, como el
cutecom.

Disclaimer
Esta seguro no es la mejor UART que existe, desde luego. Acepto comentarios que ayuden
a mejorarla. Este es mi pequeo aporte, quiz entre todos salga algo decente que podamos
usar. Es lo genial del software libre. Por otro lado, todo esto es software prototipo. No esta
completamente depurado y NO ASEGURO QUE FUNCIONE EN NINGN CASO. NO ME
HAGO RESPONSABLE DE LOS DAOS CAUSADOS AL HARDWARE, A LA

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

RS232 en el PIC: UART por software

Pgina 7 de 7

COMPUTADORA O A SU PERSONA. Puedes modificarlo o usarlo a tu antojo. Queda bajo


la licencia GPL v2.0 o posterior.

Referencias
1. X-Robotics (http://www.x-robotics.com/rutinas.htm)
2. Mucha info til (alemn) (http://www.sprut.de/electronic/pic/grund/rs232.htm)

Previous (/recipe/2007-05-17/la-consola-de-la-fonera-ds275)

Archive (/archive.html)

Next (/recipe/2007-05-17/traffic-shaping-y-qos-en-gnu-linux)

[ show comments ]

2015 CRySoL with help from Jekyll Bootstrap (http://jekyllbootstrap.com) and Twitter Bootstrap
(http://twitter.github.com/bootstrap/). See site sources (https://github.com/CRySoL/web.source).
Generated at 2015-04-24 20:03:47 +0200
Visit our forum (https://groups.google.com/forum/?hl=es#!forum/crysol).

http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

14/05/2015

Вам также может понравиться