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

Programador PIC Pablin II

Corregido Debido a la gran cantidad de e-mails que recibimos pidindonos la forma de programar PICmicros de mas de 18 pines decidimos hacer esta segunda versin de nuestro equipo el cual ahora puede programar micros de 8, 18, 28 y 40 pines as como memorias seriales de la familia 24.

Tal como vemos el circuito es esencialmente el mismo que la versin anterior. Los dos diodos en los pines 5 y 6 del puerto paralelo se encargan de unir elctricamente las salidas D4 y D5 que son las encargadas de comandar Vpp1 y Vpp2 desde el programa ICProg. Dado que nuestro equipo no requiere dos vas de VPP individuales decidimos "puentearlas" con estos diodos para proteger elctricamente el puerto paralelo de la PC. La llave selectora permite determinar que tipo de PIC se va a programar. Colocndola en la posicin superior se pueden programar micros chicos y medianos (de 8 y 18 pines) mientras que colocndola en la posicin inferior se pueden programar micros grandes (de 28 y 40 pines).

Vemos aqu el conexionado de la placa de circuito impreso que contiene los zcalos para los distintos tipos de PICmicro que podemos programar. Pensamos que sera mejor hacer el sistema en dos placas, una con la electrnica en el interior del gabinete y otra con slo los zcalos para colocar en el exterior del gabinete donde ser mas simple insertar o retirar los micros a programar.

Podemos, adems, equipar a nuestro equipo de un zcalo de 8 pines adicional como el visto arriba para poder leer y programar memorias seriales de la familia 24. Como fuente de alimentacin debemos usar una de 12V (NO REGULADA) de 300mA en adelante de corriente. El programa a utilizar es el ICProg, el cual podemos descargar de www.icprog.com o encontrarlo en nuestro CD de Enero 2003. En la pantalla de configuracin del programa ICProg establecer como programador el "Propic II programmer" y tildar la casilla "Invertir MCLR". Luego de esto el LED indicador PIC se encender indicando que es posible insertar o quitar pics de los zcalos.

IMPORTANTE
El LED marcado como "PIC" indica cuando no hay presencia de tensin de programacin (VPP) en el zcalo. Cuando este LED esta apagado la tensin est presente en los zcalos PIC. Nunca insertar o quitar microcontroladores de los zcalos estando este indicador apagado.

Programador PIC Pablin


Si bien son muchos los circuitos disponibles en la Web que permiten programar microcontroladores PIC decidimos tomar lo mejor de cada uno de ellos y elaborar uno propio con las caractersticas que lo hacen propio para nuestro pas (componentes econmicos y fciles de conseguir, software fcil de usar y en espaol). El programador PIC Pablin permite leer y grabar PICmicros de 8 y 18 pines as como memorias EEPROM seriales.

Dispone de un zcalo de 18 pines el cual permite conectar, tal como se ve en la plantilla, tanto PIC's como memorias EEPROM seriales. Los PIC's de 18 pines se colocan ocupando la totalidad del zcalo mientras que los PIC's de 8 pines se colocan ocupando la parte superior del zcalo. En tanto las memorias seriales se colocan una hilera anterior al fin del zcalo (el pin 1 de la memoria debe coincidir con el 5 del zcalo). El LED marcado como "Enc." permite observar que el sistema se encuentra alimentado mientras que el LED marcado como "PIC" se enciende indicando que es seguro insertar o quitar un chip (PIC o memoria) y se apaga por instantes breves cuando una lectura o programacin de un PIC est en curso. Mientras este ltimo LED este apagado no se debe quitar o insertar ningn integrado del zcalo. El funcionamiento del circuito es muy simple: los pines del puerto paralelo 2, 3, 5 y 10 permiten interconectar el circuito con la PC. El pin 2 es el encargado de traer los datos (desde la PC hacia el integrado). El pin 3 es el envo de los

pulsos de reloj (desde la PC hacia el integrado). En tanto el pin 10 permite a la PC leer los datos desde el programador. El pin 5, por ltimo, es el encargado de controlar la tensin de programacin (Vpp) necesaria para cuando queremos leer o escribir en un PIC. Los microcontroladores PIC se programan utilizando el mismo protocolo que las memorias EEPROM seriales, por consiguiente el programador sirva tanto para PIC's como para memorias. La tensin de programacin VPP es necesaria para indicarle al PIC que deseamos leerlo o programarlo. Si en este pin (que es compartido con la entrada de RESET del micro) ponemos masa el PIC sufre un reset, si ponemos el pin en alto (5v) el PIC trabaja normalmente mientras que si ponemos el pin a 12v el PIC se inicializa en modo programacin, quedando dos de los pines de E/S destinados a datos (SDA) y reloj (SCL). El integrado 74LS04 est formado internamente por seis buffers inversores. Estos nos permiten por un lado obtener niveles TTL a su salida y por el otro no cargar de forma excesiva al puerto. Algunos programadores, como el NOPPP utilizan diodos y resistencias para conectar el PIC directamente el puerto paralelo. Esto funciona en muchas computadoras de escritorio con fuentes poderosas pero en la mayora de las porttiles que no disponen de tanta corriente el funcionamiento es errtico o directamente no funciona. Gracias a la utilizacin de este buffer podremos utilizar el circuito en cualquier puerto paralelo ya sea de una computadora de escritorio o en un porttil. Se colocan las compuertas en serie para obtener a la salida el mismo nivel de entrada, sin invertir. Las resistencias de 1K dan seguridad al sistema para evitar que circule corriente excesiva. El control de la tensin de programacin lo efecta el transistor NPN. Estando el pin 5 del puerto paralelo a masa (en 0) tendremos al transistor abierto por lo que la corriente proveniente de +V (12v) pasar por el diodo LED el cual no encender y se portar como un diodo comn polarizado en directa, pasar por la resistencia limitadora de corriente del LED la cual no ofrecer mucha resistencia y ser inyectada al PIC en su terminal MCLR/VPP. Poniendo en 1 el bit que controla el pin 5 del puerto paralelo, en cambio, el transistor se cierra y hace circular masa hacia el PIC haciendo, adems, encender el LED al quedar a masa el otro extremo de la resistencia limitadora de corriente. El circuito requiere como nica alimentacin 12V de continua con una corriente de 200mA. Puede usarse cualquier fuente universal siempre que se respete la polaridad. De tener una fuente de mas tensin (13.5v como mucho) no hay problema, se la puede utilizar sin inconvenientes. No es necesario que la fuente sea regulada. Si se tiene una fuente de 12V con mas corriente 1A o incluso mayor se la puede utilizar tambin sin inconvenientes. Para conectarlo a la PC se puede utilizar un conector hembra centronics para circuito impreso (igual al que tienen las impresoras) o un cable directo hacia el macho DB25.

Vemos la foto del prototipo terminado, en nuestro caso optamos por poner un segundo zcalo para las memorias seriales y dejar el zcalo grande para los PIC's. La resistencia de 1K dems junto al integrado qued de la etapa de prctica pero no tiene conexin a ninguna parte. El programa que recomendamos para este programador es el IC-Prog dado que rene varias caractersticas mas que interesantes:

Es muy fcil de usar Interface con botones de acceso rpido a las principales funciones Permite ver el ASM del programa que se esta por cargar en el PIC (si ! lo obtiene desde el HEX) Tiene varios idiomas, entre ellos espaol Dispone de cinco espacios de memoria (Buffers) para poder tener hasta cinco programas simultneos. Dentro de una nica ventana rene memoria de programa, memoria EEPROM y bits de configuracin. Hay actualizaciones peridicas con funciones nuevas y problemas resueltos. Funciona tanto bajo Windows95 como Windows XP as como en versiones intermedias.

Vemos a continuacin una captura de pantalla del programa, haciendo click sobre ella se lo puede descargar.

Para configurarlo slo es necesario presionar F3 y especificar el tipo de hardware programador (seleccionar ProPic 2), indicar el puerto paralelo al cual est conectado y establecer como mtodo de transferencia de informacin al puerto Direct I/O (en caso de usar Windows 95, 98 o ME) o Windows API (en caso de usar Windows NT, 2000 o XP). El retardo de I/O establecerlo en 10 que es un valor que funciona siempre. Se puede ir reduciendo y probando para lograr el menor retardo posible y as obtener la mayor velocidad de operacin. En tanto se debe indicar como nica lnea invertida la de MCLR. Las dems lneas son normales. El programa no requiere instalacin, bastar con descomprimir los nicos dos archivos que lo conforman (el EXE y el SYS) en cualquier carpeta (nosotros usamos C:\ICPROG). Una vez hecho esto ejecutar el EXE con doble click y establecer la configuracin (lo pide una nica vez). Si al momento de terminar la configuracin del programa los dos LED's estn encendidos es seal de buen funcionamiento. Dentro del men ajustes hay una opcin para probar el funcionamiento del programador. Para comprobar si hay nuevas revisiones visitar www.ic-prog.com

Aclaracin: Nosotros utilizamos un regulador de tensin 7805 de 1A dado que es lo que tenamos a mano, pero puede utilizarse un regulador 78L05 (los de 300mA que tienen forma de transistor) sin problemas y con la ventaja de ocupar mucho menos espacio.

Programador para PIC 16F84 y 16F87x


Proyecto: Programador para microcontroladores PIC 16F84 y 16F87x de Microchip Fecha : 25 de Setiembre de 2001 (Actualizado 11de Noviembre de 2002) Autor: TodoRobot

Introduccin:
El propsito de este proyecto fue obtener un producto simple que nos permitiese programar los principales microcontroladores con memoria Flash de la firma Microchip. Por sus similitudes en la forma de programar nos decidimos a enfocarnos en los modelos 16F84, 16F84A, 16F870, 16F871, 16F872, 16F873, 16F874, 16F876 y 16F877. La variedad nos pareci aceptable, por lo que a fin de no complicar el diseo se descartaron los dems modelos. Dentro de la Web se pueden encontrar muchos sitios dedicados a estos microcontroladores, muy famosos entre los aficionados a la electrnica y la robtica debido a su bajo costo y grandes prestaciones.

Circuito del programador:


En el documento picprog-circuit.pdf podemos apreciar el circuito a utilizar. Si observamos el circuito, se pueden apreciar los tres posibles encapsulados que se pueden hallar dentro de los modelos soportados por este programador ( PIC 16F8xx ). A pesar de sus diferencias, se puede ver que bsicamente todos tienen las mismas salidas, solo que en los modelos ms sencillos estas se ven reducidas. Pero a nivel programacin los pines son los mismos (solo que en distinta ubicacin en cuanto a nmero de pin). Lo ideal sera usar tres zcalos del tipo ZIF ( Insercin Cero ) para los tres modelos de encapsulado, es decir: 2x 9, 2x 14 y 2x 20. En caso que el presupuesto sea muy ajustado, se puede recurrir al uso de zcalos comunes, los cuales dan un resultado bastante aceptable. Las distintas tensiones necesarias para la programacin y funcionamiento del PIC 16F8xx se controlan mediante VR1 (78L05) y VR2 (78L12).

La alimentacin de entrada debe ser provista mediante una fuente externa que pueda entregar 15 a 17v de corriente continua y aproximadamente 100mA. La conexin al puerto paralelo de la PC se debe realizar mediante un conector db25 macho y respetando el conexionado indicado en el circuito. Estos conectores traen el nmero de cada pin marcado al costado del mismo con lo que no es difcil su identificacin. A su vez y para mayor seguridad, en el circuito tambin se hace mensin al nombre que representa cada lnea a usar en el LPT. En la siguiente figura se puede apreciar el pinout correspondiente al puerto paralelo de la PC:

Debido a que este circuito est pensado para poder ser usado In Circuit, el mismo podra perfectamente con algunos retoques poder ser incluido dentro de un desarrollo para evitar tener que extraer el chip para su programacin. Lo nico que se debe tener en cuenta es que en ningn momento el pin MCLR/VPP debe ser conectado directo a VCC, ya que al intentar programar se daaran los transistores Q1 y Q3 al quedar estos cortocircuitando VCC y GND. Otra posibilidad muy interesante sera proveer al programador con un conector de salida tipo bornera que permita tener acceso desde el exterior a todos los puertos del micro que se est programando. De esta forma sera muy til a la hora del desarrollo al permitirnos usar el micro sin necesidad de extraerlo del programador. En el documento salida.pdf se puede apreciar una idea para realizar el conector de salida antes comentado.

Software

PicProg est preparado para programar los siguientes modelos de la familia de Microchip: 16F84 16F84A 16F870 16F871 16F872 16F873 16F874 16F876 16F877

PicProg le permite Programar, Verificar y Borrar todos los modelos


anteriormente detallados. El archivo Hexadecimal (.hex) a grabar debe ser formato Intel INHX8M. Este es el formato estandar generado por la herramienta de desarrollo MPLAB que puede descargarse gratis en el site de Microchip.

PicProg fue diseado para trabajar en entorno Windows 9x. En el archivo ZIP picprog-v2.zip se
encuentran las instrucciones as como la DLL necesaria para su funcionamiento. Debido a que Windows NT y Windows 2000 son algo limitados a la hora de permitirnos tomar control del hardware de la PC, este software no funciona en esos S.O.

El programa PicProg fue diseado para leer la configuracin a aplicar al PIC directamente desde el archivo Hexadecimal. Esta configuracin es la que indicar si el PIC trabajar con Cristal (XT) o una celda RC, si se debe activar el WatchDog, etc. Para que esto sea as, esta configuracin se debe incluir dentro del cdigo fuente (ASM) antes de compilar el mismo como se puede ver a continuacin:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


El ejemplo anterior corresponde a la configuracin para un PIC 16F84. En este caso se est indicando que no se usar Cdigo de Proteccin (CP), no se usar WatchDog (WDT), se usar Power Up Timer (PWRTE) y se usar oscilador a crital (XT). (segn nomenclatura de Microchip). En caso que el archivo Hexadecimal (.hex) no posea embebida la configuracin, esta podr ser realizada manualmente mediante el botn CONFIGURACION . As mismo PicProg tiene la capacidad de autodetectar el PIC instalado o bien tambin se puede realizar la seleccin manualmente.

Utilizando el software PicProg:


Para ejecutar el software, simplemente se debe debe hacer click sobre el ejecutable PicProg.exe o bien crear un acceso directo al mismo. Una vez cargado, el funcionamiento es muy simple y se encruentra explicado en la ayuda provista con el mismo. Es importante aclarar que no es necesario borrar el PIC antes de reprogramarlo, ya que PicProg verifica cada sector de memoria a programar y solo regraba aquellos que son diferentes al actual. De esta manera se favorece la vida til de la memoria Flash del PIC. Por consiguiente solo es recomendable el borrado total cuando se debe regrabar un micro que fue grabado anteriormente utilizando Cdigo de Proteccin (CP).

Circuito de prueba:
Una vez construido el programador, lo mejor es realizar las primeras pruebas con un proyecto sencillo con el cual se tenga la certeza de su buen funcionamiento y de esa manera nos demuestre que el PIC ha sido correctamente programado. Este programa puede ser el WALK.HEX, el cual genera un sencillo efecto de secuenciador entre cuatro LED's. En el siguiente diagrama se aprecia el circuito a utilizar con el programa WALK.HEX:

D1, D2, D3 y D4 son los LED's que, si todo funciona correctamente, se prendern secuencialmente hacia un lado y hacia otro. Una vez construido, el siguiente paso es grabar en el PIC el programa WALK.HEX , y si todo ha funcionado bien los LED's deberan comenzar a prenderse secuencialmente. Si deseas analizar el cdigo fuente de este programa pods descargar WALK.ASM

Errores: Consulta las Preguntas Frecuentes

Recomendaciones:
En la pgina del fabricante Microchip, se puede encontrar gran cantidad de informacin necesaria para encarar cualquier proyecto con este microcontrolador. Ah mismo se puede descargar en forma gratuita el MPLAB, que es una estacin de diseo y depuracin para plataforma Windows, la cual les permitir realizar todos los desarrollos basados en los microcontroladores PIC. Una vez instalado el MPLAB, podremos hallar en C:\Archivos de programa\MPLAB\TEMPLATE\Code los template que servirn como base para comenzar a programar. Por ejemplo el template correspondiente al PIC 16F84A es f84atemp.asm

IMPORTANTE

Se debe desconectar la alimentacin del programador antes de extraer o insertar el PIC


en el zcalo para evitar daos al chip, as como tambin al puerto paralelo de la PC. PicProg ha sido diseado para trabajar con archivos Hexadecimales en formato Intel INHX8M , si se intenta usar cualquier otro formato los resultados son impredecibles. Aunque en ningn caso es peligroso para el Chip o el Programador, simplemente el programa se cargar erroneamente o no llegar a cargarse.

EXPERIENCIAS Y PRCTICAS I
con los microcontroladores PIC16F84
Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si

quiere volver a visitarnos.

