Rs232 en El Pic Uart

7
CRySoL (/) (/) 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-en- el-pic-uart-por-software.html)edit (https://github.com/CRySoL/web.source/edit/master/_posts/migrated/2007- 05-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 Compilación cruzada de IceServices para arquitecturas ARM (/recipe/2011-02-28/compilacin-cruzada-de- iceservices-para-arquitecturas-arm) Creando ejecutables válidos para cualquier PSP... ¡como Sony! (/2011-01-21/creando-ejecutables-vlidos-para- cualquier-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-tu- friendlyarm) FoxG20 (/2010-07-16/foxg20) recent passwd/shadow inconsistencies (/recipe/2015-04-24/authentication-failure-ignored) About (/about.html) Archive (/archive.html) Recipes (/recipes.html) Users (/users.html) Página 1 de 7 RS232 en el PIC: UART por software 14/05/2015 http://crysol.github.io/recipe/2007-05-17/rs232-en-el-pic-uart-por-software/

description

diseño de algoritmo para comunicación rs232 en pic

Transcript of Rs232 en El Pic Uart

  • CRySoL (/)

    (/)

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

    el-pic-uart-por-software.html)edit (https://github.com/CRySoL/web.source/edit/master/_posts/migrated/2007-

    05-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-de-

    iceservices-para-arquitecturas-arm)

    Creando ejecutables vlidos para cualquier PSP... como Sony! (/2011-01-21/creando-ejecutables-vlidos-para-

    cualquier-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-tu-

    friendlyarm)

    FoxG20 (/2010-07-16/foxg20)

    recent

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

    About (/about.html) Archive (/archive.html) Recipes (/recipes.html) Users (/users.html)

    Pgina 1 de 7RS232 en el PIC: UART por software

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

  • 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/la-

    consola-de-la-fonera-ds275/). Si no quieres leer mucho, estos son los pines a conectar

    (usando un DB-9 para el RS232):

    Pgina 2 de 7RS232 en el PIC: UART por software

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

  • RS232 DS275 PIC -------------------------- RxD(2) TXout(5) TxD(3) RXin (7)

    RXout(1) RxD TXin (3) 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:

    Pgina 3 de 7RS232 en el PIC: UART por software

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

  • (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 ; Procesador a usar. include

    ;;; 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 PORTA ; Puerto de tranmisin tx_pin equ 0x0 ; Pin de transmisin rx_port equ PORTA ; Puerto de recepcin rx_pin equ 0x1 ; Pin de recepcin

    data_tx equ 0xd ; Datos a enviar data_rx equ 0xf ; Datos recibidos

    count_d equ 0xc ; Contador para el retardo count_p equ 0x10 ; Contador para el nmero de bits

    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 D'32' ; 1 us (algo menos de 33) movwf count_d ; 1 us decfsz count_d, F ; 1 us (+ 1 en caso de skip) goto $-1 ; 2 us

    return ; 2 us

    Pgina 4 de 7RS232 en el PIC: UART por software

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

  • 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 data_tx ; Guargamos el dato a enviar movlw d'8' ; Enviaremos 8 bits movwf count_p

    bcf tx_port,tx_pin ; enviamos el bit de inicio call rs232_d

    s_loop: btfss data_tx,0 ; comprobamos el primer bit

    bcf tx_port,tx_pin ; si es un 0 enviamos un 0 btfsc data_tx,0 bsf tx_port,tx_pin ; si es un 1 enviamos un 1

    call rs232_d ; mantenemos el bit el tiempo necesario

    rrf data_tx,F ; movemos los bits a la derecha

    decfsz count_p,F ; si no se han enviado 8 bits... goto s_loop ; seguimos

    bsf tx_port,tx_pin ; si se han enviado, enviamos el bit de stop call rs232_d

    return

    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 d'8' movwf count_p clrf data_rx ; daremos por hecho que son todo 0's btfsc rx_port, rx_pin ; comprobamos bit de inicio return ; datos errneos

    r_loop: rrf data_rx,F ; rotamos a la derecha (primero LSB) call rs232_d ; esperamos el tiempo adecuado

    btfsc rx_port, rx_pin ; solo cambiamos si es un 1 bsf data_rx,7decfsz count_p, F goto r_loop

    movf data_rx, W ; retornamos el dato leido, en W return

    Pgina 5 de 7RS232 en el PIC: UART por software

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

  • 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 ; Procesador a usar. include

    ;;; 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 PORTA ; Puerto de tranmisin tx_pin equ 0x0 ; Pin de transmisin rx_port equ PORTA ; Puerto de recepcin rx_pin equ 0x1 ; Pin de recepcin

    data_tx equ 0xd ; Datos a enviar data_rx equ 0xf ; Datos recibidos

    count_d equ 0xc ; Contador para el retardo

    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

    Pgina 6 de 7RS232 en el PIC: UART por software

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

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

    Pgina 7 de 7RS232 en el PIC: UART por software

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