Professional Documents
Culture Documents
Para los PIC se han creado unas instrucciones y una estructura de programa que los hacen más
sencillos. Las instrucciones de los microcontrolador PIC cumplen con las siguientes condiciones:
1) Juego de instrucciones reducido (RISC): Por ejemplo, solo existen 35 instrucciones en el
PIC16F84A.
2) Sencillas y rápidas: La mayoría se ejecuta en un ciclo de instrucción, y solo las de salto precisan
2 ciclos. El ciclo de instrucción consta de 4 ciclos de reloj principal. De esta manera un dispositivo
con un cristal de cuarzo de 4 MHz realiza 1 millón de instrucciones por segundo.
3) Ortogonalidad: La ubicación de los operandos que manejan es muy flexible. Cualquier objeto del
procesador puede actuar como origen o como destino.
4) Formato uniforme de las instrucciones: Todas las instrucciones tienen una longitud fija de bits.
Esta característica significa un notable ahorro de la memoria de programa y una facilidad en la
construcción de compiladores.
5) Formato uniforme de los datos. Todas los datos que maneja la memoria Ram tienen una longitud
fija de 8 bits
Un programa es una serie de instrucciones mediante las cuales un sistema basado en CPU realiza
una tarea en particular y la forma más simple de realizar un programa es mediante el lenguaje
ensamblador. El lenguaje ensamblador "es complejo por su sencillez". Esto quiere decir que, a
diferencia de los lenguajes de alto nivel, aquí no hay funciones que solucionen y simplifiquen
algoritmos, si no que hay que implementar hasta los pasos más elementales. Las intrucciones en
ensamblador contienen:
f: Registro al que afecta la instrucción
W: Acumulador (Working register)
b: Número de bit (hay instrucciones que afectan a un solo bit)
k: constante (un número)
d: selección de destino del resultado de la instrucción, puede ser "0" o "1", si es "0" el resultado se
guarda en el acumulador (W) y si es "1" se guarda en el registro f al que afecta la instrucción.
Un programa en código fuente es un fichero ASCII con extensión ASM que está formado por 4
columnas para identificar las diferentes funciones:
Etiquetas: Dan nombre a determinadas partes del programa (hasta 32 caracteres)
Instrucciones: Son las instrucciones que se pasan al microcontrolador o una DIRECTIVA al
ensamblador.
Datos: Datos u operandos para las instrucciones.
Comentarios: Siempre después de un “;” son descripciones para hacer más legible el listado.
2.1.2.ORIENTADAS A REGISTROS.
Registro STATUS: Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0).
Con los registros utilizados por el PIC para funciones específicas, es habitual
no escribir directamente su dirección, sino el nombre simbólico definido en el
fichero PIC16F84.INC. En el ejemplo anterior nos quedaría así:
MOVWF 10H ; cargar el valor 10H en el acumulador.
MOVWF TMR0 ; copia el acumulador en el registro TMR0.
Registro STATUS: No modifica ningún bit de estado.
El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc.
El parámetro “d” determina el destino.
Si d = 0, se guarda en “W”.
Si d = 1, se guarda en “f”.
Si no se pone nada, el valor por defecto es 1 y se guarda en “f”.
También se puede indicar directamente “W” ó “f”.
Ejemplo: Si tenemos el registro VALOR = 00000001B y aplicamos la instrucción
RRF VALOR
el resultado será VALOR = 00000000B y el bit C = 1.
Si tenemos el registro VALOR = 10000000B y aplicamos la instrucción
RRF VALOR
El resultado será VALOR = 01000000B y el bit C = 0.
Registro STATUS: Modifica el bit C (CARRY).
MODOS DE DIRECCIONAMIENTO
La memoria interna se direcciona en forma directa por medio de los 8 bits “f” contenidos en las
instrucciones que operan sobre registros. De esta manera se puede direccionar cualquier posición
desde la 00 a la FF.
En los microcontroladores que tengan más de un banco, antes de acceder a alguna variable que se
encuentre en la zona de los bancos de registros, el programador deberá asegurarse de haber
programado los bits de selección de banco en el registro FSR.
El registro FSR sirve como puntero para direccionamiento indirecto además de servir para seleccionar
el banco activo. La posición 00 del mapa de RAM es la llamada dirección indirecta.
Si en cualquier instrucción se opera con la dirección 00, en realidad se estará operando con la
dirección a donde apunte el contenido del FSR.
Por ejemplo si el FSR contiene el valor 1Ah, una instrucción que opere sobre la dirección 0, en
realidad lo hará sobre la dirección 1Ah. Puede decirse que la posición 1Ah de memoria fue
direccionada en forma indirecta a través del puntero FSR.
El direccionamiento indirecto es muy útil para procesar posiciones consecutivas de memoria (como
en el ejemplo) o para el direccionamiento de datos en subrutinas.
Direccionamiento inmediato:
El dato utilizado por la instrucción se codifica al mismo tiempo que la propia instrucción. En este caso,
al dato se le denomina “literal”.
TECNICAS DE PROGRAMACION
Subrutinas y Llamadas:
La mayoría de los microcontroladores incluyen en su repertorio de instrucciones algunas que
permiten saltar a una rutina y, cuando se completa su ejecución, retornar al programa principal.
El empleo de subrutinas aporta muchas ventajas entre las que se destacan las siguientes:
1) Se pueden escribir como subrutinas secciones de código y ser empleadas en muchos programas
( por ejemplo, la subrutina de exploración de un teclado ).
2) Dan a los programas un carácter modular, es decir, se pueden codificar diferentes módulos para
utilizarlos en cualquier programa.
3) Se reduce notablemente el tiempo de programación y la detección de errores, utilizando
repetidamente una subrutina.
4) El código es más fácil de interpretar, dado que las instrucciones de las subrutinas no aparecen en
el programa principal, sólo figuran las llamadas (CALL).
LIST
Es una directiva para listar una serie de opciones de ensamblado de diversa índole. Los
parámetros listados se separan por comas. Por ejemplo, siguiente directiva
List p = PIC16F84A, r = dec, b = 8, f = INHX8M
Tiene cuatro parametros, cuyo significado es:
p: establece el Procesador destino (PICmicro). Esto será equivalente a la directiva
processor.
r: establece el sistema de numeración a usar por defecto. Como se vio al inicio, el formato
de los números se suele especificar por un prefijo: 0x para hexadecimal, . para decimal,
etc. En caso de no especificar nada, el número será considerado en el formato señalado
por r. En el ejemplo, es obvio que se indica decimal. El valor por defecto es hex
(hexadecimal). Esto es equivalente a la directiva radix.
b: establece la cantidad de espacios en blanco que serán insertados en lugar de cada
tabulación del archivo *.lst. Éste es un archivo secundario de los tantos que genera el
ensamblador. De cualquier forma, más adelante veremos para que puede servir.
f: establece el Formato del archivo hexadecimal de salida. las opciones disponibles son
INHX8M, INHX8S e INHX32. La primera es el valor por defecto.
Es una costumbre poner list con al menos el parametro p = indicando el procesador.
INCLUDE
Es la directiva para incluir como parte del programa el archivo que se indica. La inclusión se
realiza como si se aplicara un “copiar - pegar” del contenido entero del archivo incluido en el
lugar donde aparece la directiva. Esta directiva debe aparecer en todos los programas de
ensamblador al menos para incluir el archivo de dispositivo del PIC usado. Estos archivos se
hallan en la carpeta de instalación del ensamblador MPASM, que a su vez se instala con
Microprocesadores Ing. Verónica Pérez 20
INSTITUTO UNIVERSITARIO DE TECNOLOGÍA
Antonio José de Sucre
GUÍA NRO 3: Set de Instrucciones y directivas de emsamblador
MPLAB IDE, norlmalmente C:\Microchip\MPASM Suite. Solo se pone la directiva y el
ensamblador sabrá dónde buscarlo.
include <P16F84A.inc> ; incluir archivo P16F84A.inc
Include también se usa para incorporar archivos de otros tipos, como librerías de códigos. Es
una convención usar los signos <> para referirse a los archivos estándar y los signos “ ” para
referirse a los archivos de usuario. Incluso pueden ignorarse dichos signos asi como poner
por delante el signo #.
EQU
Cuando se quiere acceder a los registros (SFR o GPR) de la RAM se les debe referenciar
por sus direcciones. Como eso sería una labor muy tediosa, el ensamblador permite
identificarlos con un alías o nombre escogido por el usuario mediante la directiva equ.
Aunque equ permite igualar (equal = igual) un identificador con cualquier constante númerica,
su principal aplicación es “darles nombres” a los registros de la RAM. De hecho, todos los
registros SFR del PIC ya están identificados así en su correspondiente archivo de dispositivo
(revísalos, si quieres). A nosotros equ nos servirá para trabajar con los registros GPR.
ORG
Su nombre deriva de origen. Es para indicarle al ensamblador a partir de que dirección
empezará a mapear el subsiguiente código ejecutable. Como el CPU empieza a ejecutar el
código desde la dirección 0x000, al menos la primera instrucción de código debería estar allí.
Sin embargo, poner org 0x00 en programas con código continuo se ha convertido en un
hábito a veces hasta innecesario porque el ensamblador, que no es tan tonto, sabe que por
defecto debe colocar el código a partir de la dirección 0x000.
org0x000
END
Es la directiva que pone fin a la lectura del código fuente por parte del ensamblador.
Cualquier código ubicado después de esta directiva ya no será tomado en cuenta, lo que
implica que solo debería haber una directiva end por programa, incluso si consta de varios
archivos. Son sofisticados los programas donde se puede usar varias veces.
Microprocesadores Ing. Verónica Pérez 21
INSTITUTO UNIVERSITARIO DE TECNOLOGÍA
Antonio José de Sucre
GUÍA NRO 3: Set de Instrucciones y directivas de emsamblador
BANKSEL
El nombre de esta directiva es un acrónimo de BANK SELection y, como se prevé, sirve para
cambiar de bancos.
En los PIC con dos bancos, como el PIC16F84A, solo se trabaja con el bit RP0.
Dado el tedio que puede acarrear este trabajo, sobre todo si no se recuerda a qué banco
pertenece un registro, la directiva banksel puede ser de gran ayuda. Banksel se encargará de
colocar las instrucciones necesarias para acceder al registro que se le indica como
parámetro.
banksel TRISA; Seleccionar banco del registro TRISA (Banco 1)
#DEFINE
Se utiliza como #defineidentificadorcadena; Lo que hará el ensamblador es sustituir el
identificador por toda la cadena restante tal cual es en cada punto del programa donde se
encuentre identificador. Por eso se le conoce como directiva de sustitución de texto.
Identificador es una palabra con las mismas reglas impuestas a otros identificadores, como
las etiquetas o nombres de registros GPR. En cambio, cadena puede estar formado por
cualesquier otro elemento de código ensamblador.
DB
La directiva DB (Define Byte) reserva memoria para datos de tipo byte (8 bits), o para una
variable de este tipo, inicializando o no dicho byte y los posteriores. • El nombre de la variable
es opcional, y se asigna dicho nombre para el primer byte (recordar que el lenguaje máquina
no entiende de variables, si no de direcciones de memoria. Una variable es una etiqueta o
referencia para el compilador, el cual sustituye cada referencia a esta variable por la
dirección de memoria correspondiente)
$
Las etiquetas en el fondo representan las direcciones de las instrucciones a las que preceden
y sirven de referencia para las instrucciones de salto. Así mismo, la directiva $ marca la
Microprocesadores Ing. Verónica Pérez 22
INSTITUTO UNIVERSITARIO DE TECNOLOGÍA
Antonio José de Sucre
GUÍA NRO 3: Set de Instrucciones y directivas de emsamblador
dirección de la instrucción actual. Normalmente es preferible colocar etiquetas y dejar el uso
de $ solo para los casos donde la propensión a cometer errores sea mínima, por ejemplo,
para las instrucciones de saltos cortos.
goto$+2; Saltar 2 instrucciones adelante
goto$-4; Saltar 4 instrucciones atrás
return