Introduccin.
Este es un acercamiento muy lineal a la escritura de un programa. Muchos escriben y producen unas subrutinas muy pequeas con saltos (GOTO's) de una subrutina a otra, de modo que los productos saltan por todas partes como 'palomitas de maz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo este tipo de disposicin es muy difcil de seguir por un lector.

EXPERIMENTO 1.
Los comienzos siempre son muy simples, luego gradualmente se hacen ms y ms complejos. Para seguir los experimentos que se describen en estas pginas se recomienda montar el proyecto "Tarjeta de Pruebas " siguiendo las indicaciones que se dan en dicho artculo, aunque naturalmente el lector puede realizar su propio desarrollo o bien usar un protoboard, a su eleccin. Una vez dispongamos de dicho soporte, las 4 pilas de 1'5V y el chip 'F84A, debemos copiar y pegar el cdigo que hay debajo, para poder completar nuestro primer experimento, al que daremos el nombre ejem01.asm y usando el ensamblador gratuito de Microchip MPLAB, pasarlo a exadecimal (.hex) con el cual tratamos de encender un LED. No hace nada ms. El objetivo de este programa es mostrar las pocas lneas de cdigo, necesarias para que el PIC haga esta tarea. Ver el listado:

;******************************************************************^ ; Ttulo: ejem01.asm ^ ; Autor: V. Garcia ^ ; Date: 12012006 ^ ; Deben documentarse todas las rutinas y el motivo de ser ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; ^ ; Que hace => Encender LED 1 ^ ; ^ ; PIC16F84A ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;--------------- Encabezado ------------Start: ORG 0x00 BSF STATUS,5 MOVLW h'00' MOVWF h'05' MOVWF h'06' BCF STATUS,5 ;Ir a pagina1 a fijar los puertos ;pon 00 en W ;haz todas las lneas RA salida ;haz todas las lneas RB salida ; Ir a pagina0 para seguir el programa ;pon 1111 1110 en W ;conecta el primer LED ; lazo a LED_EN

LED_EN: MOVLW h'254' MOVWF h'06' GOTO LED_EN END

El siguiente es el listado en exadecimal, si no dispone de un ensamblador, puede copiar y pegar en su editor de texto y gurdelo como ejem01.hex para usar con el 'quemador' de chips y comprobar que hace lo que se espera.
:1000000083160030850086008312FF308600FE30A4 :040010008600072837 :00000001FF

Qu hace el programa.
Las lneas que empiezan con un punto y coma, como ya se ha comentado, son comentarios y no los usa el ensamblador, as que, la primera lnea donde realmente comienza el listado, empieza en mnemnicos con una etiqueta Start (Principio), no siempre es necesario usar etiquetas. La instruccin ORG 0x00 indica al micro en ensamblador, donde colocar el programa, al principio de la memoria de programa (Flash). Es un rea de datos en el propio micro, en la que se memorizan diversos datos durante la ejecucin del programa, este rea es la RAM del PIC, definida por el fabricante como rea de FILE REGISTER, que se encuentra a partir de la direccin 0x0C. En el PIC, siempre le siguen unas lneas que como se ver, nos permiten el acceso a un juego de registros para la configuracin del micro.

La instruccin que sigue BSF STATUS,5 BSF (BIT SET FILE REGISTER) pone a 1 el bit 5 del registro STATUS (0x03), en la posicin de memoria RAM especificada, lo que nos permite el acceso a la pgina1 (o Banco1) donde se deciden las condicionantes que se ocupan de los registros 05 (puerto A) y 06 (puerto B) y ambos registros determinan el estado lgico de cada uno de los pines de dichos puertos A y B. Con la instruccin MOVLW 00h (MOVE Literal to W register) ponemos el literal 00 en el registro de trabajo W, con la siguiente instruccin MOVWF 05h (MOVE W to File) ponemos el valor del registro W en el registro 0x05 (RP0) que es el Puerto A, que viene definido en el archivo P16F84A.INC, con esto hemos configurado el Puerto A como salida 0000 0000b. Si queremos que sea todo entradas usaremos la instruccin MOVLW FFh seguido de MOVWF 05h, esto pone 1111 1111b, todos los bits del Puerto A (0x05) a 1 como entradas . En el registro STATUS, encontramos los parmetros RP0 que corresponde al valor 0x05 o lo que es lo mismo el bit5 del registro. Se pone a 1 este bit para cambiar el banco de trabajo y manejar los registros TRISA y TRISB como se ver ms tarde. Por ejemplo, cuando un bit del registro RP0 es 1, la patilla correspondiente del chip (del Puerto A) ser entrada y cuando dicho bit lo ponemos a 0, esa patilla ser salida. Tengamos en cuenta que, no podemos cargar ninguno de estos registros directamente, en primer lugar se debe poner un valor o nmero (llamado literal) en W y luego cargar W en el registro deseado. Si cargamos 00 en W y luego W en 05 y 06, todas las lneas del Puerto A y del Puerto B sern puestas como salida. La siguiente instruccin BCF STATUS,RP0 (Bit Clear File register) cierra esta pgina1 (banco1) y devuelve el control a las instrucciones del programa de la pgina 0 (banco 0). Observar el smil BSF (Bit Set, banco1 ) y BCF (Bit Clear, banco 0). Como el F84A slo tiene dos bancos (0 y 1) usa el estado de un slo bit para cambiar de banco, otros PICs con ms memoria requieren de ms bits de control en el mismo registro STATUS. Esto, en esencia significa que, el programa para encender un LED realmente consiste en tres lneas, la primera lnea en la etiqueta LED_EN MOVLW h'254', pone el valor FEh en el registro de trabajo W, la segunda lnea MOVWF h'06' copia el valor en W al Puerto B (06). Este puerto es de salida (en realidad es un puerto de Entrada/Salida) cuando el primer bit del Puerto B pase a ALTO, el LED se iluminar, como el programa es muy rpido, se apagar de inmediato y no podremos saber si funciona el programa, entonces, entra en accin la tercera lnea del programa. La tercera lnea GOTO LED_EN (del ingls GO TO, ir a), es la instruccin que enva el puntero del programa a la direccin de la etiqueta LED_EN, es el lazo que mantiene el LED encendido por el programa al repetir la secuencia, ya que como se ha dicho, el micro debe estar (corriendo) todo el

tiempo, incrementando el programa. Ahora, puede que sea algo confuso lo descrito, sin embargo a medida que avance en estos artculos podr comprobar que es sencillo y fcil.

El circuito.

Como se aprecia en el esquema, el circuito anterior (Tarjeta de Pruebas) se compone de un microcontrolador PIC16F84, ocho diodos LED y unos pocos componentes adicionales. El Puerto B del PIC tiene un LED conectado a cada una de sus ocho lneas. El circuito ms simple y sencillo se puede ver a continuacin.

Todo lo descrito hasta aqu, es cierto, si bien hay otras formas de lograr el mismo resultado, una de las formas es cambiando el sentido del LED, en

cuyo caso se debe modificar el valor de la salida del puerto B, donde haba un 0 ahora debe presentar un 1, lo que obliga a conectar el nodo a la salida y la resistencia a la lnea de masa (GND), con esto se ha modificado el programa y sigue mostrando el mismo resultado que el anterior. Entonces, porque se ha usado el primer mtodo. No ha sido al azar, tengamos en cuenta que el consumo del conjunto LED ms resistencia normalmente no supera los 20mA y como la patilla del puerto, admite una corriente mayor, no causar ningn contratiempo, ya que el drenador de salida del puerto soporta dicha carga mejor que tener que aportar dicha corriente que supone un mayor consumo y el consiguiente aporte de calor, este ha sido el principal motivo de usar este mtodo. Este mtodo debe ser considerado por el tcnico para reducir consumos innecesarios en los proyectos. Este criterio es el que seguiremos aqu. La operacin del circuito se basa en un programa y este programa est contenido en el chip. Cuando se aplica la energa, el micro empieza en la primera posicin de memoria y ejecuta el programa. El programa ser guardado en la memoria del micro, durante el "quemado" y en ese nico momento estn disponibles un nmero de opciones de oscilador, osc RC (oscilador Res. / Cond.) que debe ser seleccionado y el chip estar listo para ese tipo de oscilador elegido, tngase en cuenta que el montaje slo responder al sistema de oscilador en la palabra de configuracin que haya elegido al 'quemar', si es RC, LP, TX, etc. Otras opciones disponibles del F84A a configurar son: PWRTE, CP, WDT, las cuales dependen del dispositivo en uso (se recomienda leer el DataSheet correspondiente). Debido a que el chip puede ser programado y reprogramado de nuevo, lo cierto es que est garantizado por ms de 1.000 veces, esto lo hace ideal para la experimentacin.

EXPERIMENTO 2.
Este experimento es similar al anterior, mediante unas pocas lneas aadidas al contenido del programa anterior, hacemos que el LED ahora se encienda y se apague en una secuencia sin fin. El circuito que se usa, es el mismo del ejercicio anterior. Esto se consigue de esta forma: aadimos en la tercera lnea, una instruccin CALL (Llamada) que enva al programa a la subrutina con etiqueta 'Delay' y luego se hace un nuevo lazo, veamos. Se trata de conseguir un retardo 'Delay' con el que poner el estado del LED en un bucle de espera, esta subrutina la llama el programa principal con la instruccin CALL Delay, esto mantiene encendido el LED, cuando termina el bucle, el micro retorna a la lnea siguiente donde esta el CALL, en el programa principal MOVLW h'FF' que, carga el literal FF en el registro W y lo pone con la instruccin MOVWF 06, en el Puerto B (salida) y salta de nuevo a la etiqueta Delay (retardo) para esta vez mantener apagado un tiempo el LED.

Al volver del retardo se establece un nuevo lazo, sera conveniente volver a empezar esta parte del programa para repetir los mismos pasos y esto se logra con un lazo que une este punto con el principio mediante el GOTO LED_EN. Vase el listado. En cuanto a la rutina 'Delay' en s, lo que ocurre es que, empieza por DECFSZ 1Bh (DECrement File Register Skip If Zero) decrementa una unidad el archivo 1Bh, si no es cero, sigue en la instruccin GOTO Delay para volver a decrementar que devuelve el programa a la instruccin anterior, para decrementarlo una nueva unidad, esto lo hace cada vez que pasa por la instruccin DECFSZ 1Bh. Cuando el archivo 1Bh llega a 0, entonces salta la instruccin GOTO Delay a la instruccin que sigue que, es otro DECFSZ pero esta vez el archivo es 1Ch y empieza a decrementarlo de uno en uno avanzando la rutina, luego se reinicia la instruccin DECFSZ 1Bh, a la que le sigue el decremento DECFSZ 1Ch, decremento de la instruccin a instruccin hasta llegar a la instruccin (RETURN) de retorno al programa principal. Esto se le llama instrucciones anidadas, ya se tratarn en ms detalle.
. . . . . . LED_EN MOVLW h'FE' MOVWF h'06' CALL Delay MOVLW h'FF' MOVWF 06 CALL Delay GOTO LED_EN Delay

;pon 1111 1110 en W ;conecta el primer LED ;Salta al retardo ;carga W con FF y ;apaga el LED ;Salta al retardo ; lazo a LED_EN

DECFSZ h'1B',1 ; Retardo GOTO Delay DECFSZ h'1C',1 GOTO Delay RETURN END

Se muestran slo los cambios que nos permiten producir lo previsto en el enunciado. Observar que no se usan los pulsadores, para estos experimentos. A continuacin se presenta el listado en hex para que si no puede ensamblarlo lo copie y pegue en su editor de texto y gurdelo como ejem02.hex para el posterior 'quemado' del chip.
:1000000083160030850086008312FF308600FE30A4 :1000100086000E20FF3086000E2007289B0B0E283E :060020009C0B0E280800F5 :00000001FF

EXPERIMENTO 3.

En este experimento, proponemos encender el LED 1 de una fila de 8 LEDs, lo apagaremos y encenderemos el siguiente LED 2 esto lo repetiremos en una secuencia hasta llegar al LED 8 con una cadencia de 2Hz, para volver a empezar por el LED 1, esto es todo lo que hace este experimento. El circuito que usaremos es similar al usado en el experimento 1, al que aadimos 7 series LED+R. Lo que ms cambiar es el listado del programa que, en este caso, tendr que sufrir algunas modificaciones como veremos. Este puede ser una modificacin del esquema en el caso de no usar la tarjeta descrita.

En el esquema del principio, los cinco pines RA0 a RA4 (puerto A) se usan como pines de entrada, estos son forzados a alto con resistencias a positivo de 10kohms, de modo que cuando los pulsadores no estn pulsados la entrada se hace alta (+5V) y cuando uno se pulsa pasa a nivel bajo (0V). El fenmeno de rebote producido, no se contempla esta vez ya que, cuando el programa detecta que el pulsador est cerrado, el tratamiento de parpadeo de los LED's se ejecuta una vez en el tiempo y es ms largo que el rebote. No se usan pulsadores en este ejercicio, de modo que no se contemplarn. Los ocho pines RB0 a RB7 (puerto B) se usan como salida, los nodos de los LED's se conectan al +5V y cada ctodo es controlado por la resistencia va PIC, de modo que cuando la salida del PIC es nivel alto (+5V), el LED implicado no luce y cuando el PIC entrega un nivel bajo (0V), lucir el LED, esto reduce la corriente en el chip. Se usarn LED's de alto brillo con poca corriente de flujo. Este es el listado completo para este experimento.
;******************************************************************^ ; Ttulo: ejem03-1.asm ^ ; Autor: V. Garcia ^ ; Date: 12012006 ^ ; Deben documentarse todas las rutinas y el motivo de ser ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; ^

; Que hace => Encender LED 1, lo apaga y enciende el siguiente ^ ; hasta el LED 8, luego vuelve a emepzar. ^ ; PIC16F84A ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;--------------- Encabezado ------------list p=pic16f84a #include <p16f84a.inc> errorlevel -302 ;Eliminar banco mensajes ;**************** Definicion de Etiquetas STATUS equ h'0003' porta equ h'0005' ; define puerto A portb equ h'0006' ; define puerto B TRISA equ h'0085' TRISB equ h'0086' ; Estos estan definidos en #include ;w equ h'0000' ;f equ h'0001' ra0 ra1 ra2 ra3 ra4 rp0 cnt500u cnt1m cnt100m cnt500m cnt1s equ equ equ equ equ equ equ equ equ equ equ 00 01 02 03 04 06 0c 0d 0e 0f 10 ;RA0 ;RA1 ;RA2 ;RA3 ;RA4 bit bit bit bit bit ********************

;500usec direccion contador ;1msec direccion contador ;100msec direccion contador ;500msec direccion contador ;1sec direccion contador ****************

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

Definicion Modelo Datos '1':OFF '0':ON

;****** Tabla Modelo ****** p00 equ b'01111111' p01 equ b'10111111' p02 equ b'11011111' p03 equ b'11101111' p04 equ b'11110111' p05 equ b'11111011' p06 equ b'11111101' p07 equ b'11111110' ; ;**************** Inicio Programa *********************** org 0 ;Vector Reset goto init org 4 ;Vector Interrupcion BCF INTCON,GIE ;Por si se dispararan interrupciones goto init ;**************** Proceso Inicial ********************* org 5 init: bsf STATUS,RP0 ;Cambiar a Banco1 movlw h'ff' ;Define modo datos entrada movwf TRISA ;Define PORTA en modo Entrada

las

clrf bcf movlw movwf

TRISB STATUS,RP0 h'ff' portb

;Define PORTB a modo Salida ;Cambia a Banco0 ;Pon datos '11111111' en salida ;para apagar LEDs

;*********** Modelo 0 Subrutina Salida *************** ptn0 movlw p00 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p01 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p02 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p03 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p04 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p05 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p06 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p07 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw h'ff' ;Pon datos FF en salida movwf portb ;datos para apagar LED call t100m ;Espera 100msec return ;******************************************************** ; Subrutina retardo (Timer) para reloj 10MHz ;******************************************************** ;************* t1m movlw movwf tm1lp1 movlw movwf tm1lp2 nop nop decfsz goto decfsz goto return ;************* t100m movlw movwf tm2lp call decfsz goto Subrutina 1msec Timer ***************** d'2' ;(1) Pon lazo cnt1 cnt1m ;(1) Guarda lazo cnt1 d'249' ;(1)*2 Pon lazo cnt2 cnt500u ;(1)*2 Guarda lazo cnt2 ;(1)*249*2 ajust retardo ;(1)*249*2 ajust retardo cnt500u,f ;(1)*249*2 cnt500u-1=0 ? tm1lp2 ;(2)*248*2 No, continua cnt1m,f ;(1)*2 cnt1m-1=0 ? tm1lp1 ;(2) No. Continua ;(2) Si. final de Cnt ;Total 2501*0.4usec=1msec 100msec Subrutina Retardo (Timer) *************** d'100' ;Pon lazo contador cnt100m ;Guarda lazo contador t1m ;subrutina 1msec cnt100m,f ;cnt100m - 1 = 0 ? tm2lp ;No. Continua

return ;************* t500m movlw movwf tm3lp call decfsz goto return ;************** t1s movlw movwf tm4lp call decfsz goto return

;Si. Final de Contador 500msec Subrutina Retardo (Timer) *************** d'5' ;pon lazo contador cnt500m ;Guarda lazo contador t100m ;subrutina 100msec cnt500m,f ;cnt500m - 1 = 0 ? tm3lp ;No. Continua ;Si. final de Contador 1sec Subrutina d'2' cnt1s t500m cnt1s,f tm4lp Retardo (Timer) ***************** ;Pon lazo contador ;Guarda lazo contador ;subrutina 500msec ;cnt1s - 1 = 0 ? ;No. Continua ;Si. Final de Contador

;******************************************************** ; Final del proceso parpadeo LED ;******************************************************** end

Este que sigue, es el archivo en hex que se obtiene al ensamblar el listado anterior, si no dispone de un ensamblador, puede copiar y pegar este archivo en su editor de texto y gurdelo como ejem03-1.hex para el 'quemado' en un chip '84A, con su sistema de programacin.
:020000000528D1 :0800080005280317FF308500F5 :1000100086010313FF308600051C0E200310FE30FE :1000200086001420860D112803309A009B0B162899 :0A0030009C0B16289A0B16280800F6 :00000001FF

Qu hace el programa.
Las primeras lneas del programa, definen las igualdades ( equ) y los parmetros que se van a usar. Aqu, se han definido las variables ra0-ra4 no usadas y RP0, seguidamente se define una tabla modelo binario de ocho lneas de datos, cada vez que se llame con: movlw p00 ; carga literal en el registro W (el literal va desde p00 a p07) movfw portb ; presenta valor en puerto b call t100m ; llama subrutina retardo su valor se enviar a la salida (puerto B), alternando con los retardos necesarios para encender el LED que corresponda en cada caso, esto se repite. Posteriormente se define la subrutina de retardo desde donde se

vuelve a la rutina principal. La rutina de tiempos aqu usada, como se aprecia, es bastante completa ya que presenta hasta cuatro alternativas permitiendo un retardo de: 1 milisegundo, 100 milisegundos, 500 milisegundos y 1 segundo, lo cual, la hace interesante a la hora de aplicar en distintas ocasiones. Le aconsejo que la estudie con atencin, le puede servir en sus proyectos. Sin embargo, nos parece muy extenso este listado, podemos hacer lo mismo de forma ms simple. Esto mismo se hace poniendo un 0, en el puerto b de salida (registro 06h), esto pone a 0 el bit ms alto y as el primer LED se iluminar. Entonces el bit se rota (cambia) un lugar a la derecha con una instruccin RLF (Rotation Left File, rotacin a la izquierda de un bit) del contenido de F, pasando por el bit de acarreo C, esto conecta el siguiente LED en la fila. Es importante 'aclarar' (poner a 0) la bandera C (acarreo) antes de usar una instruccin de rotar, ya que cuando se conecta el micro, la bandera C puede estar en 1, con esto nos aseguramos que los LED's se desplazaran, que es lo que desebamos. Este es el listado en ensamblador que se puede copiar, pegar y guardar con el nombre ejem03.asm.
;******************************************************************^ ; Ttulo: ejem04.asm ^ ; Autor: V. Garcia ^ ; Fecha: 20-01-2006 ^ ; Version: 0.0 ^ ; Codigo para: PIC16C84 y PIC16F84 ^ ; Clock: 4MHz , XT. -> Ciclo = 1 uS. ^ ; Reset: Power On Reset. ^ ; Watch Dog: Inhabilitado. ^ ; Proteccion de codigo: Inhabilitado. ^ ; Ficheros requeridos: H16f84a.inc ^ ; Placa uControladora: Circuito de ctodos de LEDs a +Vcc. ^ ; ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; Pulsador sin rebotes enciende un LED ^ ; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ^ ; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ^ ; desde LED 8 hasta LED 1 ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;--------------- Encabezado ------------;******************************************************************** ; LIST p=PIC16F84A ; Directiva para definir micro. #include <p16f84a.inc> ; Fichero estandard de cabezera. ; ;******************** DEFINICIONES ********************************** ; Todas las definiciones estan en 'include ', por tanto ; solo se definen las locales porta equ h'0005' ; define puerto A

portb con1 con2

equ equ equ

h'0006' ; define puerto B 0x0C 0x0D ; Variable de temporizacion. ; Variable de temporizacion.

;******************** COMIENZO DEL PROGRAMA ******************** ; SE DEFINEN BANCOS #define banco1 bsf STATUS,RP0 ;Macro para abreviar el BANCO 1 ;pone a 1 el bit5 del registro status #define banco0 bcf STATUS,RP0 ;Macro para abreviar el BANCO 0 ;pone a 0 el bit5 del registro status ORG GOTO 0x00 inicio ; Vector de Reset. ; Programa Principal.

;************************************************************ delay: CLRF con1 ;lazo exterior MOVLW 0xF0 MOVWF con2 ; RETURN ;esta linea es de prueba loop: DECFSZ con1,F ;lazo interior GOTO loop DECFSZ con2,F GOTO loop RETURN ; ;******************** PROGRAMA PRINCIPAL ******************** inicio: banco1 ; Banco 1. CLRF TRISB ; aclara puerto B, pone a 0 , todo salidas banco0 ; Banco 0. MOVLW 0xff MOVWF portb BCF STATUS,C ; PORTB 11111111. ; ;Preparado para rotar, pone a 0 el bit C

; Desplazar portB a la izquierda, usamos la instruccion ROTAR gira_i: BTFSS portb,7 ANDLW 01 ;si el bit 7 = 1 salta y rota a derecha ;si no, AND entre literal y W

sigue_i: BTFSC portb,7 ; portb = 00? goto $+3 ; no, salta 2 lineas movlw 0xff ; si, pon 255 en movwf portb ; portb BCF STATUS,C ;Asegura que en primera ; rotacion ingrese 0 en PORTB RLF portb,F ;rota archivo F a izq. (F = '1111 1110') CALL delay ;salta a retardo GOTO gira_i ;vuele a girar. ; END ; Fin de programa.

Qu hace el programa.
Se definen los parmetros en las primeras lneas, registros, puertos y variables. Adems en este caso he querido plasmar otra forma posible de definir las variables para manejar los bancos (banco0 y banco1). Para ello he

definido las macros banco1 y banco0, mediante las cuales se realiza la configuracin de los mismos. El tema de macros no se describir aqu. Seguidamente en Inicio, se ve como se aplican. En este punto recalco el modo de poner a cero todos los bits de un puerto, en este caso el puerto B (TRISB) mediante la instruccin CLRF (aclarar registro f). En las lneas siguientes, se carga el puerto B con el literal FF y con BCF (Bit Clear File) se pone a 0 el bit C, con lo que estamos listos para empezar a desplazar el LED encendido, por la barra de LEDs. Sigue la subrutina de retardo y ahora empieza la rutina principal gira_i el primer paso comprueba el estado del bit7 =1 del puerto b, luego comprueba si es 0 y mediante la instruccin RLF (Rota Left File) nos desplaza a la izquierda una posicin (rotacin del bit), en cada iteracin del lazo de la subrutina, encendiendo, apagando y desplazando el LED en cada momento. Si en BTFSC portb,7 es 0, se carga el puerto b con 255 para podar seguir desplazando el LED. Se puede observar un RETURN inhabilitado en la rutina de retardo, esto lo uso para comprobar el buen funcionamiento de las subrutinas, una vez comprobada, pongo el consabido punto y coma delante y a seguir. El listado en hex que sigue, por si no lo quiere ensamblar, lo puede copiar, pegar y guardar como ejem03.hex en un archivo con el que puede quemar el '84A para probar su funcionamiento.
:020000000528D1 :06000A008316860183123B :10001000FF3086000310861F0139860D10200B2843 :100020008C01F0308D008C0B13288D0B13280800E9 :00000001FF

Como siempre el circuito y esquema electrnico es el mismo mostrado en la figura anterior.

EXPERIMENTO 4.
En este caso, propongo producir un programa que encienda un LED y lo desplace en un sentido por la barra, cuando llegue al final regrese y repita esta secuencia en el otro sentido. Digamos que, con este programa obtendremos la clsica barra de LEDs del famoso coche 'Fantstico'. A tenor de lo visto en los ejemplos anteriores parece sencillo y as lo voy a demostrar. El listado sera el siguiente:
;******************************************************************^ ; Ttulo: ejem04.asm ^ ; Autor: V. Garcia ^ ; Fecha: 20-01-2006 ^ ; Version: 0.2 ^

; Codigo para: PIC16C84 y PIC16F84 ; Clock: 4MHz , XT. ; ; ; ; ; ; ;

->

Ciclo

^ uS.

^ ^ ^ ^ ^ ^ (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________

Reset: Power On Reset. Watch Dog: Inhabilitado. Inhabilitado. Ficheros requeridos: H16f84a.inc Placa uControladora: Circuito de ctodos de LEDs a +Vcc.

^ ^ ^ *

; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; Pulsador sin rebotes enciende un LED ^ ; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ; desde LED 8 hasta LED 1 ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;--------------- Encabezado ------------;****************************************************************** ; LIST p=PIC16F84A ; Directiva para definir micro. include "p16f84a.inc" ; Fichero estandard de cabezera. DEFINICIONES

;******************** ********************************* con1 con2 equ 0x0C ; Variable de temporizacion. equ 0x0D ; Variable de temporizacion.

;******************** COMIENZO DEL PROGRAMA ******************** ; SE DEFINEN BANCOS #define banco1 BSF STATUS,RP0 ;Macro para abreviar el BANCO 1 ;pone a 1 el bit5 del registro status #define banco0 BCF STATUS,RP0 ;Macro para abreviar el BANCO 0 ;pone a 0 el bit5 del registro status ORG 0x00 ; Vector de Reset. GOTO inicio ; Programa Principal. ;****************** SUBRUTINA DE TIEMPO ************* delay: CLRF con1 MOVLW 0xF0 MOVWF con2 ; return ;es de prb loop: DECFSZ con1,F GOTO loop DECFSZ con2,F GOTO loop RETURN ;************************************************************ ;******************** PROGRAMA PRINCIPAL ******************** inicio: banco1 CLRF TRISB banco0 ; Banco 1. ; aclara ; Banco 0.

MOVLW 0xff MOVWF PORTB BCF STATUS,C

; PORTB 11111111. ; ;Preparado para rotar

; PORTB Rota hacia la izquierda, usamos la instruccion ROTAR gira_i: BTFSC PORTB,7 ;si el bit7 = 0 salta y rota a derecha GOTO sigue_i ;no, sigue izquierda. GOTO gira_d ; sigue_i: RLF PORTB,F ;rota archivo F a izq. (F = '1110') CALL delay ; BTFSC PORTB,0 ;salta y rota si bit0 = 0 GOTO gira_i BSF PORTB,7 ; PORTB Rota hacia la derecha gira_d: BTFSC PORTB,0 ;salta y rota si bit0 = 0 GOTO sigue_d GOTO gira_i sigue_d: RRF PORTB,F CALL delay GOTO gira_d ; END ; Fin de programa.

Qu hace el programa.
Si el lector sigue el flujo del programa puede comprender que, he recurrido a dos rutinas encadenadas idnticas en la forma: gira_i y gira_d ambas estn entrelazadas, tratar de describir como funcionan. Al llegar el programa a gira_i, encuentra la instruccin BTFSC portb,7 que comprueba si el bit7 del puerto B est a 0, como dicho bit7 es 0, el programa sigue y salta a la etiqueta sigue_i, en ese momento rota izquierda con RLF seguido de un salto al retardo para que el LED se vea encendido, al regresar comprueba si est a 0 el bit0, si no lo est vuelve a gira_i, repitiendo estos pasos hasta que el bit0 es 0, en cuyo caso salta hasta BSF PORTB,7 para poner a 1 el bit7, luego sigue con gira_d donde comprueba el estado del bit0 que, estar a 1 y saltar a sigue_d para rotar a derecha seguido de un CALL a pausa, al volver har un GOTO gira_d, repitiendo estos pasos. Al llegar el programa a la instruccin CALL delay saltar a la posicin de la etiqueta (subrutina de retardo) delay, limpia el registro cont1 y carga el registro cont2 con el valor F0h, decrementa el registro cont1 que esta a 00 y por tanto ahora esta a FFh (GOTO loop) hasta que es 0 y en ese momento decrementa el registro cont2 (GOTO loop) hasta que es 0 cerrando el lazo por segunda vez. Cuando termine esta subrutina (pausa), volver a la instruccin siguiente a la que le hizo saltar. Espero haber aclarado el flujo del programa. Sigue est el listado en hex del archivo un vez ensamblado, como siempre, puede copiar y pegar en un editor de texto y guardarlo como ejem04.hex

para posteriormente quemar un PIC17F84A y comprobar su eficacia.


:020000040000FA :1000000009288C01F0308D008C0B04288D0B0428FE :100010000800831686018312FF3086000310861BBA :1000200012281728860D012006180F288617061893 :0A0030001A280F28860C012017285B :00000001FF

Con este ejercicio ponemos el punto y aparte por esta vez, seguiremos con estos ejemplos en la segunda parte.

Manual Rpido del MPLAB


Hoy: Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si quiere volver a visitarnos.

Introduccin.
En los proyectos que se describen en estas pginas utilizaremos el software de uso libre como es el MPLAB, si por alguna razn el lector quiere usar la versin que he manejado en estos artculos puede bajarse la versin 5 (ojo! pesa 11MBytes y si su conexin no es rpida puede tardar algo de tiempo) El motivo es que hemos de entender y aprender a utilizarlo para ensamblar nuestros proyectos, hacerlo fcil y esto es lo que vamos a describir aqu. Si no se dispone de esta herramienta recomendamos se obtenga es gratis, para poder seguir nuestros pasos. En programacin como ya se ha dicho en estas pginas, existen unas directivas generales que se utilizan de forma repetida y por ese motivo se ha descrito una plantilla del programador que encontrar en ests pginas, como herramienta menor de ayuda. El entorno de trabajo MPLAB vers5, necesita de una configuracin de las instrucciones para 'que vaya como la seda', ya hemos documentado este apartado en otras ocasiones y lo vamos a repetir aqu. Para empezar, se debe documentar todo nuestro trabajo, esto significa que los comentarios aclaratorios necesarios son: Nombre del Autor, Archivo , Fecha y Descripcin de qu hace el programa y para este fin el MPLAB dice que detrs de "; " todo se considera comentario y no se tendr en cuenta al compilar el listado. Podemos hacer una primera incursin en el MPLAB para tener una visin general de cmo proceder a

compilar un listado que tengamos en formato . asm, despus entraremos en detalles ms extensos. Estos son los pasos: 1. Ejecutar el programa MPLAB. Hay disponibles cuatro mens de iconos, como muestra la figura de abajo. Elegir el segundo men para empezar un proyecto y el primero, para ejecutar distintas acciones de anlisis. 2. Men File-New, mostrar un cuadro de dialogo que dice: 'A project is not currently opened' o sea, que no hay un proyecto disponible, 'desea crear uno', pulsamos sobre la opcin Yes para empezar. Si ya lo hemos usado con un proyecto y al salir lo guardamos, ahora nos propondr si queremos abrirlo, pulsamos sobre la opcin Yes para continuar con el proyecto. 3. Mostrar una ventana 'New Project' en la celda correspondiente daremos un nombre a nuestro proyecto y se puede elegir el directorio en el que guardarlo y pulsamos OK. 4. Empezaremos a crear nuestro proyecto en la ventana 'Edit Proyect' como se ve en la imagen de abajo a la izquierda. 5. En esta ventana hay cinco celdas en las que debemos introducir datos: En la primera, 'Target Proyect' aparecer el nombre de nuestro proyecto. 'Include Path', 'Library Path' y 'Linker ...', se dejan como estn. En 'Development Mode' nos aseguramos que el sistema de desarrollo es el correcto 'MPLAB SIM PIC16F84' y en la cleda de abajo en 'Language Tool Suite', se encuentra Microchip. Ahora viene la parte ms compleja si se quiere, en el men 'Project' la opcin 'Edit Project' o CRTL+F3, abre un cuadro de dialogo, en la parte de abajo en 'Project Files' aparecer el nombre del archivo que vamos a producir con la extensin [.hex], al seleccionarlo, a su derecha se activar el botn 'Node Properties...', lo pulsamos, aparecer una nueva ventan con cuatro zonas diferenciadas, como se aprecia en la imagen de abajo, en la parte de arriba aparece la celda 'Node' con el nombre del proyecto y la extensin hex, a su derecha la celda ' Language Tool' que normalmente no se toca. En la zona central, se encuentra una cuadricula 'Options' con seis columnas y distintas descripciones, observar que algunas no estn activas, en definitiva y para acortar, deben estar activadas, en 'On' las

siguientes: 'Hex Format', 'Error File', 'List File', 'Case Sensitivity' y 'Default radix' y activada en 'Off' la de 'Cross-reference File'. Ya se describirn ms adelante estos criterios, ver esto en la imagen que sigue.

Debajo, en la zona 'Command Line', se muestran las ordenes que se han generado en segn lo asignado en el apartado anterior. En la ltima zona 'Additional Command Line Options' estar en blanco. Y para cerrar pulsamos OK. 6. Se mostrar la ventana en blanco, de ttulo Untitle1, donde se debe escribir nuestro programa (cdigo fuente). Sin embargo como ya se ha dicho, en muchas ocasiones ya lo dispondremos de nuestro editor ms habitual, podemos traer el cdigo fuente hasta la carpeta donde tenemos el proyecto con la extensin .prj . Entonces con el 'Edit Project' pulsamos el botn 'Add Mode...' y nos abrir una ventana para seleccionar la carpeta en la que localizamos la que contiene el archivo con la extensin .asm que ya tenemos guardado y luego pulsamos 'Aceptar'. Ahora el archivo 'puntoasm' se muestra debajo del anterior y para cerrar pulsamos 'OK'. 7. Digamos que, ya est en el simulador MPLAB el listado, por fin podremos compilar el programa. 8. Es el momento de acceder al 'Men-Project' y 'Make Project' o simplemente pulsamos la tecla F10. Esto abrir una nueva ventana como la de la derecha, en la que se mostrar una barra de progreso de color verde e inmediatamente debajo, unos indicadores con los Errores, Warnings, Menssages, etc. si es que los hay, aunque no siempre hay errores. Normalmente si hay errores, presentar una ventana como la mostrada debajo que, nos indicar todos los errores producidos y su localizacin el nmero de lnea en la que se encuentra cada uno. Para corregir los errores, haremos doble clic en uno de ellos, el puntero se desplaza hasta la lnea del listado de cdigo que contiene el error, para que as lo modifiquemos. Revisamos las instrucciones que hayamos puesto, para corregir los fallos.

Una vez rectificados los errores, volveremos al paso 7 y procederemos a la nueva compilacin del programa, verificaremos que no se hayan producido errores o los rectificaremos hasta lograr la depuracin del programa. Recuerde que nadie es perfecto y aprenda de sus errores. El caso ms comn es que despus de ciertas correcciones no presente errores, quizs una atencin (warning) y obtendremos el listado en hexadecimal que se ha creado en la misma carpeta donde est el proyecto, ste es el que tenemos que usar con el 'quemador'de chips descrito en otro artculo de la serie, para comprobar si nuestro proyecto refleja nuestros deseos, en caso de no ser as, debemos realizar los cambios necesarios en el programa y volver a empezar el proceso de compilar de nuevo hasta lograr nuestro propsito y luego a por otro proyecto.

Como estimular al MPLAB


Esta bien, cuando hemos terminado de ensamblar un listado .asm y antes de quemar el chip con el cdigo generado por este, es conveniente en muchas ocasiones, proceder a simular la ejecucin del archivo hexadecimal generado para mayor seguridad y para esto el MPLAB incorpora una herramienta que nos permite realizar dicha simulacin. Hasta aqu, todo es normal, en el caso especial de necesitar estimular una lnea, es decir, como por ejemplo, simular que se ha presionado un pulsador en un momento de la simulacin, aqu es donde se necesita dominar esta herramienta. En men Window, disponemos de las ventanas que ms nos servirn para seguir con detalle la evolucin de la simulacin, tambin estn los iconos propios en las barras de men que se menciona al principio de este artculo.

Destaca la ventana del stack o pila, aqu se vern en accin la pila con sus 8 niveles y que el ltimo en ingresar es el primero en salir, para eso tiene que estar la simulacin en activo. La ventana que mayor importancia le doy, en la de 'Special Function Register', o registros de funcin especial de la izquierda, en esta se aprecia la evolucin de los distintos registros con sus valores cambiantes segn el valor resultante de la ejecucin de cada instruccin. Todo esto es posible examinarse mediante la ejecucin del programa en el modo, paso a paso (step to step) o animado (animate). Es conveniente que el interesado haga su propia simulacin en ambos modos y compruebe lo que ocurre en cada momento. Otra ventana es la de 'Program Memory' a la derecha que, nos muestra la evolucin del programa instruccin a instruccin, obsrvese las columnas que empiezan por 0000, corresponde a la localizacin en memoria y a su derecha con 4 dgitos, corresponde al cdigo de la instruccin de esa lnea, las siguientes columnas se refieren a la etiqueta, a la instruccin propiamente y a sus valores. En Modify, podemos modificar el valor de un registro en un momento dado, para no tener que esperar tanto tiempo de ejecucin como ocurre con un retardo. Sigamos con la simulacin. En el men Debug/Simulator Stimulus.../Asincronus Stimulus tenemos la ventana donde se pueden configurar las seales que deben influir en la simulacin como son, pulsadores, seales de reloj, etc. Al abrir esta ventana, muestra 12 botones que, en principio indican Stim 1(P), Stim 2(P), etc. Con el botn derecho del ratn sobre uno de ellos, mostrar una ventana para seleccionar distintas opciones. En nuestra simulacin se trata de sendos pulsadores en el puerto de entrada, por ej. RA2, RA3 y RA4. En el mencionado men emergente, se selecciona Assign pin... RA0, ahora es RA0 (P), nuevamente haremos click con el botn derecho sobre el mismo botn pero esta vez seleccionamos Toggle aqu significa pulsador, con RA3 y RA4 se procede del mismo modo. Una vez configurados estos botones, debemos iniciar el generador de tiempos que, como un generador de reloj, se encarga de enviar los pulsos a los terminales de puerto, indicados por los botones de estimulo anteriores, en la secuencia prevista.

Ahora, en Debug/Simulator Stimulus.../Clock Stimulus, en la celda Stimulus pin, elegimos RA2. En la secuencia de reloj High y Low anotamos 4 que, es la marca espacio de la seal o sea, el ancho del pulso H y L. Si fuera necesario, aadir los dems botones de tiempos pulsando Add.. y para aplicar todo esto, pulsamos sobre Apply. Por fin estn configurados los estmulos. Antes de empezar la simulacin, se debe hacer un Reset de la simulacin, imagen de la derecha. Al pulsar el Reset, la simulacin se inicializa y los valores de los registros empiezan a moverse segn se ejecutan las instrucciones. En este momento debemos disponer cinco ventanas en pantalla; la de proyecto, para seguir el programa; la de registros, para ver la evolucin de los mismos; la de memoria que, permite ver los valores de memoria en uso y la de tiempos y estmulos, ver posicin en la figura para su mejor apreciacin.

LA SIMULACIN.
Es el momento de iniciar la simulacin, en men Debug/Run/Step se inicia el simulador en modo paso a paso, este modo nos permite apreciar el trasvase de informacin entre los registros que intervienen al ejecutar una instruccin, una vez iniciado y dependiendo del programa a simular, podemos optar por la opcin de ejecucin animada mediante Debug/Run/Animate o usar Ctrl+F9, que empezar desde el punto en el que se encuentre en ese momento hasta el final del programa. Si hubiera algn error, se produce una parada que muestra una ventan emergente indicando el motivo, para poder corregir el error. El proceso de simulacin podemos pararlo con una pulsacin en el icono semforo rojo, para seguir slo pulsamos Ctrl+F9 y seguimos la tarea, debe seguirse el proceso para entender lo que ocurre con nuestro programa. En alguna ocasin el programa nos pide que se presione un pulsador o requiere una seal de entrada por una lnea de un puerto, esto puede parecer un problema de, como interactuar con el programa.

Supongamos que el programa trata de un temporizador que, se pone en marcha cuando se aprieta el pulsador A que est en RA1, iniciando el retardo de 1 minuto, al termino del mismo se activa un LED indicando que ha transcurrido el minuto. En ese caso al simular el programa, se ejecutar hasta la instruccin del lazo de espera a que se presione el pulsador y no avanzar hasta que le llegue esa seal. Para interactuar, usamos una herramienta que genera ese pulso en RA1 y podremos seguir. Estamos en el lazo. Entonces abrimos la ventana Asincronus Stimulus y le ponemos RA1 en el primer botn y la opcin Toggle, a continuacin en la venta Clock Stimulus, ponemos lo que se indica en su apartado anterior que lo describe muy bien. Con esto, ya podemos seguir la simulacin, las seales necesarias se producirn en el momento adecuado y se apreciar su efecto. Sin embargo, justo en nuestro programa se produce un retardo que para la simulacin puede ser tedioso su seguimiento, no hay problema, est todo previsto en el MPLAB, en el men Debug/Execute/Execute An Opcode..., elegimos la opcin return y pulsamos Execute, en ese mismo momento habremos salido del
lazo de retardo que nos retena y seguir la simulacin si no hay otra condicionante.

OTRO MTODO.
Cuando haga la simulacin de un retardo, como ya se ha comentado o ha de emplear largo tiempo en decrementar un registro, es interesante conocer esta posibilidad de Modificar que nos brinda el MPLAB. Por ej. Estamos simulando un programa que crea una seal cuadrada a la salida RB0, para ello utiliza el TMR0 y la interrupcin por desbordamiento del mismo, asignando el prescaler con un factor de divisin de 1/2. De esta forma las interrupciones saltarn a intervalos fijos de tiempo. Invirtiendo el estado de RB0 durante las interrupciones se conseguir una onda cuadrada perfecta. Cuando estemos ejecutando el cdigo y lleguemos a la rutina 'hacer nada', nos detenemos y debemos acceder a File Registers Window , en el men Window/File Registers, se ver el cuadro Ventana Registros. Si nos fijamos en el

cdigo, el registro PCL est aumentando con cada instruccin, cuando llega a la rutina 'hacer nada', el valor es 08 como muestra la imagen, al detenernos el registro mantiene el valor, ahora vamos a modificar el valor de este registro, para reducir el tiempo de espera. Con el botn derecho del ratn, hacemos un click justo sobre 08 y luego en File

Register(s) como se aprecia en la imagen de la derecha y nos muestra un cuadro de dilogo Modify (ver debajo). 1) En l seleccionar en Address, el registro que vamos a modificar, en este caso 01 2) en Data/Opcode el nuevo valor para ese registro en este caso ff (este valor hace que llegue al mximo de la cuenta), tal como se ve en esta imagen. Y 3) Luego le damos a Write (escribir) y se habr modificado el valor del registro 0x01, para seguir la simulacin. Ahora si, le damos a F7 para ver que el registro adquiere el nuevo valor, con la siguiente F7, el registro se desborda y hace que el programa avance en su ejecucin saliendo del lazo y saltando a la subrutina de servicio de interrupcin (RSI) BCF INTCON,2 en la simulacin, esto quiere decir que todo va correctamente y nos ahorramos una larga espera. Que podemos decir de una temporizacin de 50 segundos, lo que hacemos all es verificar que los respectivos registros (19h,1Ah, 1Bh, 1Ch y 1Dh) se decrementan con cada iteracin del programa, de modo que, nuevamente nos encontramos ante un prolongado tiempo de espera para verificar una rutina que ha entrado en un lazo de retardo y ya conocemos su funcionamiento. Con este ejemplo puede darse por aclarado el uso de algunas de las opciones que nos ofrece esta herramienta que es el MPLAB.

