|
|
||||||||||||||||||||||||||||||||||
|
Introducción.Esta es la primera incursión en este apartado de programación 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 'librería' de rutinas en la que inspirarse a la hora de plantear un proyecto o la solución a un posible problema que le surja. El Primer Proyecto.Esta pretende ser una aproximación muy lineal a la escritura de un programa. Son muchos los que escriben y producen subrutinas muy pequeñas con saltos (GOTO's) de una subrutina a otra, de modo que el programa salta por todas partes como 'palomitas de maíz'. El micro es capaz, perfectamente capaz de saltar por un programa, sin embargo, éste tipo de disposición es muy difícil de seguir incluso por un lector avezado. Es mucho más fácil seguir la secuencia de acontecimientos y así, muy pronto seremos capaces de escribir programas similares a los de la sección de proyectos de cualquier empresa." - Así, empieza otro de los artículos que tengo en esta web. En incontables sitios se utiliza un listado de apoyo al que se inicia en la programación, dicho listado describe qué hace dicho listado. En este caso describe, cómo controlar el encendido y apagado de un punto de luz mediante un diodo LED. Después de considerar otros modos de empezar este camino, he llegado a la conclusión 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 añada códigos extraños, puede utilizarse el Bloc de Notas, aunque hay otros más adaptados a la programación que ofrecen mejores prestaciones como el EditPlus2, eso lo dejo a elección del lector. El MPLAB integra un editor eficiente, aunque tiene sus "cosas" y distingue entre mayúsculas y minúsculas, así que, decídase por un criterio y sigamos. El listado del programa en lenguaje ensamblador se muestra en las líneas siguientes, recuérdese que cualquier línea que empieza por un ';' (punto y coma) se interpretará como un comentario sin efecto en el programa, estas líneas sirven de ayuda y recomiendo utilizarlas para una mejor comprensión de qué hace el programa en ciertos momentos. El listado debe ser guardado con la extensión .asm
Recordar que todo lo que hay en una línea, detrás de un punto y coma
(';') son comentarios que no influyen en el programa
ensamblador MPLAB, sólo se usan como ayuda. Para que el listado tenga cierta coherencia, se recomienda
utilizar el tabulador en 8 para crear los espacios necesarios y que haya claridad en el listado. En el listado
anterior, se ha incluido el número de línea como ayuda a esta descripción, no se deben poner en su programa.
En las primeras líneas se hacen los comentarios que
describen cual es el motivo del archivo. En las líneas 8 y 9 se indica al ensamblador que vamos a trabajar con
el PIC 16F84, es necesaria su inclusión. La definición de etiqueta estándar de PIC16F84A es
leída según la directriz INCLUDE. Los archivos de definición generalmente son instalados en el lugar ;
C:\Program Files\Mplab\p16f84a.inc Al respecto del MPLAB, como este programa no admite cabeceras mayores de 60
digitos, es conveniente que creemos un carpeta, para contener nuestros ejemplos o proyectos, como
C:\Archivos de Programa\Mplab\proyetos\, donde guardaremos los listados, esto nos evitará algunos errores, cuando
vayamos a compilar posteriormente.
En las líneas de la 13 a 17 se declaran las
"equ" o igualdades, de la memoria. En las siguientes líneas se definen las etiquetas
y direcciones de uso personal llamadas de propósito general, las direcciones de los registros personales u
otros que vayamos a utilizar en el programa, éstas las decide el analista en función de sus necesidades y
según el mapa de memoria que empieza en 0Ch, en el caso del F84. Debe observarse, donde empieza dicho
mapa de memoria que, puede variar en cada modelo de microcontrolador.
En la línea 22, se encuentra el origen del programa, es decir,
al iniciar el programa o al dar tensión de la fuente de alimentación al micro, es donde irá el programa cada vez que se
inicie o cada véz que se resetea o hay un corte de suministro. Le sigue la orden de salto GOTO que hace saltar al
programa hasta la etiqueta que le sigue, en este caso Primero El las líneas siguientes se definen donde empiezan las posiciones
de memoria; los bancos 0 y 1, los PuertoA, PuertoB y los TRISA y el TRISB con sus posiciones.
Al referirnos al Puerto A o Puerto B, nos estamos refiriendo implícitamente al Banco 0, ya que
el banco 0 no dispone de los tres registros TRIS y OPTION, por este motivo se llama de 'memoria
paginada', ver el mapa de memoria siguiente. Según las hojas de especificaciones, la memoria de datos se divide en múltiples bancos, que contienen
los GPRs (Registros de Objetivo General) y los SFRs (Registros de Función Especial). Los Bits
RP0 y RP1 son los bits de selección de banco, el 'F8A tiene los banco 0 y banco 1, con un sólo
bit se direccionan 2 bancos (los que tiene el F84), con dos bits 4 bancos, etc.
La tabla anterior, muestra que los bancos vienen definidos por el estado del bit (5) RP0, de modo que, si RP0 = 1 el Banco 1 es el banco operativo, en el cual dispondremos la configuración de los puertos y definiremos los estados especiales de cada registro en el que debamos intervenir, como los puertos y el estado de sus bits. Si RP0 = 0 el Banco 0 es el banco operativo. En este banco 0 es donde se ejecuta el programa con sus rutinas y subrutinas. Con viene aclarar este tema, ya que siempre produce confusiones en los que se inician en la programación. Veamos un ejemplo: -Tenemos una mesa con cuatro grandes cajones numerados del 0 al 3 (son los bancos de memoria). Entendido este concepto, si necesitamos archivar 12 folios en la carpeta 43 del cajón 2. Cómo lo haríamos. Se procedería de esta forma: BSF STATUS,RP1 ; para seleccionar el banco 2 ó 3 (cajón 2 ó 3)
BCF STATUS,RP0 ; aquí defino banco 2 (elijo cajón 2, entre el 2 y el 3)
; ahora, el segundo paso
movlw .12 ; cojo los 12 folios y
addwf .43, 1 ; los archivo en la carpeta y se los añado a lo que ya tenía el cajón 43.
Nota. - Los valores expresados se harán en hexadecimal acompañados al final de una h, en caso de hacerlo en binario con una b y cuando sea en decimal anteponer un (.) punto. A continuación, en las siguientes líneas, como ya se ha mencionado, definimos los pines de entrada y salida: ;****************** Mapa de memoria *******************
22 Primero: bsf status, RP0 ;selecciona banco 1 para configurarlo
23 bcf tris_b, 3 ;pone a 0 el bit 3 (RB3) como salida
24 bcf status, RP0 ;selecciona banco 0, para continuar programa
;***************************************************
Las instrucciones bsf (bit set file) ponen un bit RP0 del registro 'status' a 1. Como ya se dijo, si el bit 5 del registro status está a 1, entonces estamos trabajando en el banco 1, se hace esto para definir los pines de entrada/salida de los puertos del micro. En esta sección se puede encontrar una disposición algo modificada aunque no presenta diferencias de cara al micro. Me estoy refiriendo a una definición como:
Incluso como:
Aunque para esto, antes deberemos definir bank1 y bank0, en la sección "equs", como sigue:
Ahora, sigue la rutina principal que hace llamadas mediante la instrucción CALL, a distintas subrutinas. Le sigue la subrutina encargada de encender y apagar el LED (en este ejempo)
Si es el caso, definiremos nuevas rutinas que realicen nuevas tareas, como es un retardo corto y uno largo. Cuando las secuencias de encendido y apagado se suceden muy rápido, puede ser de utilidad usar un retardo, permitiendo que el efecto se aprecie por el ojo, debemos tener presente que el microcontrolador es muy rápido y no permite ver ciertos eventos si no se usan los retardos.
El resto del listado una vez más se describe así. 50 ;La subrutina de retardo corta con dos lazos anidados.
51 ret: movlw 0xFF ;Carga el acumulador con el valor FF
52 movwf count1 ;mueve contenido del acumulador a count1
;para iniciar lazo externo.
54 ret1: movlw 0x0Fh ;Carga el acumulador con el valor 0Fh
55 movwf count2 ;mueve contenido del acumulador a count2
;para iniciar lazo interno
57 ret2: decfsz count2, 1 ;decrementa count2 lazo interno, guarda el
; resultado en F y si es cero salta la siguiente instruccion.
58 goto ret2 ;volver a la subrutina ret2 otra vez (lazo ret2)
59 decfsz count1, 1 ;decrementa count1 (lazo externo) y si count1
; es cero saltate la siguiente instruccion.
60 goto ret1 ;si no, vuelve a decrementar mientras ret1 no sea 0.
61 return ;si es 0, retorna al punto de llamada.
63 END ;Termina el programa
Este listado nos ha servido para describir ciertas partes interesante en el desarrollo de un programa escrito en ensamblador para los micros de la familia PIC. En próximos trabajos desarrollaremos otros interesantes proyectos que tengan utilidad práctica. El ensamblador.Una vez terminado el listado mnemónico con las instrucciones que hayamos
considerado necesarias para el proyecto, debemos ensamblarlo con una herramienta que la misma empresa
creadora del PIC nos proporciona gratis, como es el MPLAB©, esta la podemos encontrar en
este enlace, si el lector no está familiarizado
con esta herramienta, le recomiendo que lea con atención
esta guía rápida,
con la que puede empezar a probar con este listado que acabamos de describir, ya que entiendo que por su
extensión e importancia merece un artículo a parte.
El siguiente es el listado en hex exadecimal, el que tendremos que quemar
en el PIC16F84A, con el quemador que dispongamos. Si no dispone del ensamblador, puede copiar y pegar
el siguiente listado que, puede guardar con el nombre "rutina1.hex", resultado de ensamblar el código descrito.
Puede leer un tutorial con referencia a la herramienta del IcPorg, en
este enlace, para poder grabar
su microcontrolador PIC.
Aquí se muestra el esquema y circuito eléctrico necesario, para utilizar el
programa que posteriormente grabaremos 'quemaremos' en un PIC. El proyecto pretende ser el primero de
una serie que nos permita aprender cómo producir un programa. Para empezar será necesario disponer de las
hojas de datos del PIC16F84A que hay en este sitio,
de modo que el estudiante pueda seguir mejor las descripciones.
Según las características del PIC16F84A, el pin de reposición o Reset,
es el pin 4, el cual debe conectarse a la línea positiva de Vcc. Sin embargo personalmente no me parece muy
seguro esto y opté por utilizar una red RC típica, formada por una resistencia y un condensador que aseguren la
correcta reposición (Reset) del 'F84A, cuando se ponga a 0 hasta cargarse el condensador. En la mayoría de los
circuitos que se pueden ver, para el reset, no incorporan el condensador, ya que, es necesario poner esta patilla a
positivo para que el micro pueda correr, por lo que el emplo del condensador, queda a su criterio. El motivo del circuito es muy simple, se trata de hacer que un diodo LED
destelle. Evidentemente tenemos que empezar desde abajo, Nota.- Cuando tengamos terminado el listado del programa y lo hayamos
ensamblado (pasado a HEX), debemos tener presente que a la hora de quemar el chip, decidamos si usaremos
para el reloj, un cuarzo o una red RC, en caso de RC, en el programador activaremos la opción RC para que funcione,
si es un oscilador cerámico. En caso de usar un cuarzo activar la opción XT en el programador y lo quemaremos
con estas opciones, de lo contrario no funcionará y no encontraremos fallos en el programa. En el momento de grabar (quemar) el micro, se produce la
palabra de configuración, la responsable de indicarle al micro como se ha
condicionado su estructura. Es conveniente conocer mas acerca de la Palabra
de Configuración, lo que ya se ha comentado en
este tutorial. Para mantener las cosas económicas y fáciles, utilizaremos la opción de oscilador RC,
si bien, este oscilador no es particularmente estable, servirá para este proyecto al igual que en otros muchos. El esquema
(muy simple) que se utilizará es el anterior y el pcb, este: Aunque la línea de Vcc del esquema dice ser de 5V, puede ser utilizada una
tensión menor, una de 3V o 4' 5V que, son valores más normalizados, aun así, he intercalado un diodo 1N4007
con el que asegurar la polaridad y la tensión incluso para 6V. Como puede apreciarse el esquema es muy sencillo,
en esencia debido a la presencia del PIC y en la siguiente figura se muestra el circuito muy simple ejecutado sobre
la placa de pruebas. Probablemente el lector haya programado anteriormente y le parezca esto demasiado elemental,
espero que sepa disculpar y tenga paciencia, no todos están a la misma altura.
Es muy sencillo como se ha mencionado, pero es una práctica que sólo pretende
ayudarnos a comprender los pasos a seguir en la programación en ensamblador (.asm) de un proyecto y su puesta
en funcionamiento. En próximos artículos se tratan nuevos temas, hay mucho que desarrollar y practicar.
Volver al indice
|
||||||||||||||||||||||||||||||||||
|
Creado el: 28-04-2005
|
||||||||||||||||||||||||||||||||||