16f84A Alexis Sanchez
Alexis Sanchez –
[email protected]
Registros especiales o SFR (Special Function Registers) Registro INDF (Indirect File) (Dirección 00h)
El registro INDF que ocupa la posición 0 no tiene existencia física, por lo que no se podrá acceder a él. En realidad este registro sirve únicamente para especificar la utilización del direccionamiento indirecto referenciándolo en el direccionamiento indirecto de datos aunque se utiliza el contenido de FSR Significa que se va a añadir, al contenido del registro W, el contenido del registro apuntado por el registro FSR de dirección 04. Se realiza entonces el Direccionamiento indirecto con respecto al contenido de FSR. Sirviéndose de INDF únicamente como modo de notación. Registro TMR0 (Timer 0) (Dirección 01h)
Este registro almacena el valor del contador TMR0, que como ya sabemos, está funcionando continuamente e incrementando el valor que tiene almacenado. Las opciones que controlan este contador residen en el registro OPTION. El Contador de Programa PC (Program Counter) (Dirección 02h y 82h)
Este registro, normalmente denominado PC, es equivalente al de todos los microprocesadores y contiene la dirección de la próxima instrucción a ejecutar. Se incrementa automáticamente al ejecutar cada instrucción, de manera que la secuencia natural de ejecución del programa es lineal, una instrucción después de la otra. Algunas instrucciones (que llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de ejecución. Dentro de estas instrucciones se encuentran GOTO y CALL que permiten cargar en forma directa un valor constante en el PChaciendo que el programa salte a cualquier posición de la memoria. Otras instrucciones de control son los SKIP o saltos condicionales, que producen un incremento adicional del PC si se cumple una condición específica, haciendo que el programa salte, sin ejecutar, la instrucción siguiente. El PC es un registro de 13 bits en el 16F84, lo que permite direccionar 8.192 posiciones de memoria de programa, pero que internamente solamente podrá direccionar 1.024, por las limitaciones del PIC que de sobre conocemos. A diferencia de la mayoría de los microprocesadores convencionales, el PC es también accesible al programador como registro de memoria interna de datos, en la posición 02. Es decir que cualquier instrucción común que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecución del programa. El contador de programa especifica la dirección de la instrucción que se va a leer para ejecutarla. El PC tiene una anchura de 13 bits. El byte (los 8 primeros bits) de menor peso es llamado PCL (Program Counter Low). Este es leíble y escribible. El byte de mayor peso se llama PCH (Program Counter High) Este registro contiene los 13-8=5 bits del PC y no puede ser leído ni escrito directamente. Todos los cambios del PCH van a través del registro PCLATH, situado en las posiciones 0A y 8A.
Alexis Sanchez –
[email protected]
Si el PC es destino de una instrucción, el contenido de PCLATCH se ti ne en cuenta automáticamente. Para las instrucciones instrucciones GOTO y CALL, tiene lugar la misma operación, operación, teniendo en cuenta el hech o de que el PC está codificado con 11 bits e n la propia instrucción. El contador de progr ma y la pila
Los ocho registros de pila no aparecen en el cuadro de la figura 36 po no estar situados en el mismo espacio de m moria que los demás. Son registros de trec bits capaces de contener íntegramente al C. Su utilización es automática, ya que el P se introduce en la pila durante la ejecución de una instrucción CALL o de una interrupciión, y se extrae de la pila durante la ejecución del retorno correspondiente. Cuando los datos contenid os en el PC son almacenados o extraídos d la pila el registro PCLATH no se ve modific do. Estos registros de pila deb en considerarse como un buffer de memoria circular, lo que significa que, si se introdu e más de 8 valores del PC, el noveno valor omará la posición del primero, y así sucesiva mente. Si nos fijamos, ningún bit d e registro indica que la pila está llena, por lo que debemos tener cuidado de que no s desborde, desborde, excepto si queremos realizar op raciones de retorno especiales, pero e to ya es otro tema.
Figura 38 Principio de d eterminación de los bits de mayor peso del C por PCLATCH
El Registro STATUS o egistro de Estado (Dirección 03h y 3h)
Ahora vamos a empezar a describir los registros cuyos bits no form n bytes, de manera que un bit puede no tener nada que ver con el que tiene al lado. Esto s bits se configuran con un 1 o un 0, y activan o desactivan una función. Algunos de est s bits los podemos cambiar nosotros manual ente a través del programa. Otros no los activamos n sotros, si no que los activa automáticam nte el PIC cuando pasan ciertos procesos. E stos bits se llaman flags (banderas). Para hacernos una idea práctica una idea se levan l evan a (se pone a 1) cuando ha pasado algo, al igual que ocurre en el fútbol con los linieres d e banda, los cuales levantan su bandera c ando hay fuera de juego o hay saque de ban a. Los flags se usan para dar información adicional cuando se realizan o eraciones lógicas y aritméticas. Podemos hac r uso de ellas para tomar ciertas decisione s que veremos con calma para cada operació . El registro STATUS está f ormado por 8 bits: R/W bit 7 IRP
R/W
R/W
R
R
R/W
R/W
R/W
6 RP1
5 RP0
4 /TO
3 /PD
2 Z
1 DC
biit 0 C
Alexis Sanchez –
[email protected]
R/W significa que el bit correspondiente se puede leer y escribir, mientras que R significa que solamente puede ser leído. Ahora diremos el significado de cada bit. Los tres primeros bits son banderas. Bit 0 (flag) : C o bit de Carry (Acarreo) 1: acarreo del bit más significativo (bit 7) del resultado de la última operación de suma, pero no en la resta. 0: acarreo del bit más significativo (bit 7) del resultado de la última operación de resta, pero no en la suma. Bit 1 (flag) : DC o bit de Digit Carry (Acarreo de Dígito): Indica acarreo en el caso de que haya acarreo de un nibble. 1: acarreo del cuarto bit (bit 3) del resultado de la última operación de suma, pero no en la resta. 0: acarreo del cuarto bit (bit 3) del resultado de la última operación de resta, pero no en la suma. Bit 2 (flag) : Z o bit de Zero (Cero) 1: El resultado de la operación lógica es cero 0: El resultado de la operación lógica no es cero Bit 3 (flag) : PD o bit de Power Down (Apagado) 1: Recién encendido o después de la instrucción CLRWDT, que resetea el contador WatchDog. 0: Después de ejecutar la instrucción SLEEP (Dormir) •
•
•
•
• •
•
•
Bit 4 (flag) : TO o bit de Time Out (Tiempo acabado) • •
1: Recién encendido o después de una instrucción CLRWDT o SLEEP 0: Se produjo un reset por el WatchDog W atchDog Timer. Timer.
Bit 5 y 6: RP0 y RP1 o bits de selección de página. Sirven para escoger si se quiere
trabajar en el banco 0 o en el 1. En la figura 39 se detallan sus posibles condiciones, y a continuación las que se usan comúnmente. RP0 RP1 0 0: Banco de memoria 0 (00h-7Fh) 0 1: Banco de memoria 1 (80h-FFh)
Figura 39. Posibles configuraciones configuraciones de los bits de selección de página. El bit RP1 deberá ser puesto a cero, ya que si no nos saldríamos del rango de memoria.
Bit 7: bit IRP. Este bit está previsto para un futuro direccionamiento de paginado indirecto, pero no se utiliza en el 16C84. Tan solo se usa para compatibilidad con las futuras versiones, por lo que se debe poner a cero.
Alexis Sanchez –
[email protected]
El registro FSR o registro de selección de registro (Dirección 04h y 84h)
El contenido del FSR se utiliza para el direccionamiento indirecto. Este registro contiene 8 bits, tamaño suficiente para las versiones actuales del PIC 16CXX; no obstante, es preciso saber que en direccionamiento indirecto, puede construirse una dirección de 9 bits utilizando el contenido de este registro y el bit IRP del registro de estado. Esta función no se utiliza en el 16C84, sino que está prevista para extensiones futuras, de ahí que se aconseje no usar el bit IRP. Como no es usado en estas versiones, pasaremos este registro por alto hsata que veamos el direccionamiento indirecto. Registro PORTA y PORTB (Direcciones 05h y 06h)
Cuando vimos los puertos ya vimos un poco cómo funcionaba este puerte, unque le dedicamos más atención al registro TRIS. Por ello resumo de nuevo su funcionamiento. Es muy simple, pues el bit que pongamos a 1 en el registro se reflejará en la patilla correspondiente; igualmente pasará cuando lo pongamos a 0. bit 7 RB7
6 5 4 3 RB6 RB5 RB4 RB3
2 RB2
1 bit 0 RB1 RB0
bit 7
6
2 RA2
1 bit 0 RA1 RA0
5
4 3 RA4 RA3
Aquí todos los bits pueden ser leídos y escritos, excepto los 3 bits más significativos del puerto A. Registro EEDATA (Datos de EEPROM) (Dirección 08h)
La posición 07h nos la saltamos, pues no tiene ningún registro contenido. Esta dirección de memoria guarda el contenido de una posición de memoria EEPROM de datos antes de su escritura o después de su lectura, según leamos o escribamos en ella. Para leerla se sigue un proceso especial que comentaré cuando lleguemos a las instrucciones que hacen uso de ella. Como ya sabemos la memoria EEPROM es bastante lenta, dato que mantendremos en cuenta cuando accedamos a ella para escribirla, pues tarda unos 10 ms en completar el proceso. Registro EEADR (Dirección de EEPROM) (Dirección 09h)
En este registro se guardará la dirección de la posición de memoria EEPROM cuando queramos acceder a ella, bien para su lectura, o bien para su escritura. El igual que la dirección anterior, veremos su uso más a fondo cuando lleguemos a las instrucciones que hacen uso de él. Por otro lado, no hay mucho más que decir. Registro PCLATH (Contador de Programa Alto) (Dirección 0A y 8A)
El uso de este registro ya lo vimos cuando vimos el PCL y su relación con el PC. Lo pongo aquí sólo como recordatorio y para no salirnos del orden establecido. Registro INTCON (Control de Interrupciones) (Dirección 0B y 8B)
Este registro sirve para el control global de las interrupciones y para indicar la procedencia de algunas de ellas, gracias a los bits de estado. Se dispone de cuatro potenciales recursos de interrupción:
Alexis Sanchez –
[email protected]
Una fuente externa a través del pin RB0/INT. El desbordamiento del temporizador 0 (TMR0). Un cambio de estado en los pines RB4 a RB7. Programación de la EEPROM de datos. Cada bit del registro INTCON tiene un significado concreto que se muestra en la siguiente tabla bit 7 6 5 4 3 2 1 bit 0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF Y la explicación de cada bit viene a continuación: Bit 0 (flag): RBIF o bit de interrupción del puerto B 1: Si se pone a 1, este bit indica un cambio de estado en una de las líneas de RB4 a RB7 del puerto B. 0: Si no, no hay ninguna interrupción Bit 1 (flag): INTF o bit de interrupción de la Entrada de Interrupción INT 1: Si se pone a uno, indica que ha habido una interrupción provocada en la patilla RBO/INT del puerto B 0: Si no, no hay ninguna interrupción Bit 2 (flag): T0IF o bit de interrupción del Temporizador 0 1: Si se pone a uno, este bit indica un desbordamiento del temporizador 0 (TMR0) 0: Si no, no ha habido ninguna interrupción. Bit 3: RBIE o bit de habilitación de las interrupciones del puerto B (RB Interrupt Enable). 1: Si se pone a uno este bit, autoriza las interrupciones provocadas por un cambio de estado de las líneas RB4 a RB7 del puerto B. 0: Si se pone a cero, estas interrupciones están deshabilitadas. Bit 4: INTE o bit de Habilitación de la entrada de Interrupción (Interrupt Enable). 1: Si se pone a uno, este bit autoriza las interrupciones provocadas RB0/INT del puerto B 0: Si se pone a cero estas interrupciones están deshabilitadas y cuando se produzca una interrupción externa el flag correspondiente permanecerá inactivo. Bit 5: T0IE o bit de habilitación de la interrupción del temporizador por desbordamiento (Timer 0 Interrupt Enable) 1: Si se pone a uno, al igual que las anteriores, este bit autoriza las interrupciones debidas al desbordamiento del temporizador. 0: Si no el flag levantado por el desbordamiento permanecerá inactivo en el caso de que ocurra Bit 6: EEIE o bit de habilitación de las Interrupciones del la memoria EEPROM 1: Si se pone a 1, este bit permite que se produzcan interrupciones debidas al fin de escritura de la EEPROM, etc. 0: Si se pone a cero este tipo de interrupciones estarán inhibidas Bit 7: GIE o bit de habilitación global de interrupciones (Global Interrupt Enable) 1: Si se pone a uno este bit autoriza todas las interrupciones que estén enmascaradas mediante sus bits individuales de activación Alexis Sanchez –
[email protected]
-
0: A cero las inhibe.
Cada activador individual debe ponerse a cero por software. Solamente hay un vector indicador de interrupción (dirección 0004h), por lo que se debe comprobar estos bits en el programa de interrupción para saber cual es la fuente de la misma. Cuando llega una interrupción, el PIC pone el bit GIE a cero, de forma que no se perturbe el tratamiento de la interrupción en curso, debido a otras interrupciones eventuales. Este bit se pone automáticamente a uno al terminar el programa de interrupción, con la ejecución de la instrucción RETFIE. Los indicadores de interrupciones correspondientes permanecen funcionales incluso cuando no se han autorizado. En este caso también pueden leerse y escribirse todos los bits que componen este registro. Registro OPTION (o registro de opciones) (Dirección 80h)
Este es el primer registro del banco 1, cuyos registros usaremos menos, pero nos serán de gran ayuda en determinadas ocasiones. Por ejemplo, este registro sirve para definir algunos puntos básicos del funcionamiento del PIC. Los elementos que controla este registro con sus respectivos bits de control vienen explicados a continuación. R/W R/W R/W R R R/W 7 6 5 4 3 2 RBPU INTDEG T0CS T0SE PSA PS2
R/W 1 PS1
R/W 0 PS0
Bits 0, 1 y 2: Bits de configuración del divisor de frecuencia o prescaler. El funcionamiento de estos bits viene explicado en la siguiente tabla: PS2 PS1 PS0 División del TMR0 0 0 0 1/2 0 0 1 1/4 0 1 0 1/8 0 1 1 1/ 16 1 0 0 1 / 32 1 0 1 1 / 64 1 1 0 1 / 128 1 1 1 1 / 256
PS2 PS1 PS0
División del WDT
0 0 0 0 1 1 1 1
1/1 1/2 1/4 1/8 1 / 16 1 / 32 1 / 64 1 / 128
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
Bit 3: PSA o bit de asignación del divisor de frecuencia o Prescaler (Prescaler Assignment). 1: El divisor estará asignado al WDT. 0: En caso contrario el divisor estará asignado al TMR0 Bit 4: T0SE o bit de tipo de flanco activo (TIMER 0 Signal Edge) 1: Si está a 1 el TMR0 se incrementa con el flanco descendente de la señal aplicada a RA4/T0CK1. 0: Si está a cero este se incrementará con el flanco de subida Alexis Sanchez –
[email protected]
BIT 5: T0CS o bit de selección de la fuente de reloj para el contador (registro TMR0) (TIMER 0 Signal Source) 1: En este estado el contador usará la señal aplicada en la patilla RA4/T0CK1 para ser incrementado. 0: Si está a cero el temporizador usará el reloj interno, es decir, la frecuencia de reloj dividida entre cuatro. Bit 6: INTDEG o bit de selección de tipo de flanco para la entrada de interrupción. 1: Si está a uno la entrada RB0/INT será sensible a los flancos ascendentes (o flancos de subida) 0: En caso contrario será sensible a los flancos descendentes (o flancos de bajada) Bit 7: RBPU o bit de conexión de resistencias Pull-Up para el Puerto B (RB Pull Up enable) 1: Si está a uno las resistencias permanecen desconectadas 0: Si se pone a cero las resistencias se activarán Como podemos observar, lo normal es que las resistencias se activen ante un 1. Esto es por que este bit del registro OPTION está negada. Debido a esto, su etiqueta en el compilador será NOT_RBPU. El registro TMR0 se incrementa en una unidad con cada impulso de reloj seleccionado mediante el registro OPTION. Cada vez que llega al valor FF, vuelve a 00 generando una interrupción, si se ha autorizado, y continúa su ciclo indefinidamente. El registro TMR0 se puede leer o escribir directamente con cualquier instrucción, con el fin de conocer su posición actual, o para inicializarlo en un estado determinado. Es importante saber que después de cualquier escritura en este registro, es necesario un retardo de dos ciclos de instrucción para que se retome la incrementación. Este retraso es independiente de la fuente de reloj usada. Las instrucciones concernidas son MOVF TMR0 o CLRF TMR0. Para comprobar el paso por cero sin inferir en el desarrollo regular del recuento, es aconsejable utilizar, por ejemplo, una instrucción MOVF TMR0,W, que no hace mas que una lectura. El reloj interno deja de funcionar en el modo SLEEP, por lo que no se puede contar con sus interrupciones en este modo ni por consiguiente, que salga de este modo de funcionamiento por medio de dicha interrupción. Obsérvese que todas las instrucciones que escriben en el TMR0 ponen a cero al prescaler (divisor), cuando éste está asignado al temporizador. Registro TRISA y TRISB (85h y 86h)
Después del registro anterior vienen algunos registros del banco 0, que también están disponibles en el banco 1, pero para mantener la compatibilidad, accederemos a ellos desde el primero. Los registros TRISA y TRISB los vimos bastante a fondo cuando estudiamos los puertos, pero para evitar retroceder hasta entonces, explicaré de nuevo cual y cómo es su funcionamiento. Alexis Sanchez –
[email protected]
Estos registros son idénticos para el puerto A y el puerto B, con la diferencia de que uno será de 5 bits y otro de 8 bits, el mismo número de bits que tiene cada puerto. Los registros TRIS, también son llamados así, sirven para configurar si los bits de cada puerto serán de entrada o de salida, de acuerdo con la siguiente tabla: -
1: La patilla del puerto correspondiente será de entrada 0: En este caso la patilla actuará como una salida.
Registro EECON1
Este registro contiene configuraciones importantes acerca de la escritura y la lectura de la EEPROM de datos. En concreto tiene 5 bits de control, cuya distribución y significado es el siguiente. 7
6
5
4 3 2 1 EEIF WRERR WREN WR
0 RD
Bit 0: RD o bit de lectura (Read Data) 1: Este bit debe ponerse a uno para poder leer un dato. 0: El circuito lo pone automáticamente a cero Bit 1: WD o bit de escritura (Write Data) 1 Este bit debe ponerse a uno para escribir un dato. 0: El circuito lo pone automáticamente a cero Bit 2: WREN o bit de habilitación de escritura. (Write Enable) 1: Este bit debe ser habilitado para poder escribir en la EEPROM 0: De lo contrario impide cualquier escritura.. Bit 3 (flag): WRERR o flag de error de escritura (Write Error) 1: Este bit se pone a 1 si se produce un error de escritura después de una parada prematura (Reset o Watchdog). En este caso, los contenidos de EEADR y EEDATA no varían, de manera que el proceso pueda ser repetido correctamente. 0: Todo en orden ;). Bit 4 (flag): EEIF o flag de interrupción de EEPROM ( EEPROM Interrupt Flag) 1: Este bit se pone a uno al terminar la escritura en la EEPROM, y debe ponerse a cero por software 0: No hay interrupción alguna. Registro EECON2
Este registro no está implementado físicamente, por lo cual no se puede leer. Tan sólo sirve para un proceso de protección de escritura que consiste en copiar en él unos datos específicos, con el fin de evitar que un programa que tenga un despiste pueda programar la EEPROM por accidente, manipulando simplemente los bits del EECON1. Veremos sus aplicaciones cuando lleguemos a la parte de algoritmos sobre la EEPROM.
Alexis Sanchez –
[email protected]
EL LENGUAJE ENSAMBLADOR Introducción
Como ya dije al principio este lenguaje es complejo por su sencillez. Esto quiere decir que, a diferencia de los lenguajes de alto nivel, aquí no hay funciones que nos solucionen y simplifiquen el algoritmo, si no que hay que implementar hasta los pasos más elementales. Para los PIC se han creado unas instrucciones y una estructura de programa que lo hacen más sencillo y atractivo todavía. En este apartado veremos la síntesis que tiene este lenguaje y los elementos que la componen. D Identificación de elementos del programa en ensamblador
Cada instrucción de un PIC está formada por una palabra de 14 bits y a su vez está dividida e un tipo de código denominado OPCODE, que especifica el tipo de instrucción, y uno o más operandos que además especifican la operación de la instrucción. Todo ello forma un mnemónico o instrucción. Las instrucciones son elementos del lenguaje en ensamblador que veremos más adelante. Estos OPCODES o instrucciones se componen de los siguientes tipos de datos. Estos son abreviaturas usados en el lenguaje ensamblador. Sólo los 6 primeros componen estos OPCODES. Como ya he comentado anteriormente, las instrucciones se componen del código de la instrucción y de algunos operandos, que son los datos con los que la instrucción en sí, deberá hacer operaciones dentro del microcontrolador. Estos operandos son: -
f Registro de direcciones de registros( file register address) (0x00-0x7F) w Registro de trabajo (Working Register) b Dirección de un bit dentro de un registro de 8 bits (0-7) l ó k Literal d Bit de destino x Los bits que estén representados por este tipo de dato no tienen ninguna función y su valor lo define el compilador.
Estos vienen explicados detalladamente a continuación. -
f (file register)
Este carácter se usa para definir registros de cualquier tipo. Cualquier instrucción que contenga este campo, contendrá la dirección de un registro, no su contenido. Un registro puede variar entre las direcciones 00h y 7Fh. En el caso de los registros especiales en vez de la dirección podremos poner directamente el nombre del registro. Ej: (ya voy a empezar a poner algunos ejemplos con instrucciones para q nos vayamos familiarizando) en vez de: BSF 03,5 podemos poner: Alexis Sanchez –
[email protected]
BSF
STATUS,5
con lo cual habremos pasado de trabajar en el banco 0 al banco 1 -
w (working register)
W (w) da nombre al acumulador de los PICs, el cual lo vimos anteriormente cuando tratamos los registros. Este no es un registro situado en un banco de memoria, si no que es independiente. A diferencia que el anterior, cuando nos referimos a él, nos referimos al contenido, no al continente, puesto que el continente es único, w, y ya viene dado por la instrucción. Su uso es muy sencillo, pues lo usaremos principalmente para pasar información de un registro a otro, o para contener la información entre dos o más instrucciones. Es como un portapapeles, para hacernos una idea ;).
-
b (bit addres dentro de un registro)
Esta letra define la dirección de un bit dentro de un byte. En ciertas ocasiones en vez de modificar o acceder a bytes tendremos que modificar o acceder a bits. De esta manera podemos especificar a una instrucción que posición ocupa el bit sobre el cual recaerá la acción que esta ejecute. Al igual que en los registros especiales, podemos poner directamente el nombre de un bit dentro de un registro. Ej: en vez de: BSF
STATUS,5
ponemos: BSF -
STATUS,RP0
l o k (literal)
Este valor será almacenado en la propia instrucción en tiempo de ensamblado, esto significa que son los valores que nosotros introducimos en las instrucciones para que trabaje con ellos (independientemente de los datos que podamos almacenar o contener en la EEPROM de datos). El valor que podemos introducir dentro de un literal está comprendido entre 0 y 255, ya q es el máximo que puede representar un byte. No debemos olvidar que este valor debe ser introducido en hexadecimal. Siendo así, el valor que puede almacenar l está comprendido entre 0 y FF. -
d (destiny bit)
Donde nos encontremos esta letra, deberemos especificar donde se alamacenará el resultado de una instrucción, en w o en un registro. Puesto que esto no es un lenguaje de alto nivel, no podemos almacenar el resultado de una operación sobre una tercera variable o registro, así que este deberá ser almacenado en el registro Alexis Sanchez –
[email protected]
origen (sobrescribiéndose), o en el acumulador. Esto se define a través de dos valores: o 1: El resultado se almacenará en f o 0: El resultado se almacenará en W -
label o etiquetas
Las etiquetas se sitúan a la izquierda de las instrucciones y sirven para agrupar fragmentos de código. Estos fragmentos pueden ser de dos tipos: o El primer tipo no es un fragmento tal cual, si no que es un punto del programa al que podremos saltar de manera incondicional a través de la instrucción adecuada o El segundo tipo es denominado subrutina. Este empieza con una etiqueta y acaba con la instrucción RETURN o RETLW, que veremos más adelante. Directrices del ensamblador
Las instrucciones más importantes que podemos manejar son las que proporciona el fabricante de un microprocesador para su producto. Pero existen otras genéricas para gran cantidad de microcontroladores, que no son para el manejo del PIC, si no del ensamblador. Estos comandos generalmente se usan para simplificar la tarea de programar, y reciben el nombre de directrices. A continuación expongo las más relevantes. -
Directriz EQU El nombre de esta instrucción viene de la palabra “equal”, o lo que es lo mismo: “igual”. Sirve para “igualar” la posición de cualquier registro a un nombre personalizado que le hayamos dado nosotros. Si el nombre es más descriptivo que una simple dirección, la tarea de programar se hará mucho más sencilla. También podemos asignar un nombre a una instrucción que repitamos varias veces a lo largo del algoritmo, de manera que sea mucho más sencillo el tener que programarlo. A estos nombre que asignamos mediante esta directriz se les denomina constantes, ya que el registro al que apuntan no variará durante el programa Ej: temp equ 12 DATO EQU 22 Bank_1
EQU BSF
STATUS,RP0
Esto es lo que se ha hecho para crear las abreviaturas de los registros antes expuestas. Estas están contenidas en un fichero que se incluye al principio de código y del cual hablaremos más tarde (véase apartado Instrucción INCLUDE ). No siempre es necesario que con esta directriz se igualen posiciones de memoria a las etiquetas, ya que podremos poner nombres a datos. Por ejemplo, podemos calcular la frecuencia de máquina a partir de la frecuencia de reloj con la finalidad de emplearla para hacer otros cálculos de la manera que se describe a continuación: Alexis Sanchez –
[email protected]
clockrate fclk
EQU EQU
.4000000 clockrate/4
; frecuencia del cristal ; frecuencia del reloj interno
Además de esto, podremos igualar a las etiquetas cualquier otro tipo de valores que usemos, como, por ejemplo, el cero y el 1 en el bit de destino: W F
EQU 0 EQU 1
Generalmente este ejemplo no tendremos que realizarlo, siempre que incluyamos el fichero correspondiente al PIC con el que estemos trabajando. -
Directriz ORG Esta directriz dice al ensamblador a partir de que posición de memoria se situarán las siguientes instrucciones. Recuerda que el 16F84 sólo tiene 1024 posiciones de memoria flash para código. Un ejemplo de su uso es el siguiente. Ej: Inicia el programa en la posición cero ORG 0x00 Nos saltamos el vector de interrupción ORG GOTO ORG Inicio
-
0x00 ; El programa comienza en la dirección 0 y inicio ; salta a la dirección 5 para sobrepasar ; el vector de interrupción, situado en la posición 4 0x05 xxx…..
Directriz INCLUDE Esta instrucción índica qué archivos deberán tomarse en cuenta a la hora de compilar el código. Normalmente se usa para incluir el archivo de PIC que el ensamblador tiene entre sus archivos, con el cual el compilador será capaz de reconocer todos los registros especiales y sus bits. Su uso nos recordará al #include del lenguaje C. Esta línea debe colocarse al principio, y tiene la siguiente sintaxis: include "P16F84.INC" En ciertas ocasiones gran cantidad errores son debidos a que el nombre del archivo puesto entre comillas no coincide con el que tiene el ensamblador en sus registros internos. Para suprimirlos basta con poner en la cabecera el nombre de este archivo. Alexis Sanchez –
[email protected]
Podemos crear archivos con funciones, definiciones y subrutinas que usemos a menudo en nuestro código, y que para evitarnos tener que copiarlas cada vez, bastará con incluir el archivo. El archivo P16F84 contiene, como ya he comentado anteriormente, las definiciones de los registros, bits y bits de configuración (también llamados fuses). Con echar un ojo nos bastará para comprender cual es su composición. No obstante, su inclusión en nuestro programa no es obligatoria, y podemos suprimir esta directriz, pero a cambio tendremos que redefinir los nombres de los registros que usemos o bien llamarlos por su posición de memoria. -
Directriz LIST Este comando sirve para que el compilador tenga en cuenta sobre qué procesador se está trabajando. Este comando debe estar en todo proyecto, situado debajo del “include”, con la siguiente sintaxis. LIST P=16F84
-
Directriz END Al igual que las dos anteriores, esta debe ir incluida una sola vez en todo el programa. En concreto, esta debe situarse al final, para indicar al ensamblador que el programa ha finalizado. Esta siempre debe estar presente, aunque el flujo de nuestro programa acabe en un bucle.
-
Directriz #DEFINE Define se usa para crear pequeñas macros. Con estas macros podremos poner nombres a pequeños fragmentos de código que nos facilitarán la realización y comprensión del algoritmo. Por ejemplo, podremos poner nombres a bits. #
define
CERO
STATUS,2
Así, en vez de tener que llamar al bit por un numero y un registro, podremos usar directamente la palabra CERO. Hemos de tener en cuenta que la definición del ejemplo ya está hecha en el archivo P16F84.inc. Otro ejemplo muy práctico es el de poner nombre a un fragmento de código usado frecuentemente. Este fragmento de código, puede ser por ejemplo, el que conmuta entre los dos bancos. BSF BCF
OPTION,RP0 OPTION,RP0
Como cambiamos varias veces de banco a lo largo de un algoritmo, puede resultar más práctico ponerle un nombre en vez de la parrafada de arriba. #define BANCO1 #define BANCO0
BSF BCF
OPTION,RP0 OPTION,RP0
Alexis Sanchez –
[email protected]
De este modo bastará con poner BANCO1 o BANCO0 para conmutar entre los dos bancos de memoria. Una cosa a tener en cuenta es que con la directriz INCLUDE, podemos prescindir del carácter almohadilla (#), pero en el caso de la directriz DEFINE, no. -
Directriz TITLE Esta directriz no sirve de mucho, pero será útil para aquellos que quieran que el compilador tenga en cuenta el título que le ha puesto a su código. Tiene la siguiente sintaxis: TITTLE
“Nombre
del
código”
Este nombre aparecerá en los archivos .lst (listados) que cree el compilador. -
Directriz MACRO A diferencia de la instrucción define, esta directriz permite crear macros más extensas que #define, que nos evitarán tener que ejecutar reiteradamente fragmentos de código idénticos. Cuando una macro es invocada, esta es copiada por el ensamblador en el lugar de la invocación dentro del código fuente. La macro se declara con la directriz MACRO, y termina con la directriz ENDM. Ej: ENDM
jz btfsc goto
MACRO JumpLabel STATUS, Z JumpLabel ;
;
; Flag
Pregunta está
;
Línea variable
Salta
si a
el uno
; ahora lo invocamos movf AnyReg, xorwf Constante jz ThisLabel
w
; Compara la ; Salta a la macro
de con
código Constante
Estructura de un programa en ensamblador
Ya hemos estudiado algunas partes del programa en lenguaje ensamblador. Sólo nos falta conocer la parte más importante: las instrucciones. Pero antes de eso, veremos cual es la estructura básica de un algoritmo en código ensambladora con la finalidad de ener claro cual es la estructura de todos los elemento que acabamos de ver. Esto lo veremos más a fondo cuando veamos todo lo concerniente a la programación. Esta estructura contiene los siguientes elementos o partes que deben ser codificadas: Comentario descriptivo del programa (opcional, pero recomendable) Definir el microcontrolador que se usará (con las directrices LIST e INCLUDE). Introducir las opciones de compilación (que serán vistas más adelante)(opcional) Establecer las constantes que se usarán (con la directriz EQU). Alexis Sanchez –
[email protected]
aquí
-
Reservar espacios de memoria (directriz RES) (si es necesario) Configurar los puertos Desarrollar el programa Poner comentarios
Y su estructura es:
Figura 41. Esquema de un programa
Hemos visto la estructura general. Ahora veremos la posición de los elementos del código por columnas. Estas se dividen en cuatro: -
Columna 1: Etiqueta. Las etiquetas se rigen por las siguientes normas: · Debe situarse en la primera columna Alexis Sanchez –
[email protected]
· Debe contener únicamente caracteres alfanuméricos · El máximo de caracteres es de 31 -
Columna 2:
Operación. En esta columna se situarán las instrucciones
Columna 3: Son los registros (f, l o k , b y w) donde se almacenarán los resultados y con los que se operará
-
Columna 4: Comentario. Aquí se situará cualquier comentario personalizado que deseemos. Estos son útiles para saber qué hace un programa sin tener que descifrar el código entero. El compilador (ensamblador) ignorará todo texto más allá del carácter punto y coma “;”. Estos comentarios generalmente se sitúan en la cuarta columna para describir la acción de una línea de código, pero pueden situarse en cualquier parte de programa para describir cualquier otro evento, siempre que estén después del carácter “;” (semicolon en inglés). Veamos más detenidamente cual es su posición:
Figura 42 . Esquema de un programa por columnas
Normalmente las columnas son separadas por una tabulación. El espacio mínimo entre dos columnas es de un carácter, que puede ser un espacio en vez de una tabulación
LAS INTRUCCIONES DEL PIC 16F84 Alexis Sanchez –
[email protected]
Introducción
Ya llegamos a la parte más interesante e importante del manejo de un microcontrolador: las instrucciones. Nuestro microcontrolador, como ya sabemos, pertenece a la gama media y es de tipo RISC; esto quiere decir que tiene un juego de instrucciones reducido, en concreto de 35. Estas 35 instrucciones o nemónicos (del inglés mnemonics(os recuerda a la película ;) ?) y a su vez proveniente del juego de palabras: Nem On Icks) serán la base de funcionamiento del PIC. Al igual que los bits de los registros, será imposible aprendernos todas y a la vez su funcionamiento, pero a la hora de codificar nuestros programas deberemos tenerlas en cuenta. Así, cuando tengamos dudas sobre su uso, esta guía será la chuleta ideal para recordarlo ;p. Las instrucciones fundamentalmente se dividen en tres tipos. Esta división viene dada por el tipo de datos con los que trabajan: • • •
Instrucciones orientadas a los bytes (byte-oriented operations) Instrucciones orientadas a los bits (bit-oriented operations) Operaciones con literales y de control (literal and control operations)
Aparte de estas instrucciones, hay otro tipo de instrucciones usadas para simplificar la tarea de programar, y q generalmente están formadas por dos instrucciones básicas. Estas no las trataremos a fondo, pero las veremos en un resumen después de comprender el funcionamiento de las 35 instrucciones básicas. En los tres apartados siguientes veremos todos los datos que se pueden dar acerca de una función. Algunos de ellos son irrelevantes y no son nuestro objetivo. En cambio otros, como la acción, la sintaxis, el funcionamiento, la operación, el comportamiento del registro STATUS y los ejemplos, son imprescindibles para comprender su funcionamiento. INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES (REGISTROS) ADDWF Acción
Suma el contenido del acumulador y el registro dado, y el resultado lo guarda en d ADDWF f,d
Sintaxis Funcionamiento Add W to file register (Añade W al registro) Operación d = W + f (d puede ser W ó f). Descripción Esta instrucción suma el contenido de un registro específico al
Comentarios
Registro STATUS
contenido de W donde f puede ser un registro cualquiera con un determinado valor. Aunque ya conocemos el funcionamiento del bit d, lo repetiré de nuevo para el resto de instrucciones: Si vale 1, el resultado se guarda en el registro f Si vale 0, el resultado se guarda en el acumulador W Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operación es 0. DC vale 1 si el resultado de la operación es un número superior a 15. C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo). • •
•
Alexis Sanchez –
[email protected]
Ejemplo
Tomamos como valores iniciales W = 5 y DATO = 10, donde dato es un registro cualquiera. ADDWF ADDWF ADDWF ADDWF
DATO DATO, 1 DATO, 0 DATO, W
; DATO = 15 y W = 5. ; DATO = 15 y W = 5. ; W = 15 y DATO = 10. ; W = 15 y DATO = 10.
ANDWF Acción Sintaxis Bits (OPCODE) Operación Descripción
Comentarios
Realiza la operación AND entre un registro y W ANDWF f,d
00 0101 dfff ffff d = W AND f (d puede ser W o f). Esta instrucción realiza la operación lógica AND entre el acumulador y el registro f. el resultado se guarda dependiendo del valor de d. Si este se omite, el valor por defecto es 1 y se guarda en f La operación AND es una de las operaciones básicas del álgebra de Boole. Esta viene descrita en el apartado de electrónica digital. Para comprender de nuevo cual es su comportamiento, recojo en la siguiente tabla los valores de la tabla de verdad de esta operación. ENTRADA f W 0 0 0 1 1 0 1 1
SALIDA S
0 0 0 1
La operación lógica es: S=f·W
Registro STATUS Ejemplo 1
Esta instrucción realiza esta operación para cada uno de los 8 bits de los dos registros, dos a dos, guardando el resultado en el registro correspondiente. Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción ANDWF f,d •
ENTRADA W f Bit 7 0 1 Bit 6 0 1 Bit 5 0 1 Bit 4 0 1 Bit 3 1 0 Bit 2 1 0
RESULTADO W·f
0 0 0 0 0 0
Alexis Sanchez –
[email protected]
1 0 0 1 0 0 Ahora en nuestro segundo ejemplo tenemos que W = 01110011 y f = 00101001 antes de ejecutar la instrucción ANDWF f,d tenemos: Bit 1 Bit 0
Ejemplo 2
ENTRADA W Bit 7 0 Bit 6 1 Bit 5 1 Bit 4 1 Bit 3 0 Bit 2 0 Bit 1 1 Bit 0 1
f
RESULTADO W·f
0 0 1 0 1 0 0 1
0 0 1 0 0 0 0 1
CLRF Acción Sintaxis Bits (OPCODE) Operación Descripción Registro STATUS Ejemplo
Borra un registro CLRF f
00 0001 1fff ffff F=0 Esta instrucción borra un registro específico, poniendo sus bits a cero Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0). Tenemos un registro que se llama dato y que vale 3F. Ponemos: CLRF dato Ahora dato vale 00
CLRW Acción Sintaxis Funcionamiento Operación Descripción Comentarios Registro STATUS Ejemplo
Borra el acumulador CLRW
Clear W W=0 Esta instrucción borra el registro W solamente Donde pone xxx… en la instrucción en hexadecimal, significa que noo importa qué valor puede contener Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0). Tenemos el acumulador cargado con el valor 3F. Ponemos: CLRF dato Ahora W vale 00
COMF Alexis Sanchez –
[email protected]
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Complementa el registro F COMF f,d
Complement f d = NOT f (d puede ser W ó f). Esta instrucción complementa un registro, es decir, los ceros los convierte en unos, y los unos en ceros. Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Supongamos que tenemos un registro fdenominado regist = 00111011; cuando es aplicada la instrucción tenemos que los 0 cambian a valores 1 y los valores 1 cambian a 0 obteniéndose un registro invertido. El resultado será regist = 11000100. •
DECF Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Decrementa el registro f DECF f,d
Decrement f d = f – 1 (d puede ser W ó f). Esta instrucción decrementa en una sola unidad el registro "f". Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Nuestro registro se llama regist = 5; cuando se aplica la instrucción DECF f,0 el resultado será W=4. Por el contrario, si aplicamos la instrucción DECF f,1 el resultado será regist = 4. •
DECFSZ Acción
Decrementa el registro f, y si el resultado es cero, se salta una instrucción. DECFSZ f,d
Sintaxis Funcionamiento Decrement f, skip if 0 d = f – 1, si d = 0 SALTA (d puede ser W ó f). Operación Esta instrucción decrementa el contenido del registro direccionado Descripción
Comentarios Registro STATUS Ejemplo
por el parámetro f, y si el resultado es 0 salta la instrucción siguiente. Si no, sigue con su curso habitual Aquí nos enfrentamos ante la primera instrucción que plantea una condición, y que modifica el curso del PC. No modifica ningún bit de estado DECFSZ VALOR, W INSTRUCCION 1 INSTRUCCIÓN 2 Si el contenido del registro VALOR al decrementarlo es igual a 0, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltándose la INSTRUCCION1. Alexis Sanchez –
[email protected]
Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente). INCF Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Suma una unidad al registro f INCF f,d
Increment f d = f + 1 (d puede ser W ó f). Esta instrucción incrementa en una sola unidad el registro "f". Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Si tenemos un registro llamado DIA = 7. Aplicando la instrucción INCF DIA, 0, tendremos W = 8 y DIA = 7. Si aplicamos esta otra INCF DIA, 1, tendremos DIA = 8. •
INCFSZ Acción Sintaxis Funcionamiento Operación Descripción
Registro STATUS Ejemplo
Incrementa en 1 a f, y si f= 0 salta la siguiente instrucción INCFSZ f,d
Increment f, Skip if 0 d = f + 1, si d = 0 SALTA (d puede ser W ó f). Esta instrucción incrementa en una sola unidad el registro "f", en la cual si el resultado “d” es igual a cero, entonces salta la instrucción siguiente. No modifica ningún bit de estado. Ejecutamos las siguiente sinstrucciones: INCFSZ VALOR, W INSTRUCCION 1 INSTRUCCIÓN 2
; el resultado se almacenará en W ; salta aquí si W ≠0 ; salta aquí si W=0
Si el contenido del registro VALOR es igual a 0 al incrementarlo en una unidad, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltándose la INSTRUCCION1. Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente).
IORWF
Alexis Sanchez –
[email protected]
Acción
Operación lógica OR entre el acumulador y un registro
Sintaxis Funcionamiento Operación Descripción
IORWF f,d
Comentarios
Inclusive Or W with F d = W OR f (d puede ser W ó f). Esta instrucción realiza una operación lógica OR inclusivo entre el acumulador W y el registro direccionado por el parámetro f. El parámetro d determina donde se almacenará el resultado de la operación. Si no se pone nada, el valor por defecto es 1 y se guarda en f. La operación OR inclusivo suele llamarse OR a secas, pero se pone así para diferenciarla de la Suma Exclusiva que veremos más adelante. La tabla de verdad de la suma lógica es la que sigue: ENTRADA f W 0 0 0 1 1 0 1 1
SALIDA S
0 1 1 1
La operación lógica que describe esta instrucción es esta: F+W=S
Registro STATUS Ejemplo 1
Se puede ver que basta con que uno de los dos registros tenga un uno para que la salida sea un uno también. Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción IORWF f,d, y después obtenemos: •
ENTRADA W Bit 7 0 Bit 6 0 Bit 5 0 Bit 4 0 Bit 3 1 Bit 2 1 Bit 1 1 Bit 0 1
Ejemplo 2
f
RESULTADO W+f
1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 En este segundo ejemplo tenemos que W = 01110011 y f = ENTRADA
RESULTADO
00101001, antes de ejecutar la instrucción IORWF f,d, y después obtenemos que: Alexis Sanchez –
[email protected]
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
W
f
W+f
0 1 1 1 0 0 1 1
0 0 1 0 1 0 0 1
0 1 1 1 1 0 1 1
Al igual que el caso anterior, el microcontrolador compara bit a bit los dos registros, dos a dos, obteniendo el resultado expresado en W + f MOVF Acción
Mueve el contenido de un registro al acumulador o al propio registro MOVF f,d
Sintaxis Funcionamiento Move f Operación d = f (d puede ser W ó f). Descripción Esta instrucción mueve el contenido del registro f en el mismo
Comentarios
Registro STATUS Ejemplo
registro f o en W. D determina el destino del resultado. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Se suele usar para mover datos al acumulador. El hecho de que se pueda mover sobre sí mismo no es otro que para mirar el resultado en el registro STATUS (no es ninguna tontería ;)) Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Tenemos el registro EDAD = 38 •
MOVF MOVF MOVF MOVF
EDAD, 0 EDAD, 1 EDAD, W EDAD
; hace que W = 38. ; hace que EDAD = 38. ; hace que W = 38. ; hace que EDAD = 38.
MOVWF Acción Sintaxis Funcionamiento Operación Descripción
Mueve el acumulador al registro f MOVWF f
Move W to f f=W Esta instrucción copia el contenido del acumulador W en el registro direccionado por el parámetro f. Alexis Sanchez –
[email protected]
Comentarios Registro STATUS Ejemplo
No existe el parámetro d (lógico, o no? En este caso no se puede copiar el acumulador sobre sí mismo :p ) No modifica ningún bit de estado. Si queremos escribir el valor 10H en el registro TMR0, que está situado en la dirección 01h, tendremos que cargar primero el valor en elacumulador y después copiarlo al registro. MOVWF 10H MOVWF 01H
; cargar el valor 10H en el acumulador. ; copia el acumulador en la dirección 01H.
O escrito de otra manera: MOVWF 10H MOVWF TMR0
; cargar el valor 10H en el acumulador. ; copia el acumulador en el registro TMR0.
NOP Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
No opera NOP
No Operation Ninguna Esta instrucción no reliza ninguna ejecución, pero sirve para gastar un ciclo de máquina, equivalente a 4 de reloj No modifica ningún bit de estado. Si usamos un cristal de cuarzo de 4 Mhz. en el oscilador, podremos obtener un retardo igual a un microsegundo por cada instrucción NOP que insertemos en el código del programa: RETARDO NOP NOP NOP RETURN Cada vez que llamemos a la subrutina RETARDO, obtendremos 3 microsegundos de demora.
RLF Acción Sintaxis Funcionamiento Operación Descripción
Rota a la izquierda el registro f RLF f,d
Rotate Left through Carry f d = << 1 (d puede ser W ó f). Esta instrucción rota a la izquierda todos los bits del registro direccionado por el parámetro fpasando por el bit CARRY del registro STATUS(desde los bits menos significativos a los más significativos). Es como si multiplicáramos por dos el contenido del registro. Veamos el registro fde forma gráfica: Alexis Sanchez –
[email protected]
Registro STATUS Ejemplo
El bit D7 pasa al CARRY del registro STATUS, el contenido delCARRY pasa al D0, el D0 al D1, etc. Modifica el bit C (CARRY). Tenemos el registro VALOR = 00000001 y aplicamos la instrucción RLF VALOR Entonces el resultado será VALOR = 00000010 y el bit C = 0. Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción RLF VALOR
Ciclos de máquina
El resultado será VALOR = 00000000 y el bit C = 1. 1
RRF Acción Sintaxis Funcionamiento Operación Descripción
Rota a la derecha el registro f RRF f,d
Rotate Right through Carry f d = f >> 1 (d puede ser W ó f). Esta instrucción rota a la derecha todos los bits del registro direccionado por el parámetro fpasando por el bit CARRY del registro STATUS(desde los bits más significativos a los menos significativos). Es como si dividiéramos por dos el contenido del registro. Veamos el registro fde forma gráfica:
El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc. El bit d determina el destino del resultado. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Alexis Sanchez –
[email protected]
Registro STATUS Ejemplo
Modifica el bit C (CARRY). Si tenemos el registro VALOR = 00000001 y aplicamos la instrucción RRF VALOR Entonces el resultado será VALOR = 00000000 y el bit C = 1. Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción RRF VALOR El resultado será VALOR = 01000000 y el bit C = 0.
SUBWF
Acción Sintaxis Funcionamiento Operación Descripción
Registro STATUS
Resta el contenido del registro W el registro f SUBWF f,d
Subtract W from f d = f – W (d puede ser W ó f). Esta instrucción resta el valor contenido en el acumulador W del valor contenido en el registro direccionado por el parámetro f. El parámetro ddetermina el destino. Si no se pone nada el valor por defecto será 1 y se almacenará en f. Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operación es 0. DC vale 1 si el resultado de la operación es un número superior a 15. C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo). Según sean los valores de W y el registro DATO, si aplicamos SUBWF DATO obtendremos diferentes resultados en el bit CARRY. • •
Ejemplo
Si DATO = 3 y W = 2; el resultado será DATO = 1 y C = 1. Si DATO = 2 y W = 2; el resultado será DATO = 0 y C = 1. Si DATO = 1 y W = 2; el resultado será DATO = FFH y C = 0. Vemos que C = 1 porque el resultado es positivo y C = 0 cuando el resultado es negativo. SWAPF
Acción Sintaxis Funcionamiento
Invierte los dos nibbles que forman un byte dentro de un registro SWAPF f,d
Swap nibbles in f Alexis Sanchez –
[email protected]
Operación Descripción
Registro STATUS Ejemplo
f = 0123 SWAP 4567 de f Esta instrucción intercambia el valor de los 4 bits más significativos (D7-D4) contenidos en el registro f, con los 4 bits menos significativos (D3-D0) del mismo. El parámetro d determina el destino. Si no se pone nada, el valor por defecto es 1 y se guarda en f. No modifica ningún bit de estado. Tenemos VALOR = 00001111 y W = 00000000. Aplicamos la instrucción SWAPF SWAPF VALOR ; VALOR = 11110000B y W = 00000000B. SWAPF VALOR, W ; VALOR = 00001111B y W = 11110000B. Con la primera instrucción modificamos el valor del registro DATO, y en la segunda instrucción modificamos el valor del acumulador sin que varíe el registro DATO
XORWF
Acción Sintaxis Funcionamiento Operación Descripción
Comentarios
Operación lógica OR-Exclusiva XORWF f,d
Exclusive OR W with f d = W OR f Esta instrucción efectúa la operación lógica XOR (OR exclusivo) entre el valor contenido en el acumulador W y el valor contenido en el registro direccionado por el parámetro f. El parámetro d determina el destino. Si no se pone nada el valor por defecto es 1 y se guarda en f Al igual que las otras operaciones lógicas, la suma exclusiva está tratada en el capítulo de electrónica digital. No obstante expongo las tablas de verdad correspondientes a esta operación ENTRADA f W
0 0 1 1
0 1 0 1
SALIDA S
0 1 1 0
La salida únicamente se podrá a nivel alto cuando las dos entradas sean distintas. Esto es útil cuando tenemos una suma lógica en la que 1 + 1 es 10 y nos llevamos 1. Esta operación algebraicamente se expresa así: S=f+W
Registro STATUS
Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Alexis Sanchez –
[email protected]
Ejemplo 1
Tenemos dos registros que se corresponden con los siguientes valores W= 00001111 y f = 11110000 antes de ejecutar la instrucción XORWF f,d. Una vez ejecutada obtenemos la siguiente tabla de verdad sobre los dos registros: ENTRADA RESULTADO Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Ejemplo 2
W
f
W+f
0 0 0 0 1 1 1 1
1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1
El PIC compara dos a dos los bits de los registros Ahora W = 01110011 y f = 00101001 antes de ejecutar la instrucción XORWF f,d y después obtenemos: ENTRADA RESULTADO Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
W
f
W+f
0 1 1 1 0 0 1 1
0 0 1 0 1 0 0 1
0 1 1 1 1 0 1 0
Alexis Sanchez –
[email protected]
INSTRUCCIONES ORIENTADAS AL MANEJO DE BITS BCF
Acción Sintaxis Funcionamiento Operación Descripción Comentarios Registro STATUS Ejemplo
Pone a cero el bit b del registro f BCF f,b
Bit Clear f F(b) = 0 Esta instrucción pone a cero un bit que hayamos elegido de un registro determinado. No debemos olvidar que en la numeración de los bits también se tiene en cuenta el 0. Si tratamos con un registro especial, podemos poner el nombre del bit correspondiente. No modifica ningún bit de estado. BCF BCF bit
PORTA, RA4 ; pone a 0 el bit RA4 del registro PORTA PORTA, 4 ; igual, si no conocemos en nombre del
Si en el PORTA tenemos como valor inicial 11111111, después de aplicar el ejemplo anterior, PORTA = 11101111. BSF
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Pone a uno el bit b del registro f BSF f,b
Bit Set f F(b) = 1 Esta instrucción pone a uno un bit que hayamos elegido de un registro determinado. No modifica ningún bit de estado. BSF BSF bit
PORTA, RA0 ; pone a 1 el bit RA0 del registro PORTA PORTA, 0 ; igual, si no conocemos en nombre del
Si en el PORTA tenemos como valor inicial 00000000, después de aplicar el ejemplo anterior, PORTA = 00000001. BTFSC Acción
Comprueba un bit b del registro f, y salta la instrucción siguiente si este es cero BTFSC f,b
Sintaxis Funcionamiento Bit Test, Skip if Clear Operación F(b) = 0? SI, salta una instrucción Descripción Esta instrucción comprueba el valor del bit b en el registro f, y si b
= 0 entonces se salta la siguiente instrucción. Si b = 1 no salta y sigue con su ejecución normal. Alexis Sanchez –
[email protected]
Registro STATUS Ejemplo
No modifica ningún bit de estado BTFSC PORTA, INSTRUCCIÓN 1 INSTRUCCIÓN 2
2
Si en PORTA tenemos como valor inicial 11111011, el programa continúa con la instrucción 2, saltándose la instrucción 1 Si en PORTA tenemos el valor 00000100, el programa sigue con la instrucción 1 y después la instrucción 2 BTFSS
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Comprueba un bit b del registro f, y salta la instrucción siguiente si este es uno BTFSC f,b
Bit Test, Skip if Set F(b) = 1? SI, salta una instrucción Esta instrucción comprueba el valor del bit b en el registro f, y si b = 1 entonces se salta la siguiente instrucción. Si b = 0 no salta y sigue con su ejecución normal. No modifica ningún bit de estado BTFSS PORTB, INSTRUCCIÓN 1 INSTRUCCIÓN 2
7
Si en PORTB tenemos como valor inicial 10000000, el programa continúa con la instrucción 2, saltándose la instrucción 1. Si tenemos el valor 01111111, el programa sigue con la instrucción 1 y después la instrucción 2.
Alexis Sanchez –
[email protected]
OPERACIONES CON LITERALES Y DE CONTROL ADDLW
Acción Sintaxis Funcionamiento Operación Descripción Comentarios Registro STATUS
Suma a W un literal
ADDLW Add literal to W W=W+k Esta instrucción suma un valor de un literal al contenido del registro W y lo guarda en W. Es igual que su homologo manejando registros Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operación es 0. DC vale 1 si el resultado de la operación es un número superior a 15. C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo). MOVLW 3 ; carga el acumulador W con el valor 3. ADDLW 1 ; suma 1 al acumulador. Al final el acumulador tendrá el valor 4. • •
•
Ejemplo
ANDLW
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Realiza la operación AND entre un literal y W ANDLW k
AND W with k W = W AND k Esta instrucción realiza una operación lógica AND entre el contenido deW y k. El resultado se guarda siempre en el acumulador W Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Si cargamos el acumulador con el número binario 10101010 y hacemos un AND con el binario 11110000, nos quedará el resultado de la operación en el acumulador W. MOVLW 10101010 ANDLW 11110000 El resultado de la operación queda en W = 10100000. •
CALL
Acción Sintaxis Funcionamiento Operación Descripción
Llama a una subrutina en la dirección k CALL k
Call subroutine CALL k...RETURN PC+1. Esta instrucción llama a un grupo de instrucciones (subrutina) que Alexis Sanchez –
[email protected]
comienzan en la dirección k, donde k puede ser un valor numérico o una etiqueta. Siempre termina con la instrucción de retorno (RETURN oRETLW). Definición de subrutina: son un grupo de instrucciones que forman un programa dentro del programa principal y que se ejecutan cuando las llama el programa principal. Utilidad: sirven para utilizarlas varias veces en cualquier parte del programa, sin necesidad de tener que copiar las mismas instrucciones, con el consiguiente ahorro de memoria. Funcionamiento: cuando un programa ejecuta una instrucción CALL, guarda en el stack el valor del registro PC+1 (PC = Program Counter) de manera que al regresar de la subrutina continúa con la instrucción siguiente recuperándola del stack, ejecutando la instrucción de retorno RETURN oRETLW.
Comentarios
Registro STATUS Ejemplo
Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack, por lo que el número máximo de CALL reentrantes (instrucciones CALL que contengan otra instrucción CALL) queda limitado a 8. Definición de subrutina: son un grupo de instrucciones que forman un programa dentro del programa principal y que se ejecutan cuando las llama el programa principal. Utilidad de las subritunas: sirven para utilizarlas varias veces en cualquier parte del programa, sin necesidad de tener que copiar las mismas instrucciones, con el consiguiente ahorro de memoria. Funcionamiento: cuando un programa ejecuta una instrucción CALL, guarda en el stack el valor del registro PC+1 (PC = Program Counter) de manera que al regresar de la subrutina continúa con la instrucción siguiente recuperándola del stack, ejecutando la instrucción de retorno RETURN oRETLW. Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack, por lo que el número máximo de CALL reentrantes (instrucciones CALL que contengan otra instrucción CALL) queda limitado a 8. No modifica ningún bit de estado. PRINCIPAL: etiqueta que identifica una dirección de memoria. RETARDO: etiqueta que identifica el comienzo de una subrutina. BUCLE: etiqueta que identifica una dirección de memoria. PRINCIPAL CALL RETARDO BTFSC PORTB, RB0 GOTO PRINCIPAL * * * RETARDO CLRF CONTADOR BUCLE DECFSZ CONTADOR, 1 GOTO BUCLE RETURN Alexis Sanchez –
[email protected]
En este listado vemos que la subrutina RETARDO salta a un grupo de instrucciones que forman un bucle y cuando éste termina regresa para seguir con la instrucción siguiente al salto (BTFSC...). CLRWDT
Acción Sintaxis Funcionamiento Operación Descripción
Registro STATUS Ejemplo
Pone el temporizador WDT a cero. CLRWDT
Clear WatchDog Timer WDT = 0 Esta instrucción se utiliza cuando programamos el PIC con la opción Watch Dog habilitada. Para evitar el reset del PIC, el programa debe contener cíclicamente la instrucción CLRWDT para ponerlo a cero. Si no se pone a cero a tiempo, el WDT interpretará que se ha bloqueado el programa y ejecutará un reset para desbloquearlo. No modifica ningún bit de estado. Bucle
CLRWDT * * * GOTO Bucle
GOTO
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Salto incondicional a k. GOTO k
Go to address (label) Salto k Esta instrucción ejecuta un salto del programa a la dirección k. El parámetro k puede ser un valor numérico o una etiqueta. No modifica ningún bit de estado.
ABAJO
INSTRUCCIÓN 1 GOTO ABAJO INSTRUCCIÓN 3 INSTRUCCIÓN 4 INSTRUCCIÓN 5 INSTRUCCIÓN 6
Primero se ejecuta la instrucción 1, después GOTO y continúa con la instrucción 6 saltándose las instrucciones 3, 4 y 5.
Alexis Sanchez –
[email protected]
IORLW
Acción Sintaxis Funcionamiento Operación Descripción Comentarios
Operación lógica OR entre el acumulador y un literal IORWF f,d
Inclusive OR W with l W = W OR l Esta instrucción realiza una operación lógica OR inclusivo entre el acumulador W y un literal. El resultado siempre se guarda en el acumulador. La operación OR inclusivo suele llamarse OR a secas, pero se pone así para diferenciarla de la Suma Exclusiva que veremos más adelante. La tabla de verdad de la suma lógica es la que sigue: ENTRADA
SALIDA
f
W
S
0 0 1 1
0 1 0 1
0 1 1 1
La operación lógica que describe esta instrucción es esta: F+W=S
Registro STATUS Ejemplo
Se puede ver que basta con que uno de los dos registros tenga un uno para que la salida sea un uno también. Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. Supongamos que W= 00001111 y l = f0. Ejecutanado la instrucción IORWF f,d, obtenemos: •
ENTRADA Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
RESULTADO
W
l
W+l
0 0 0 0 1 1 1 1
1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1
MOVLW
Acción Sintaxis Funcionamiento Operación
Copia el contenido de un literal al acumulador MOVLW f
Move literal to W W=f Alexis Sanchez –
[email protected]
Descripción Comentarios Registro STATUS Ejemplo
Esta instrucción asigna al acumulador W el valor del literal k, el cual debe estar comprendido entre 0 y 255. Ninguno No modifica ningún bit de estado. Si tenemos el acumulador a cero o con cualquier valor, y queremos que contenga el que le asignemos nosotros directamente entonces usaremos esta instrucción: W = 0. Valor a asignar = 100. Instrucción: MOVLW 100 El acumulador valdrá 100 (W = 100). Con distinto valor de partida del acumulador: W = 225. MOVLW 100 El acumulador valdrá 100 (W = 100).
RETFIE
Acción Sintaxis Funcionamiento Operación Descripción Comentarios Registro STATUS Ejemplo
Retorno de la llamada a una subrutina RETFIE
Return From Interrupt FIN INTERRUPCIÓN Esta instrucción devuelve el control al programa principal después de ejecutarse una subrutina de gestión de una interrupción. Ninguno No modifica ningún bit de estado ORG 00H BUCLE GOTO BUCLE; bucle infinito. ORG 04H; vector de interrupción. RETFIE ; retorna de la interrupción Este código de programa ejecuta un bucle infinito. Si habilitamos una de las interrupciones del 16F84, en cuanto ésta se produzca pasará el control al programa situado en la dirección 04h y la instrucción RETFIE regresa de la interrupción. Al ejecutarse una interrupción, el bit GIE del registro INTCON se pone a 0 y así evita que otra interrupción se produzca mientras ya está con una en marcha. Con la instrucción RETFIE ponemos de nuevo el bit GIE a 1 para así atender de nuevo a futuras interrupciones.
Alexis Sanchez –
[email protected]
RETLW
Acción Sintaxis Funcionamiento Operación Descripción
Retorno de subrutina y carga literal k en el acumulador RETLW
Comentarios
¿Y para qué me sirve regresar de una subrutina con un determinado literal en el acumulador? Nos será muy útil al programar con TABLAS. No modifica ningún bit de estado
Registro STATUS Ejemplo
Return with Literal in W RETORNO con W = k Esta instrucción retorna de una subrutina al programa principal, cargando el acumulador W con el literal k. Es la última instrucción que forma una subrutina, al igual que RETURN, con la diferencia que carga en W el valor de k.
SUBRUT1 SUBRUT2
CALL MOVWF CALL MOVWF * * RETLW RETLW
SUBRUT1; llama a Subrut1. DATO 1 ; carga W en Dato1. SUBRUT2; llama a Subrut2. DATO2 ; carga W en Dato2. 0A 0B
; carga W = 0A y retorna. ; carga W = 0B y retorna.
RETURN
Acción Sintaxis Funcionamiento Operación Descripción
Comentarios
Registro STATUS
Retorno de una subrutina. RETURN
Return from subroutine RETORNO Esta instrucción retorna de una subrutina al programa principal en la instrucción siguiente a la llamada de la subrutina, tomando el valor almacenado en el stack para continuar. Es la última instrucción que forma una subrutina (al igual que RETLW). El procedimiento es siempre el mismo. Así, tenemos que crear la subrutina y darle el nombre para poder ser llamada; al final de la subrutina se debe escribir la instrucción denominada RETURN. Entonces podemos concluir que una subrutina está constituida por un conjunto de instrucciones demarcadas por un nombre que se encuentra al inicio y la instrucción RETURN que se encuentra al final demarcando el final de la subrutina. Estos mismos pasos debemos seguirlos para la instrucción RETLW No modifica ningún bit de estado.
Alexis Sanchez –
[email protected]
Ejemplo
CALL COMPARA INSTRUCCION1 INSTRUCCION2 * * COMPARA INSTRUCCIÓN R1 INSTRUCCIÓN R2 RETURN
; llama a Compara. ; vuelve aquí cuando se ; ejecuta return
Aquí llamamos a la subrutina COMPARA, se ejecutan las instrucciones R1 y R2 y con el RETURN regresa a la instrucción siguiente al CALL y ejecuta las instrucciones 1, 2 y sigue con el programa. SLEEP
Acción Sintaxis Funcionamiento Operación Descripción
Registro STATUS Ejemplo
Paso a modo de bajo consumo SLEEP
Go into Standby Mode EN ESPERA. Esta instrucción detiene la ejecución del programa, deja el PIC en modo suspendido y el consumo de energía es mínimo. No ejecuta ninguna instrucción hasta que sea nuevamente reinicializado (reset) o surja una interrupción. Durante este modo, el contador del Watch Dog sigue trabajando, y si lo tenemos activado el PIC se reseteará por este medio. No modifica ningún bit de estado. No creo que haga falta… ;)
SUBLW
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS
Resta al literal k el valor del acumulador. SUBLW k
Substract W from Literal W=k-W Esta instrucción resta al literal k el valor almacenado en W y el resultado se guarda en el acumulador. Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operación es 0. DC vale 1 si el resultado de la operación es un número superior a 15. C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo). MOVLW 10 ; carga el acumulador W con el valor 10. SUBLW 15 ; resta a 15 el valor del acumulador. Al final el acumulador tendrá el valor W = 5. • •
•
Ejemplo
Alexis Sanchez –
[email protected]
XORLW
Acción Sintaxis Funcionamiento Operación Descripción
Comentarios
Operación lógica OR exclusivo entre el acumulador y el literal k XORLW k
Exclusive OR Literal with W W = W XOR k Esta instrucción realiza un OR exclusivo entre el contenido del acumulador W y el valor del literal k. El resultado se guarda siempre en el acumulador (recuerda que k es un literal, no un registro). Al igual que las otras operaciones lógicas, la suma exclusiva está tratada en el capítulo de electrónica digital. No obstante expongo las tablas de verdad correspondientes a esta operación ENTRADA
SALIDA
f
W
S
0 0 1 1
0 1 0 1
0 1 1 0
La salida únicamente se podrá a nivel alto cuando las dos entradas sean distintas. Esto es útil cuando tenemos una suma lógica en la que 1 + 1 es 10 y nos llevamos 1. Esta operación algebraicamente se expresa así: S=f+W
Registro STATUS Ejemplo
Modifica el bit Z. Z vale 1 si el resultado de la operación es 0. W = 01110011 y k = 00101001 antes de ejecutar la instrucción XORWF k ENTRADA RESULTADO •
W k Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 1 1 1 0 0 1 1
0 0 1 0 1 0 0 1
W+k
0 1 1 1 1 0 1 0
Alexis Sanchez –
[email protected]
INSTRUCCIONES DE LA GAMA BAJA
Entre estas instrucciones no se han incluido dos rutinas que aparte de no pertenecer a las 35 instrucciones de la gama media, no pueden ser clasificadas en ninguna de las categorías expuestas anteriormente, aunque normalmente son acogidas dentro de las instrucciones con literales y de control. Estas instrucciones son OPTION y TRIS. La razón por la cual no pertenecen a estas 35 instrucciones es porque fueron creadas pensando en la gama baja, ya que carece de 4 de las instrucciones de la gama media: ADDLW, RETFIE, RETURN y SUBLW. No por ello se ha prohibido a la gama media disponer de estas instrucciones: OPTION
Acción Sintaxis Funcionamiento Operación Descripción Registro STATUS Ejemplo
Guarda el valor del acumulador en el registro OPTION OPTION
OPTION = W Esta instrucción guarda en el registro especial OPTION el valor contenido en el acumulador W No modifica ningún bit de estado. MOVLW OPTION
10H ; carga el acumulador con el valor 10h. ; carga el registro OPTION con el acumulador.
Esta instrucción existe para mantener la compatibilidad con los PIC producidos con anterioridad, y como en el futuro podría dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma: BSF MOVLW MOVWF
STATUS, RP0 ; activa el banco 1. 10H ; carga el acumulador con 10h OPTION_REG ; carga OPTION con el acumulador.
TRIS
Acción Sintaxis Funcionamiento Operación Descripción
Registro STATUS Ejemplo
Guarda el acumulador en uno de los registros de TRIS. TRIS f
TRIS de f = W. Esta instrucción guarda el valor del acumulador W en uno de los registros especiales de TRIS que indicamos en el parámetro f. Los registros TRIS determinan el funcionamiento como entrada y salida de las líneas I/O del PIC. No modifica ningún bit de estado. MOVLW 16h ; carga el acumulador W con el valor 16h TRIS PORTA ; carga el registro PORTA con el acumulador.
Alexis Sanchez –
[email protected]
Esta instrucción existe para mantener la compatibilidad con los PIC producidos anteriormente, y como en el futuro podría dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma (aunque ocupa más memoria...): BSF STATUS, RP0 ; activa el banco 1. MOVLW 16h ; carga el acumulador con el valor 16h MOVWF TRISA ; carga el registro PORTA con W.
Alexis Sanchez –
[email protected]
INSTRUCCIONES ESPECIALES
Existe un conjunto de instrucciones especiales diseñadas para facilitar las operaciones a la hora de diseñar nuestros algoritmos. Estas instrucciones pueden ser implementadas con una, dos o tres de las instrucciones de la gama media. La mayoría de ellas se basa en las operaciones con los acarreos y con los bits del registro status en general. Este cuadro sólo debe servir de referencia, y no debemos usarlo en el caso de que estemos empezando. Sólo lo usaremos si vemos muy claro el funcionamiento de las instrucciones, pero es recomendable usar la forma equivalente, que tiempo de acomodarnos ya tendremos. Otra cosa que debemos tener en cuenta es que no por reducir algoritmos a una sola expresión, vamos a ahorrar ciclos de máquina. Mnemónico
Parámetros Descripción
Traducción
Operación Equivalente
Flags
ADDCF ADDDCF B BC BDC BNC BNDC BNZ BZ CLRC CLRDC CLRZ LCALL
f, d
Add Carry to File
Sumar acarreo a f
Z
f, d
Add Digit Carry to File
Sumar acarreo de digito a f
K K
Branch Branch on Carry
K
Branch on Digit Carry
K
Branch on No Carry
K
Branch on No Digit Carry
K
Branch on No Zero
K
Branch on Zero
K
Clear Zero Long CALL
Saltar a unaetiqueta Saltar a una etiqueta si hay acarreo Saltar a una etiqueta si hay acarreo de digito Saltar a una etiqueta si no hay acarreo Saltar a una etiqueta si no hay acarreo de digito Saltar a una etiqueta si no hay cero Saltar a una etiqueta si hay cero Poner a cero acarreo Poner a cero acarreo de digito Poner a cero el flag Zero Llamada larga a una etiqueta
BTFSC INCF BTFSC INCF GOTO BTFSC GOTO BTFSC GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSC GOTO BCF BCF
LGOTO
K
Long GOTO
Salto largo a una etiqueta
MOVFW NEGF SETC SETDC SETZ SKPC SKPDC SKPNC SKPNDC SKPNZ SKPZ SUBCF SUBDCF TSTF
F f, d
Move File to W Negate File
Mover registro a W Negar un registro
Set Carry Set Digit Carry
Skip on Non Zero Skip on Zero Substract Carry from File
Poner a uno el acarreo Poner a uno el acarreo de digito Poner a uno el Zero Saltar si hay acarreo Saltar si hay acarreo de digito Saltar si no hay acarreo Saltar si no hay acarreo de digito Saltar si no hay Zero Saltar si hay Zero Restar acarreo delregistro
Substract Digit Carry from File Test File
Restar acarreo de dígito del registro Probar registro
Clear Carry Clear Digit Carry
Set Zero Skip on Carry Skip on Digit Carry Skip on No Carry Skip on No Digit Carry
f,d f,d f
Alexis Sanchez –
[email protected]
3,0 f,d 3,1 f,d k 3,0 k 3,1 k 3,0 k 3,1 k 3,2 k 3,2 k 3,0 3,1
Z -
BCF 3,2 BSF/BCF 0A,3 BSF/BCF 0A,4 CALL k BSF/BCF 0A,3 BSF/BCF 0A,4 GOTO k MOVF f,0 COMF f,1 INCF f,d BSF 3,0 BSF 3,1
Z Z
BSF 3,2 BTFSS 3,0 BTFSS 3,1
-
BTFSC 3,0 BTFSC 3,1
-
BTFSC BTFSS BTFSC DECF BTFSC DECF MOVF
Z
3,2 3,2 3,0 f,d 3,1 f,d f,1
-
Z Z
CUADRO DE INSTRUCCIONES Para finalizar, las 35 instrucciones de la gama media las encontraremos resumidas en
los tres próximos cuadros.
Instrucciones orientadas a los bytes
Mnemónico ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ
Parámetros f, d f, d f f, d f, d f, d
INCF INCFSZ
f, d f, d
IORWF
f, d
MOVF MOVWF NOP RLF
f, d f f, d
RRF
f, d
SUBWF SWAPF XORWF
f, d f, d f, d
Descripción Add W and f AND W with f Clear f Clear W Complement f Decrement f Decrement f, Skip if 0 Increment f Increment f, Skip if 0 Inclusive OR W with f Move f Move W to f No Operation Rotate left f through carry Rotate right f through carry Subtract W from f Swap nibbles in f Exclusive OR W with f
Ciclos 1 1 1 1 1 1 1(2)
Banderas C, DC, Z Z Z Z Z Z None
1 1(2)
Z None
1
Z
1 1 1 1
Z None None C
1
C
1 1 1
C, DC, Z None Z
Alexis Sanchez –
[email protected]