DESENSAMBLADOR.
En alguna ocasin cuando por motivos extraos, se pierde un listado en asambler (.asm) y solo dispones del listado en hexadecimal. La mejor forma de proceder para disponer del listado es usar un desensamblador, personalmente recomiendo el que viene integrado en el MPLAB. El procedimiento es el siguiente:
En el men File, ir a Import y elegir el archivo en hexadecimal (.HEX) En el men View, ir a Program Memory; dispone de tres opciones: OPCODE HEX, MACHINE y SYMBOLIC. Sobre la pantalla, botn derecho pulsar 'Output to file' para terminar.

"Vaya a FILE, IMPORT y elija el archivo .HEX que desee desensamblar. Luego vaya a VIEW, PROGRAM MEMORY y fjese que abajo tiene 3 opciones. OPCODE HEX, MACHINE , SYMBOLIC. Luego botn derecho sobre la pantalla '... Output to file' y listo ya puede tener un .asm del archivo elegido. Eso s, luego ser trabajo suyo determinar que es variable y que no lo es, etc."

Ms adelante y si tengo tiempo abordar este tema con ms profundidad en el que hablare de cmo influir en el MPLAB para simular la accin de un pulsador o un interruptor, por ejemplo, aunque entiendo que ya hay artculos en la red que lo describen muy bien y desde aqu lo hago constar. Este prrafo lo redact en 2005, en estos momentos ya se ha modificado para mejor.

Descripcin del Juego de Instrucciones


de los PIC16F84A
Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si quiere

volver a visitarnos.

LOS REGISTROS
(Tambin llamados ARCHIVOS )

CARACTERSTICAS PIC16F84A.

GENERALES

DE

LOS

Hay solo 35 instrucciones en el PIC16F84A, con cdigos de instruccin de 14 bits de ancho. Todas las instrucciones ocupan una palabra y todas consumen un ciclo, excepto las de salto o bifurcacin que usan dos. La velocidad mxima de funcionamiento 20MHz (200 ns x instr.). Tpicamente a 4MHz (1us x instr.), con 1024 palabras (14 bits) de memoria de programa FLASH.

El PIC16F84A tiene 68 bytes de RAM y 64 bytes de EEPROM de datos, tiene 12 registros de funcin especfica FSR. Con 8 niveles de Pila hardware y tres modos de direccionamiento: directo, indirecto y relativo. Dispone de cuatro fuentes de interrupcin y 13 pines de E/S (puertoA de 5 bits y el puertoB de 8 bits), con control individual bidireccional y dispone de un Timer0/ Contador con reloj independiente y la gran ventaja dispone de Perro Guardin (WDT). Este dispositivo tiene otras particularidades que lo hacen seriamente aconsejable, algunas de estas se detallan en otros artculos de esta serie y en las hojas de caractersticas del fabricante Microchip.
El PIC16F84A tiene un contador de programa de 13 bits capaz de dirigir 8 kilobytes x 14 espacio de memoria de programa. Para el F84A, el primer 1 kilobyte x 14 (0000h-03FFh) fsicamente es implementado (Figura 2-1). El tener acceso a una posicin anterior de la direccin fsicamente puesta en prctica causar un recirculado. Por ejemplo, para posiciones 20h, 420h, 820h, C20h, 1020h, 1420h, 1820h, y 1C20h, la instruccin ser la misma. El vector RESET (REPUESTO) est en la direccin 0000h y el vector INTERRUPT est en la 0004h, con cuatro fuentes de interrupcin, vase el documento interrupciones descrito en estas pginas. Hay dos bloques de memoria en el PIC16F84A, estos son la memoria de programa y la memoria de datos. Cada bloque tiene su propio bs, de modo que el acceso a cada bloque pueda ocurrir durante el mismo ciclo de oscilador. La memoria de datos adicional mayor puede ser direccionada en la RAM de objetivo general y los Registros de Funcin Especiales (SFRs). La operacin de los SFRs que controla el "corazn" (reloj) est descrita aqu. Los SFRs usados para controlar los mdulos perifricos son descritos en la seccin que habla de cada mdulo individual perifrico. El rea memoria de datos tambin contiene la memoria de datos EEPROM. Esta memoria no es mapeada directamente en la memoria de datos, pero es mapeada indirectamente. Es decir, un puntero de direccin indirecta, especifica la direccin de la memoria de datos EEPROM para lectura/escritura. Los 64 octetos de datos de la memoria EEPROM tienen la gama de direccin 00h-3Fh. Ms detalles de la memoria EEPROM se pueden encontrar en la Seccin 3.0 de las hojas de caractersticas. La memoria de datos es dividida en dos reas. La primera, es el rea de Registros de Funcin Especial (SFR), mientras la segunda es el rea de Registros de Propsito General (GPR). Los SFRs controlan el modo de operacin del dispositivo. Partes de memoria de datos son mapeadas, esto es tanto para el rea SFR como para el rea

GPR. El rea GPR es mapeada para permitir una capacidad mayor de 116 bytes de RAM de propsito general. Las reas mapeadas del SFR son para los registros que controlan las funciones perifricas. Los bancos requieren el empleo de bits de control para la seleccin de banco. Estos bits de control son localizados en el Registro STATUS. En la figura 2-2 se muestra la organizacin de mapa de memoria de datos. Las Instrucciones MOVWF y MOVF pueden mover valores del registro W a cualquier posicin en la RAM al archivo de registro ("F") y viceversa. Se puede tener acceso directo a toda la memoria de datos utilizando la direccin absoluta de cada archivo de registro o indirectamente mediante los Registros de Funcin Especial (SFR). La direccin indirecta usa el valor actual del bit RP0 para el acceso en las reas mapeadas de memoria de datos. La memoria de datos es dividida en dos bancos que contienen los Registros de Propsito General y los Registros de Funcin Especial. El banco 0 se selecciona por el aclarado (0) del bit de RP0 (STATUS<5>). Al activar el bit RP0 se selecciona el Banco 1. Cada Banco se extiende hasta 7Fh (128 bytes). Las doce primeras posiciones de cada Banco son reservadas para los Registros de Funcin Especial. El resto, son Registros de Propsito General, implementados en la prctica como la RAM esttica.

REGISTROS PROPSITO GPR.

DE GENERAL

Cada Registro de Propsito General (GPR) es de 8 bits de ancho y es direccionado directa o indirectamente por los SFR. Las direcciones de GPR en el Banco 1 son mapeadas a direcciones en el Banco 0. Como un ejemplo, direccinando la posicin 0Ch u 8Ch tendremos acceso al mismo GPR.

REGISTROS DE FUNCIN ESPECIAL SFR.


Los Registros de Funcin Especial SFR (Figura 2-2 y Tabla 2-1) son usados por la CPU y funciones perifricas para controlar la operacin del dispositivo. Estos registros son la RAM esttica. Los registros de funcin especial pueden ser clasificados en dos juegos, central y perifrico. Aquellos asociados con las funciones principales son descritos en esta

seccin. Aquellos relacionados con la operacin de los rasgos perifricos son descritos en la seccin para aquel rasgo especfico.

En otros artculos describiremos otros registros y su forma de uso, los bits que se usan y cmo influyen las banderas que activan. Por ahora, vamos a seguir con la descripcin de las instrucciones que es el fondo de este documento. Veamos primero el formato de las instrucciones.

A continuacin vemos el juego de instrucciones de los PIC12CXXX, entre ambas.

Debajo, muestro unas tablas originales del juego de instrucciones de los PIC16C/FXXX, resumidas.

Esta es una tabla de las instrucciones extendidas (algunas macros), admitidas por el sistema MPLAB, que podemos usar en nuestros listados, para generar los programas propuestos, aunque no estn en las tablas del los PIC16FXXX, al compilarlos con el MPLAB, nos generan el cdigo asm adecuado.

Si buscamos en la carpeta donde instalamos el MPLAB (p.e. C:\Archivos de programa\MPLAB) la ayuda llamada DEVICE.HLP, podemos encontrar un listado completo de las instrucciones especiales que usa el MPLAB y que nos permitirn mejorar nuestros listados, esta es una muestra. Adems, en las hojas de datos de Microchip, vienen todas las instrucciones de estos chips, quizs el lector piense, porqu me he tomado tantas molestias en plasmar aqu tanta informacin que ya existe, la razn es que, no est en castellano (espaol) o la que hay es muy tcnica y no est al alcance de mucha gente, por otra parte, no creo que est dems que alguien la exponga desde otro punto de vista.

NOTA.
1- La palabra Literal significa "NMERO" como el nmero 9 o 16h. El nmero 16h es un nmero exadecimal y en valores decimales esto representa el nmero: "veintids". 2- Destino de la instruccin segn el designador OP: Si el bit de cdigo OP de la instruccin es 0, el destino es W y si es 1, el destino es el registro f, o sea, se selecciona el destino donde se guarda el resultado de una operacin.

Nota2. Cuando una instruccin termina con W el destino del resultado ser el registro W, o termina con F el destino del resultado ser el registro el archivo f, se define con el designador '0' o '1' de la propia instruccin. 0 1=F Por ej.: ADDWF 1F,0 el resultado es almacenado en el registro de trabajo W. ADDWF 1F,1 el resultado es almacenado en el mismo registro (F). = W

Seguidamente se hace una descripcin detallada de las instrucciones que, son generales para todos los PIC's, adems de las particularidades de cada instruccin, por orden alfabtico que, presentan para cada micro tanto para el PIC16F84A como para el PIC12C508A.

NOTA. Se usaran algunos trminos extraos para acomodar (agilizar) algunas


expresiones anglosajonas. Ej.: AND'ed para expresar la aplicacin de la operacin de producto lgico (AND) entre dos trminos o XOR'ed que se aplica a la operacin lgica OR exclusiva (XOR) entre dos trminos.

El lector, deber diferenciar entre el nombre del registro/[archivo] y el contenido del registro/[archivo].

ADDLW Esto significa: Agregar (sumar) el Literal al registro W (acumulador o


registro de trabajo) resultado en W. ADDLW 00 al FF Un nmero fijo (llamado literal) es sumado al registro W (registro de trabajo). El literal (nmero) puede estar comprendido entre el 00 y FF. En el registro STATUS se ven afectadas tres banderas (o flags) por la orden ADDLW (Z, DC y C), ver debajo. C Se pone a 1 si se produce un acarreo desde el bit de mayor peso (desbordamiento). DC Se pone a 1 si se genera un acarreo del bit 3 al bit 4. Z Se pone a 1 si el resultado de la operacin es cero. Esta instruccin no est disponible para el '508A. Si quiere usar esta instruccin en el '508A o un programa en l la requiere/contiene, emplee las 3 instrucciones siguientes: Por ejemplo en el F84:
ADDLW 80 ; mueve 80h a W ; Mueve W a cualquier archivo ;poner 80h en W ;sumar el archivo 13h a W

Sustityala en el '508A por:


MOVWF 13h MOVLW 80h ADDWF 13h

ADDWF Esto significa: Suma aritmtica de W y un archivo (f).

ADDWF 00 a 1F,0 El resultado es almacenado en el registro de trabajo W,


debido al valor 0 en la instruccin. ADDWF 00 a 1F,1 El resultado es almacenado en el mismo archivo, debido al valor 1 del designador en la instruccin. ADDWF (sumar) el contenido del registro W con el contenido de un archivo. El resultado puede ser guardado en el registro W (designador = 0) o emplazado en el archivo llamado (designador = 1). Con la orden ADDWF, en el registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y el DC (Dgito Carry). Si el resultado de una instruccin ADD rebasa FF, la bandera C (Carry) es puesta a 1, si tiene cualquier otro valor es 0. Si el resultado de una instruccin ADD es cero 0000 0000, la bandera Z (Cero) se pone a 1 y 0 si tiene cualquier otro valor. La suma se realiza en aritmtica binaria pura y sin signo. Si hay un (desborde) acarreo del bit 7, es decir que el resultado es mayor de 255, el bit C (bandera Carry) resulta 1, en caso contrario resulta 0. El PIC supervisa si hay acarreo del bit 3, es decir que, la suma de los dos mitades (nibbles) menos significativas (bits 0 a 3) resulta mayor de 15, el bit DC (digit carry) se pone a 1, en caso contrario se pone a 0. Por ejemplo: Si agregamos 21h a 3Ch, el resultado es 5Dh, esto no afecta la bandera Carry, por lo que la bandera DC (dgito carry) ser puesta a 1, pero si a 2Dh le agregamos 3Eh, el resultado es 6Bh, lo que desborda el contador (6B>FF) por lo que la bandera C (Carry) ser puesta a 1.
Ejemplos : banderas 1010 0010 + 0100 1111 C DC Z 1111 0001 0 1 0 1101 0000 + 0110 1111 C DC Z 0011 1111 1 banderas 0 0

ANDLW Esto significa: producto lgico AND del Literal con el registro W. Ver
tambin ANDWF.

ANDLW 00 a FF El objetivo de la operacin es, descubrir cuantos bits de L y


W, en binarios estn a 1. Si ambos bits son cero, el resultado es cero y la instruccin usada en este caso es XOR. Esta instruccin hace un AND lgico entre un nmero fijo (literal) y el contenido del registro W, el resultado es colocado en el registro W. Con la orden ANDLW, en el registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y el DC (Dgito Carry). El literal puede ir de 00 a FF. La operacin AND puede decirse que se usa para enmascarar (separar o quitar) los bits que nos interesen. Por ejemplo: 0Fh enmascarar (quita) los cuatro bits altos (nibble alto) y F0h quitar los cuatro bits bajos (nibble bajo). Veamos como se usa: Utilizacin del 0Fh: ANDLW 0x0F Primer nmero: 1001 0011 [Nmero en W anterior a la instruccin ANDLW]

Segundo nmero (0F): 0000 1111 [Nmero L Mscara] Respuesta al AND: 0000 0011 [Al aplicar la funcin AND entre ambos] (ANDed) Utilizacin del F0h: ANDLW 0xF0 Primer nmero: 1001 0011 [Nmero en W anterior a la instruccin ANDLW] Segundo nmero (F0): 1111 0000 [Nmero L Mscara] Respuesta al AND: 1001 0000 [Al aplicar la funcin AND entre ambos] (ANDed)

ANDWF Esto significa: Operacin AND producto lgico de W con el archivo f


