Programación de un PIC16F84
Código fuente (.asm)
En este primer paso, escribiremos nuestro codigo fuente. Un codigo
fuente es definir una serie de comportamientos con palabras o
codigos que son mas cercanos a nosotros, para ello usaremos El
ensamblador, que es uno de esos lenguajes de programación
para desarrollar código fuente en una aplicación
con PIC. El archivo de código fuente puede crearse y editarse
con cualquier editor de texto ASCII tipo NotePad de Windows, renombrando
el fichero de [.txt] a
[.asm]. No obstante un codigo fuente debe seguir las siguientes
pautas básicas:
Cada línea del codigo fuente puede contener cuatro tipos
de información: Etiquetas, Operación, Operandos
y Comentarios. El orden y posición de éstos es importante,
sobre todo y para facilitar la depuración, se recomienda
que la etiqueta se coloque en la primera columna y que los
mnemónicos se coloquen una o dos columnas más
allá para que todo cuadre, de este modo sera mas facil
su lectura. Los operandos siguen
al código mnemotécnico.
Por ultimo los comentarios pueden seguir a los operandos, mnemónicos
o etiquetas, y pueden comenzar en cualquier columna. La anchura
maxima de una columna es de 255 carácteres.
Un espacio en blanco debe separar la etiqueta del código
mnemotécnico, y también un espacio en blanco deba
separar el código mnemotécnico y los operandos.
Los operandos múltiples deben separarse por comas.
Nota:Se considera
como un espacio en blanco uno o más espacios o tabulaciones
La
imagen de arriba muestra un fragmento de Codigo Fuente, poco
a poco voy a ir mostrando las diferentes instrucciones que forman
el repertorio del PIC16F84. Para ello primero voy a aclarar
una serie de términos básicos que serán
los que utilice de aqui en adelante.
Etiquetas
Una etiqueta se usa para representar una línea o grupo
de código, o un valor constante. Se necesitan para las
instrucciones de salto. Las etiquetas deben empezar en la columna 1. Pueden terminar
en "dos puntos" (:), espacio, tabulación o
fín de línea. Las etiquetas deben comenzar por
un carácter alfabético o por un guión bajo
(_) y pueden contener carácteres alfanuméricos
como el guión bajo (_) y el signo de interrogación
(?).
Mnemónicos, directivas y macros:
Es el nombre de la instrucción, el que nosotros podemos
"ordenar" al microcontrolador que haga. Hay que escribirlo
tal cual es, sin cambiarlo.
Por ejemplo, suma (add), ir a (goto) o movimientos (movwf). A
diferencia de las etiquetas que creamos nosotros mismos, los mnemónicos
los proporciona el lenguaje ensamblador que se utilice. Los mnemónicos
no son en ningún caso sensibles a mayúsculas/minúsculas.
Las directivas son órdenes
del ensamblador que aparecen en el código fuente pero
que normalmente no son traducidas directamente a códigos
de operación. Se utilizan para controlar al ensamblador:
sus entradas, salidas y asignación de datos. Las directives
no son en ningún caso sensibles a mayúsculas/minúsculas.
Las macros son conjuntos de instrucciones
y directivas definidas por el usuario que se insertarán
en el código fuente al realizar el ensamblado siempre
que la macro se invoque (ver directiva macro).
Los mnemónicos de las instrucciones del ensamblador,
las directivas y las llamadas a macros deben colocarse de la
segunda columna en adelante. Si hay una etiqueta en la misma
línea, las instrucciones deben separarse de esa etiqueta
por "dos puntos", o por uno o más espacios
o tabulaciones.
Operandos: son los parametros que
necesita la instrucción para ejecutarse. Al estudiar
una instrucción se dice el tipo Parámetros que
admite, que habrá que sustituir por los valores reales.
Parámetro
f: representa un registro de la memoria de datos, operando
origen de una instrucción
Parámetro
d:
representa un registro, operando destino de una operación,
con dos posibles valores. si se sustituye por un 0 significa
que el registro de destino es el registro de trabajo W y si
se sustituye por un 1 que es el mismo operando de origen de
la instrucción
Parámetro
b: representa un bit (valores de 0 a 7) de un registro.
Parámetro
k: representa valor literal, es decir, un valor numérico
que acompaña al Mnemónico de la instrucción.
RESUMEN DE TODAS LAS INSTRUCCIONES DEL PIC
Bueno, como tampoco quiero escribir un libro, voy a poner unas
tablas en las que vienen todas las instrucciones del PIC16F84
para que mas o menos el que la necesite pueda ver las posibilidades
de este lenguaje.
La instrucción movlw
La instrucción"mov"
es típica en todos los procesadores ya que siempre es
necesario el movimiento de datos de un sitio a otro, bien sea
valores de resultado, valores entre registros o valores inmediatos.
Consta de dos operandos donde el 1º es transferido o movido
al 2º. se comporta igual que una copia de datos, ya que
el dato no se borra de la fuente.
Hay tres tipos de instrucciones "mov", las cuales
se diferencian en los operandos fuente y destino. En el caso
de la movlw el origen es un valor literal y el destino es el
registro de trabajo W.
Un ejemplo, se pretende mover el valor literal 5 al registro
de trabajo W y continuación el valor literal 3 a ese
mismo registro W, la figura adjunta representa el valor que
toma W tras la ejecución de cada una de las instrucciones.
Al principio el valor de W será indeterminado, lo cual
se representa mediante "x". Tras la primera instrucción
se habrá cargado en W el valor 5, que en código
binario corresponde como "101". como el registro del
PIC tiene 8 bits el resto se rellena con 0 a la izquierda. Tras
la segunda instrucción el valor de W varia, borrando
el primer valor y pasando a ser 00000011 que es 3 en decimal.
La instrucción movwf
La segunda
variante de la instrucción"mov". En ella el
dato contenido en el registro de trabajo W es transferido al
registro f, que aparece como Parámetro, sin que por ello
se borre de W. solo hay que indicar cual es el operando destino
ya que el fuente, W viene implícito en el código
de instrucción
Un ejemplo, esta vezble queremos cargar el valor del registro
culla dirección es 0E, y que vamos a llamar OPERANDO,
con el valor decimal 8. Para ello tenemos que emplear las dos
instrucciones que ya conocemos movwf y movlw. En la figura se
muestran los pasos a realizar, al comienzo los registros tienen
valor indeterminado, X e Y. lo de d'8' es por que la ALU si
no especificamos nada toma como defecto que los datos están
en código hexadecimal de 0 a f si queremos especificar
otro código tendremos k poner el valor entre comas simples
y precedido de la letra que implique el código
La instrucción movf
Esta es la tercera y ultima variante de la instrucción"mov".
En este caso en contenido del registro f, que es el operando
fuente, puede transferirse al registro de trabajo W, o al mismo
registro f, dependiendo del valor "d". Es necesario
especificar tanto la fuente como el destino. Esta operación
afecta al flag o señalizador Z. El flag Z es un bit del
registro de estado que se pone a 1 si el resultado de la operación
a sido 0.
La instrucción bsf
Esta instrucción
pone a 1 un bit de un registro. El nombre o posición
del registro dentro de la memoria de datos, será suministrado
como primer Parámetro de la instrucción, y el
numero de bit como segundo Parámetro Tanto uno como otro
comienzan a contarse desde 0.
La instrucción bcf
Esta instrucción
realiza justo la operación contraria a la "bsf";
pone a 0 un bit de un registro. La síntesis es la misma
que la anterior instrucción
La instrucción addlw
Suma un valor
literal al contenido del registro de trabajo W, y el resultado
lo deja en este ultimo.
La instrucción INCF
Esta instrucción incrementa en una unidad el contenido
de un registro. El resultado se puede llevar al registro de
trabajo W en lugar de al registro de origen, con lo k este ultimo
no se modificaría. Esto depende, como siempre del valor
del Parámetro d.
La instrucción DECF
Con esta instrucción se decrementa el valor de un registro
y llevar el resultado a ese mismo registro o al registro de
trabajo W. Su flag asociado también es el Z, que se pondrá
a 1 cuando el registro en cuestión llegue a 0.
La instrucción GOTO
Esta es la instrucción de salto incondicional, un salto
a otra parte del programa (subrutinas).
La Instrucción BTFSC
Esta es una
instrucción de salto condicional, en caso de que un bit
señalado del registro tenga valor 0 la instrucción
siguiente es ignorada y en caso contrario no.
La instrucción BTFSS
Es la análoga a la anterior. Siguiendo de nuevo sus siglas
veremos que solo cambia la ultima letra, esta instrucción
(t) testea un bit (b) de un registro (f) y salta (s) si es uno
(s) set en ingles puesta a 1.
Ejem:
btfss ESTADO Z
goto ETIQUETA 1
goto ETIQUETA 2
La instrucción DECFSZ
Esta instrucción (dec) decrementa un registro (f) y salta
(s) si el resultado es cero (z). El resultado del decremento puede
ser guardado en el mismo registro que se toma de base para dicho
decremento, o el registro de trabajo W, en cullo caso el registro
no varia.
|