|
con los microcontroladores PIC16F84 |
||||||||||
|
Este es un acercamiento muy lineal a la escritura de un programa.
Muchos escriben y producen unas subrutinas muy pequeñas con saltos (GOTO's)
de una subrutina a otra, de modo que los productos saltan por todas partes como
'palomitas de maíz'. El micro es capaz, perfectamente capaz de saltar por un
programa, sin embargo este tipo de disposición es muy difícil de seguir por un lector. Los comienzos siempre son muy simples, luego gradualmente
se hacen más y más complejos. Para seguir los experimentos que se describen en
estas páginas se recomienda montar el proyecto "Tarjeta de Pruebas
" siguiendo las indicaciones que se dan en dicho artículo, aunque
naturalmente el lector puede realizar su propio desarrollo o bien usar un
protoboard, a su elección.
El siguiente es el listado en exadecimal, si no dispone de un ensamblador, puede copiar y pegar en su editor de texto y guárdelo como ejem01.hex para usar con el 'quemador' de chips y comprobar que hace lo que se espera.
Qué hace el programa.Las líneas que empiezan con un punto y coma, como ya se ha comentado, son comentarios y no los usa el ensamblador, así que, la primera línea donde realmente comienza el listado, empieza en mnemónicos con una etiqueta Start (Principio), no siempre es necesario usar etiquetas. La instrucción 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 ejecución 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 dirección 0x0C. En el PIC, siempre le siguen unas líneas que como se verá, nos permiten el acceso a un juego de registros para la configuración del micro. La instrucción que sigue BSF STATUS,5 BSF (BIT SET FILE REGISTER) pone a 1 el bit 5 del registro STATUS (0x03), en la posición de memoria RAM especificada, lo que nos permite el acceso a la página1 (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 lógico de cada uno de los pines de dichos puertos A y B. Con la instrucción MOVLW 00h (MOVE Literal to W register) ponemos el literal 00 en el registro de trabajo W, con la siguiente instrucción 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 instrucción 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 parámetros 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á más 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 número (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 líneas del Puerto A y del Puerto B serán puestas como salida. La siguiente instrucción BCF STATUS,RP0 (Bit Clear File register) cierra esta página1 (banco1) y devuelve el control a las instrucciones del programa de la página 0 (banco 0). Observar el símil BSF (Bit Set, banco1 ) y BCF (Bit Clear, banco 0). Como el F84A sólo tiene dos bancos (0 y 1) usa el estado de un sólo bit para cambiar de banco, otros PICs con más memoria requieren de más bits de control en el mismo registro STATUS. Esto, en esencia significa que, el programa para encender un LED realmente consiste en tres líneas, la primera línea en la etiqueta LED_EN MOVLW h'254', pone el valor FEh en el registro de trabajo W, la segunda línea 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 rápido, se apagará de inmediato y no podremos saber si funciona el programa, entonces, entra en acción la tercera línea del programa. La tercera línea GOTO LED_EN (del inglés GO TO, ir a), es la instrucción que envía el puntero del programa a la dirección 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 artículos podrá comprobar que es sencillo y fácil. 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 líneas. El circuito más simple y sencillo se puede ver a continuación. ![]() 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 había un 0 ahora debe presentar un 1, lo que obliga a conectar el ánodo a la salida y la resistencia a la línea 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 método. No ha sido al azar, tengamos en cuenta que el consumo del conjunto LED más resistencia normalmente no supera los 20mA y como la patilla del puerto, admite una corriente mayor, no causará ningún 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 método. Este método debe ser considerado por el técnico para reducir consumos innecesarios en los proyectos. Este criterio es el que seguiremos aquí. La operación del circuito se basa en un programa y este programa está contenido en el chip. Cuando se aplica la energía, el micro empieza en la primera posición de memoria y ejecuta el programa. El programa será guardado en la memoria del micro, durante el "quemado" y en ese único momento están disponibles un número de opciones de oscilador, osc RC (oscilador Res. / Cond.) que debe ser seleccionado y el chip estará listo para ese tipo de oscilador elegido, téngase en cuenta que el montaje sólo responderá al sistema de oscilador en la palabra de configuración 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 más de 1.000 veces, esto lo hace ideal para la experimentación. EXPERIMENTO 2.
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 instrucción CALL Delay, esto mantiene encendido el LED, cuando termina el bucle, el micro retorna a la línea 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 instrucción 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, sería 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. Véase 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 instrucción GOTO Delay para volver a decrementar que devuelve el programa a la instrucción anterior, para decrementarlo una nueva unidad, esto lo hace cada vez que pasa por la instrucción DECFSZ 1Bh. Cuando el archivo 1Bh llega a 0, entonces salta la instrucción GOTO Delay a la instrucción 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 instrucción DECFSZ 1Bh, a la que le sigue el decremento DECFSZ 1Ch, decremento de la instrucción a instrucción hasta llegar a la instrucción (RETURN) de retorno al programa principal. Esto se le llama instrucciones anidadas, ya se tratarán en más detalle.
Se muestran sólo los cambios que nos permiten producir lo previsto en el enunciado. Observar que no se usan los pulsadores, para estos experimentos. A continuación se presenta el listado en hex para que si no puede ensamblarlo lo copie y pegue en su editor de texto y guárdelo como ejem02.hex para el posterior 'quemado' del chip.
EXPERIMENTO 3.
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 están pulsados la entrada se hace alta (+5V) y cuando uno se pulsa pasa a nivel bajo (0V). El fenómeno 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 más largo que el rebote. No se usan pulsadores en este ejercicio, de modo que no se contemplarán. Los ocho pines RB0 a RB7 (puerto B) se usan como salida, los ánodos de los LED's se conectan al +5V y cada cátodo es controlado por la resistencia vía 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 usarán LED's de alto brillo con poca corriente de flujo. Este es el listado completo para este experimento.
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 guárdelo como ejem03-1.hex para el 'quemado' en un chip '84A, con su sistema de programación.
Qué hace el programa. Las primeras líneas del programa, definen las igualdades (equ) y los parámetros
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 líneas de datos,
cada vez que se llame con: 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 atención, le puede servir en sus proyectos.
Qué hace el programa.Se definen los parámetros en las primeras líneas, registros, puertos y variables. Además 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 configuración 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 instrucción CLRF (aclarar registro f). En las líneas 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 instrucción RLF (Rota Left File) nos desplaza a la izquierda una posición (rotación del bit), en cada iteración 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.
Como siempre el circuito y esquema electrónico es el mismo mostrado en la figura anterior. EXPERIMENTO 4.
Qué hace el programa.Si el lector sigue el flujo del programa puede comprender que, he recurrido a dos rutinas encadenadas idénticas en la forma: gira_i y gira_d ambas están entrelazadas, trataré de describir como funcionan. Al llegar el programa a gira_i, encuentra la instrucción 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 instrucción CALL delay saltará a la posición 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 instrucción 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.
Con este ejercicio ponemos el punto y aparte por esta vez, seguiremos con estos ejemplos en la segunda parte. Volver al índice de artículos PIC. Actualizada el: 12-09-2005 © Copyright 2007, Hispavila.com. Reservados todos los derechos. | declaración de privacidad | Póngase en contacto con nosotros |