[ AND'ed entre W y f]. Ver tambin ANDLW. ANDWF 00 a 1F, 0 El resultado se almacena en el registro W, por el valor 0 en la instruccin. ANDWF 00 a 1F, 1 El resultado se almacena en el archivo f, por el valor en la instruccin. Al registro W se le aplica el producto AND con un archivo f. Como dos archivos juntos no se pueden operar (AND), un archivo debe ponerse en W y se hace AND con el segundo archivo. Vase arriba para hacer operaciones de enmascarar con la operacin AND. Con la instruccin ANDWF, slo se afecta la bandera Z (cero). Si la respuesta es cero, la bandera Z en el registro STATUS se pone a 1, si la respuesta es distinta de cero, la bandera se pone a 0.

BCF Esto significa: Bit Clear File (pon a "0" o aclara el bit indicado (detrs de
la coma) en el archivo f ). Ver tambin BSF. BCF 00 a 1F, bit Hay sobre 300 instrucciones (incluidas en los micros, trabajando internamente) para esta orden. Hay 79 archivos en el PIC16F84A, los 13 primeros archivos se llaman Registros de Funcin Especial (SFR's), el resto (66) se llaman Archivos de Propsito General (GPR's) del 0Ch a 4Fh. No afecta los bits de STATUS. BCF se usa para limpiar [clear] un bit (pone a 0 el bit identificado en el archivo f). Por ej.: BCF 06h,5 significa que el bit 5 del archivo 06 debe ser puesto a "0" (aclarado), el resto de bits no se influyen. Ver figura de la derecha. El archivo 6 contiene lneas de E/S comnmente se llaman I/O del puerto.

BSF Esto significa: Bit Set File (poner a 1 el bit indicado, en el archivo f). Ver
tambin BCF.

BSF 00 a 1F, bit Hay casi 300 instrucciones para esta orden. Hay 79
archivos en el PIC16F84A, de las que los primeros 13 son los SFR's y los siguientes 66 son los conocidos GPR's. Estos GPR's ocupan del 0Ch al 4Fh y cada uno tiene 8 bits. BSF significa poner a 1 lgico el bit especifico en el archivo f. No afecta los bits de STATUS. Por ejemplo: BSF 06h,5 indica que el bit 5 del archivo 6 ser puesto a 1, este

archivo 6 contiene 8 lneas E/S, comnmente se llaman lneas I/O del puerto. El resultado es la inversa a la instruccin anterior, el 0 se sustituye por un 1.

BTFSC Esto significa: Bit Test, Skip if Clear ( Bit de Test, Salta si es "0"). BTFSC 00 a 1F, bit Hay casi 300 instrucciones para esta orden, para cubrir
los 79 archivos, cada uno con 8 bits. BTFSC significa, comprobar el bit identificado en el registro llamado y si es 0 saltar una instruccin (no ejecuta la instruccin que sigue). No afecta los bits de STATUS. Se ve mejor con un ejemplo: BTFSC 06h,4 es la forma de comprobar si el bit 4 en el archivo 6 es "0", si es cero, salta la prxima instruccin (pasar sin ejecutar) y continuar con la posterior.
Etiqueta: BTFSC 06h,4 ; comprueba si el bit 4 es 0 GOTO Etiqueta2 ; si no es 0, salta hasta Etiqueta2 CALL Dlay ; si es 0, llama a subrutina Dlay.

BTFSS Esto significa: Bit Test, Skip if Set (Bit de Test, Salta si es "1"). BTFSS 00 a 1F, bit Tambin hay casi 300 instrucciones para esta orden,
para cubrir los 79 (4Fh) archivos, cada uno con 8 bits. BTFSS significa, comprobar el bit identificado en el registro llamado y salta la prxima instruccin si es 1. No afecta los bits de STATUS. En BTFSS 3,2 comprobamos el bit 2 del registro 3 y si dicho bit es 1, salta la prxima instruccin, si no, continua con la siguiente.
Etiqueta: BTFSS 03h,2 GOTO Etiqueta2 CALL Dlay esta instruccin y sigue. ; comprueba si el bit 2 es 1 ; si no, va a Etiqueta2 ; si es 1, llama a subrutina Dlay para seguir. ; si es 1 viene a

CALL Esto significa: Llamada incondicional a subrutina.


En un programa, esto se escribe como: CALL Salida o CALL Tono1, etc. donde Salida o Tono1 son etiquetas. Un RETURN debera encontrarse al final de la subrutina CALL para que el micro vuelva a la siguiente instruccin despus de la instruccin CALL que la llam, de lo contrario se producir un desborde de pila, con el consiguiente bloqueo del programa. No afecta los bits de STATUS.

CALL Etiqueta Los programas deberan ser escritos de forma que las pocas
primeras instrucciones pongan al micro en el Inicio de Programa Principal. El "Programa Principal" se localizar fsicamente al final del listado y ste puede estar en el final de la memoria o a mitad del camino, si el programa es aproximadamente 250 bytes de largo. Despus de las primeras instrucciones que llevan al micro a: GOTO Inicio, se colocan todas las subrutinas necesarias para el programa. Con una orden CALL se llamar a las subrutinas y al final de cada subrutina debe tener una instruccin RETURN. Una llamada remota puede hacer de subrutina pero esta segunda subrutina no puede llamar otra subrutina.

Cada vez que se ejecuta una instruccin CALL, un valor de direccin es colocado (empujado) en la Pila (Stack), entonces el micro sabe donde volver despus de ejecutada la subrutina, la Pila slo puede tener 8 niveles de alto, entonces es necesario llevar cuidado para no quedarse sin Pila (Stack). Ver tambin GOTO, RETURN y RETLW.
Ejemplo: Loop2: BTFSS 05,2 GOTO Loop2 MOVLW 01 XORWF 06,1 CALL Delay GOTO Loop1 ;esta apretado el pulsador? ;No. Salta a Loop2 ;S. ; encender el LED ;Llamada a rutina de Retardo ; para ver LED encendido.

Delay: DECFSZ 1Bh,1 ; Subrutina anidada de Retardo GOTO Delay ; retardo exterior DECFSZ 1Ch,1 ; retardo interior GOTO Delay RETURN

CLRF Esto significa: Clear f [Limpia f] (poner a 0 los 8 bits del archivo f) CLRF 00 a 1F El contenido de un archivo se pone a 0 (Clear) y el bit Z del
registro STATUS es puesto a 1, esto es, los ocho bits se ponen a "0". Por esto hay que tener en cuenta el bit Z (cero, flag Z). Los 12 primeros archivos son SRF's y los siguientes 68, del 07h al 4Fh son los llamados GPR's.

CLRW Esto significa: Clear W (limpiar el registro de trabajo - llamado


acumulador en otros micros) CLRW El registro W (de trabajo) es aclarado, todos los bits son puestos a 0. Cuando el W es puesto a 0, la bandera cero (flag Z) es puesta a 1, en otras palabras la bandera Z del registro STATUS es puesta a 1.

CLRWDT Esto significa: aClarado (puesta a 0) del Temporizador Perro


Guardin (El bit WDT = 0). CLRWDT La instruccin repone (resetea) el Temporizador Perro Guardin, esto tambin repone el preescaler del WDT y consume 2 ciclos maquina. Ejemplo:
Operacin: 00h WDT 0 WDT prescaler, 1 TO 1 PD Afecta Status: TO, PD

COMF Esto significa: Complemento del archivo f. COMF 00 a 1F,0 El resultado estar en W por el valor 0 detrs de la coma. COMF 00 a 1F,1 El resultado estar en f. El contenido f es complementado
(los 0's se cambian a 1's y los 1's a 0's).

DECF Esto significa: Decremento del archivo f . DECF 00 a 1F,0 El resultado estar en W. El contenido del archivo f es
decrementado y puesto "W". DECF 00 a 1F,1 Aqu, el resultado estar en f. El contenido del archivo "f" es decrementado, significa que es deducido (tomado) 1 del archivo. Si el archivo es 0000 0000 esto da la vuelta a 1111 1111 (255) afectando a la bandera Z. Cuando el archivo es 0000 0001 y se ejecuta una instruccin DECF, el archivo pasa a 0000 0000 y la bandera Z (cero) del STATUS se pone a 1, en otro caso es 0.

DECFSZ Esto significa: DECrement f, Skip if Zero (Decrementa el archivo f y


salta si es 0).

DECFSZ 00 a 1F,0 El resultado estar en W. DECFSZ 00 a 1F, 1 El resultado estar en f. La instruccin DECFSZ tiene
muchos empleos. Un empleo importante est en una subrutina de retardo. En esta rutina la instruccin DECFSZ crea un lazo en el que el micro es enviado a una instruccin por encima-del-programa y se ejecutar un juego de instrucciones una y otra vez, esta es una tctica de perdida de tiempo para crear un retardo. No afecta al registro STATUS. Cada vez que el micro llega a DECFSZ, el contenido del archivo es decrementado y si el archivo no es cero, se ejecutar la siguiente instruccin en el programa. La siguiente instruccin es normalmente GOTO y sta enva de nuevo al micro por encima-del-programa. Por ej.: ret: DECFSZ 0Ch,0 ; Decrementa 0C y si es 0, salta una lnea
GOTO ret ... ... ; no es 0, ejecuta esta lnea ; si es 0, viene hasta aqu. ;sigue programa

GOTO Esto significa: Bifurcacin Incondicional. GOTO k GOTO es la bifurcacin incondicional en la que el micro es enviado
a la direccin especificada. Esta instruccin carga simplemente la constante k en el registro PC (contador de programa). Esta es la tpica instruccin de salto incondicional a cualquier posicin de la memoria de programa. La constante literal k es la direccin de destino del salto, es decir la nueva direccin de memoria de programa a partir de la cual comenzarn a leerse las instrucciones despus de ejecutar la instruccin GOTO. No afecta al registro STATUS. Tambin se usa $-n o $+n donde n es el nmero de lneas que ha de, volver atrs o avanzar en el programa. Por ej.
ret DECFSZ 0Ch,0 GOTO $-1 ... ; decrementa 0Ch, si es 0 salta 1 instruccin ; No, vuelve 1 lnea atrs. No requiere etiqueta. ; Si, sigue programa

INCF Esto significa: Incrementar el archivo f. INCF 00 a 1F,0 El resultado del incremento estar en W.

INCF 00 a 1F,1 El resultado estar en f. El contenido del archivo 'f' es


incrementado, esto simplemente significa que se agrega 1 al archivo, si el archivo es 1111 1111 (255) esto da la vuelta a 0000 0000. Cuando el archivo es FFh y se ejecuta la instruccin INCF, el archivo pasa a 0000 0000 y la bandera Z (cero) es puesta a 1 en otro caso es 0.

INCFSZ Esto significa: INCrement f and Skip if 0 (Incrementar el archivo f y


salta si es 0).

INCFSZ 00 a 1F,0 El resultado estar en W. INCFSZ 00 a 1F,1 El resultado estar en f. Normalmente la funcin de
decremento DECFSZ se usa para crear un retardo, pero tambin se puede usar un INCFSZ. No afecta al registro STATUS. Esto trabaja as: Si el contenido de un archivo es incrementado y el resultado no es 0, entonces la siguiente instruccin es ejecutada con un GOTO una direccin anterior y ejecutar otro INCFSZ. Eventualmente el archivo ser 1111 1111 y el prximo incremento lo devolver a 0000 0000, el resultado ser cero y la instruccin GOTO ser ignorada, ejecutndose la siguiente instruccin.

IORLW Esto significa: Inclusive OR Literal con W. IORLW 00 a FF El contenido del archivo W es sumado (lgico) [OR'ed] con
un nmero. El resultado es colocado en registro de trabajo W, el nmero literal puede ser desde 00 a FF. Afecta al bit Z del registro STATUS. Esto es simplemente una operacin OR (suma lgica) y el objeto de su realizacin es cambiar dos o ms bits a "1", si un bit es ORed con 0, la respuesta no se altera, si el bit es ORed con 1, el resultado es 1.
Ejemplo: Si el registro W se carga con 1111 0000 (es una mscara de 4 bits altos F0h) y un nmero como 0100 1110 (4Eh) es ORed con W, el resultado es 1111 1110 (FEh).

IORWF Esto significa: Inclusive OR con el archivo f IORWF 00 a 1F,0 El resultado estar en W. IORWF 00 a 1F,1 El resultado estar en f. El contenido del registro W es
ORed con el archivo f, esto simplemente es una operacin "OR" y el objeto de su realizacin es cambiar dos o ms bits a "1". Si un bit es ORed con 0, la respuesta no se altera, si el bit es ORed con un 1 el resultado es 1. Afecta al bit Z del registro STATUS.
Ejemplo: Si el registro W es cargado con 1111 0000 (F0h es una mscara de 4 bits altos) y un archivo con un nmero como 0100 1110 (4Rh) es ORed con W, el resultado es 1111 1110 (FEh).

MOVF Esto significa: Mueve el contenido del archivo 00 a 1F dentro y fuera


del archivo o al W.

MOVF 00 a 1F,0 El contenido del archivo es movido al W. El resultado estar


en W.

MOVF 00 a 1F,1 El resultado estar en f. Para esta instruccin MOVF 00 a


1F,1 el contenido es movido fuera del archivo y devuelto a l otra vez, pero no entra en W. Esto es una prueba til ya que la bandera Z (cero) del STATUS se ve afectada. Si el contenido es cero, la bandera Z es puesta a 1, si el contenido es 1, la bandera Z es 0.

MOVFW Esta instruccin no es correcta y sin embargo el MPALB la admite.


Porque ocurre esto.

MOVFW 00 a 1F La instruccin: MOVFW PORTB es una macro del


MPLAB que significa mueve el contenido del PORTB al registro de trabajo W, esto lo mismo que escribir esta instruccin ms correcta: MOVF PORTA,W con esto evitamos confusiones. De modo que, las instrucciones: MOVF FF,W y MOVFW FF son idnticas.

MOVLW Esto significa: Mueve Literal a W. MOVLW 00 a FF Un nmero f (Literal) es cargado en el registro W. El Literal
puede ser 00 a FF. No afecta al registro STATUS.

MOVWF Esto significa: Copia W al archivo llamado f. MOVWF 00 a 1F Esta instruccin copia datos del registro W al archivo f. No
afecta al registro STATUS.

NOP Esto significa: Ninguna operacin. Es decir, el micro no realiza ninguna


operacin, slo consume el tiempo de 1 instruccin.

OPTION Esto significa: Carga registro OPTION. El contenido del registro W es


cargado en el registro OPTION.

RETFIE Esto significa: Cuando hay una interrupcin, RETURN con valor de lo
alto de la Pila y lo deja en el PC. RETFIE Carga el PC con el valor que se encuentra en la parte superior de la pila, asegurando as la vuelta de la interrupcin. Pone a 1 el bit GIE, con el fin de autorizar o habilitar de nuevo que se tengan en cuenta las interrupciones. TOS PC, 1 GIE. No afecta al registro STATUS.

RETLW Esto significa: RETURN con Literal en W. RETLW 00 a FF El registro W es cargado con el valor del literal,
normalmente devuelve un dato procedente de una tabla. El Contador de Programa (PC) es cargado de la cima de la pila (Stack), que corresponde a la direccin de RETURN de programa. No afecta al registro STATUS.

RETURN Esto significa: Retorno de Subrutina. Esta instruccin est al final de


una rutina o subrutina. No afecta al registro STATUS.

RLF Esto significa: Rotar el archivo f a Izquierda con aCarreo (Carry). RLF 00 a 1F,0 El resultado se almacena en W. RLF 00 a 1F,1 Resultado se almacena en f. El contenido de un archivo, es
rotado un bit a la izquierda por la bandera Carry (acarreo), esto requiere de 9 desplazamientos para recuperar el valor original del archivo. Afecta al bit C del STATUS. El uso de: RLF.....Reg, Destino........; rota los bits de un registro un lugar la izquierda. Si Reg = b'00010110' Despus de la instruccin: Reg = b'0010110C' donde C es el valor del bit STATUS,C en el momento de ejecutarse la instruccin RLF. Veamos en mas detalle, cmo trabaja la funcin RLF: Un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0 Al aplicar la instruccin RLF.....Reg,F ocurre que: (STATUS,C <== B7) <== B6 B5 B4 B3 B2 B1 B0 (C <== STATUS,C) Esto significa que, todos los bits de Reg son rotados (desplazados) una posicin hacia la izquierda. El espacio generado a la derecha de Reg es decir, el bit0 (B0) del registro, es ocupado por el valor que tena en ese momento el bit C del registro STATUS. A su vez, el Bit7 (B7) de Reg sale del Registro y se rellena con el bit C del registro STATUS. Repasemos otra vez. Reg = b'00001100' (Ch = .12) y STATUS,C = 0 Aplicamos; RLF Reg,F Entonces: Reg = b'00011000' (18h = .24) y STATUS,C =0 Podemos comprobar que antes de aplicar la RLF, Reg vala 12 en sistema decimal. Despus de la instruccin RLF Reg vale 24. Hemos multiplicado a Reg por dos, utilizando la instruccin RLF. Ahora, consideremos el siguiente caso: Reg = b'00001100' (Ch) y STATUS,C = 1 Aplicamos; RLF Reg,F Entonces: Reg = b'00011001' (19h = .25) y STATUS,C = 0 En este caso, antes de la aplicacin de RLF Reg vala 12 en decimal y despus de aplicar la instruccin Reg vale 25 en decimal, por qu ocurre este error si hemos aplicado la misma instruccin al mismo registro Reg. Debemos considerar el motivo. El motivo radica en que el bit C del registro STATUS, antes de ejecutar la instruccin RLF, vala 1, en el segundo caso y ocup el bit0 del Reg al ejecutar la instruccin RLF. Por tanto, en este segundo caso, al hacer RLF Reg,F equivale a hacer Reg * 2 + 1. Precauciones a tener en cuenta para evitar incurrir en este error. Para

asegurarnos en una multiplicacin por dos, siempre limpiaremos el bit C del STATUS antes de aplicar la instruccin RLF, asegurndonos as que el bit STATUS,C no "corrompa" la operacin. Ej.: BCF STATUS,C la multiplicacin RLF Registro,F ;Limpiar STATUS,C para asegurar que no "ensucia" ;y ahora, si. Rotar el Registro a la izquierda.

Se puede rotar ms veces a la izquierda, lo que en buena lgica es lo mismo que hacer Reg * 2 * 2, etc.

RRF Esto significa: Rotar el archivo a la Derecha por Carry (aCarreo). RRF 00 a 1F,0 En este caso el resultado se almacena en W. RRF 00 a 1F,1 Y en este el resultado se almacena en f. El contenido de un
archivo es rotado un bit a la derecha por la bandera Carry (acarreo), esta instruccin corrompe el registro al introducir el valor de C en el bit7, por tanto, debemos usar una instruccin de aclarado del bit C antes de usar RRF, otro modo de lograr esto, requiere de 9 desplazamientos para recuperar el valor original del archivo. La instruccin: RRF Reg,Destino la derecha. ; rota los bits de un registro un lugar hacia

Veamos: Reg = b'00011000' (18h = .24) Aplicamos: RRF Reg,F y Reg = b'C0001100' Donde C es el valor que tena el bit C de STATUS en el momento de ejecutar la instruccin RRF. Veamos en detalle cmo trabaja la funcin RRF: Sabemos que un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0 Al aplicar la instruccin: RRF.....Reg,F ocurre que: (STATUS,C ==> C) B7 B6 B5 B4 B3 B2 B1 ==> (B0 ==> STATUS,C) Esto significa que todos los bits de Reg son desplazados una posicin hacia la derecha. El espacio generado a la izquierda de Reg, es decir, el bit7 (B7) de registro, ser ocupado por el valor que tena en ese momento el bit C del registro STATUS. A su vez, el Bit0 (B0) de Reg sale de Reg y rellena el bit C del registro STATUS. Supongamos que: Reg = b'00011000' (18h = .24) y STATUS,C = 0 Al aplicar: RRF Reg,F Reg = b'00001100' (Ch = .12) y STATUS,C = 0 Aqu, podemos comprobar que antes de aplicar la RRF, Reg vala 24 en sistema decimal. Despus de la instruccin RRF Reg vale 12, por lo que hemos dividido a Reg por dos, utilizando la instruccin RRF. Sin embargo, veamos el caso en el que:

Reg = b'00011000' (18h = .24) y STATUS,C = 1 Al aplicar: RRF Reg,F Reg = b'10001100' (8Ch = .140) y STATUS,C = 0

En este caso Reg, antes de la instruccin RRF vala 24 en sistema decimal. Y despus de la instruccin RRF Reg vale 140. Este error ocurre por que el bit C de STATUS, en este caso, antes de ejecutar la instruccin RRF vala 1, el cual al ejecutar la instruccin RRF, ocup el bit7 del registro Reg. Debemos considerar el motivo para evitar incurrir en este error, difcil de depurar. Para asegurar una divisin por dos, limpiaremos el bit C del registro STATUS antes de realizar cualquier instruccin RRF y asegurarnos que el bit STATUS,C no "corrompa" la divisin. Ej.: BCF STATUS,C "corrompe" la divisin RRF Registro,F ;Limpia STATUS,C para asegurar que no ;y ahora si. Rota el Registro a la derecha.

Por la misma lgica rotar dos veces a la derecha un registro equivale a decir Registro / 2 / 2, lo que simplificado es Registro / 4, y as sucesivamente.

SLEEP Esto significa: SEELP (Dormir, bajo consumo). Pone a 0 el flag PD#
(Power Down) y el flag TO# (Timer Out) se pone a 1. O sea, el bit de estado de energa-baja es aclarado, el bit de estado de interrupcin es puesto a 1, el Temporizador Perro Guardin y su preescaler son aclarados (puestos a 0) y el procesador es puesto en el modo Sleep (bajo consumo) con el oscilador parado. Para salir de este estado, es necesaria una de estas causas: Provocar un Reset activando el MCLR. Por desbordamiento del WDT (Watchdog) si quedo operativo en el modo reposo. Generando una interrupcin distinta a TMR0 ya que sta se desactiva con la propia instruccin SLEEP.

SUBLW Esto significa: Restar W del Literal. SUBLW 00 a FF EL registro W es restado (mtodo de complemento a 2) del
valor Literal, el resultado es colocado en el registro W. Esta instruccin no est disponible en el juego de instrucciones del '508A, usar estas 5 instrucciones, ejemplo: SUBLW 80h. Sustituir por:
MOVWF MOVLW MOVWF MOVF SUBWF 13h 80h 14h 13h,0 14h,0 ;Mover W a cualquier archivo ;Poner 80h en W ;Mover W a cualquier archivo ;Mover 13h a W ;Restar W del archivo 14h

SUBW F Esto significa: Restar W del archivo.

SUBWF 00 a 1F,0 El resultado estar en W. SUBWF 00 a 1F,1 El resultado estar en f. Restar por el mtodo de
complemento a 2, el registro W del archivo (de 00 a 2F).

SWAPF Esto significa: Swap Nibbles (intercambio de bits) en el archivo f. SWAPF 00 a 1F,0 El resultado estar en W. SWAPF 00 a 1F,1 El resultado estar en f. Los nibbles (niveles) superiores e
inferiores de un archivo 00 a 1F son cambiados.

TRIS 06 o solamente TRIS Esto significa: Carga Registro TRIS. Ver tambin
OPTION 0DFh en la Biblioteca de Rutinas. Esta instruccin carga a TRIS con el contenido de W, usamos TRIS 06 para recordar que se est refirindose al PuertoB (determinando la naturaleza de Entrada/Salida de cada una de las lneas) cuando el programa se transfiere a un PIC F84. Las dos instrucciones de configuracin (set-up) son:
MOVLW xxh [GP3] debe ser 1). TRIS 06 ;Cargar W con un valor literal (recordar que para el '508A el Bit3 ;Cargar TRIS con el valor de W.

Nota: El '508A slo tiene 6 lneas en el puerto y usa slo los 6 bits inferiores. Si W es 0000 1000 todas las lneas son salida excepto GP3, ya que GP3 slo puede ser ENTRADA. Si se requiere usar la instruccin TRIS en un '508A, son necesarias las siguientes 4 instrucciones:
BSF 03,5 MOVLW 08 MOVWF 06 6) BCF 03,5 ;Seleccionar Page0 ;Seleccionar pagina 1 ;Haga GP3 entrada ;Cargar el archivo TRIS (como estamos en page1, esto no es salida port

XORLW Esto significa: Exclusivo OR Literal con W. XORLW 00 a FF El contenido del registro de W es XOR'ed con un valor
literal (el contenido de W se hace un XOR lgico con el valor literal), el resultado es colocado en el registro W.

XORWF Esto significa: Exclusivo OR W con el archivo f. XORWF 00 a 1F,0 El resultado estar en W. XORWF 00 a 1F,1 El resultado estar en f. Exclusivo OR del contenido del
registro W con un archivo (00 a 1F). Con esto, damos por terminada la descripcin de las instrucciones para la familia PIC. En prximos artculos pondremos en accin los conocimientos

adquiridos en este artculo, sin embargo personalmente recomiendo que se haga una copia en papel para tener a mano en sus proyectos, esto le facilitar el proceso de programacin ayudndole a recordar la funcin de las instrucciones y ganar tiempo en sus proyectos.

JUEGO DE INSTRUCCIONES de los PIC

Hoy: 3 Octubre 2009.


Creado por: V. Garca.

Incluir en favoritos, para volver a visitarnos.

Juego Reducido de Instrucciones (RISC) de los PIC.


Como se indica es un juego reducido de instrucciones slo son 35, as que, no nos resultar demasiado complicado manejar estas pocas instrucciones, aunque es cierto que no es necesario retener en la memoria qu hace cada una, esto resultara una extrema labor para cualquiera de nosotros y no es esto lo que se pretende, se trata de disponer de una referencia a la que acudir, en caso de dudas y continuar con nuestro trabajo que es la programacin. Para lograr cierta soltura a la hora de programar, es muy conveniente realizar cuantas ms practicas mejor, slo con la practica se puede lograr la agilidad en cualquier disciplina. Una forma de familiarizarse con las instrucciones que aqu se describen, es utilizar las libreras de rutinas y tratar de comprender el motivo por el que se ha usado cierta instruccin y no otra que se nos haya ocurrido. Por cierto, es interesante usar las rutinas que se entregan y procurar adaptarlas a las caractersticas y circunstancias que nos convengan en cada aplicacin, el motivo es que estas rutinas sabemos que funcionan por lo tanto ser mejor aprovechar un trabajo hecho y comprobado frente al riesgo de la aventura. Y sin ms prembulos empecemos con las instrucciones.

Trminos resaltados en Rojo indican que no tienen correspondencia con el '508A.


ADDLW ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ GOTO INCF INCFSZ IORLW IORWF MOVF MOVLW MOVWF NOP OPTION RETFIE RETLW RETURN RLF RRF SLEEP SUBLW SUBWF SWAPF TRIS XORLW XORWF

NOTACIN PARA NMEROS


Siempre depender de la herramienta en uso, normalmente se usa lo que sigue:

Decimal : '100D' .100 Hexadecimal : '64H' 0x64 64h Octal : '144O' o 144O Binario : '01101100b' ASCII : 'C'

NOTACIN PARA REGISTROS Y LITERALES

LAS INTERRUPCIONES
en los PIC
Hoy es: Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si quiere volver a visitarnos.

Introduccin.
Hemos avanzado en nuestro empeo de aprender un poco mas a cerca de la programacin de los micros PIC y no podemos continuar sin atender unas de las ms importantes instrucciones ("herramientas") como son las interrupciones. Veremos que hay dos tipos de interrupcin en los micros PIC16X84 y vamos a descubrir como podemos usarlas en nuestro provecho.

Las Interrupciones.
Es una de las caractersticas de los microcontroladores, de las ms importantes que constituye la capacidad de sincronizar la ejecucin de programas con acontecimientos externos; es decir, cuando se produce una interrupcin, el micro automticamente deja lo que est haciendo, va a la direccin 04h de programa y ejecuta lo que encuentre a partir de all hasta encontrarse con la instruccin RETFIE que le har abandonar la interrupcin y volver al lugar donde se encontraba antes de producirse dicha interrupcin. Hemos de diferenciar entre dos tipos de interrupciones posibles en un PIC16X84: 1. - Mediante una accin interna. El desbordamiento de la Pila (Stack) por una operacin indebida, por ejemplo: Al completarse la escritura de datos en una EEPROM. Por desbordamiento del registro TMR0 al rebasar el valor 255 (FFh) a 0. 2. - Mediante una accin externa, la ms til. Al producirse un cambio del nivel en uno de sus pines por una accin externa. Estando en el modo de reposo (SLEEP), un cambio de nivel en el pin RB0/INT . Un cambio de nivel en uno de los pines RB4 a RB7 estando configurados como entrada. Cuando ocurre un evento de los descritos anteriormente, se produce una peticin de interrupcin, guardando el valor actual del PC (contador de programa) en la Pila, sea cual sea la fuente de la interrupcin, se pone a cero el bit7 GIE (Global Interrupt Enable), con lo cual inhibe cualquier otra peticin de interrupcin, el registro PC se carga con el valor 0004h que, es la posicin del vector de interrupcin. Aqu, empieza la ejecucin del programa de

atencin a la interrupcin ISR (Rutina de Servicio de Interrupcin). El tiempo de procesamiento de la ISR debe ser lo ms breve posible, para que se ejecuten las otras interrupciones ya que, pueden habilitarse ms de una de ellas. Adems, cualquier tipo de interrupcin tambin puede sacar al micro del modo de reposo (SLEEP). Como he apuntado, una interrupcin puede ser inhibida slo si existe otra interrupcin en curso. Esto se debe a que, una interrupcin est controlada por dos bits que indican la fuente de la interrupcin, un bit acta como bandera (flag) indicando si se ha producido una interrupcin y el otro bit, acta como bit de inhibicin o prohibicin de la interrupcin en s, debido a que existe otra interrupcin en ejecucin y todo esto se realiza de forma automtica por parte del micro. Ecir, el bit GIE es el responsable del permiso de interrupcin que se borra automticamente cuando se acepta una interrupcin evitando as que se produzca ninguna otra interrupcin mientras se atiende a la primera. Estos bits de control se encuentran en el registro INTCON (0Bh y 8Bh). Estos bits corresponden al registro INTCON que cambia de nivel 0 a 1 cuando se produce la interrupcin, excepto el ltimo bit (bandera) que se encuentra en el registro EECON1. Vase los detalles de los bits de INTCON.

REGISTRO INTCON
1 = Todas las Interrupciones habilitadas Bit Enabled Interrupt 0 = Todas las Global Interrupciones inhbiles 1 = Habilitacin Activada Bit Interrupciones de 0= Perifricos Desactivada 1 = Habilitacin Activada Bit Interrupcin del 0= TMR0 Desactivada 1 = Habilitacin Activada Bit Interrupcin 0= externa Desactivada 1 = Habilitacin Activada Interrupcin por 0= cambio Puerto B Desactivada 1 = TMR0 Bandera del desbordado TMR0 0 = No - Borrar por software desbordado

Bit7

GIE

Bit6

EEIE

Bit5

T0IE

Bit4

INTE

Bit3

RBIE

Bit2

T0IF

Bit1

Bit0

1 = Hubo interrupcin externa INTF 0 = No hubo interrupcin externa 1 = Uno o ms pines cambiaron de RBIF nivel 0 = Ningn pin ha cambiado de nivel.

Bandera

RB0/INT
- Borrar por software

Bandera en

RB4 : RB7
- Borrar por software

Las acciones que debe tener en cuenta el programador al crear sus programas, son las siguientes: 1. Cuando se produce una interrupcin el bit7 GIE se pone a 0. 2. El valor del PC se guarda en la Pila (Stack) con el valor 0004h, que es el vector de interrupciones. 3. La rutina de atencin a la interrupcin debe empezar con un salto a la posicin de memoria de programa, antes, debe guardar todos los registros que puedan ser modificados por la interrupcin y explorar las banderas para determinar la causa de la interrupcin. 4. Dependiendo de la causa, la rutina de interrupcin se bifurcar a la subrutina correspondiente. 5. Antes de volver al programa principal, se deben devolver los valores originales salvados de los registros anteriores a la interrupcin y adems limpiar (poner a 0) las banderas que indican la fuente de la misma. 6. Como ltima instruccin de la rutina de interrupcin usar RETFIE, que cargar el PC con el valor de Pila y el bit GIE se pondr automticamente a 1. Para detectar interrupcin: TOIF (bandera (Flag) de interrupcin por desbordamiento de TMR0) Para habilitar interrupcin: TOIE (habilita la interrupcin por desbordamiento de TMR0)

Por tanto, el bit7 GIE, es el encargado de la activacin global que habilita las interrupciones al ponerse a 1 y al reconocer una interrupcin se pone a 0 de forma automtica, evitando se produzca otra interrupcin mientras se atienda la actual. El bit GIE se pone de nuevo a 1 al retornar de la atencin a la interrupcin al encontrar una instruccin RETFIE. Para el resto de los bits (banderas o flags) no est previsto ningn tratamiento de puesta a cero, por lo que es el propio programa de atencin a la interrupcin, el que le corresponde tratarla y las banderas (flags) que indican la interrupcin, debe ponerlas a 0 (cero). Antes de seguir, hago hincapi en que, si bien cada bandera cambia o se pone a 1 al producirse una interrupcin, es tarea del propio programador, borrarla o ponerla a cero nuevamente, ya que si no lo hace, el micro siempre permanecer interrumpido o lo que es lo mismo, creer que la

interrupcin se est produciendo continuamente. En resumen, el micro slo tiene un vector de interrupcin en la direccin 0x04h, as que, con cualquier interrupcin el PC se carga con 0004h y el programa de atencin a la interrupcin (que llamamos ISR) se encarga de comprobar el estado de las banderas para determinar que dispositivo caus la interrupcin y actuar segn lo previsto, la propia ISR se encargar de guardar los registros implicados al principio de la rutina para poder devolver sus estados originales al regresar de la rutina. Ver el siguiente ej.
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; Nombre: Demo de Interrupciones ^ ; Que hace => Encender un LED en RB1, lo haremos dormir y ^ ; despertarlo al accionar un pulsador en RB0/INT lo encender para ^ ; hacerlo dormir hasta la siguiente interrupcion que lo apagar. ^ ; --- Descripcion del circuito --^ ; El pin 7 (RB1) conectado al anodo del LED, el catodo a masa. ^ ; El pin 6 (RB0/INT) conectado a positivo a traves de R de 10K ^ ; El pin 6 (RB0/INT) conectado a contacto pulsador, el otro a masa.^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ LIST P=16F84 #include <P16F84a.INC> ACUM equ h'000C' ;se declara acum STAT equ h'000D' ;se declara stat #DEFINE BANCO0 BCF Org goto ORG GOTO ORG 0x00 STATUS,5

;Posicion 0 de la Memoria de Programa (apuntador) ;Viene cuando hay una interrupcion. inicio ;Va a la etiqueta INICIO 0x04 rsi 0X05 ;viene cuando hay una interrupcion ;salta a rutina de rsi que atiende la interrupcion

; ****Bits del registro OPTION ******************************* ; bit8 = 0 Resistencias de polarizacin deshabilitadas ; bit7 = 0 Interrupcin externa por flanco bajada (no usada) ; bit6 = 0 Fuente de reloj, interno (Usa TMR0 como temporizador) ; bit5 = 0 Flanco de seal externa (no lo usamos) ; bit4 = 0 Divisor asignado al TMR0 ; bit3 = 1 bit2 = 1 bit1 = 0 Divisin por 128 ; ******************************************************* ;---- Inicio -----ini BSF status,RP0 ; configurando puertos MOVLW 01 ; carga w con 0000 0001 MOVWF trisb ; RB0/INT es entrada BCF option_reg,6 ; seleccionamos flanco descendente BCF status,RP0 ;---- Activa interrupciones ---BSF intcon,GIE ; habilita todas las interrupciones BSF intcon,INTE ; que sean interrupciones externas CLRF portb ; limpia el puerto B dormir SLEEP GOTO dormir ; poner a dormir ;---- rutina servicio interrupciones

rsi

BTFSC GOTO

; verifica que se suelte el pulsador ; espera ; comenzamos guardando el contenido del W MOVWF ACUM ; Copia el acumulador al registro acum MOVF status,W ; Guarda STATUS en el acumulador BANCO0 ; para restaurarlos antes de volver MOVWF STAT ; Copia el acumulador al registro STAT BTFSC GOTO BSF BCF GOTO RETFIE portb,1 off_led portb,1 intcon,INTF HECHO ; y ahora s, si el led est a 1 ; ir a off_led para apagarlo ; sino, encender el LED ; borrar bandera de interrupcin ; salta a restaurar valores ; antes de volver

portb,0 rsi

off_led BCF BCF HECHO MOVF MOVWF SWAPF SWAPF RETFIE END

portb,1 ; apaga el LED intcon,INTF ; borra bandera de interrupcin ; Restauramos los valores del W y status STAT,W ; Guarda el contenido de STAT en el W STATUS ; Restaura el STATUS ACUM,F ; Da la vuelta al registro ACUM ACUM,W ; Vuelve a dar la vuelta al registro ACUM ; y lo restaura ; retorna al programa principal

Como referencia, debemos guardar el contenido del registro W y del registro STATUS, para lo cual "no se debe usar la instruccin MOVF" porque corrompe la bandera Z, modificando el registro STATUS. En las hojas del fabricante recomienda el cdigo del siguiente ej. a la hora de tratar una rutina de servicio de interrupciones y puede tomarse, de forma general, procurando adaptarlo a la exigencia del usuario.
; ======== Inicio - Rutina de Servicio de Interrupcin ========= ; ========== Guardando W y el Registro de Estado ========== MOVWF R_W ; Guardamos W en R_W (R_W=0x0A) SWAPF STATUS,W ; invertimos los nibbles del registro STATUS (STATUS=0xAF) y ; lo pasamos a W, (W=0xFA). Si ponemos f en SWAPF STATUS,f ; se guardara en el mismo registro STATUS MOVWF R_STAT ; Guardamos el contenido de STATUS en (R_STAT=0xFA) . . . . ; Aqui atendemos la rutina ISR . . ; Deberia configurarse banco como se requiera ; ======== Fin - Rutina de Servicio de Interrupcin =========== ; ======== Restaurando W y el Registro de Estado =========== SWAPF R_STAT,W MOVWF STATUS SWAPF R_ACUM,F (R_ACUM=0xA0) que ; ; ; ; ; invertimos los nibbles del registro R_STAT y lo pasamos a W (R_STAT=0xFA), (W=0xAF) Restauramos STATUS (STATUS=0xAF) estado original del banco invertimos los nibbles de R_ACUM

SWAPF R_ACUM,W ahora W=0x0A RETFIE

; ;

invirtindolo

nuevamente

lo

pasamos

W,

En este ejemplo; R_W y R_STAT son registros auxiliares en los que se guardan los valores del registro W y del registro Status. Lo que se ha hecho:

Se guarda el registro W en R_W Se guarda el registro STATUS en R_STAT Se ejecuta la rutina de servicio de interrupciones. Y antes de salir de la ISR Se restablece el registro STATUS (y el bit seleccionado del banco) Se restablece el registro W

Espero que se haya aprovechado la descripcin del tema de las interrupciones y los registros que de algn modo se relacionan con las mismas, para avanzar en los conocimientos de la programacin. En prximos artculos veremos como aplicar estos conocimientos.

EL REGISTRO TMR0
Un temporizador especial.
Hoy: 3 Octubre 2009,
Creado por: V. Garca.

Incluir en favoritos, para volver a visitarnos.

Introduccin.
Debido a la importancia de este registro, se ha optado por realizar un artculo en exclusiva para este registro. Se supone que el lector tiene unos conocimientos bsicos para la comprensin y seguimiento del contenido de este artculo, sobre los microcontroladores y en especial sobre los microPICs. Esto es lo que nos hace emprender este proyecto. La medida constante del tiempo es en s, una constante Universal del hombre, en todas sus facetas y esta no es una rama que escape a esta sentencia. Una funcin muy habitual de los programas para controlar dispositivos consiste en contar intervalos de tiempo, el elemento que realiza esta funcin se llama temporizador (Timer), en ocasiones cuenta impulsos provenientes del mundo exterior, entonces el elemento destinado a tal fin se llama contador. Ahora bien, si las labores de temporizador o contador en un programa, las asignramos al programa principal le robaran mucho tiempo al procesador en detrimento de actividades ms importantes, es decir, en el tiempo que emplea en temporizar o contar, no puede atender otras rutinas. Por este motivo se disean recursos especficamente orientados a estas misiones. Este tipo de circuitos, se conocen con el nombre de RTCC (Real Time Clock Counter) y

tambin como Timer/Counter (Temporizador/Contador). Especificacin Detallada para PIC16F84A. En este artculo, explicar los datos especficos del registro TMR0 para este PIC.

Especificaciones del temporizador (TMR0)


La figura que sigue se muestra el temporizador (TMR0) y el temporizador perro guardin (WDT) en diagrama de bloques. Al pi de la figura (en amarillo) los bits relacionados, de cada registro que afecta el ajuste de los temporizadores.

El Preescaler que, est en el centro de la figura, puede ser usado por el TMR0 o por el WDT. La figura anterior muestra el preescaler conectado a TMR0. El bit PSA (bit 3) del OPTION_REG determina a cual de los dos es conectado el preescaler. El preescaler es un contador programable cuyo rango es determinado por los bits PS0, PS1, PS2 (bits 0, 1 y 2) de OPTION_REG. TMR0 es un contador binario de 8 bit que puede contar hasta 256. Cuando el contador rebasa la cuenta de 255 (FFh) a 0 (00h) ocurre una interrupcin por desbordamiento y el bit T0IF (bit 2) del registro INTCON es puesto a 1. El hardware est diseado tal que cuando ambos el GIE (bit 7) y TOIE (bit 5) del registro INTCON son H ("1") la interrupcin ocurre y el PC (program counter) va la direccin 004h, para comenzar la operacin de programa. Una cuenta 256 de TMR0, a veces es corta. Por ejemplo, cuando el reloj interno es 20MHz, la frecuencia de entrada del contador es 5MHz. (F osc/4). El

perodo de este pulso de reloj es de 200ns (1 / 5Mhz = 0.2 s.). Para desbordar el TMR0 se necesitan 0.2 s. x 256 (51.2 s.). Entonces para ampliar este perodo se usa el preescaler. El preescaler se puede usar para dividir la entrada por 2, 4, 8, 16, 32, 64, 128, o 256. Por ejemplo, cuando el preescaler es puesto para dividir por 2, hay 1 pulso de salida por cada 2 pulsos de entrada al preescaler. Si ponemos a 256, habr 1 pulso de salida por cada 256 pulsos entrada. As que, el tiempo de desbordamiento de TMR0 se puede hacer ms largo modificando el valor del preescaler. En el ejemplo anterior cuando el preescaler fue puesto a 256, el tiempo de desbordamiento se hizo 51.2 s. x 256 = 13,107.2 s. (aproximadamente 13 milisegundos). La entrada al temporizador (TMR0) puede ser un reloj externo o el reloj interno. Para usar el reloj externo, el bit T0CS (bit 6) del registro OPTION_REG y bit 4 del registro TRISA debe ser puesto a "1". Esto pondr el pin RA4/T0CKI en el modo entrada de reloj (TMR0 CLOCK IN). El borde de las transiciones de subida o de cada del pulso de reloj, tambin, se pueden seleccionar por el bit T0SE (bit 5) del registro OPTION_REG. As, "0" para el borde creciente y "1" para el borde de cada. En la entrada al temporizador (TMR0) hay un circuito de sincronizacin de reloj. Usando un reloj externo, el conteo del borde de subida y cada de reloj no se sincronizar con el reloj interno, esto afectara la sincronizacin de la interrupcin. Dicho circuito sincroniza la entrada de escritura de TMR0 con el reloj interno. La sincronizacin se alcanza en un mximo de 2 ciclos. El oscilador del Temporizador Perro Guardin (WDT) es independiente del reloj de la CPU. La interrupcin WDT se produce aproximadamente cada 18 ms. Generalmente, para prevenir un tiempo mayor de la condicin del WDT debe ser reiniciado de vez en cuando va software, usando la instruccin CLRWDT. Ver imagen de la derecha. Si el Temporizador no es reiniciado antes de la interrupcin, la CPU forzar un reinicio a la posicin de direccin inmediatamente despus del encendido (Power up). El preescaler puede ser usado para ampliar el perodo de interrupcin. En este caso, los valores de contador son diferentes del TMR0. El preescaler puede ser puesto a uno de los ocho valores 1, 2, 4, 8, 16, 32, 64 o 128. Cuando se pone a 128, la interrupcin es aproximadamente 2 segundos (18msec x 128 = 2,304msec). La funcin del temporizador perro guardin (WDT) debe prevenir una operacin incorrecta del software. (Ej.: Ejecutar instrucciones que no son parte del programa. Lazo: Ejecutar la misma parte repetidamente). La funcin WDT no es siempre necesaria. Si hay un error en el programa, por lo general, puede reconocerse que hay un mal funcionamiento por el modo en el que ste se desarrolla (esto, no se realiza del modo que se esperaba). Si el WDT reinicia el

PIC, no se puede ser capaz de entender, que hizo que, el programa funcionara mal. En ocasiones es mejor, no usar el temporizador perro guardin. Para desactivar la operacin del temporizador perro guardin, resetee el bit WDT de la palabra de configuracin (2007) del programa de memoria a "0" cuando grabe el micro en su quemador de PICs. Hemos visto las especificaciones generales del temporizador TMR0 y el WDT. Ahora, con ms detalle, continuaremos con las caractersticas de los registros que intervienen en mdulo Timer0, que nos permiten configurar su capacidad.

El registro TMR0.
Los PICs poseen un registro llamado TMRO, es un temporizador/contador de 8 bits. El registro TMR0 es un temporizador especial del mdulo Timer0. El mdulo Timer0, tiene las caractersticas que se indican a continuacin: Temporizador/contador de 8 bit Capacidad de Lectura/Escritura Software de 8 bits con Preescaler programable Seleccin de Reloj Interno o externo Interrupcin por desbordamiento (al pasar de) FFH a 00H Seleccin del Borde (de subida o bajada) para el reloj externo El registro TMR0 como se ha dicho, es un temporizador especial del mdulo Timer0, es decir, es un contador de 8 bits cuyo contenido, se incrementa con una frecuencia constante en cada oscilacin de su seal de reloj Ftmr0 programable por hardware. Por su estructura de 8 bits, el mximo de la cuenta est en 256 (podemos contar hasta 28 = 256 valores, entre 0 y 255). Este registro TMR0, tambin puede usarse de modo que, permita contar eventos externos, segn el valor del bit 5 (TOCS) del registro OPTION. Si este bit 5 est a 1, TMR0 cuenta pulsos de entrada por RA4 y se le llama Contador, por el contrario, si el bit 5 est a 0, TMR0 (como ya se ha descrito ms arriba) cuenta pulsos internos de reloj de frecuencia constante (en modo temporizador) y se le llama Timer. Si nos interesa, se puede insertar un divisor de frecuencia programable (preescaler). Como se ha dicho, este divisor puede ser utilizado indistintamente como preescaler del TMR0 o como postscaler del WDT (Watch Dog Timer), segn lo programemos por software. A diferencia de otros registros, el valor que contiene el registro TMR0 se incrementa continuamente. De modo que, si asignamos el valor 10, despus de un ciclo de instruccin, el contenido del registro comienza a ser incrementado a 11, 12, 13 y as sucesivamente con una cadencia constante y

totalmente independiente de la ejecucin del resto del programa. Una vez alcanzado el valor 255, en la cuenta siguiente, se desborda el registro TMR0, es decir, es puesto a cero automticamente, cuando pasa de FFh a 00h, comenzando entonces a contar nuevamente desde cero y no desde el valor originalmente cargado. Adems, en el momento de pasar por cero, se activa la bandera TOIF, bit 2 del registro INTCON por desbordamiento del TMR0, generndose la interrupcin, slo si el Control Global de Interrupciones est activado GIE = 1, INTCON bit 7. La frecuencia de conteo es directamente proporcional a la frecuencia de reloj aplicada al dispositivo que, como se ha dicho, puede ser modificada, programando adecuadamente los bits de configuracin del preescaler. La primera figura, es un diagrama simplificado de los bloques del mdulo Timer0 y preescaler. La informacin adicional est disponible en el "Manual de Referencia de la Familia PIC de Gama Media MCU" (DS33023).

La tabla anterior debe despejar las posibles dudas al principiante, respecto del registro TMR0 y el mdulo Timer0. El registro TMR0 est localizado en la direccin 01h y el mdulo Timer0, es un mdulo que tiene asociados los registros TMR0, OPTION_REG, TRISA e INTCON, como muestra la tabla. En los PIC's de gama media, el mdulo Timer0 es un mdulo interno de los micros y el registro TMR0, como ya se ha mencionado, es un registro de 8 bits que interviene en las operaciones de interrupciones producidas por el mdulo Timer0 que veremos con detalle.

El mdulo Timer0.
El mdulo Timer0 es un dispositivo que como se ha descrito (ver imagen), puede funcionar de dos formas: como contador de pulsos externos o como temporizador para calcular intervalos de tiempo. El denominado mdulo Timer0 en las hojas de datos (descrito ms arriba), es un Temporizador/Contador de 8 bits habitual en los microcontroladores PIC16F84 (en otros modelos, es posible encontrar mdulos adicionales de 8 16 bits cuyo funcionamiento bsico, es el mismo). Antes de explicar el funcionamiento y uso con ejemplos del Timer0, para evitar confusiones,

debemos definir los tres conceptos siguientes:


Frecuencia de oscilacin (Fosc): Es la frecuencia externa del PIC (mediante un cristal de cuarzo, un resonador, etc.). Frecuencia interna (Fint): Es la frecuencia del reloj interno de instrucciones, generada a partir de la frecuencia de oscilacin externa. Frecuencia TMR0 (Ftmr0): Es la frecuencia constante, despus del preescaler, a la entrada del TMR0.

Nota.- En los microcontroladores PIC, la frecuencia Fint difiere de la frecuencia Fosc, ya que para mantener la compatibilidad con los diseos originales es necesario dividirla por cuatro. El tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin (es decir, si estamos trabajando con un XT de 4 Mhz, es una instruccin por cada microsegundo, 1s), segn la formula:

Cuando los pulsos provengan del reloj interno (Fint), el Timer0 se utilizar para generar interrupciones peridicas mediante una cuenta programada. Puesto que conocemos la frecuencia de funcionamiento y en base a un valor que cargaremos en el contador del timer TMR0 podremos temporizar eventos. Cuando dicha seal provenga de una fuente externa (patilla RA4/T0CKI) del microcontrolador (Fext), es especialmente til para contar el nmero de pulsos que dicha seal genera en el tiempo ya que cada pulso de dicha seal incrementa el valor del TMR0. El esquema simplificado del Timer0, se puede ver en la figura que sigue:

El Timer0, usado como temporizador, puede contar perodos de tiempo exactos, acumulndolos en un registro auxiliar, cada vez que ocurra un pulso

de entrada podemos consultar el registro auxiliar y comparar el incremento acumulado desde el anterior pulso. Conocidos los perodos, podemos calcular el tiempo transcurrido. Adems como se describi ms arriba, de las dos formas de reloj descritas, tambin podemos configurar que el disparo de la seal, sea por flanco ascendente o descendente. Esto lo podemos realizar con los siguientes bits de control:

T0SC (Timer0 Select Clock) (bit5) del registro OPTION: Indica el origen del reloj del contador, oscilador interno (1) o seal externa (0). T0SE (Timer0 Set Edge) (bit4) del registro OPTION: Cuando se selecciona seal externa, indica el flanco activo que se usar (1 ascendente; 0 descendente).

El preescaler.
Un circuito adicional en el Timer0, es el preescaler, este circuito, nos permite modificar la frecuencia del reloj de entrada del Timer0, dividiendo sta y generando una nueva seal de menor frecuencia a su salida que, ser la seal de reloj (Ftmr0) de entrada al registro TMR0. El preescaler, es una ayuda para cuando la seal de entrada es una frecuencia demasiado alta para nuestros propsitos y necesitamos reducirla. El preescaler es un divisor de frecuencia programable que, se utiliza normalmente para lograr tiempos largos y se puede aplicar al TMR0 o al WDT, esto se configura en el bit PSA (bit3) del registro OPTION. Para configurar el preescaler del registro TMR0, como veremos en la siguiente seccin, usaremos 4 bits del registro OPTION, el PSA y tres bits que nos permiten dividir la frecuencia de una seal de entrada por 2, 4, 8, 16, 32, 64, 128 o 256. En caso de utilizar un divisor por 1, la seal de salida es la de entrada sin ningn cambio. Por ejemplo, si usamos como oscilador externo del PIC un cristal de 4Mhz, entonces el reloj interno de instrucciones funciona a Fint = 4Mhz /4 = 1 Mhz = 1 s. Si el Timer0 usa la seal del reloj interno y la pasamos por el preescaler configurado para una divisin por 4, la seal a la salida del preescaler ser Fpresc = 250 Khz. La configuracin se realiza con los siguientes bits de control:

PSA (Post Scaler Assignament) (bit3) del registro OPTION: Indica si el postscaler es asignado "1" al WDT o "0" al Timer0. PS2:0 (bit2:0) del registro OPTION: Indican el valor del divisor a utilizar

en el postscaler (consultar tabla para los valores). Nota de Microchip: Al alimentar el PIC o despus de un overflow por WDT, el postscaler esta asignado al WDT. Si se asigna el postscaler al Timer0, es posible que ocurra un reset por el WDT (incluso aun deshabilitado). Por esto se recomienda usar CLRWDT antes de reasignar el postscaler:
clrwdt movlw movwf ;borra postscaler y WDT b'11110001' ;reloj externo por flanco de caida OPTION_REG ;preescaler 1:4 asignado al Timer0

Registro OPTION

Para el clculo del divisor de frecuencia en PS2 - PS1 - PS0, usaremos la tabla siguiente:

Aprovechamos este punto para insertar la tabla de los registros pertenecientes a INTCON, ya que nos ayudarn a comprender mejor los Bits implicados en el proceso de temporizadores con el TMR0.

Temporizaciones con TMR0.


Veamos en la practica, como hacer una temporizacin con el registro TMR0. Por lo descrito, el tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin, es decir, si usamos un XT de 4 Mhz, 1 instruccin por cada microsegundo, necesitaremos el valor del divisor de frecuencia (el que se selecciona con los bit's PS2, PS1 y PS0) y tambin el complemento del valor cargado en TMR0 (es decir 255 - TMR0), la ecuacin que nos permite realizar el clculo es la que siguiente: Temporizacin = Ciclo de instruccin * (255-TMR0) * Divisor de Frecuencia [1] Generalizando: Retardo = 4 * Tosc (s) * (256 - Valor cargado en TMR0) *

(Rango del preescaler) . . . . [2] 1) Supngase que necesitamos una temporizacin de 1s (1000 milisegundos), si usamos un cristal XT de 4 Mhz y a dems como divisor de frecuencia seleccionamos 8 (los bits PS2, PS1, PS0 = 0, 1, 0). Sabemos que, 1 seg. = 1000 ms = 1000000 s y como 1 ciclos/s es el tiempo empleado en ejecutarse una instruccin, aplicando la ecuacin anterior, tenemos:
255 - TMR0 = Temporizacin (en microsegundos) / (1 ciclo/S * Div. de Frec.) que sustituyendo: 255-TMR0 = 255-TMR0 = 255-TMR0 = 255-TMR0~= 1000000 s/(1 ciclo/s * 8) 1000000 /(8 ciclos) 125000 ciclos 125 ciclos

Por lo tanto TMR0 se debe cargar con: 255 - TMR0 = 125, que despejando nos proporciona el valor de TMR0 = 255 - 125 = 130 (82h). El valor que se debe cargar en TMR0 es 82h. Entonces empezar a contar los 130 ciclos necesarios para desbordarse, produciendo as la interrupcin. El tiempo empleado es el previsto, 1000000s = 1s.

2) Calculemos en este caso, el mximo retraso que es posible obtener con el mdulo Timer0, usando la seal interna de reloj de un PIC genrico que usa un cristal de 4 Mhz. El mayor retraso se puede obtener con el mayor divisor del preescaler 256 (PSA2,1,0 = 111), un valor 0 para el TMR0 (contar desde 0 a 255 antes del desbordamiento, es decir, 256 incrementos). Como Fosc= 4 Mhz el retraso mximo es: Retardo - TMR0 = (256 * 256) * (4/ 4 Mhz) = 65,566 ms 3) En esta ocasin, utilizando el mdulo Timer0 vamos a crear una funcin que genere un retardo de un milisegundo, el cual incrementa un contador cuyo valor se muestra por el PORTC de un PIC16F877. Ahora, veamos como realizar una funcin de retardo. Debemos tener en cuenta que el reloj es de 20 Mhz, entonces segn la formula [2],
1 (20x10^6) 1 ms = = 0.05 x * s ; 0.05 los ciclos para ; y hacer 1 ms x

despejando

x= 1000 / 0.05 = 20.000 ciclos.

Por lo tanto, necesitamos 20.000 ciclos para hacer 1 ms. Si, cada instruccin

toma 4 ciclos en realizarse, las instrucciones que necesitamos son: 20.000/4 = 5.000 instrucciones para tener nuestro retardo de 1 ms (en el caso de contar ciclos de instruccin en lugar de los pulsos en RA4). Un ciclo de instruccin = 4 * Fosc Que, multiplicado por un numero X, obtendremos que, Retardo = Un ciclo de instruccin * X Retardo_R = 4 * Fosc * TMR0 Segn esta expresin, debemos considerar que el tiempo mximo sera: Retardo_R = 4 * Fosc * 256 al PIC tendramos: 256 s. Ahora si tenemos un clock de 4MHz conectado luego:

Adems sabemos que el modulo timer 0 posee un preescaler que servira para amplia el retardo. Si lo usamos debemos configurar el bit PSA a 0 . Si seteamos el bit PS2, PS1 y PS0 a 1 el preescaler tendra un valor de 256. Retardo_T0_Pre = 4 * Tosc * TMR0 * Preescaler. Retardo_T0_Pre = 4.0.25 s * 256 * 256 = 65536 s = 65.536 ms Con esto no alcanzamos a generar un segundo. Sin embargo podemos usar un registro que sirva para efectuar varios bucles. En tal caso, podramos lograr retardos mayores: Retardo = Bucle * Retardo_T0_Pre Retardo = Bucle * 65,536 ms 1000 ms = Bucle * 65,536 ; Como el Retardo debe ser 1segundo

;Bucle = 15.25

Como vemos generar el retardo es bastante fcil teniendo en cuenta que hemos de definir una rutina que se encargue de comparar o contar las veces que el TMR0 produce los desbordes hasta llegar a 256 cuentas.

Resumiendo
Sabemos que, la bandera T0IF del registro INTCON (bit2) que se pone a 1 siempre que hay un desborde en el Registro TMR0 es decir cuando pasa de 255 a 0. Esta bandera puede servir nuestros intereses ya que una vez producido el desborde el bit T0IF permanece en "1" y es necesario que lo pongamos a "0". Otro punto importante a recordar es que, debemos cargar el TMR0 con el valor apropiado para conseguir el retardo deseado. Supongamos que se

necesita un retardo de 10 us. Entonces nuestro algoritmo sera:


T0IF = 0 Poner (256 - 246) 10 en el registro TMR0 Comprobar cuando T0IF sea 1

Se ha cargado el TMR0 con 10 ciclos de instruccin (10 s), lo que supone 10 cuentas de desbordamiento del TMR0, porque 10 cuentas = 1 T0IF. La que sigue podra ser una formula para el clculo del retardo que necesitamos: Retardo = Ciclo_instruccin * Valor_TMR0 * Valor_Preescaler * Bucle Esto nos indica que puede haber otras soluciones. Segn lo descrito, el registro OPTION_REG debera configurarse as: OPTION_REG = 1100 0110 ; Esto se puede traducir como:
MSB desconectadas 1 1 0 0 0 1 1 0 Todas las resistencias de carga (Pull up)

LSB

Flanco para la interrupcin ascendente Pulsos de reloj interno Fosc/4 Cada flanco ascendente incrementa TMR0 Divisor de frecuencia se asigna al TMR0 \ } Valor del preescaler = 128 /

El programa que cumpla lo considerado, puede ser el siguiente:


list p=16f627A include "p16f628A.inc" CONTA EQU 0x20 hexadecimal ORG 0x00 de memoria inicio: BSF STATUS,RP0 BCF STATUS,RP1 CLRF TRISA MOVLW b'11000110' MOVWF OPTION_REG BCF STATUS,RP0 BCF STATUS,RP1 CLRF PORTC bucle: CALL retardo ;Comando que indica el Pic usado ;Etiquetas genricas para el Pic16F877 ;Variable CONTA en direccin 0x20

;Inicio del programa en la posicin cero

;Ir banco 1 ;PORTA salida ;Configuracin del modulo TMR0 ;Preescaler = 128 ;Ir banco 0 ;PORTC = 0 ;Llama la rutina de retardo

INCF PORTC,F GOTO bucle retardo: Preescaler MOVLW d'64' MOVWF CONTA espera1: CLRF INTCON MOVLW d'134' cuentas MOVWF TMR0 espera: BTFSS INTCON,T0IF GOTO espera DECFSZ CONTA,F cero GOTO espera1 RETURN END

;Incrementa el valor del PORTC ;Ir bucle ;T = 4 * Tosc * Valor de TMR0 *

;Cargar el valor de CONTA para 1 segundo

;Deshabilitar interrupciones ;Cargar el valor de TMR0 ;(Complemento) ;Esperar desborde del TMR0 ;Decrementar el registro

para

122

CONTA

hasta

;Si no es cero: ir a espera1 ;retorno de call

Con esto, estoy convencido que se ha descrito con extensin y puede darse por cerrado el tema. Esta informacin se ha obtenido de distintas fuentes y de la red.

MANUAL PRACTICO
DEL PROTEUS
Hoy: 3 Octubre 2009,

VSM

Incluir en favoritos, para volver a visitarnos.


Creado por: V. Garca.

Introduccin.
Las ventajas de que disponemos actualmente los que nos dedicamos a la electrnica aplicada en cualquiera de sus facetas, es realmente para tener en cuenta. Hace poco tiempo (ciertamente, cada vez queda ms lejos), no disponamos de las herramientas fsicas y las de software con las prestaciones que se presentan en estos tiempos. Esto es verdaderamente bueno. En lo referente a equipos fsicos, el que empieza es evidente que no pueda disponerlas, sin embargo en el apartado de software, existen una serie de herramientas que prestan gran ayuda a los diseadores incluso a los que empiezan, facilitando su tarea y aprendizaje en los ltimos, esto repercute en un mejor aprovechamiento del tiempo y un mayor rendimiento. Hay una gran variedad de paquetes EDA (Herramientas de CAD Electrnico)

estas herramientas unas mas conocidas que otras entre ellas podemos citar: TangoPCB, Elegance, Livewire, Proteus VSM, ExpresPCB, Eagle, etc. Todas son marcas registradas, algunas de ellas disponen de versiones demo que pueden servir para conocer su funcionamiento. Aqu, nos ocuparemos del PROTEUS, se disponen de manuales en espaol, muy muy buenos y muy extensos, los cuales sacarn de dudas a quien las tenga, ms tarde les doy algunos enlaces. Una de estas herramientas es la que nos ocupa en este prctico y rpido manual con un nivel superficial. Se trata es poner en manos del estudiante, lector o interesado, las bases mnimas para poner en prctica las ideas o necesidades que le surjan en el ejercicio de su trabajo o simplemente para su entretenimiento (hobby), por lo tanto, ser slo eso un asomo al uso de esta herramienta de diseo y anlisis electrnico, dejando para otros manuales ya existentes la labor de desarrollar en profundidad su conocimiento a fondo. El objetivo de esta clase tutorial es de mostrar, por la creacin de un simple esquemtico, como conducir una simulacin interactiva que usa Proteus VSM. Mientras nos concentramos en el empleo de Componentes Activos y las instalaciones de eliminacin poe depurado de fallos del editor ISIS tambin miraremos lo bsico de presentar una direccin de circuito esquemtica y general. La cobertura plena de estos temas puede ser encontrada en el Manual ISIS.

PROTEUS VSM.
La herramienta PROTEUS es un entorno integrado diseado para la realizacin completa de proyectos para construccin de equipos electrnicos en todas sus etapas. Proteus el Sistema Virtual de Modelado (VSM) combina el modo mixto la simulacin de circuito de SPICE, componentes animados y modelos completos de diseos basados en microprocesador para facilitar la co-simulacin del microcontrolador. Esta herramienta dispone de los mdulos conocidos por: Captura de esquemticos ISIS, Layout de ARES PCB y Simulador (ProSpice/VSM). Por primera vez, es posible desarrollar y probar diseos antes de construir un prototipo fsico.

Captura de Esquemtico ISIS.


Una vez instalado el programa, iniciar ISIS, se presenta la suite de diseo en la que se aprecian dos zonas, a la izquierda un visor del plano del proyecto, debajo, la ventana para mostrar dispositivos y a la derecha la zona de trabajo propiamente dicha, en la que el diseador trazar los circuitos elctricos con sus componentes, posteriormente podr ejecutar un modelo virtual que simule su proyecto en funcionamiento.

En la columna de la izquierda pulsamos sobre el botn P que nos antepone la ventana de libreras, en esta ventana elegiremos el dispositivo que necesitemos con doble-click, eligiendo otros componentes del mismo modo, lo que enviar dichos dispositivos a la ventana principal, en la columna de la izquierda donde aparecen los componentes a usar. Incorpora una librera de ms de 6.000 modelos de dispositivos digitales y analgicos. En posteriores tutoriales se describir su funcionamiento.

Layout de ARES PCB.


Es la herramienta que usaremos para la elaboracin de nuestras placas de circuito impreso, ARES dispone de un posicionador automtico de elementos, con generacin automtica de pistas. El diseador con experiencia ya no tiene que hacer el trabajo duro, es el PC quien se encarga de esta tarea.

PROSPICE.
Se trata de una herramienta de simulacin de circuitos segn el estndar industrial. La versin bsica, suministrada con todas las versiones de Proteus, slo soporta anlisis de transitorios.

VSM.
VSM es la herramienta integrada que incluye PROTEUS, se trata de un completo simulador para esquemas electrnicos que contienen microprocesador. El corazn de VSM es ProSPICE, un producto que combina un ncleo de simulacin analgica usando el estndar SPICE3f5, con modelos animados de los componentes electrnicos y los microprocesadores que comprenden el circuito, tanto si el programa se ha

escrito en ensamblador como si se ha utilizado un lenguaje de alto nivel, permitiendo interactuar con nuestro diseo, utilizando elementos grficos animados realizando operaciones de indicadores de entrada y salida. La simulacin se realiza en tiempo casi real, los efectos se pueden considerar prcticamente como a tiempo real. Incorpora prcticos controles de depuracin paso a paso y visualizacin del estados de las variables. La caracterstica ms sorprendente e importante de VSM es su capacidad de simular el software que se ejecuta en el microcontrolador y su interaccin con cualquier componente electrnico digital o analgico conectado a l.

Ejecucin del microprocesadores.

programa

con

Como podremos comprobar y segn dice el fabricante, la caracterstica ms sorprendente e importante de VSM es su capacidad de simular el software que se ejecuta en el microcontrolador y su interaccin con cualquier componente electrnico digital o analgico conectado a l. Veamos un ejemplo sencillo: Trazamos un circuito sencillo compuesto por unos pocos componentes alrededor de un microcontrolador como el PIC16F84A, el siguiente puede ser el esquema de lo descrito.

En el esquema se aprecia un pulsador P1, un LED con su resistencia R2 de seguridad, la resistencia R1 para el reset y el micro PIC16F84A. Al usar el puerto B como entrada, por software reducimos componentes, como son las resistencias de pull-up del puerto B que internamente ya dispone.

Uso del Capturador ISIS

Una vez iniciado el programa, elegimos los componentes que se van a usar. Pulsamos sobre el icono , esto abrir una ventana como la que se muestra debajo, en ella se aprecian tres columnas con distintas posibilidades: La columna de la izquierda tiene una celda en la que podemos entrar el cdigo del dispositivo deseado y podemos automatizar su bsqueda, para ello hemos de conocer el nombre con el que figura en las libreras disponibles, en otro caso no dar buenos resultados.

Debajo de esta celda se encuentra un rea con nombre "Category:" en ella se ven los nombres de las categoras de los dispositivos y series que aparecen en las libreras, debajo las subcategorias con algo mas de definicin por familias y debajo se muestra los distintos fabricantes. En la medida en que elijamos las distintas categoras, as, se podr seleccionar con una mayor precisin, el dispositivo deseado para la realizacin ms exacta de nuestro proyecto. An as, puede que no se disponga del dispositivo exacto, es el momento de actualizar o pedir informacin al fabricante por una opcin que nos pueda interesar. La columna central, nos mostrar una lista con una cierta cantidad de elementos y una descripcin, dependiendo del elemento que estemos buscado, podremos encontrar el dispositivo necesitado, moviendo la corredera correspondiente, al seleccionarlo su smbolo y su representacin esquemtica ser mostrada en la columna de al lado. Estas operaciones se tienen que realizar por cada uno de los elementos que constituyen nuestro

circuito, de modo que al llegar a esta situacin, habiendo encontrado el dispositivo buscado, para ganar tiempo slo hay que dar un doble-click sobre el mismo y sin cerrar esta ventana podremos seguir buscando ms elementos. Cuando demos por terminada la lista de componentes pulsaremos "OK" para salir. Es de especial inters que al elegir un componente (siempre que sea posible) nos decidamos por el que disponga de simulacin animada, como pueden ser componentes de entrada (generadores, motores) o de salida (LEDs, Display, LCD, motores). La figura de la derecha puede ayudar al lector a identificar los elementos esenciales para localizar, seleccionar, girar y emplazar cada uno de los componentes en un determinado circuito. El botn corresponde a las libreras y muestra el contenido de las mismas, esto no lo vamos a ver aqu, ya que se trata de un repaso rpido sobre esta maravillosa herramienta, hay otros manuales muy buenos que estn hechos en espaol, por citar uno de ellos podemos citar los; 11 video Tutoriales, hechos por Germn Tojeiro sobre Proteus entre otros, buscando en la red puede encontrar informacin en pginas sobre el tema. Una vez seleccionados todos los componentes necesarios para el desarrollo del circuito esquemtico, procederemos a la ubicar en el rea de trabajo cada unos de los componentes. Para ello, seleccionamos en la columna de la izquierda el componente a ubicar, por ej. el microcontrolador, en el visor de arriba se muestra la posicin del componente, si es necesario el usuario mediante las flechas de girar y rotar adecuar la posicin del mismo con un click en el lugar elegido. Ahora seguir con los dems componentes, procurando ubicarlos en lugares cercanos entre si para que estn relativamente juntos como se aprecia en el grfico que se muestra ms arriba. Quizs el lector ya haya creado el listado del programa que vamos a implementar en esta prctica, en otro caso este es el momento de hacerlo o talvez se decida por copiar y pegar el listado que est aqu, para evitar que surjan problemas derivados de la ruta entre el Proteus y el propio programa en asm, es conveniente que ste se ubique en una carpeta donde est el Proteus. Si ya tenemos todo como se ha descrito, es el momento de seguir. Con esto ya tenemos el circuito terminado. Si queremos simularlo entonces

debemos proceder de la siguiente forma. En la barra de men, seguir estos pasos: ir a Source/Add/Remove... como se aprecia en la imagen.

Ahora, con el men Source, se abre una persiana con distintas opciones que describiremos, seleccionamos la primera Add/Remove souce fikes esto presenta a ventana de abajo, en la que primero seleccionamos la herramienta para generar el cdigo (Code Generation Tool), en este caso MPASM, luego seleccionamos el fichero en cdigo asm que contiene el programa que deseamos ejecutar en el micro, exactamente el mismo que cargaramos en el chip real, con el buscador dentro de la carpeta donde lo tengamos, con el botn "Change", no actuaremos sobre los flags en este caso y pulsamos "OK" para finalizar, se cerrar la ventana.

El siguiente paso es elegir la herramienta para definir la generacin del cdigo (Define Code Generation Tools...), en la celda de la persiana "Tool"

seleccionamos MPASM, el resto no se toca y para terminar pulsar OK.

Volver a "Source" en la opcin "Setup External Text Editor" del men, nos puede servir para indicarle al ISIS que queremos usar nuestro editor habitual, en otro caso no se toca. Cuando lo tenemos todo configurado, entonces usaremos la opcin "Build" para que nos genere el archivo HEX, podra ser que tuviramos algn error en cuyo caso nos mostrar en una ventana indicando donde y cuales son las lneas que dan el error para su correccin. La ltima opcin, nos sirve para editar el archivo en ASM, con el que corregir los posibles errores. Personalmente llegado el caso de la aparicin de errores, hago una copia del programa en asm y mediante el MPLAB hago la depuracin del cdigo, una vez he solucionado todos los errores, hago un copiado del programa terminado y lo pego en el sitio donde estaba en el Proteus, ahora ya lo tengo depurado, sin embargo lo de nuevo por el "Build" para que me confirme lo evidente, este paso no es necesario si tambin he copiado el archivo hex generado por el MPLAB.

El siguiente paso es: Seleccionar el microcontrolador en el esquema (en este caso PIC16F84A), estar resaltado en rojo, entonces pulsamos el botn izquierdo del ratn (dije, el izquierdo, se ha borrado el componente!, hacer CRTL-Z, volver todo a su sitio) y se abrir la siguiente ventana:

En primer lugar si es el caso, modificaremos la frecuencia del reloj, en la imagen, la celda con asterisco, segn tengamos previsto. Despus, en "Program File:", pulsaremos sobre la carpeta que aparece y buscaremos el archivo HEX que se ha generado (debe estar en el mismo sitio que el listado ASM) seleccionar y aceptar, si se tienen mas definiciones o propiedades se pueden indicar en el apartado del pi del cuadro y aceptar en OK. Con esto

el programa ISIS, ya dispone de la informacin bsica necesaria para proceder a la simulacin virtual del programa.

Panel de simulacin.
Las simulaciones interactivas son controladas por un simple VCR, como el panel que se comporta como un mando a distancia normal. Este control se sita en el lado izquierdo inferior de la pantalla. Si no es visible se debe seleccionar la opcin de Animacin de Circuito del men de Grfico. Hay cuatro botones con los que se suele controlar el flujo del circuito.

- El botn Play, inicia la ejecucin continuada del programa. - El botn de modo PASO simple o paso a paso para seguir con detalle el proceso, lo que nos ayudar a la hora de depurar nuestro programa. Si el botn es presionado y liberado entonces avanzar la simulacin un paso, si el botn se mantiene presionado entonces los avances de animacin continuamente hasta que el botn sea liberado. - El botn de PAUSA suspende la animacin y entonces puede ser reactivada pulsando el botn de PAUSA otra vez, o solo dado un paso presionando el botn de PASO. El simulador tambin entrar en el estado de pausa si encuentran un punto de interrupcin. - El botn de PARADA indica a PROSPICE deja de hacer la simulacin en tiempo real. Toda la animacin es parada y el simulador es descargado de la memoria. Todos los indicadores son reinicializados a sus estados inactivos pero los actuadores (interruptores etc.) conservan sus ajustes existentes. Se puede configurar el incremento de tiempo de paso simple, usando el botn de PASO va el cuadro de dilogo de Configuracin de Circuito Animado (es decir la cantidad de tiempo avanzado por cada vez que se presione del botn). La capacidad de tiempo de paso es til para supervisar el da la vuelta ms estrechamente y la vista en el movimiento lento que afecta que.

Notar que el botn de paso simple sobre el panel de control de animacin es usado para avances incrementales de sistema, pero no para pasos simples por el cdigo donde requieren la regularidad especfica - eliminando fallos del cdigo se comenta con detalle aqu. Durante una animacin, el tiempo de simulacin actual y la carga media de CPU se muestran en la barra de estado. Si la potencia de la CPU es insuficiente para controlar la simulacin en tiempo real, la lectura mostrar el 100 % y el tiempo de simulacin dejar de avanzar en tiempo real. Aparte de esto, ningn dao a resaltar de simular muy rpido circuitos, como el sistema automticamente regula la cantidad de simulacin realizada por marco de animacin. Aparte de componentes ordinarios electrnicos, las simulaciones interactivas generalmente aprovechan, usan Componentes especiales Activos. Estos componentes tienen un nmero de estados grficos y vienen en dos condiciones: Indicadores y Actuadores. Los indicadores muestran un estado grfico que se cambia segn algn parmetro moderado del circuito, mientras los Actuadores permiten determinar por el usuario su estado, para luego modificar alguna caracterstica del circuito. Los actuadores son designados por la presencia de los pequeos smbolos de marcador rojos que pueden ser pulsados con el ratn para manejar el control. Si se tiene un ratn con una rueda, tambin se pueden manejar los actuadores sealando en ellos y haciendo rodar la rueda en la direccin apropiada.

LA SIMULACIN.
Tradicionalmente, la simulacin de circuitos ha sido un asunto no interactivo. En los primeros das, complejos listados fueron preparados a mano, cuya salida consista en un montn de nmeros. Si se tena suerte, obtenan una salida pseudo-grfica trazada con asteriscos para mostrar el voltaje y formas de onda de las corrientes.

Recientemente, se ha convertido en norma la captura esquemtica sobre pantalla grafica, pero el proceso de simulacin es todava no-interactivo [se dibuja el circuito, se imprime y entonces] se estudia el resultado en una especie de procesado posterior. Esto es en esencia, si el circuito que se prueba es esencialmente esttico en su comportamiento, por ejemplo, un oscilador que oscila a 1MHz simplemente. Sin embargo, si se disea una alarma antirrobo y se quiere averiguar que pasa cuando un ladrn sin llaves entra el (PIN) nmero de identificacin personal incorrecto en el teclado numrico, la funcin requerida se hace bastante poco prctica y hay que recurrir a un prototipo fsico. Esto es una vergenza, cmo trabajando en el "ciberespacio" que tiene tanto para ofrecer en trminos de productividad de diseo y sin embargo carece de este tipo de simulador. Slo en crculos educativos, se ha hecho una tentativa para presentar la simulacin de un circuito como la vida real, en la electrnica, donde es posible actuar recprocamente con el circuito mientras ste es simulado. El problema aqu ha sido que, los modelos de componentes animados han sido arduamente codificados en el programa. Slo un nmero limitado de dispositivos simples se han ofrecido, como motores elctricos, interruptores, bombillas, etc. y estos son de poco uso al usuario profesional. Adems, la calidad de simulacin de circuito a menudo no se aproximaba mucho a lo deseado. Por ejemplo, un producto principal de este tipo no tiene ninguna informacin de temporizadores dentro de sus modelos digitales. Si el programa escribe en uno de los puertos del micro, los niveles lgicos en los circuitos cambian de acuerdo con esto. Y si los circuitos provocan el cambio en el estado de alguno de los pines del microprocesador, entonces estos se visualizarn en pantalla de acuerdo al programa ejecutado. Exactamente como en la vida real. Los modelos de CPU utilizados por VSM emulan por completo los puertos de entrada y salida, las interrupciones, los temporizadores, los puertos USART y cualquier otro perifrico presente en cada uno de los microprocesadores soportados. A diferencia de un simulador de software ms sencillo, la interaccin de todos estos perifricos con los circuitos externos, se realiza completamente utilizando modelos de ondas. El simulador VSM, si el proyecto lo requiere, puede simular esquemas electrnicos que contengan ms de un microprocesador. Para lo cual, simplemente se colocan los microprocesadores en el esquema y se cablean entre s o con el resto de la circuitera. VSM es una herramienta nica por su capacidad de ejecutar simulaciones cercanas al tiempo real de sistemas completos basados en microprocesadores. Sin embargo, su potencia real se descubre al realizar simulaciones en el modo de ejecucin del programa paso a paso. Es entonces cuando se comprueba que VSM trabaja justo igual que el depurador de software preferido.

La mejor descripcin es una muestra, continuando con el ejemplo que venimos desarrollando. En este punto, pulsaremos el mencionado botn para ejecutar la simulacin. Que ocurre al pulsar "Play". En primer lugar, el circuito muestra unos puntos rojos en algunos extremos de ciertos componentes, si reparamos en ello, veremos que esto ocurre en los puntos que en un caso real estaran en nivel lgico alto, el color de los que estn a nivel bajo se representan en azul, esto no indica en un primer momento, mucha informacin de los estados en los puntos que nos interesen controlar, como se puede ver en la imagen.

Se ha modificado en el circuito, el componente LED estndar por un LED "animado", es decir, que interacta, cuando una corriente adecuada le atraviesa, el LED modifica su apariencia mostrando que est activado como en el mundo real. Adems, se observa que en este estado, los componentes que configuran el circuito, no pueden ser modificados, esto es debido al hecho de estar ejecutndose la simulacin. En la barra de mensajes LOG, se muestra en verde, la cuenta del tiempo transcurrido de la simulacin. Por otra parte, si actuamos con el puntero del ratn sobre el componente identificado como pulsador, si todo transcurre bien, observamos que el contacto del pulsador conectado al micro, cae de nivel al ser pulsado y esto conmuta el estado del LED, esto es debido al cdigo que se est ejecutando junto con la simulacin. Con cada pulsacin, se conmuta el estado del LED. En definitiva, esto es lo que se esperaba en la simulacin, lo que confirmara que el cdigo que hemos escrito es correcto y adecuado para nuestros requisitos. Esto es una simulacin simple y como ya est depurado el programa no ha habido problemas en los que hayamos tenido que entrar a discutir o describir, no obstante, es cierto que no siempre ser tan simple, por ese motivo vamos a contemplar un caso en el que se tenga que solucionar un problema, en el que tengamos que localizar un tramo de cdigo el cual

tengamos que cambiar o modificar en algn modo.

Simulacin al Paso.
Cuando estamos simulando un programa, se pueden dar dos casos, uno como el anterior, donde todo va bien, aunque es ms probable que se produzca algn tipo de error, en cuyo caso sera deseable poder acceder, en tiempo de ejecucin al cdigo que generamos, para ver in-situ su comportamiento. Y en este caso, para que podamos averiguar que ocurre y en que punto del programa se produce el resultado indeseado o el problema por llamarlo de algn modo, se encuentra la simulacin al Paso. Veamos un caso concreto.

Listado fuente.
Para los objetivos de nuestra clase tutorial, hemos preparado el programa siguiente que permitir al PIC controlar los semforos. Este programa en un archivo fuente llamado TL.ASM.
LIST objetivo #include "P16F84.INC" temporal CBLOCK 0x10 state l1,l2 ENDC org goto org alto: goto sin hacer nada. setports: 0 setports 4 alto ; vector de inicio. ; salta al codigo de inicio ; vector Interrupt. ; sentarse a esperar ; cabecera del archivo Include ; Macro de memoria p=16F84 ; PIC16F844 es el procesador

clrw movwf PORTA antes de habilitarlo. movwf PORTB antes de habilitarlo. bsf STATUS,RP0 clrw los bits como salida. movwf TRISB bcf STATUS,RP0 initialise: clrw movwf state

; ;

; poner cero en W. Asegura que PORTA es cero Asegura que PORTB es cero todos

; Selecciona Bank 1 ; Mascara para ; poner en registro TRISB. ; Regresa al Bank 0. ; estado inicial. ; ponlo. ; Convierte

loop: call getmask mascara de bits. movwf PORTB

state

; escribelo en el portb

incf W. andlw movwf call goto

state,W 0x04 state wait loop ; ; ; ;

Incrementa

state

en

mantener cerca de cero. Ponlo en a la memoria Esperar y lazo

; Funcin para devolver mascara de bits del estado actual en puerto de salida. ; El nibble superior contiene los bits para un juego de luces y el es ambar ; nibble bajo los bits para otros juego. Bit 1 es rojo, 2 ; y bit 3 es verde. El bit 4 no se usa. state,W PCL,F 0x41 0x23 0x14 0x32 ; mueva state a W ; aadir la compensacin de W a ; state==0 es Verde y Rojo ; state==1 es Ambar ; state==3 es Rojo y Verde ; state==4 es Reojo/Ambar y

getmask: movf addwf PCL retlw retlw Rojo/Ambar retlw retlw Ambar. wait: w1:

; Funcin que usa dos lazos para alcanzar un retardo. movlw 5 movwf l1 call decfsz goto return clrf decfsz goto return END wait2 l1 w1 l2 l2 w2

wait2: w2:

De hecho, hay un error deliberado en dicho cdigo, esto lo veremos ms adelante. Este listado lo puede encontrar en los ejemplos del propio Proteus.

Enlazando el archivo fuente.


La siguiente etapa debe enlazar el programa al diseo para que podamos simular su comportamiento. Hacemos esto con las rdenes sobre el Men Source. Ir al Men Source y ahora seleccionar la Orden Agregar/Quitar Archivos Source. Hacer click en botn Nuevo, buscar (Change) hasta alcanzar el directorio "Samples\Tutorials" y seleccionar el archivo TL.ASM. Hacer click sobre Abrir y el archivo debera aparecer en la lista bajo el Nombre del archivo de Cdigo original. Ahora tenemos que seleccionar el instrumento de generacin de cdigo para

el archivo. Para nuestros objetivos el instrumento MPASM bastar. Esta opcin debera estar disponible de la lista desplegada y entonces pulsando el botn izquierdo se seleccionar de forma habitual. (Notar que si se planea usar un ensamblador nuevo o el compilador por primera vez, se tendr que registrar usando la orden de Definir Instrumentos de Generacin de Cdigo). Finalmente, es necesario especificar que archivo debe ejecutar el procesador. En nuestro ejemplo este ser tl.hex (el archivo exadecimal producido por MPASM subsiguiente al tl.asm ensamblado). Para enlazar este archivo al procesador, botn derecho sobre el PIC en el esquema y pulsar luego el izquierdo sobre Editar Propiedades. Esto crear la forma de dilogo de Componente de Revisin que contiene un campo para el Archivo de Programa. Si esto no esta ya especificado en el tl.hex entrar a mano la ruta al archivo o buscar la posicin del archivo va el botn '?' a la derecha del campo. Una vez que usted ha especificado el archivo exadecimal a controlar pulse Aceptar para salir del dilogo. Ahora ya hemos enlazado el archivo fuente al diseo y hemos especificado el Generador de Cdigo que se usar. Una explicacin ms detallada sobre el Sistema de Control de Cdigo est disponible en la documentacin de ayuda.

Simulando el circuito.
Para simular el circuito, pulsar con el ratn sobre el botn Play del panel de animacin en el inferior de la pantalla y djelo. La barra de estado debera aparecer con el tiempo que la animacin ha sido activa. Tambin deberamos notar que uno de los semforos es verde mientras el otro es rojo y el estado lgico de los pines se puede ver sobre el esquema. Nota, sin embargo, que los semforos no cambian su estado. Esto est previsto, un error (bug) deliberado que hemos introducido en el cdigo. En esta etapa, sera apropiado eliminar fallos de nuestro programa e intentar aislarlos del problema.

Depurar el programa.
Para asegurar que estamos atentos en la eliminacin de fallos del circuito, pararemos la simulacin corriente. Una vez que se ha hecho esto se puede comenzar a eliminar fallos, presionando CTRL+F12. Dos ventanas deberan aparecer - 1) propiedad valores CPU Registros corrientes y 2) propia que muestra el cdigo fuente original del programa. Cualquiera de estas puede ser activada en el Men Debug es un servidor de otras ventanas informativas. Tambin podemos activar la Ventana Watch Window en la que podemos supervisar los cambios apropiados de la variable state. Una explicacin completa de estas caractersticas est disponible en la seccin titulada Watch Window en la documentacin de ayuda. Centrndonos por ahora en la ventana Source, en el lado izquierdo notar el

icono flecha sobre punto rojo. Esto, con la lnea resaltada indica la posicin actual del contador de programa (PC). Para poner un punto de interrupcin (breackpoint) aqu pulsar ENTER, el punto de ruptura siempre se resaltar la lnea. Si quisiramos limpiar el punto de ruptura lo podramos hacer pulsando ENTER otra vez, pero en este momento lo dejaremos puesto.

Ajustar el Punto de Ruptura.


Mirando el programa, se pueden ver los bucles rotar sobre s mismo en un ciclo que se repite. Por lo tanto es una buena idea el poner un punto de interrupcin al principio de este lazo antes de empezar. Esto se puede hacer, pulsando el botn Pausa y resaltando la lnea (en la direccin 000E) con el ratn y entonces pulsar F9. Luego pulsar F12 para poner el programa a correr. El programa se detendr en el punto de ruptura que pusimos al principio del bucle. El programa en el Men Debug da una lista de las llaves de depuracin, pero principalmente usaremos F11 para seguir el programa. Ahora pulsar F11, entonces la flecha roja de la izquierda (puntero) bajar a la prxima instruccin. Qu hemos hecho realmente, hemos ejecutado la instruccin "clrw" y se ha parado. Se puede verificar esto, viendo el registro W en la ventana de CPU Registros, advirtiendo que se ha puesto a cero. Necesitaramos determinar lo que esperamos que suceda en la ejecucin de la prxima instruccin y entonces probarla, para ver si sucede realmente. Por ejemplo, la prxima instruccin del programa, debe mover el contenido del registro W al PUERTO A, es decir el Puerto A se debe limpiar. Debe advertirse que, ambos puertos han sido aclarados, listos para la salida (como indica el registro TRISB) y que la variable state ha sido puesta correctamente a 0. Ejecutar esta instruccin y verificar en la ventana CPU Registros, que esto es verdad. Continuar en esta lnea, hasta que se alcance el punto de ruptura por segunda vez. Para ver mejor como se producen los pasos, pongamos otro punto de ruptura justo en la lnea 0015, pulsando F9 y sigamos. Como esto es una funcin de CALL (llamada) tenemos la opcin de al Paso (pulsando F10), pero para asegurarnos pasaremos por cada instruccin. Al pulsar F11 aqu nos saltar a la primera lnea ejecutable de la funcin de getmask y se parar. Al dar un paso ms, vemos que la operacin move era acertada ya que se 'aterriza' en el lugar correcto, para agregar una desviacin de cero en la tabla de consulta. Por lo tanto, cuando volvemos al programa principal, tenemos la mscara que nosotros esperbamos. Dar an un paso ms para escribir la mscara al puerto y podemos ver el resultado correcto en el esquema. Un nuevo paso otra vez para incrementar state, tambin es un xito como se ve en la ventana CPU Registros, donde el valor para el registro W es incrementado en 1. Un paso nos tomar la instruccin diseada para mantener state cerca de

cero cuando se incrementa por arriba de 3. Esto, no funciona como debera, se puede ver en la Ventana Watch. Claramente, state se debe incrementar aqu para indicar 1 en la orden, para poner la mscara correctamente en la prxima ejecucin del lazo. Nos tomar un paso la instruccin diseada, para mantener el registro state cerca de cero, cuando se incremente por encima de 3. Esto, no funciona como debera, se puede ver en la Ventana Watch. El registro state debe ser claramente incrementado para indicar 1 aqu de modo que la mscara sea puesta correctamente en la prxima ejecucin del lazo.

Encontrar el fallo (bug).


Un vistazo ms de cerca revela que el problema es causado por la orden AND con 4 en vez de 3. Los estados que queremos ver de la tabla son 0,1,2,3 y cualquiera de stos sumado (ANDed) con 4 da 0. De ah que al correr la simulacin el estado de los semforos no cambia. La solucin del problema es cambiar simplemente en la instruccin AND (sumar) a state con 3 en lugar de 4. Esto significa que state se incrementar a 3 y cuando el registro W es incrementado a 4 state devolver un 0. Una solucin alternativa sera de probar simplemente para el caso cuando el registro "W" tenga 4 y para reiniciarlo poner a cero. Este es un corto ejemplo que ilustra lo bsico de las tcnicas de depuracin de fallos disponibles en Proteus VSM, hay mucha funcionalidad adicional disponible. Se recomiendan que se mire la seccin sobre Nivel de Depuracin de cdigo fuente (Source Level Debugging) para una explicacin ms detallada. NOTA. En prximos artculos, siempre que lo requiera el caso, tratar de utilizar este programa de simulacin y depuracin que es Proteus, para mostrar otras cualidades de esta herramienta, de modo que el interesado pueda ampliar sus conocimientos. Este pequeo manual producto de mi experiencia, parte de la ayuda que acompaa al Proteus y de lo aprendido en los tutoriales que tan bien ha elaborado el profesor Germn Tojeiro, al que quiero felicitar desde aqu.

MICROCONTROLADORES PIC I
Sabado, Octubre 03, 2009_______________________ Incluir en favoritos si quiere volver a visitarnos. Creado por: V. Garca.

Introduccin.
Bienvenidos al inicio de la clase "Microprocesadores PIC". Estas pginas, mostrarn cmo se forma la estructura bsica del dispositivo, directamente por el programa, mtodos y tcnicas, queremos acercarnos a uno de los microcontroladores que, por diversas razones ms auge ha adquirido en los ltimos tiempos, podemos decir que, ha invadido nuestras expectativas de trabajo, con un amplio margen de aplicaciones. Habr sugerencias sobre como modificar el cdigo para que usted pueda adaptar el PIC para satisfacer sus necesidades dentro de sus usos. Incluir los mnimos diagramas de arquitectura internos, esto suele conducir a la turbacin. Si alguien quiere mirar las hojas de datos (datasheet), entonces puede localizarlos en el sitio web de Microchip. Esto es necesario al principio, ya que, nadie ha empezado desde CERO AL CUADRADO, toda la ayuda disponible va dirigida al principiante. Estando apartado, como educador durante los pasados aos, puedo ver esto y si Ud. est de acuerdo, le fascinar con el acercamiento que he hecho. Esto no es un acercamiento convencional ya que esto implicara muchos trminos nuevos y complicaciones. Esto es, un ACERCAMIENTO SIMPLE, una vez que se domine el arte de programar, podr poner un programa con sus habilidades junto con la informacin del mismo en sus proyectos. Como digo, una marea de usuarios, estudiantes e ingenieros vienen utilizando para sus proyectos, algn microcontrolador de la familia PIC. Doy por supuesto que, el lector dispone de conocimientos bsicos sobre electrnica digital, para los usuarios ms avanzados o incluso con una formacin media, podrn resultar estas primeras entregas algo superfluas, pero ya llegarn los captulos avanzados. Aqu presentare unos artculos sobre las posibilidades, rutinas y proyectos que, se han creado para tal fin, alguno me han llegado de colaboradores o algunos que me he atrevido a traducir a nuestro idioma [castellano], para que tambin los que utilizamos este idioma, podamos aprender y llevar a cabo los ejercicios que se proponen y as obtener un conocimiento mayor y ms profundo si cabe, de unos microcontroladores que, nos pueden aportar una solucin tanto personal como profesional para nuestros proyectos. Con esta documentacin el estudiante, de nuestros artculos PIC, estar preparado para la programacin de estos dispositivos y para el diseo de sistemas digitales y/o analgicos basados en los mismos. Otro objetivo es, hacer lo ms econmico posible estos artculos, reduciendo en lo posible los gastos, aunque sin embargo, los estudiantes sern capaces de hacer estos ejercicios con muy pocos gastos, an as, inevitablemente habrn algunos pequeos gastos. Para empezar, deberemos centrar nuestro esfuerzo en unos chips o dispositivos muy concretos. Microchip fabrica una amplia gama de

microcontroladores y distribuye los microcontroladores PIC, ofreciendo un entorno de desarrollo semi-gratuito, se trata del MPLAB, con esta aplicacin como veremos, podemos programar, compilar y simular nuestros proyectos. Los microcontroladores PIC, basados en la arquitectura RISC (Juego Reducido de Instrucciones), contemplan la mayora de las caractersticas de esta arquitectura, destacando el juego de instrucciones homogneo, reducido nmero de instrucciones y alta velocidad. Hay muchas versiones de chips diferentes disponibles, algunos tipos bsicos de memoria reducida, otros superiores los que tienen convertidores digitales o analgicos y hasta los constituidos por A/D y PWM. Para ayudar al principiante a entrar en la programacin, los microcontroladores PIC16F84A y los PIC12C508A, en adelante nos referiremos con 'F84 al PIC16F84 o '508A al PIC12C508A. Cuando se aprende a manejar uno de estos chips, conociendo su arquitectura y su reducido repertorio de instrucciones, ser muy fcil aplicar los principios a otros tipos de la gama.

En estos artculos describiremos los aspectos relevantes para el uso y control del 'F84A es la versin con un "puerto y medio" y el ms pequeo como es el '508A, ambos dispositivos son muy pequeos en el mundo de los 'micros' pero ambos son el medio para empezar. La designacin de pines de ambos se muestra en estas imgenes.

Se ha elegido la gama de dispositivos PIC, porque son los ms econmicos y quizs lo mejor para el principiante. Quizs alguien se pregunte por qu he realizado tanta informacin para la programacin de estos chips, cuando ya existe una enorme cantidad disponible en libros y en otros sitios de la red desde hace tiempo y he de aadir, muy buena. Una razn es que los seguidores de este sitio, habrn comprobado que desde hace aos se presentan distintos tratados sobre la electrnica siempre desde un aparente desorden, quiero decir, sin jerarqua de que artculo va antes de cual otro, hasta cierto punto, esto obedece a un sistema con el que se pretende que nadie sienta la necesidad hacer un ordenado mtodo de la adquisicin de conocimientos. Lo cotidiano de un tcnico es que, cada da aprende una nueva tcnica para desarrollar un trabajo y sin duda, sobre la marcha aplica sus conocimientos, sin embargo nadie le indica como aplicarlos, simplemente ocurre. Por lo tanto, creo que, el mtodo de cmo se adquieren los conocimientos no es muy importante, lo verdaderamente importante es comprender lo que se lee. Se que para algunos, estructurar los temas responde a la experiencia de que, el usuario que por primera vez estudia los micros o microcontroladores, le resultar mas sencillo aprender primero lo referente a la constitucin interna del dispositivo y la arquitectura general de los microcontroladores, para una vez dominada sta, pasar entonces a los detalles electrnicos de la circuitera y la programacin. Sin embargo, en este manual no se establece ese orden, sino que, el propio usuario tiene la flexibilidad para optar por otras secuencias, esperando generar as, mayor inters en seguir aprendiendo. Y esto es lo que he hecho. No se necesita saber el lgebra Booleana, matemticas complejas o la forma de cmo hacer un doble XOR, haremos todo de manera simple y se ser capaz de programar. El 'curso' tambin muestra como comunicar (interfaz) los chips con dispositivos externos, tomando ideas de un proyecto y aplicndolas a otro, se puede crear un circuito totalmente nuevo con la mayor destreza.

Alguien dijo, "hay una cosa asombrosa sobre la programacin, un programa puede ser producido usando una idea sumamente compleja o una idea muy simple. El resultado final es el mismo, aunque el caso simple pueda tener unas instrucciones ms para alcanzar el resultado final". Y, quien se preocupa por unas pocas instrucciones de ms, cundo el micro procesa sobre 1.000.000 de instrucciones por segundo, s, un milln por segundo!

EL PIC12C508A.
Comenzaremos con un programa simple de siete lneas para controlar un LED en un prototipo que, llamaremos Destello '508A. Recuerde dar nombre a sus experimentos, ya nos ocuparemos de esto. No se preocupe por ahora, si no entiende el significado de los parmetros que siguen. El programa enciende un LED, esto es todo lo que hace. El objetivo de este programa es mostrarle el nmero mnimo de lneas de cdigo requerido para conseguir que haga algo el microcontrolador PIC.
Inicio BSF 03,5 MOVLW 3E MOVWF 06 BCF 03,5 Salida MOVLW 01 MOVWF 06 (enciende LED) GOTO Salida ; ; ; ; inicia el registro mueve 3Eh = 0011 1110b al registro W copia W en f, apaga el bit0 o GP0 bit de borrado a 1 la salida GP0

; inicia lazo de retardo ; copia W en f, pone

; retorna al principio del lazo.

Este simple programa para el 12C508A, iluminar un LED, repitiendo esta secuencia de forma indefinida, hasta que falte la energa al circuito. El circuito consta de un LED adems del '508A, conectando tres patillas del CI, las dos de energa y la correspondiente al pin 7 (Propsito General In/Out lnea GP0) y el programa. Este sera el organigrama que ilustra esta rutina que hace lucir un LED.

Esta figura, muestra un programa con los 4 pasos siguientes: Inicio, pone la salida activa [1] (inicia lazo), retardo de encendido de 0'1 segundo por la propia instruccin, desactivar pone la salida a [0] y produce un retardo de apagado de 0'9 segundos, volviendo al principio del lazo (loop), no vuelve a "inicio", solo a la etiqueta "salida". La parte que se debe recordar es que, el procesador (el corazn del microcontrolador) debe mantenerse corriendo (latiendo) todo el tiempo. El chip contiene un oscilador de 4MHz, sta frecuencia es dividida internamente por 4 para que en cada microsegundo, sea procesada una instruccin. Esto permite hacer muy fcil, rutinas de retardo exactas. En este caso no necesitamos tiempos de retardo exactos, sin embargo podremos obtener resultados va programa y el circuito trabajar exactamente como se proponga. El programa requiere de 0'1 segundo, esto quiere decir que se tendr que producir un retardo de 100.000 ciclos [sin hacer nada], mientras la salida se mantiene encendida (EN). Acto seguido, el mismo programa solicita 0'9 segundos. Esto significa un retardo de 900.000 ciclos de nuevo, mientras la salida est en la condicin apagado (AP). La rutina necesaria est descrita a continuacin (se puede copiar y pegar), son unas pocas lneas, se distinguen tres columnas: Etiqueta
Flash

Comandos
BSF 03h,5 MOVLW 00 MOVWF 06 BCF 03h,5

;Comentarios
;Selecciona Pagina 1 ;pone literal 00 en W ;para hacer GP0 salida ;y vuelve a pagina0

Loop1

BSF 06,0 ;Pone a 1 el bit0 del archivo 06h CALL Delay1 ;salta a Delay1 BCF 06,0 ;Pone a 0 el bit0 del archivo 06h

AA1

MOVLW 09 MOVWF 0C CALL Delay1 DECFSZ 0C GOTO AA1 GOTO Loop1 MOVLW 82h MOVWF 1A DECFSZ 1B GOTO DelX DECFSZ 1A GOTO DelX RETURN

;fuerza un 9 en W ;activa lazo ;salta al retardo Delay1 ;decrementa registro 0Ch y salta si es Cero ;repite lazo ;salta a Loop1 ;crea 130 lazos ;256 decrementa para volver a 1A ;2s instrucciones

Delay1 DelX

Sin embargo, antes de empezar a realizar este ejercicio, debera tenerse en cuenta que, un microcontrolador PIC12C508A, slo se puede 'quemar' una vez (OTP), debido a que las celdas que componen su memoria reciben una descarga elctrica durante la programacin, el efecto producido 'quemado' no se puede cambiar. El fabricante garantiza que el chip es capaz de mantener el programa durante muchos aos. Segn esto, antes de utilizar el '508A, debemos asegurarnos completamente que el programa nos satisface y cuando el proyecto entero est terminado, entonces pasarlo al '508A. Hay otra forma ms rpida de conseguir experiencia en nuestras practicas de programacin si utilizamos un chip PIC16F84A. Esta es una versin mayor del '508A y por suerte casi todas las caractersticas del '508A se pueden encontrar en el 'F84. Esto quiere decir que podemos tratar el 'F84 como un '508A y usar los registros y los pines de entrada/salida que corresponden al '508A, el cdigo escrito para el 'F84 puede ser cargado en un '508A y este puede ser incluido en un proyecto. Como el '508A es mucho ms econmico que el 'F84 y nos propusimos hacer un proyecto muy barato, este es el otro motivo, adems porque el 'F84 puede ser programado y borrado cerca de 1.000 veces y esto nos ahorra malgastar chips. Podemos hacer todas nuestras prcticas de programacin con un solo 'F84 y poner el programa acabado, en un '508A y el proyecto estar terminado. Ver en los siguientes artculos que, el 'curso' es completamente prctico y la mayor parte se consigue con la programacin. Nuestros objetivos se deben conseguir con la programacin, as que, puede producir los proyectos de microcontrolador y vender sus propios chips programados por poco. Esto es algo que, nunca ha sido posible hacerse antes. Esto quiere decir que, nuestro 'curso' est en marcha a pesar de todo. Por este motivo, no censuro a cada uno de los grupos de usuarios del PIC o cada uno de los productores de programadores econmicos ya que, el lector necesitar la ayuda de estas fuentes, una vez que consiga su 'equipo' para la programacin. Todos estos otros grupos tienen una considerable entrada de valores por la programacin de PIC, se entiende, otra cosa que debe recordar, es el concepto de programacin mediante una Biblioteca de Rutinas

y la utilizacin del 'F84A como una herramienta de desarrollo para sus proyectos simples. Los dos chips en los que nos centraremos como se ha dicho, son el PIC12C508A y PIC16F84A, estos le permitirn que pueda empezar a crear proyectos equivalentes a 6 u 8 chips (o an ms de la vieja tecnologa de puertas y contadores etc.), sus cosas y otros productos como cerraduras electrnicas que usan una tarjeta para el acceso, las tarjetas de seguridad que transmiten un dato o ms, demostraciones, juegos, dispositivos telefnicos, alarmas, dispositivos interfaces, osciladores, en robtica y otras partes. Como dijo un programador: ' Ya nunca usar el 555 otra vez '. Cada una de las ideas y proyectos que ya han sido producidos sobre y para un mdulo de 'tipo intrprete' ahora puede ser creado con un slo chip y producido en menos de 1/4 del coste. Seguro que nuestro curso tendr la disculpas de los que ya programis con uno de esos mdulos caros. Bastante a menudo se les ocurrir una idea, que sea conveniente para su comercializacin. Entonces es cuando el proyecto tendr que ser convertido en un diseo mucho ms barato para hacerlo comercializable. Y aqu es donde intervenimos, para que el coste de un chip, prototipo (placa PCB), un juego de discos, programa, libros y ser capaz de lanzar su propio producto. Pero obviamente tendr que comenzar por el principio y familiarizarse con el cdigo y las capacidades de los distintos chips. Por lo dicho respecto al '508A, tomamos la decisin de usar el 'F84A.

EL PIC16F84A
Aqu se muestra visto por la cara superior el smbolo y nombre de las patillas o pines de un PIC16F84A y similares, ms adelante estos datos se ampliarn y reincidiremos sobre ellos.

En este dispositivo sus pines estn organizados en puerto y medio, es decir,

los pines RA0-RA4 corresponde a medio puerto A y los pines RB0-RB7 son el puerto B, a parte se encuentran los pines de oscilador OSC1 y OSC2, el de MCLR (aclarado maestro) y los propios de suministro de energa (Vdd y Vss). A continuacin, describir ligeramente para que se utiliza cada uno: RA0 a RA4 RA es un puerto bidireccional (I/O). Es decir este puede ser configurado como una entrada o una salida, segn interese. El nmero despus de RA es el bit relativo, el nmero puede ser (0 a 4). As que, tenemos un puerto de 5 bit direccional donde cada bit puede ser configurado individualmente como Entrada o Salida. Recordar que al tratarse de un puerto, un bit se considera una lnea o pin del puerto. RB0 a RB7 RB es un segundo puerto bidireccional (I/O). Esto se comporta exactamente del mismo modo que RA, excepto que hay 8 bits implicados, el nmero puede ser de 0 a 8 y cada bit como en RA, puede ser configurado individualmente como Entrada o Salida y tambin es una lnea (pin) del puerto. OSC1 y OSC2 Estos pines conocidos tambin como CLKIN y CLKOUT, en CLKIN puede conectarse un reloj externo, o donde conectamos un cristal, red RC o un resonador externo, para que el microcontrolador tenga una especie de 'pulso cardaco'. Debemos recordar que segn el tipo de generador que decidamos usar de los descritos, es el que debe usarse a la hora de 'quemar' el programa, ya que si se cambia no oscilar o puede dar problemas de oscilacin. MCLR Este pin tiene dos utilidades, es usado como (Reset) para borrar posiciones de memoria dentro del PIC (cuando queremos reiniciar de nuevo el programa). En el uso normal, este pin se conecta al terminal de suministro positivo, personalmente recomiendo intercalar un resistor de al menos 1k. El segundo uso es en el momento de la programacin de este chip, el terminal MCLR es el pin por el que se aplica la tensin de programacin por el software de quemado, en ese momento no se usa el resistor de 1k. INT Este es un pin de entrada que puede ser supervisado. Si este pin se pone alto (1), haremos que el programa comience de nuevo, se pare o cualquier otra funcin simple que deseemos. Bsicamente se usa para " despertar" al dispositivo como ya se describir en otros artculos. TOCK1 Este pin es otra entrada de reloj, que maneja un temporizador interno. Este se utiliza en casos extremos en ausencia del reloj principal. Normalmente no se utiliza ste modo. VDD y VSS

Estos son los pines de suministro de energa, VDD es la lnea del positivo y VSS es la lnea del negativo, masa o 0V. La tensin mxima de la fuente de suministro que se puede usar sin deteriorar el dispositivo para su normal funcionamiento son 6V y el mnimo de 2V, aunque recomiendo utilizar un diodo rectificador de paso en el caso de tensiones de 6V.

NOCIONES
Todo lo que hace el micro es, configurar y manejar bits entre distintos registros. Estos registros estn implementados en la memoria RAM interna con un ancho de 8 bits, cada bit de cada registro o archivo tiene una funcin especifica. Los registros de las primeras posiciones en la memoria RAM, como ya se describe en otro artculo, se les ha dado el nombre de SFR (Registros de Funcin Especial), los de las siguientes posiciones son los de propsito general y se llaman GPR. EL PIC16F84A DISPONE DE DOS CLASES DE MEMORIA. Hay dos bloques de memoria en el PIC16F84A, estos son la memoria de programa y la memoria de datos. Cada bloque tiene su propio bs, de modo que el acceso a cada bloque puede ocurrir durante el mismo ciclo del oscilador. Una es, la memoria flash que se encarga de almacenar y gestionar el programa, la memoria del 'F84A es de 1k (1024 celdas o palabras) cada celda tiene un ancho de palabra de 14 bits y tiene la particularidad de que aunque se desconecte o falte la energa, no se altera su contenido. Sin embargo, el contenido permite ser reescrito sobre 10.000 veces, por medio de los llamados grabadores de microchips, con los que se procede al 'quemado', borrado y lectura de los programas. La memoria de datos adicional mayor puede ser direccionada en la RAM de propsito general y los Registros de Funcin Especial (SFRs). La operacin de los SFRs que controla el "corazn" se describe aqu. Los SFRs usados para controlar los mdulos perifricos son descritos en la seccin que habla de cada mdulo individual perifrico. El rea memoria de datos tambin contiene la memoria de datos EEPROM. Esta memoria no es directamente mapeada en la memoria de datos, pero es mapeada indirectamente. Es decir, un puntero de direccin indirecta, especifica la direccin de la memoria de datos EEPROM para

lectura/escritura. Los 64 octetos de datos de la memoria EEPROM tienen la gama de direccin 00h-3Fh.

Memoria de Programa.
Los PIC16FXX tienen un contador de programa de 13 bit capaz de direccionar un espacio de memoria de programa de 8 kilobyte x 14. Para el PIC16F84A, el primer kilobyte x 14 (0000-03FFh) fsicamente esta implementado (figura de la izquierda). El tener acceso a una posicin superior a la direccin fsicamente puesta en prctica causar un recirculado. Por ejemplo, para posiciones 20h, 420h, 820h, C20h, 1020h, 1420h, 1820h, y 1C20h, la instruccin ser la misma. El vector RESET est en 0000h y el vector interrupt est en 0004h, esto le puede parecer enrevesado, sin embargo pronto ver como se le aclaran las ideas.

Memoria de Datos.
La memoria de datos se divide en dos reas. La primera, es el rea de Registros de Funcin Especial (SFR), mientras la segunda es el rea de Registros de Propsito General (GPR). Los SFRs controlan el modo de operacin del dispositivo. Partes de memoria de datos son mapeadas, esto es tanto para el rea SFR como para el rea GPR. El rea GPR es mapeada para permitir una capacidad mayor de 116 octetos de RAM de propsito general. Las reas mapeadas del SFR son para los registros que controlan las funciones perifricas. Estos bancos requieren del empleo de bits de control para la seleccin de banco. Estos bits de control mencionados antes, se localizan en el registro STATUS. La figura de la derecha, muestra la organizacin del mapa de memoria de datos. Las instrucciones MOVWF y MOVF pueden mover valores del registro W a cualquier posicin en el archivo de registro ("F") y viceversa. Se puede tener acceso directo a toda la memoria de datos utilizando la direccin absoluta de cada archivo de registro o de modo indirecto mediante los Registros de Funcin Especial (SFR). El direccionado indirecto usa el valor actual del bit RP0 para el acceso a las reas mapeadas de memoria de datos.

Como se ha dicho, la memoria de datos se divide en dos bancos que contienen los RPG y los SFR:

El banco 0 se selecciona por el aclarado (puesta a 0) del bit RP0 (STATUS<5>). El banco 1 se selecciona al poner a 1 (Set) el bit RP0.

Cada Banco se extiende hasta 7Fh (128 bytes). Las doce primeras posiciones de cada Banco son reservadas para los Registros de Funcin Especial, el resto son Registros de Propsito General, implementados en la prctica como RAM esttica. Los Registros de Funcin Especial se usan por la CPU y funciones perifricas para controlar la operacin del dispositivo. Estos registros son la RAM esttica. Los registros de funcin especial pueden ser clasificados en dos juegos, central y perifrico. Aquellos asociados con las funciones principales son descritos en esta seccin. Aquellos relacionados con la operacin de los rasgos perifricos son descritos en la seccin para aquel rasgo especfico.

EMPEZAMOS
Resumiendo, cuando se pone a correr el micro, la primera posicin a la que llega es la 0000h, lo que se conoce por Vector de Reset, esto puede ocurrir por cualquier causa externa o interna como, inicio, reinicio, reset, despertado por cambio en los pines, timer0, etc. como ya describir en otros artculos. Luego en la posicin 0004h, se encuentra el Vector de Interrupcin, a esta posicin llega el programa cuando esta habilitada la interrupcin y ocurre un evento bien sea interno del micro o por una interrupcin externa. Ver la imagen de la izquierda. Hay un espacio de memoria destinada al programa del usuario, puede apreciarse que slo se han implementado 1k (hasta 03FFh). A partir de las ltimas posiciones hay un espacio de memoria reservado, este espacio est en la posicin 2007h y se conoce como Palabra de Configuracin, en el que se configura el oscilador, se habilita el Temporizador Perro Guardin y otros. A esta parte slo se accede para escribirla mediante el interfaz de usuario y grabador en el quemado del chip. La otra clase es la memoria RAM , que est compuesta por dos partes similares llamadas bancos, cada banco dispone de 80 bytes (00h a 4Fh). El ancho de palabra de estos bancos es de 8 bit. En los 12 primeros registros del 00h al 0Bh de cada banco se encuentran los registros de funcin especial SFR que se usan permanentemente por el programa, en los que se configuran los puertos y dems opciones ya descritas. Los siguientes 68 registros desde 0Ch a 4Fh, estos son los registros de propsito general GPR, usados por el usuario. Ver imagen de la derecha. Al conectar la energa al micro, el micro empieza a correr con el contenido por

defecto del valor de los registros FSR y empieza a correr nuestro programa. El contenido tanto de los registros SFR como GPR con los que hemos cargado el programa, estarn cambiando continuamente al ritmo de ejecucin de las lneas del propio programa, por lo que en el momento de desconectar la energa, los valores contenidos en los registros SFR y GPR definitivamente se pierden. Los registros con el mismo nombre en ambos bancos, indican que el contenido es el mismo en ambos, esto se conoce como mapeado. Existe otro tipo de memoria de 8 bits de ancho, muy utilizada la EEPROM, que se usa como memoria permanente de datos. El diferente ancho de palabra de estas memorias la RAM-EEPROM de 8 bits y la FLASH de 14 bits estn conectadas a la CPU con buses diferentes. Esta arquitectura tiene la ventaja de que el tamao de las instrucciones no est relacionada con los datos de la RAM lo que permite ser optimizada para que cualquier instruccin ocupe una sola posicin de la memoria permitiendo una mayor velocidad y menor longitud de programa. El cometido de los principales registros SFR, est descrito en el artculo 'descripcin de instrucciones' de esta serie de artculos. Este artculo continua en la segunda parte. En prximos artculos seguiremos con descripciones y prcticas para adquirir la practica y experiencia en programacin.

Programacin de micro chips PIC


Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si

quiere volver a visitarnos.

Introduccin a programar PIC.


Este es un acercamiento a la escritura de un programa, muy lineal. Muchos escriben y producen subrutinas muy pequeas con saltos (llamados GOTO) de una subrutina a otra de modo que los productos saltan por todas partes como 'palomitas de maz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo este tipo de disposicin es muy difcil de seguir por un lector. Es mucho ms fcil seguir la secuencia de acontecimientos y as, muy pronto ser capaz de escribir programas similares a los de la seccin de proyectos de cualquier empresa. De nuevo recordamos que el PIC12C508A slo debera ser usado en proyectos donde coste y ahorro espacial tiene suma

importancia. Los artculos que necesitaremos son: Biblioteca de trminos y Lista de rutinas. Juego de instrucciones para ' 508A y F84. Un archivo hex del final de estos artculos. Alguna de las siguientes herramientas: Programador ICProg u Tablero 'protoboard' para - Un chip reprogramable PIC16F84A. 1. 2. 3. 4. 5. Cualquier proyecto para un chip ' 508A.

otro

similar. experimentos.

Por donde empiezo.


Lo normal es que, el lector se pregunte: por donde comienzo?. Este artculo es el punto de partida, con l se cubren dos de los microcontroladores ms pequeos y ms simples de la gama del PIC, son el '508A y el 'F84 que con los instrumentos de desarrollo que se describen, se puede entrar un programa con un bajo costo. Los dos micros internamente, son casi idnticos excepto un par de diferencias menores, no as en lo fsico: '508A
'F84A '508A 5 lneas de 13 lneas de entrada/salida entrada/salida 1 nica lnea de entrada 511 1020 direcciones direcciones para programa para programa 'F84A

1 nica 1.000 grabaciones grabacin posibles (OTP) 33 36 instrucciones instrucciones Hay diferencias entre los dos, pero para mantener las cosas simples, podemos pensar que el 'F84 es dos veces tamao del '508A. Si seguimos esta lnea, seremos capaces de desplazarnos de un dispositivo al otro segn la complejidad del proyecto. Ya que ambos microcontroladores tienen el mismo juego de instrucciones (hay diferencias muy pequeas descritas en otros artculos en estas pginas), el lector, slo tiene que aprender unas 33 a 36 instrucciones para ser capaz de crear un programa. Estas 33 o 36 se amplan a ms de 2.000 instrucciones cuando se considera

que cada bit en cada archivo puede ser puesto a EN [1] (Encendido, Alto), limpiado ([CLEARed], aClarado) o probado (TESTed), pero slo tenemos que recordar 33 palabras "similares al ingls" conocidas como mnemnicos, para crear un programa sin usar un leguaje de alto nivel. Una de las ventajas de los micros PIC es el margen de seguridad, esto significa que, el programa que se trasvasa a un chip no puede ser ledo por nadie ms, en el mejor de los casos slo pueden conseguir un juego embrollado de figuras. Un smil de un micro PIC es como un libro con las pginas en blanco, ste tiene un rea donde se coloca el programa. El programa lo crea uno mismo y lo carga en el chip mediante un dispositivo llamado "quemador". Aqu utilizaremos el quemador IcProg ya mencionado (si utiliza el XP o Win2000 , necesitar el driver adecuado), ambos son gratis y puede servir para gran nmero de dispositivos distintos, yo he probado algunos y todos son muy sencillos, con 4 hilos (seales) puede trazarse uno y usarlo "in-situ", como el Policristalino, del que ya trato en otro artculo. Como ya se ha dicho en la introduccin, hemos hallado un modo de permitir programar desarrollos en un '508A sin desperdiciar ningn chip. Para esto se usa un mdulo que se llama Quasi '508A. Este mdulo Quasi '508A, nos permite escribir programas por etapas y probarlos en un mdulo llamado el Expreso 12c508A 6V. El mdulo Quasi '508A es realmente un 'F84 cableado para que funcione como un '508A y esto significa que el programa se puede reprogramar cuantas veces sea necesario, durante el desarrollo del programa. El 'F84 constituye el mdulo Quasi '508A es quemado y sacado en los proyectos de Prcticas y para otras aplicaciones. Una vez se desarrolla y perfecciona el proyecto, ste puede ser quemado en un OTP ms econmico el '508A y ensamblado en el proyecto desarrollado, el programador mantiene la opcin de modificar el contenido. Este es el motivo por el que programar con PIC puede ser una forma provechosa de trabajo.

Qu necesito.
Para crear un programa para el '508A, disponemos de los artculos que se exponen en estas pginas y otras de otros autores. Los programas pueden ser escritos en un cuaderno o sobre papel, de all sern transferidos a un programa de computador, cada lnea se escribe con la ayuda de los mnemnicos, un lenguaje de programacin medio ingls, a medio camino entre usuario y compilador. De este modo el programa es convertido a cdigo hexadecimal mediante el programa MPLAB de MicroChip, es libre, sin costo y est disponible a travs del propio enlace. El archivo .hex creado, se enva al microcontrolador en formato binario (1's y 0's) para quemarlo en la memoria del chip. No debe preocuparse por la falta de espacio de programa de 1FF posiciones del ' 508A. Esto equivale a ms de 500 lneas de cdigo, si en unas pginas

de papel escribe 50 instrucciones, esto representa ms de 10 pginas. Realmente, slo se dispone de 255 posiciones para su uso, pero esto, evidentemente es un programa muy largo. Sin embargo, en el mejor de los casos, si se necesita un espacio mayor, recomiendo revisar la gama de productos de la empresa Microchip, es muy extensa y crece cada da. Un punto a recordar; cuando se escribe y desarrolla un programa, ste consistir en, muchas subrutinas que siguen a una rutina principal. stas subrutinas se llamarn una o muchas veces entre s. De modo que cuando un programa se hace largo, debemos encontrar cmo puede usar las subrutinas que ya se han escrito y entonces el programa se har ms eficiente.

NOTACIN EN HEX.
Todos los valores en un programa se escriben en HEX. Esto hace la escritura de un programa ms compleja, por la comprensin del hex que nos acerca un poco ms a cmo trabaja y nos permite resolver los valores para las lneas de entrada o salida de puerto individual. Los valores del programa se cargan en un registro llamado registro de trabajo (W), estos valores se llaman LITERALES. Un literal es simplemente otro nombre del valor o nmero. El cdigo hex tiene una base de diecisis nmeros que son: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A= diez, B= once, C= doce, D= trece, E= catorce y F= quince. Como se debe recordar, 12 en decimal es igual a 0C en hex y 16 en decimal es igual a 0F. Es fcil ver que 3E (igual a sesenta y dos) es un valor hex, para hacer fcil reconocer valores hex como 23 o 41 u 82, colocaremos una 'h' pequea despus del valor, as: 41h, 23h, 82h. Un registro puede contener un valor desde 00 a FFh que representa un valor desde cero a doscientos cincuenta y cinco en decimal. Vase que la pgina de hex valora de 00 a 1FF en otro de los artculos, para ver la notacin estructurada en hex. Puede que nos lleve algo de tiempo entender el hex, pero mientras se lo piensa, hay otro concepto que se debe considerar: BINARIO-a-HEX. Todos los registros del '508A y el 'F84 comprenden 8 "celdas" en las que se coloca un 'cero' o un 'uno'. Las ocho celdas se separan en dos grupos, uno de 4 celdas superiores y otro de 4 celdas inferiores. Las 4 celdas superiores llamadas 'nibble' alto y las 4 celdas inferiores, 'nibble' bajo. Para leer el valor completo de un registro hex, se combinan ambos 'nibble' alto y 'nibble' bajo. N Bit 7 6 5 4 3 2 1 0 Registro 0 0 0 0 0 0 0 0 nibble alto nibble bajo Cada lnea GP (una lnea GP es una lnea entada/salida de Propsito

General) corresponde a un bit en el archivo 06. La lnea GP0 (bit0) corresponde al Bit Menos Significativo (LSB) y GP1 corresponde al siguiente bit (bit1). Ahora, aqu viene el bit ms difcil de en tender, pero esto es lgico.
REGISTRO 06h

MSB
'508A F84A RB7 RB6 RB5

MSB
GP4 RB4 GP3 RB3 GP2 RB2 GP1 RB1

LSB
GP0 RB0

Para poner GP0 como lnea de salida, el bit menos significativo (LSB) en el archivo 06 debe ser 0, "0" significa salida.
Hacer GP0 BAJO: MOVLW 08 ;Carga w con 0000 1000 TRIS 06 ;carga el registro TRIS BCF 06,0 ;haz el bit 0 BAJO

Para poner GP0 como lnea de entrada, el bit menos significativo (LSB) en el archivo 06 debe ser 1, "1" significa entrada.
Hacer GP0 ALTO: MOVLW 08 TRIS 06; BSF 06,0 ;Carga w con 0000 1000 ; carga en registro de TRIS ;haz bit 0 ALTO

Suponga que quiere hacer GP0, GP1 y GP2 como entradas. Los tres bits bajos deben ser "1", esto pone el archivo = 0000 0111 = 07. Suponga ahora que quiere configurar GP3 como entrada, el valor del archivo ser = 0000 1000 = 08. Suponga ahora que quiere configurar GP5 y GP3 como entradas, el valor del archivo ser = 0010 1000 = 28h, el resto sern salidas. Se puede introducir cualquier combinacin de lneas como entrada o salida y es esencial entender la notacin en hex para poner el valor a cargar el archivo 06. El archivo 06 tiene un nombre genrico, se le conoce como Puerto_A y slo tiene 6 bits funcionales (no se si es casualidad que tenga 6 bits y le llamen registro 06), todos los dems archivos tienen 8 bits. Necesitamos conocer el valor hex cuando se cargue en un archivo por que puede tengamos que saber: a) Cuando cierto bit es puesto EN, en un archivo siendo incrementado. b) El archivo mximo que contendr una tabla. c) El modelo de salida cuando un contador ha sido 'cargado'. Al escribir programas, se implican valores binarios en todos las etapas y el hex es simplemente ms corto de mostrar que el binario usando 2 dgitos. El hex es fcil de ver y leer, adems mentalmente se puede convertir de binario a hex y de binario a hex muy rpidamente.

LOS ARCHIVOS.
El ' 508A contiene 32 archivos o registros de los cuales los primeros siete (00h a 06h) se llaman Registros de Funcin eSpecial (FSR) y los siguientes 25 (07h a 1Fh) son archivos o Registros de Propsito General (GPR). El F84 tiene doce SFR (00h a 0Bh) y los siguientes sesenta y ocho (0Ch a 4Fh) se llaman 'Archivos'. Veinte archivos son comunes al ' 508A y al F84. Estos son: 0Ch, 0Dh, 0Eh, 0Fh, 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h, 1Ah, 1Bh, 1Ch, 1Dh, 1Eh, 1Fh. Estos son, los archivos que usaremos. Cada archivo tiene 8 bits que pueden tomar el valor 0 o 1, cuando todos los bits son Cero (0000 0000), el archivo tiene valor cero. Cuando el LSB es 1, el archivo tiene el valor de 1, ya hemos mostrado como 'nibble' bajo en los incrementos del archivo F (ver Notacin de hex) al principio del artculo. El siguiente incremento despus de 0F produce 0001 0000 = 10h, luego 0001 0001 = 11h. Al incrementar del archivo 1111 1111 = FF darn la vuelta a 0000 0000. Antes de dejar el hex, hay una habilidad ms que necesitar. Esto convierte binario a hex luego podr poner bits EN [1] en un archivo. El ajuste de bits solos es fcil. Aqu est la tabla: Binario Valor Bit 0000 0001 = 01h = bit0 0000 0010 = 02h = bit1 0000 0100 = 04h = bit2 0000 1000 = 08h = bit3 0001 0000 = 10h = bit4 0010 0000 = 20h = bit5 0100 0000 = 40h = bit6 1000 0000 = 80h = bit7 Para poner EN [a 1] DOS o MS BITS en el 'nibble' alto o bajo, lalo. Recuerde, se llama bit ms bajo al bit0 y el ms alto es el bit7. Para poner EN los bit2 y bit3, el valor binario es: 0000 1100. Tmese como referencia la tabla anterior, en la que se puede ver que esto es 08h ms 04h. Y cmo se suma 08h y 04h? Simple, se toma el valor ms alto 08 y se aaden cuatro cuentas, as; + nueve, + A, + Be y + Ce, la cuenta nos da 0Ch. Para poner EN los bit6, bit5 y bit4, el procedimiento es: 0111 0000. Esto es 40h ms 20h ms 10h. Para hacer las cosas simples, tomamos los nibble altos, o sea, 4h ms 2h ms1h, esto suma 7h, entonces la respuesta es 70h. Otro ejemplo: para poner EN los bit7, bit6, bit5 y bit4, el procedimiento es: 1111 0000 = 80h mas 40h mas 20h mas 10h. El nibble alto de esto es: 8h+4h+2h+1h, empezamos con el 8 e incrementamos cuatro cuentas, as: nueve, A, Be y Ce, ahora incremento dos cuentas: De y E y entonces

incremento una cuenta eFe. Esto da F y le aado el nibble bajo 0, la respuesta es: F0h. Esto, le llevar algo de tiempo para tener pericia, pero trabaje sobre esto, ganar tiempo cuando lo domine.

EL REGISTRO DE TRABAJO (W)


El registro W o de trabajo es el registro ms importante en el chip. Este registro acta como una cesta en un supermercado, recogiendo un valor del programa, como un Literal, un byte de datos de una tabla, un valor de cualquiera de los archivos o bits de datos del puerto de entrada y entregndolo a otro archivo o al puerto de salida. El puerto de salida es el archivo 06 y cualquier valor entregado a este archivo va W, est disponible para transferirlo. Esto tambin ocurre al revs, cualquier valor del mundo exterior presente en este archivo, es entregado al archivo 06 y del archivo 06 ste valor puede ser pasado al registro de trabajo W. El registro de trabajo puede ser limpiado (puesto a cero) o cargado con un nmero (llamado literal). Los bits del registro de trabajo W no pueden ser comprobados, limpiados o poner EN ni intercambiar los nibbles, tampoco puede ser incrementado, decrementado o rotados sus bits, estas operaciones tienen que hacerse sobre un valor en un archivo. El registro de trabajo W es un concepto, no tiene una posicin de direccin, simplemente lo llamamos "W" en una instruccin, es simplemente 'El portador' o 'Ayudante' en el sistema.

EL DESIGNADOR.
Hay rasgos en el juego de instrucciones del PIC que lo hacen muy 'poderoso'. Por este motivo pensamos que una instruccin sola incorpora dos o tres cosas. En los primeros microprocesadores, una instruccin slo haca una cosa y por eso se necesitaban muchas instrucciones en el juego de instrucciones. Uno de los rasgos inteligentes del juego de instrucciones del PIC es el designador, ste es el nmero 1 o el 0 adicional a la instruccin para decirle al micro donde poner el resultado de la operacin. Si tomamos la instruccin ANDWF 0C,1 el resultado es colocado en el archivo 0C. Si usamos la instruccin ANDWF 0C,0 el resultado es colocado en el registro W. Hay una importancia obvia al seleccionar la instruccin correcta, con la primera instruccin se cambia el contenido del archivo 0C, mientras que en la segunda instruccin no cambia 0C y puede que no queramos cambiar 0C. Con algunas instrucciones es ms fcil de ver el objetivo del designador. Por ejemplo, MOVF 0C,1 simplemente mueve el contenido del archivo 0C dentro y fuera de 0C y cambia las banderas (flags). Esto no pone el contenido en W, para poner el contenido en W, debe ser usada la instruccin MOVF 0C,0.

Al escribir un programa es importante incluir el designador, si se olvida el compilador (MPASM) agregar un 'falta designador' y presentar la condicin. Se debe comprobar que no falta el designador, puede producir el resultado no requerido, por ejemplo: MOVF 0C,1 no pone el contenido de 0C en W, esto simplemente mueve el contenido (mete y saca) de 0C.

ESCRITURA DE UN PROGRAMA.
El programa en un ' 508A comienza en 000 y se extiende a 1FF, esto es un nmero hexadecimal y corresponde a 512 posiciones (512 lneas de cdigo). Slo podemos usar hasta 511 posiciones de direccin, la posicin superior es usada por el micro como un valor de calibracin (OSCCAL). Por las aplicaciones podremos hablar de (juegos, demostraciones, temporizadores, contadores, etc.) 511 lneas de cdigo es un buen tamao de programa, especialmente cuando se considera que el chip es capaz de tomar el espacio de 5 o ms chips en el proyecto. Antes de la escritura de un programa, se debera examinar los proyectos que se han incluido en este sitio, as como las Libreras de trminos y rutinas, para tener alguna idea de que se puede hacer con el micro. Esto tambin nos dar una idea de como son escritas las instrucciones y el tipo de instruccin requerida para una operacin particular. El modo ms fcil de aprender es con el ejemplo y gastando tiempo con proyectos y en mirar las rutinas de bibliotecas que nos iniciaran en los 'bloques de partida'. La mayor parte de las ideas que acuden escribiendo un programa no llegan a verse en la versin final del proyecto, vamos a ver lo que el programador piensa cuando l produce una rutina. En primer lugar, l tiene que resolver lo que el proyecto ha de hacer. l no se preocupa del programa o del micro, por el momento, solamente piensa lo que l quiere VER que el proyecto ha de hacer. En primer lugar produce una descripcin total en forma de ensayo, toma apuntes o produce un organigrama. Todo lo referente a micro, patillas, LED's de colores, tiempos y tipos de sonidos vendrn ms tarde.

ORGANIGRAMAS Y ORGANIGRAMAS.
Algunas escuelas de pensamiento creen que un organigrama es esencial para acertar el programa. Si el lector no est puesto con los smbolos de los organigramas o cmo producir tal carta, no se preocupe, otras escuelas consideran el tema, son absolutamente innecesarios. Para los que son entusiastas de los organigramas, slo hay tres smbolos de organigrama que tiene que conocer. Estos son: Ovalo de inicio o parada, rectngulo que ejecuta una operacin y el diamante de decisin donde tomar una decisin como un "SI" o "NO", "Entrada" o "Salida". Estas formas se conectan con lneas con flechas que indican la direccin de flujo del programa.

Un organigrama ayuda a otros a entender qu hace el programa y da una idea de su complejidad. El mejor modo de comenzar un proyecto nuevo es, escribir una descripcin de la operacin entera. Luego se separa en secciones y se coloca cada paso de 'operaciones' en un rectngulo. Cualquier etapa de toma de decisiones se colocan en un diamante, entonces se unen con lneas y flechas y Vaya! hemos producido nuestro propio organigrama! Despus se toma cada seccin y se convierte en los pasos que pueden ser realizados por el microcontrolador. Aqu es donde empieza la aplicacin de los conocimientos del programa. Para hacer esto tiene que entender el juego de instrucciones, slo entonces podremos escribir las instrucciones correctas. Es muy importante ponerlas en el orden correcto entonces el resultado ser exactamente como se esperaba.

EL PROGRAMA MS SIMPLE.
El programa ms simple se encarga de cargar el registro de trabajo W con el valor "1" y la salida del mismo en GP0. Si un LED en serie con una R resistencia de 470 a 1kOhms se conecta a GP0, esto iluminar el LED cuando esta instruccin se ejecute.

Pero antes de que podamos controlar este sencillo programa, tenemos que

"estructurar" el puerto GP0 para que sea una salida, como se describe en el artculo. As que, volvamos al principio.
;=============== PROGRAMA MUY SIMPLE ========== ; GP0 = SALIDA ; GP3 = ENTRADA ;===================================== Sistema Salida MOVLW 3E TRIS 06 MOVLW 01 MOVWF 06h GOTO salida ;carga archivo TRISB ;carga W con 1 ;pone GP0 alto

GP0 Es una de las lneas de entrada/salida del chip, antes de que un programa ponga un valor en la salida, esta lnea del puerto debe ser "establecida" para que GP0 sea una salida. GP0 es el bit0 del registro TRIS y debe ser "0" para ser una salida. Los haremos "1" (entrada) para demostrar el hecho que el puerto del '508A tiene slo 6 lneas, as , el registro TRIS ser; 0011 1110 = 3Eh. Ya que usamos el Quasi'508A para el desarrollo del programa, las instrucciones para la "estructuracin" son as: Sistema salida TRIS 06h TRISB GP0 es ahora una lnea de salida, esto entregar un EN al mundo exterior cuando sea cargado un "1" en el bit0 del archivo 06, se han usado estas instrucciones: MOVLW 01 MOVWF 06h 06 La lnea GP0 producir un EN y si tenemos un LED conectado a esta lnea se iluminar cuando las dos instrucciones anteriores ms las instrucciones de estructura son ejecutadas. Cuando este programa es cargado en un chip, sobre el mdulo Qasi '508A, se puede pensar en un puntero imaginario que comienza en la primera instruccin y se pasa a la unidad central para la ejecucin. El 'puntero' es el Contador de Programa, este empieza en 000 e incrementa una posicin a la vez y alimenta el cdigo (en la direccin) a la unidad central donde es interpretado. Una vez el micro es puesto a operar, no se para y sigue bajo el programa. En el programa anterior, el Contador de Programa "escapar al final del programa", para impedir esto es necesario pasar instrucciones adicionales para "dirigir" el contador de programa, arriba se muestra el programa completo. ;Carga W con 1 ;Mueve W al archivo ;Carga archivo MOVLW 3E ;pone GP0 como

El primer 06h en el programa no es el registro de puerto, este es el TRISB. El segundo 06h es el puerto de entrada /salida. La instruccin GOTO crea un lazo para hacer ir al micro a la etiqueta "salida". Una vez el micro entra en este lazo, nunca sale, a menos que falte la energa. Las instrucciones para hacer el LSB en el registro TRIS como salida son: MOVLW 3Eh una salida TRIS 06h ;Pone 0011 1110 en W para hacer GP0

El valor binario 0011 1110 muestra que los bits 6 y 7 no se usan, como el '508A tiene slo 6 lneas de puerto y el resto de lneas sern lneas de entrada (como muestran los "1"), excepto el bit ms bajo, que ser una salida. En otras palabras, slo tenemos que hacer bit0 un cero. El valor en W se mover al registro de TRIS y esto har del BIT Menos Significativo en TRIS una salida. El puerto se establece ahora con el LSB una salida. Esta lnea se llama GP0 (lnea 0 Propsito General).

LOS ARCHIVOS .ASM


Los programas se escriben usando las 33/36 instrucciones PIC en una libreta o editor y guardados con la extensin .asm (punto asm). Cuando un programa se escribe como muestra el 'programa mas simple', lo llaman cdigo ensamblador y se guarda con la extensin .asm. Es decir, se ha escrito para un ensamblador, llamemos al ensamblador que usaremos MPASM y esto localizar todas las etiquetas y las convertir en una direccin, convirtiendo las instrucciones para trabajar en cdigo mquina. El resultado es un archivo con extensin .hex.

OTRO PROGRAMA SIMPLE


Podemos incluir un botn pulsador, a aadir en nuestro "programa ms simple". El pulsador se agrega al circuito para que cuando ste sea pulsado, GP3 vea un alto [a esto se le llama lgica positiva]. Ahora el programa se activa para cuando se pulsa el botn encienda un LED, esto debe ser convertido en un juego de instrucciones que puedan ser ejecutadas por el ' 508A.

El programa necesita para hacer esto un lazo, entonces el pulsador se detectar cuando sea presionado y conectar el LED y cuando sea liberado el pulsador el LED se apagar.
ADJUNTAR AL PROGRAMA MS SIMPLE MOVLW 3E TRIS 06 ;GP0 salida, GP3 entrada btn BTFSS 06,3 ;comprueba GP3, detecta si es GOTO Libre GOTO Pulsdo BSF 06,0 GOTO btn BCF 06,0 GOTO btn ; si si, salta esta lnea ;activa GP0 ;apaga GP0

pulsado

Pulsdo Libre

De ahora en adelante, todos lo programas contienen un lazo, el programa ms simple anterior es el nico programa que usa un lazo "callejn sin salida", un programa normal es una forma de lazo completamente funcional, ya que el micro ejecuta instrucciones a razn de aproximadamente un milln por segundo, un lazo se ejecutar muchas veces por segundo. Las instrucciones en el lazo deben incluir un detector de botn pulsado o no, dando una salida ALTA o BAJA sobre una lnea cambiando EN o AP el LED, estableciendo el registro TRIS para que GP0 sea una salida y GP3 sea una entrada. Las dos primeras lneas del programa son las mismas que en el programa ms simple, sin embargo la lnea btn BTFSS 06,3 es el detector de pulsado o no. Esta instruccin comprueba el bit3 del archivo 06 (archivo del puerto), el micro 'lee' el puerto y comprueba el bit3 para ver si lo pone alto. El micro saltar la siguiente instruccin del programa si el bit es alto, cuando el pulsador es presionado, la lnea ser alta y el bit3 ser puesto EN. Si el bit est EN (botn pulsado) el micro ejecutar la instruccin GOTO pulsdo.
GOTO libre GOTO Pulsdo

Hemos creado dos ramas en el programa, la rama libre, cuando est liberado

el pulsador y la rama pulsado, cuando est presionado. Si el bit es EN, el pulsador estar presionado. El juego de instrucciones para la mini-rutina son: Pon alto GP0 y entonces ir a btn y vigila la entrada: Pulsdo BSF 06,0 y GOTO btn Si el bit est limpio [Clear], entonces ser bajo por lo tanto el pulsador no est presionado. Ahora tenemos que producir una o ms instrucciones para la mini-rutina de 'aclarado' [Clear]. Las instrucciones para aclarado limpiarn el bit0 del puerto para que la lnea GP0 sea Baja y el LED se apagar: libre BCF 06,0 ; apagar el LED. Ahora el micro debe ser enviado atrs para vigilar el puerto otra vez y comprobar la condicin del pulsador, esta instruccin es GOTO btn. El programa estar constantemente formando lazos con la instruccin para vigilar el pulsador y cambiar el LED encendido o apagado.

LED QUE DESTELLA


Si queremos hacer que un LED encienda y apague automticamente, necesitaremos un juego de instrucciones diferente, en primer lugar necesitamos instrucciones para poner el LED alto, luego una rutina para mantenerlo encendido por un periodo de tiempo (llamado rutina de retardo), adems instrucciones para poner el LED apagado y finalmente una rutina de retardo.

El programa al llegar al final vuelve atrs donde el LED se activa, el resultado es un LED intermitente. El organigrama anterior describe mejor esta secuencia usando los smbolos mostrados antes. Esto ayuda a ver el nmero de pasos implicados en el programa. Del organigrama podemos deducir una disposicin para el programa. Sistema estructuracin - - -; Las instrucciones de

; van - - - -; aqu GOTO principal Retardo retardo - - - -; Las instrucciones de

; van aqu ; RETLW 00 inicio - - - -- - - -llamada de retardo - - - -- - - -van aqu llamada de retardo GOTO inicio Esto sigue con una segunda parte, los proyectos diseados para ejercitarse el lector se encuentran disponibles en otros artculos. ;Conecta instrucciones ; van aqu ; instrucciones apagar LED ; instrucciones apagar LED

van aqu

PRIMER PROYECTO CON EL PIC 16F84A

Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si quiere volver

a visitarnos.

Introduccin.
Esta es la primera incursin en este apartado de programacin para microcontroladores PIC, pretendo mostrar algunos proyectos con los que el interesado en aprender a programar microcontroladores PIC, consiga ciertos conocimientos y cierta fluidez, al mismo tiempo que disponga de una 'librera' de rutinas en la que inspirarse a la hora de plantear un proyecto o la solucin a un posible problema que le surja.

El Primer Proyecto.
Esta pretende ser una aproximacin muy lineal a la escritura de un programa. Son muchos los que escriben y producen subrutinas muy pequeas con saltos (GOTO's) de una subrutina a otra, de modo que el programa salta por todas partes como 'palomitas de maz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo, ste tipo de disposicin es muy difcil de seguir incluso por un lector avezado. Es mucho ms fcil seguir la secuencia de acontecimientos y as, muy pronto seremos capaces de escribir programas similares a los de la seccin de proyectos de cualquier empresa." - As, empieza otro de los artculos que tengo en esta web. En incontables sitios se utiliza un listado de apoyo al que se inicia en la programacin, dicho listado describe qu hace dicho listado. En este caso describe, cmo controlar el encendido y apagado de un punto de luz mediante un diodo LED. Despus de considerar otros modos de empezar este camino, he llegado a la conclusin que, por algo hay que empezar y ese camino trazado por otros puede que sea el mejor y en ello estamos. Se debe utilizar un editor de texto que no aada cdigos extraos, puede utilizarse el Bloc de Notas, aunque hay otros ms adaptados a la programacin que ofrecen mejores prestaciones como el EditPlus2, eso lo dejo a eleccin del lector. El MPLAB integra un editor eficiente, aunque tiene sus "cosas" y distingue entre maysculas y minsculas, as que, decdase por un criterio y sigamos. El listado del programa en lenguaje ensamblador se muestra en las lneas siguientes, recurdese que cualquier lnea que empieza por un ';' (punto y coma) se interpretar como un comentario sin efecto en el programa, estas lneas sirven de ayuda y recomiendo utilizarlas para una mejor comprensin de qu hace el programa en ciertos momentos. El listado debe ser guardado con la extensin .asm
01 02 03 04 05 ;******************************************************************* ; Autor: V. Garcia ; Fecha:06/07/2005 ; Titulo: rutina1.asm ; Programa de ejemplo para detallar las lineas que lo integran y

Sabado, 03 de Octubre del 2009__________________ Incluir en favoritos si quiere volver a visitarnos. Introduccin. Este es un acercamiento muy lineal a la escritura de un programa. Muchos escriben y producen unas subrutinas muy pequeas con saltos (GOTO's) de una subrutina a otra, de modo que los productos saltan por todas partes como 'palomitas de maz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo este tipo de disposicin es muy difcil de seguir por un lector. EXPERIMENTO 1. Los comienzos siempre son muy simples, luego gradualmente se hacen ms y ms complejos. Para seguir los experimentos que se describen en estas pginas se recomienda montar el proyecto "Tarjeta de Pruebas " siguiendo las indicaciones que se dan en dicho artculo, aunque naturalmente el lector puede realizar su propio desarrollo o bien usar un protoboard, a su eleccin. Una vez dispongamos de dicho soporte, las 4 pilas de 1'5V y el chip 'F84A, debemos copiar y pegar el cdigo que hay debajo, para poder completar nuestro primer experimento, al que daremos el nombre ejem01.asm y usando el ensamblador gratuito de Microchip MPLAB, pasarlo a exadecimal (.hex) con el cual tratamos de encender un LED. No hace nada ms. El objetivo de este programa es mostrar las pocas lneas de cdigo, necesarias para que el PIC haga esta tarea. Ver el listado:
;******************************************************************^ ; Ttulo: ejem01.asm ^ ; Autor: V. Garcia ^ ; Date: 12012006 ^ ; Deben documentarse todas las rutinas y el motivo de ser ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; ^ ; Que hace => Encender LED 1 ^ ; ^ ; PIC16F84A ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;--------------- Encabezado ------------Start: ORG 0x00 BSF STATUS,5 MOVLW h'00' MOVWF h'05' MOVWF h'06' BCF STATUS,5 ;Ir a pagina1 a fijar los puertos ;pon 00 en W ;haz todas las lneas RA salida ;haz todas las lneas RB salida ; Ir a pagina0 para seguir el programa ;pon 1111 1110 en W ;conecta el primer LED ; lazo a LED_EN

LED_EN: MOVLW h'254' MOVWF h'06' GOTO LED_EN END

El siguiente es el listado en exadecimal, si no dispone de un ensamblador, puede copiar y

Hoy: 3 Octubre 2009, Creado por: V. Garca. Introduccin.

Incluir en favoritos, para volver a visitarnos.

Este artculo, basado en informacin adquirida de la red es, una aproximacin a los conversores AD, en el que se muestra que hacer para conectar una seal analgica a un PIC. Una seal analgica es similar a una onda senoidal y generalmente de amplitud inferior a 5V (5.000mV). Las seales de bajo nivel, generalmente se expresan en mV, para hacerlas reconocibles instantneamente y facilitar el comentar o referirse sobre ellas. Anlisis de una seal La figura de la derecha muestra una seal analgica, esta seal puede ser tan baja como de unos pocos milivoltios o cientos de milivoltios. En general este tipo de seal ser demasiado pequeo para ser detectado por la entrada de un microcontrolador. El micro necesita una seal mayor, sobre 3.500mV para que la forma de onda se presente sobre la lnea de entrada como un nivel H (ALTO), durante el pico de su excursin. Este debera ser tan alto como sea posible, sobre 5.000mV para una deteccin fiable de la seal. La instruccin para leer un nivel H (Alto) es: BTFSS 06,3 ;Comprueba si es H la lnea de entrada RB3 (bit 3)

Esta instruccin comprueba la lnea RB3 y si el bit es ALTO (la lnea est Activa - la instruccin ver un ALTO) el micro saltar la siguiente lnea del programa y ejecutar la lnea que sigue en el programa, para su tratamiento. La forma de la onda no es del todo importante, sta puede consistir en grandes y pequeos picos como muestra la figura de abajo.

En estos casos slo los grandes picos sern detectados por el micro, los dems pueden ser demasiado pequeos para ser detectados y se despreciaran. Para aumentar en lo posible la seal analgica cerca de 5.000mV, como se muestra debajo, es necesario un amplificador.

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