FUNDACIÓN UNIVERSITARIA SAN MARTÍN CAT MONTERÍA – FACULTAD DE INGENIERÍA DE SISTEMAS

EL PIC16F84

El PIC 16f84 es el microcontrolador que fabrica la compañía Microchip. Aunque no son los microcontroladores que más prestaciones ofrecen, en los últimos años han ganado mucho mercado, debido al bajo precio de éstos, lo sencillo de su manejo y programación y la ingente cantidad de documentación y usuarios que hay detrás de ellos. ¿Para qué sirve un PIC? Un PIC, al ser un microcontrolador programable, puede llevar a cabo cualquier tarea para la cual haya sido programado. No obstante, debemos ser conscientes de las limitaciones de cada PIC. Así, el 16F84, PIC que se tratará en este tutorial, no podrá generar un PWM ni convertir señales analógicas en digitales, entre otras. El 16F84 Se trata de un microcontrolador de 8 bits. Es un PIC de gama baja, cuyas características podemos resumir en: - Memoria de 1K x 14 de tipo Flash - Memoria de datos EEPROM de 64 bytes - 13 líneas de E/S con control individual - Frecuencia de funcionamiento máxima de 10 Mhz. - Cuatro fuentes de interrupción - Activación de la patita RB0/INT - Desbordamiento del TMR0 - Cambio de estado en alguna patia RB4-RB7 - Fin de la escritura de la EEPROM de datos - Temporizador/contador TMR0 programable de 8 bits - Perro Guardián o WatchDog Generalmente se encuentra encapsulado en formato DIP18. A continuación puede apreciarse dicho encapsulado y una breve descripción de cada una de las patitas: imagen: - VDD: alimentación - VSS: masa - OSC1/CLKIN-OSC2/CLKOUT: conexión del oscilador - VPP/MCLR: tensión de programación y reset - RA0-RA3: líneas de E/S de la puerta A - RA4: línea de E/S de la puerta A o entrada de impulsos de reloj para TMR0 - RB0/INT: línea de E/S de la puerta B o petición de interrupción - RB1-RB7: líneas de E/S de la puerta B

GOOD LUCK

preparó: Ing. Indalecio Copete

PIC - Líneas E/S, recursos auxiliares, programación A excepción de dos patitas destinadas a recibir la alimentación, otras dos para el cristal de cuarzo, que regula la frecuencia de trabajo, y una más para provocar el Reset, las restantes patitas de un microcontrolador sirven para soportar su comunicación con los periféricos externos que controla. Las líneas de E/S que se adaptan con los periféricos manejan información en paralelo y se agrupan en conjuntos de ocho, que reciben el nombre de Puertas. Hay modelos con líneas que soportan la comunicación en serie; otros disponen de conjuntos de líneas que implementan puertas de comunicación para diversos protocolos, como el I2C, el USB, etc. Recursos auxiliares Según las aplicaciones a las que orienta el fabricante cada modelo de microcontrolador, incorpora una diversidad de complementos que refuerzan la potencia y la flexibilidad del dispositivo. Entre los recursos más comunes se citan los siguientes: - Circuito de reloj: se encarga de generar los impulsos que sincronizan el funcionamiento de todo el sistema. Temporizadores, orientados a controlar tiempos. - Perro Guardián o WatchDog: se emplea para provocar una reinicialización cuando el programa queda bloqueado. - Conversores AD y DA, para poder recibir y enviar señales analógicas. - Sistema de protección ante fallos de alimentación - Estados de reposos, gracias a los cuales el sistema queda congelado y el consumo de energía se reduce al mínimo. Programación de microcontroladores La utilización de los lenguajes más cercanos a la máquina (de bajo nivel) representan un considerable ahorro de código en la confección de los programas, lo que es muy importante dada la estricta limitación de la capacidad de la memoria de instrucciones. Los programas bien realizados en lenguaje Ensamblador optimizan el tamaño de la memoria que ocupan y su ejecución es muy rápida. Los lenguajes de alto nivel más empleados con microcontroladores son el C y el BASIC de los que existen varias empresas que comercializan versiones de compiladores e interpretes para diversas familias de microcontroladores. En el caso de los PIC es muy competitivo e interesante el compilador de C PCM de la empresa CCS y el PBASIC de microLab Engineerign, ambos comercializados en España por Mircosystems Engineering. Hay versiones de interpretes de BASIC que permiten la ejecución del programa línea a línea, y en ocasiones, residen en la memoria del propio microcontrolador. Con ellos se puede escribir una parte del código, ejecutarlo y comprobar el resultado antes de proseguir.

GOOD LUCK

preparó: Ing. Indalecio Copete

Organización de la memoria del PIC 16F84 A continuación podemos ver la organización de la memoria del 16F84: Podemos comprobar como la memoria está dividida en dos bancos (cada una de las columnas): banco 0 y banco 1. Las primeras 12 posiciones de cada banco (00h0Bh y 80h-8Bh) están ocupadas por los Registros de Propósito Especial (Special Purpose Registers). Estos registros, en los que entraremos en detalle más adelante, son los encargados de controlar ciertas funciones específicas del PIC. Las 68 posiciones siguientes (0Ch-4Fh y 8ChCFh) son los denominados Registros de Propósito General, del inglés General Purpose Registers. Éstos son empleados para guardar cualquier dato que necesitemos durante la ejecución del programa. BANCO 0  TMR0: es un temporizador/contador de 8 bits. Puede operar de dos modos distintos: - Temporizador: el registro incrementa su valor en cada ciclo de instrucción (Fosc/4). - Contador: el registro incrementa su valor con cada impulso introducido en la patita RA4/TOSKI. En ambos casos, cuando el registro se desborda, es decir, llega a su valor máximo (en este caso 2^8 = 256. Como el 0 también se cuenta, el máximo valor sería 255), empieza de nuevo a contar a partir del 0, no sin antes informar de este evento a través de la activación de un flag y/o una interrupción.  PCL: es el contador del programa. Indica la dirección de memoria que se leerá a continuación. En algunas ocasiones, como el empleo de las tablas, el uso de este registro es imprescindible.  STATUS: registro de 8 bits que sirve para configurar ciertos aspectos del PIC. En la siguiente figura se aprecia la disposición de los bits de dicho registro: Bit 7 IRP Bit 6 Bit 5 RP0 Bit 4 TO# Bit 3 PD# Bit 2 Z Bit 1 DC Bit 0 C

GOOD LUCK

preparó: Ing. Indalecio Copete

ya que la puerta A sólo tiene 5 líneas de E/S  PORTB: lo mismo que la puerta A.bcf f.Brinco . deberemos usarlo de registro puente para llevar a cabo ciertas operaciones.b: pone a 1 el bit b del registro f.bsf f.Control y especiales . o al menos más empleadas en la programación de PICs. . .Manejo de bits . b: explora el bit b del registro f y salta si vale 0 .clrf f: limpia el registro f. los tres bits de mayor peso no representan ninguna línea de E/S.Manejo de registros . Repertorio de instrucciones A continuación veremos algunas de las instrucciones más importantes. en etiqueta GOOD LUCK preparó: Ing. pero referente a la puerta B.Btfss f. Indalecio Copete . . Cuando vale 0 se selecciona el Banco 0 y cuando vale 1 el Banco 1.comf f. el destino es el registro fuente f. Si un bit se encuentra en 1. en ASM.Btfsc f. Cada bit representa una línea de E/S de la puerta A: Bit 7 Bit 6 Bit 5 Bit 4 RA4 Bit 3 RA3 Bit 2 RA2 Bit 1 RA1 Bit 0 RA0  Como se puede comprobar.  PORTA: representación de la puerta A. en cambio.b: pone a 0 el bit b del registro f. Las restantes se irán viendo en entregas posteriores según vaya siendo necesario u manejo: . si. entre otras. se encuentra a 0. esa línea de E/S se configura como entrada.RP0: indica el banco de memoria con el que se está trabajando. Es de vital importancia ya que.d: complementa el registro fuente f cambia los 1 por 0 y viceversa) y el resultado lo deposita en el destino. pero en este caso con 8 líneas de E/S BANCO 1  TRISA: registro de 8 bits de configuración de la puerta A. . también conocido como registro de trabajo (del inglés work) o acumulador. se configura como salida  TRISB: lo mismo que TRISA.Goto etiqueta: sitúa el cursor del programa (PCL). b: explora el bit b del registro f y salta si vale 1 . es decir. pone todos sus bits a 0. . Bit7 RB7 Bit6 RB6 Bit5 RB5 Bit4 RB4 Bit3 RB3 Bit2 RB2 Bit1 RB1 Bit0 RB0 Finalmente cabe destacar el registro W. Si d = 0 el destino es W y si d = 1.

.  CARACTERÍSTICAS ESPECIALES Algunos elementos que forman parte de los PIC no se encuentran en microcontroladores de otros fabricantes. PILA (STACK). esto significa que se pueden anidar 8 llamados a subrutina sin tener problema alguno. lo que garantiza un arranque correcto del sistema. por que el watchdog hace que se reinicie el sistema o por que ocurre una interrupción al sistema. Es muy útil cuando se trabaja en ambientes con mucha interferencia o ruido electromagnético. dicho circuito hace que el microcontrolador sufra un reset cada determinado tiempo (que se puede programar entre 18 mS y 2 segundos). Este reset lo puede evitar el usuario mediante una instrucción especial del microcontrolador (CLRWT: Borra el contenido del watchdog). lo cual representa grandes ventajas. Su tiempo de retardo es de 72 milisegundos. . Cuando se habilita su funcionamiento.INTERRUPCIONES Este microcontrolador incluye el manejo de interrupciones. o simplemente representan alguna ventaja o facilidad a la hora de hacer un diseño. o cuando se atiende una interrupción. Se usan para guardar el valor del contador de programa cuando se hace un llamado a una subrutina (CALL ). la cual se debe ejecutar antes de que termine el periodo nominal de dicho temporizador. por algún ruido o interferencia externa. el sistema se reiniciará (cuando se acabe el tiempo programado y no se haya borrado el contador) y el programa puede restablecerse para continuar con su funcionamiento normal.MODO DE BAJO CONSUMO (Sleep) Esta característica permite que el microcontrolador entre en un estado pasivo donde consume muy poca potencia. Cuando se entra en este modo el oscilador principal se detiene. Este es el registro de trabajo principal. . cuando el micro regresa a seguir ejecutando su tarea normal. para ello se debe seleccionar "ON".REGISTRO DE TRABAJO W. Este registro participa en casi todo el programa y por consiguiente en la mayoría de las instrucciones. Este oscilador corre de manera independiente al oscilador principal.TEMPORIZADOR DE ENCENDIDO (Power-up Timer) Este proporciona un reset al microcontrolador en el momento de conectar la fuente de alimentacion. pero el temporizador del circuito de vigilancia (watchdog) se reinicia y empieza su conteo nuevamente. Se entra en ese estado por la ejecución de una instrucción especial (llamada SLEEP) y se sale de él cuando el microcontrolador sufre un reset por un pulso en el pin MCLR. A continuación una corta descripción de las más significativas. Indalecio Copete . Esta conformado por un oscilador RC que se encuentra dentro del microprocesador.CIRCUITO DE VIGILANCIA (Watchdog Timer) Su función es restablecer el programa cuando éste se ha perdido por fallas en la programación o por alguna razón externa. El PIC 16F84 tiene una pila de 8 niveles. luego. el contador de programa recupera su valor leyéndolo nuevamente desde la pila. De esta manera si el programa se ha salido de su flujo normal. El PIC16F84 posee cuatro formas de interrupción que son: GOOD LUCK preparó: Ing. se comporta de manera similar al acumulador en los microprocesadores. . En el momento de grabar el microcontrolador se debe habilitar el fusible de configuración "Power-up Timer". Estos registros no forman parte de ningún banco de memoria y no permiten el acceso por parte del usuario.

cuando tengamos dudas sobre su uso. Si el bit GIE (Global Interrup Enable) se coloca en 0. a la vez que habilita de nuevo las interrupciones. pertenece a la gama media y es de tipo RISC. Un cambio en los pines del puerto B (RB4 a RB7) colocará en uno el bit RBIF (INTCON). El bit de control respectivo es RBIE (INTCON). esto quiere decir que tiene un juego de instrucciones reducido. Cuando se presenta un flanco valido en el pin INT. Al igual que los bits de los registros.    Interrupción externa en el pin RB0/INT Finalización del temporizador/contador TMR0 Finalización de escritura en la EEPROM de datos Cambio de estado en los pines RB4 a RB7 El registro 0Bh o INTCON contiene las banderas de las interrupciones INT. Interrupción Externa. Así. La interrupción puede reactivar al microcontrolador después de la instrucción SLEEP. incluida la de escritura de la memoria EEPROM. el bit GIE se coloca en 0 automáticamente pare evitar interferencias con otras interrupciones que se pudieran presentar. Actúa sobre el pin RB0/INT y se puede configurar para activarse con el flanco de subida o el de bajada. INTF se debe colocar en cero antes de regresar al programa principal. La bandera respectiva se debe colocar. pero a la hora de codificar nuestros programas deberemos tenerlas en cuenta. la bandera INTF (INTCON) se coloca en uno. esta guía será la chuleta ideal para recordarlo . de acuerdo al bit INTEDG (Interrup Edge Select Bit. será imposible aprendernos todas y a la vez su funcionamiento. como ya sabemos. Una vez en la rutina de servicio. Indalecio Copete . es conveniente que el programador tenga cuidado con el registro de estados y el de trabajo. se coloca en 1 el bit EEIF (EECON1). la fuente de interrupción se puede determinar examinando las banderas de interrupción. Sólo la bandera de finalización de la escritura reside en el registro 88h o EECON1. por software. Cuando la escritura de un dato en la EEPROM finaliza. para evitar que se vuelva a detectar nuevamente la misma interrupción. GOOD LUCK preparó: Ing. Cuando se atiende la interrupción. Estas 35 instrucciones o nemónicos (del inglés mnemonics(os recuerda a la película . Interrupción por finalización de escritura. La superación del conteo máximo (0FFh) en el TMR0 colocara el bit TOIF (INTCON) en uno. Cuando una interrupción es atendida. localizado en el registro OPTION). La interrupción se puede deshabilitar colocando el bit de control INTE (INTCON) en cero. al colocar el bit GIE en uno.) ?) y a su vez proveniente del juego de palabras: Nem On Icks) serán la base de funcionamiento del PIC. deshabilita todas las interrupciones. en cero antes de regresar de la interrupción. Debe tenerse presente que solamente el contador de programa es puesto en la pila al atenderse la interrupción. La instrucción RETFIE permite al usuario retornar de la interrupción. Interrupción por cambio en el puerto RB.p. en concreto de 35. si previamente el bit INTE fue habilitado Interrupción por finalización de la temporización. cambio en el puerto B y finalización del conteo del TMR0. la dirección de retorno se coloca en la pila y el PIC se carga con la dirección 04h. Nuestro microcontrolador. El bit de control respectivo es TOIE (INTCON). a través de la rutina de servicio. al igual que el control para habilitar o deshabilitar cada una de las fuentes de interrupción. El bit de control respectivo es EEIE (INTCON). por lo tanto. ya que se pueden introducir resultados inesperados si dentro de ella se modifican.

 Z vale 1 si el resultado de la operación es 0. y q generalmente están formadas por dos instrucciones básicas. la sintaxis. INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES (REGISTROS) ADDWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Suma el contenido del acumulador y el registro dado. son imprescindibles para comprender su funcionamiento.Si vale 1. el comportamiento del registro STATUS y los ejemplos. Indalecio Copete .Si vale 0. la operación. En los tres apartados siguientes veremos todos los datos que se pueden dar acerca de una función. . Estas no las trataremos a fondo. ADDWF ADDWF ADDWF ADDWF 1 DATO DATO. y el resultado lo guarda en d ADDWF f. DATO = 15 y W = 5. lo repetiré de nuevo para el resto de instrucciones: . W . donde dato es un registro cualquiera. hay otro tipo de instrucciones usadas para simplificar la tarea de programar.Las instrucciones fundamentalmente se dividen en tres tipos. W = 15 y DATO = 10.d Add W to file register (Añade W al registro) 07 ff 00 0111 dfff ffff d = W + f (d puede ser W ó f). Tomamos como valores iniciales W = 5 y DATO = 10. pero las veremos en un resumen después de comprender el funcionamiento de las 35 instrucciones básicas. Registro STATUS Ejemplo Ciclos de máquina GOOD LUCK preparó: Ing. DATO = 15 y W = 5. . el funcionamiento. W = 15 y DATO = 10.  DC vale 1 si el resultado de la operación es un número superior a 15. En caso contrario C vale 0 (resultado negativo). Algunos de ellos son irrelevantes y no son nuestro objetivo. Aunque ya conocemos el funcionamiento del bit d. 0 DATO. como la acción. Esta instrucción suma el contenido de un registro específico al contenido de W donde f puede ser un registro cualquiera con un determinado valor. DC y C. 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. el resultado se guarda en el registro f . En cambio otros.  C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. el resultado se guarda en el acumulador W Modifica los bits Z. 1 DATO. .

Para comprender de nuevo cual es su comportamiento. el resultado se guarda dependiendo del valor de d. Modifica el bit Z.ANDWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Realiza la operación AND entre un registro y W ANDWF f.d tenemos: ENTRADA RESULTADO W f W·f Bit 7 0 0 0 Bit 6 1 0 0 Bit 5 1 1 1 W 0 1 0 1 SALIDA S 0 0 0 1 Comentarios Registro STATUS Ejemplo 1 Ejemplo 2 GOOD LUCK preparó: Ing. Indalecio Copete . recojo en la siguiente tabla los valores de la tabla de verdad de esta operación. Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción ANDWF f. dos a dos. guardando el resultado en el registro correspondiente. Si este se omite.d ENTRADA RESULTADO W f W·f Bit 7 0 1 0 Bit 6 0 1 0 Bit 5 0 1 0 Bit 4 0 1 0 Bit 3 1 0 0 Bit 2 1 0 0 Bit 1 1 0 0 Bit 0 1 0 0 Ahora en nuestro segundo ejemplo tenemos que W = 01110011 y f = 00101001 antes de ejecutar la instrucción ANDWF f. 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 instrucción realiza la operación lógica AND entre el acumulador y el registro f. Esta viene descrita en el apartado de electrónica digital.d AND W with f 05 ff 00 0101 dfff ffff d = W AND f (d puede ser W o f).  Z vale 1 si el resultado de la operación es 0. ENTRADA f 0 0 1 1 La operación lógica es: S=f·W Esta instrucción realiza esta operación para cada uno de los 8 bits de los dos registros.

Ponemos: CLRF dato Ahora W vale 00 1 Ciclos de máquina COMF GOOD LUCK preparó: Ing.Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Ciclos de máquina 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 CLRF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Borra un registro CLRF f Clear file register 01 8f 00 0001 1fff ffff F=0 Esta instrucción borra un registro específico. poniendo sus bits a cero Ninguno Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0). 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 un registro que se llama dato y que vale 3F. Tenemos el acumulador cargado con el valor 3F. Ponemos: CLRF dato Ahora dato vale 00 1 Ciclos de máquina CLRW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Borra el acumulador CLRW Clear W 01 8f 00 0001 0xxx xxxx W=0 Esta instrucción borra el registro W solamente Donde pone xxx… en la instrucción en hexadecimal. Indalecio Copete .

d Decrement f. Si no. y los unos en ceros. 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.Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Ciclos de máquina Complementa el registro F COMF f.d Complement f 09 ff 00 1001 dfff ffff d = NOT f (d puede ser W ó f). Indalecio Copete . es decir. ninguno Modifica el bit Z. ninguno Modifica el bit Z.0 el resultado será W=4. DECFSZ f. Supongamos que tenemos un registro fdenominado regist = 00111011. Esta instrucción decrementa en una sola unidad el registro "f".1 el resultado será regist = 4. se salta una instrucción. cuando se aplica la instrucción DECF f. si d = 0 SALTA (d puede ser W ó f). si aplicamos la instrucción DECF f. 1 Ciclos de máquina DECFSZ Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Decrementa el registro f. y si el resultado es cero. los ceros los convierte en unos.d Decrement f 03 ff 00 0011 dfff ffff d = f – 1 (d puede ser W ó f). Esta instrucción decrementa el contenido del registro direccionado por el parámetro f. skip if 0 0B ff 00 1011 dfff ffff d = f – 1. Por el contrario. Esta instrucción complementa un registro. y si el resultado es 0 salta la instrucción siguiente.  Z vale 1 si el resultado de la operación es 0. 1 DECF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Decrementa el registro f DECF f. Nuestro registro se llama regist = 5.  Z vale 1 si el resultado de la operación es 0. GOOD LUCK preparó: Ing.

y que modifica el curso del PC. Si aplicamos esta otra INCF DIA.Comentarios Registro STATUS Ejemplo sigue con su curso habitual Aquí nos enfrentamos ante la primera instrucción que plantea una condición. si d = 0 SALTA (d puede ser W ó f). GOOD LUCK preparó: Ing. se guarda el resultado en el acumulador y sigue con la INSTRUCCION2. Ninguno Modifica el bit Z. en la cual si el resultado “d” es igual a cero. No modifica ningún bit de estado DECFSZ VALOR. Si tenemos un registro llamado DIA = 7. tendremos DIA = 8. W INSTRUCCION 1 INSTRUCCIÓN 2 Si el contenido del registro VALOR al decrementarlo es igual a 0. Si el resultado que guardamos en W no es 0. 1. y si f= 0 salta la siguiente instrucción INCFSZ f.d Increment f 0A ff 00 1010 dfff ffff d = f + 1 (d puede ser W ó f). Indalecio Copete . 0. sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente). tendremos W = 8 y DIA = 7. Aplicando la instrucción INCF DIA.  Z vale 1 si el resultado de la operación es 0. 1 Ciclos de máquina INCFSZ Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Incrementa en 1 a f. Esta instrucción incrementa en una sola unidad el registro "f". saltándose la INSTRUCCION1. Ninguno No modifica ningún bit de estado. 1 (2) Si tiene que saltar ocupa dos ciclos Ciclos de máquina INCF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Suma una unidad al registro f INCF f. Esta instrucción incrementa en una sola unidad el registro "f". entonces salta la instrucción siguiente.d Increment f. Skip if 0 0F ff 00 1111 dfff ffff d = f + 1.

saltándose la INSTRUCCION1. y después obtenemos: ENTRADA RESULTADO W f Bit 7 0 1 W+f 1 GOOD LUCK preparó: Ing.d Inclusive Or W with F 04 ff 00 0100 dfff ffff d = W OR f (d puede ser W ó f). pero se pone así para diferenciarla de la Suma Exclusiva que veremos más adelante. 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 resultado se almacenará en W . La operación OR inclusivo suele llamarse OR a secas. El parámetro d determina donde se almacenará el resultado de la operación. el valor por defecto es 1 y se guarda en f. 1 (2) Si tiene que saltar ocupa dos ciclos IORWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Operación lógica OR entre el acumulador y un registro IORWF f.Ejemplo Ejecutamos las siguiente sinstrucciones: INCFSZ VALOR. La tabla de verdad de la suma lógica es la que sigue: ENTRADA f 0 0 1 1 W 0 1 0 1 SALIDA S 0 1 1 1 Comentarios Registro STATUS Ejemplo 1 La operación lógica que describe esta instrucción es esta: F+W=S Se puede ver que basta con que uno de los dos registros tenga un uno para que la salida sea un uno también. Si el resultado que guardamos en W no es 0. W INSTRUCCION 1 INSTRUCCIÓN 2 .d. salta aquí si W≠0 . salta aquí si W=0 Ciclos de máquina 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. Indalecio Copete .  Z vale 1 si el resultado de la operación es 0. Modifica el bit Z. Si no se pone nada. sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente). Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción IORWF f.

1 . 0 MOVF EDAD. obteniendo el resultado expresado en W + f 1 Ciclos de máquina MOVF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Mueve el contenido de un registro al acumulador o al propio registro MOVF f. y después obtenemos que: ENTRADA RESULTADO W f W+f Bit 7 0 0 0 Bit 6 1 0 1 Bit 5 1 1 1 Bit 4 1 0 1 Bit 3 0 1 1 Bit 2 0 0 0 Bit 1 1 0 1 Bit 0 1 1 1 Al igual que el caso anterior. antes de ejecutar la instrucción IORWF f. Tenemos el registro EDAD = 38 MOVF EDAD. hace que EDAD = 38. Si no se pone nada. . D determina el destino del resultado. Esta instrucción mueve el contenido del registro f en el mismo registro f o en W. Se suele usar para mover datos al acumulador. Comentarios Registro STATUS Ejemplo GOOD LUCK preparó: Ing.)) Modifica el bit Z. hace que W = 38.  Z vale 1 si el resultado de la operación es 0. 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 .d Move f 08 ff 00 1000 dfff ffff d = f (d puede ser W ó f). el valor por defecto es 1 y se guarda en f.d. dos a dos. Indalecio Copete .Bit 6 0 Bit 5 0 Bit 4 0 Bit 3 1 Bit 2 1 Bit 1 1 Bit 0 1 Ejemplo 2 1 1 1 0 0 0 0 1 1 1 1 1 1 1 En este segundo ejemplo tenemos que W = 01110011 y f = 00101001. el microcontrolador compara bit a bit los dos registros.

copia el acumulador en la dirección 01H. o no? En este caso no se puede copiar el acumulador sobre sí mismo :p ) No modifica ningún bit de estado. cargar el valor 10H en el acumulador. O escrito de otra manera: MOVWF 10H MOVWF TMR0 1 . MOVWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Mueve el acumulador al registro f MOVWF f Move W to f 00 ff 00 0000 1fff ffff f=W Esta instrucción copia el contenido del acumulador W en el registro direccionado por el parámetro f. en el oscilador.Ciclos de máquina MOVF EDAD. que está situado en la dirección 01h. equivalente a 4 de reloj Ninguno No modifica ningún bit de estado. hace que W = 38. pero sirve para gastar un ciclo de máquina. Si usamos un cristal de cuarzo de 4 Mhz. . hace que EDAD = 38. Si queremos escribir el valor 10H en el registro TMR0. MOVWF 10H MOVWF 01H . Indalecio Copete . W MOVF EDAD 1 . No existe el parámetro d (lógico. . tendremos que cargar primero el valor en el acumulador y después copiarlo al registro. podremos obtener un retardo igual a un microsegundo por cada instrucción NOP que insertemos en el código del programa: RETARDO NOP NOP GOOD LUCK preparó: Ing. copia el acumulador en el registro TMR0. cargar el valor 10H en el acumulador. . Ciclos de máquina NOP Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo No opera NOP No Operation 00 00 00 0000 0xx0 0000 Ninguna Esta instrucción no reliza ninguna ejecución.

1 RLF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Rota a la izquierda el registro f RLF f. Ninguno 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. Veamos el registro fde forma gráfica: Comentarios Registro STATUS Ejemplo El bit D7 pasa al CARRY del registro STATUS.d Rotate Right through Carry f 0C ff 00 1100 dfff ffff d = f >> 1 (d puede ser W ó f). Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción RLF VALOR El resultado será VALOR = 00000000 y el bit C = 1. 1 Ciclos de máquina RRF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Rota a la derecha el registro f RRF f.d Rotate Left through Carry f 0D ff 00 1101 dfff ffff d = << 1 (d puede ser W ó f).Ciclos de máquina NOP RETURN Cada vez que llamemos a la subrutina RETARDO. Es como si multiplicáramos por dos el contenido del registro. Indalecio Copete . el D0 al D1. el contenido del CARRY pasa al D0. 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). etc. obtendremos 3 microsegundos de demora. Esta instrucción rota a la derecha todos los bits del registro direccionado GOOD LUCK preparó: Ing.

 Z vale 1 si el resultado de la operación es 0. El parámetro ddetermina el destino. Ninguno Modifica los bits Z. Si DATO = 3 y W = 2. el resultado será DATO = 1 y C = 1. el D1 al D0.por el parámetro fpasando por el bit CARRY del registro STATUS (desde los bits más significativos a los menos significativos). Según sean los valores de W y el registro DATO. GOOD LUCK preparó: Ing. Si tenemos el registro VALOR = 00000001 y aplicamos la instrucción RRF VALOR Entonces el resultado será VALOR = 00000000 y el bit C = 1. DC y C. 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). Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción RRF VALOR El resultado será VALOR = 01000000 y el bit C = 0.d Subtract W from f 02 ff 00 0010 dfff ffff d = f – W (d puede ser W ó f). Ninguno Modifica el bit C (CARRY). Veamos el registro fde forma gráfica: Comentarios Registro STATUS Ejemplo El bit C del registro STATUS pasa al D7. Indalecio Copete . Es como si dividiéramos por dos el contenido del registro. el D0 pasa al bit C. El bit d determina el destino del resultado. si aplicamos SUBWF DATO obtendremos diferentes resultados en el bit CARRY.  DC vale 1 si el resultado de la operación es un número superior a 15. etc. Esta instrucción resta el valor contenido en el acumulador W del valor contenido en el registro direccionado por el parámetro f. Si no se pone nada. Si no se pone nada el valor por defecto será 1 y se almacenará en f. el valor por defecto es 1 y se guarda en f. 1 Ciclos de máquina SUBWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Resta el contenido del registro W el registro f SUBWF f.

1 SWAPF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Invierte los dos nibbles que forman un byte dentro de un registro SWAPF f. Aplicamos la instrucción SWAPF SWAPF VALOR . VALOR = 11110000B y W = 00000000B. W . el resultado será DATO = FFH y C = 0. Tenemos VALOR = 00001111 y W = 00000000. Si DATO = 1 y W = 2. Vemos que C = 1 porque el resultado es positivo y C = 0 cuando el resultado es negativo. El parámetro d determina el destino. SWAPF VALOR. el resultado será DATO = 0 y C = 1. Si no se pone nada. Con la primera instrucción modificamos el valor del registro DATO. Indalecio Copete .Ciclos de máquina Si DATO = 2 y W = 2. Ninguno No modifica ningún bit de estado.d Exclusive OR W with f 06 ff 00 0110 dfff ffff 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. la suma exclusiva está tratada en el capítulo de electrónica digital.d Swap nibbles in f 0E ff 00 1110 dfff ffff f = 0123 SWAP 4567 de f Esta instrucción intercambia el valor de los 4 bits más significativos (D7D4) contenidos en el registro f. con los 4 bits menos significativos (D3D0) del mismo. No obstante expongo las tablas de verdad correspondientes a esta operación Comentarios GOOD LUCK preparó: Ing. VALOR = 00001111B y W = 11110000B. Si no se pone nada el valor por defecto es 1 y se guarda en f Al igual que las otras operaciones lógicas. el valor por defecto es 1 y se guarda en f. y en la segunda instrucción modificamos el valor del acumulador sin que varíe el registro DATO 1 Comentarios Registro STATUS Ejemplo Ciclos de máquina XORWF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Operación lógica OR-Exclusiva XORWF f. El parámetro d determina el destino.

Esto es útil cuando tenemos una suma lógica en la que 1 + 1 es 10 y nos llevamos 1.ENTRADA f 0 0 1 1 W 0 1 0 1 SALIDA S 0 1 1 0 La salida únicamente se podrá a nivel alto cuando las dos entradas sean distintas. Una vez ejecutada obtenemos la siguiente tabla de verdad sobre los dos registros: ENTRADA RESULTADO W f W+f Bit 7 0 1 1 Bit 6 0 1 1 Bit 5 0 1 1 Bit 4 0 1 1 Bit 3 1 0 1 Bit 2 1 0 1 Bit 1 1 0 1 Bit 0 1 0 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. Tenemos dos registros que se corresponden con los siguientes valores W= 00001111 y f = 11110000 antes de ejecutar la instrucción XORWF f. Indalecio Copete . Z vale 1 si el resultado de la operación es 0.d. Esta operación algebraicamente se expresa así: S=f+W Registro STATUS Ejemplo 1 Modifica el bit Z.d y después obtenemos: ENTRADA RESULTADO W f W+f Bit 7 0 0 0 Bit 6 1 0 1 Bit 5 1 1 1 Bit 4 1 0 1 Bit 3 0 1 1 Bit 2 0 0 0 Bit 1 1 0 1 Bit 0 1 1 0 Ejemplo 2 Ciclos de máquina 1 GOOD LUCK preparó: Ing.

si no conocemos en nombre del bit Si en el PORTA tenemos como valor inicial 11111111. 1 Ciclos de máquina GOOD LUCK preparó: Ing. pone a 0 el bit RA4 del registro PORTA BCF PORTA. después de aplicar el ejemplo anterior. RA4 . 4 . igual. igual. Indalecio Copete . pone a 1 el bit RA0 del registro PORTA BSF PORTA. No debemos olvidar que en la numeración de los bits también se tiene en cuenta el 0.b Bit Set f 1b ff 01 01bb bfff ffff F(b) = 1 Esta instrucción pone a uno un bit que hayamos elegido de un registro determinado. PORTA = 00000001. Ninguno No modifica ningún bit de estado. RA0 . BCF PORTA. si no conocemos en nombre del bit Si en el PORTA tenemos como valor inicial 00000000. Si tratamos con un registro especial. 0 .b Bit Clear f 1b ff 01 00bb bfff ffff F(b) = 0 Esta instrucción pone a cero un bit que hayamos elegido de un registro determinado. después de aplicar el ejemplo anterior. No modifica ningún bit de estado. BSF PORTA.INSTRUCCIONES ORIENTADAS AL MANEJO DE BITS BCF Acción Sintaxis Funcionamiento Hexadecimal Bits Operación Descripción Comentarios Registro STATUS Ejemplo Pone a cero el bit b del registro f BCF f. PORTA = 11101111. podemos poner el nombre del bit correspondiente. 1 Ciclos de máquina BSF Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Pone a uno el bit b del registro f BSF f.

1 (2) Si tiene que saltar ocupa dos ciclos Comentarios Registro STATUS Ejemplo Ciclos de GOOD LUCK preparó: Ing. y si b = 0 entonces se salta la siguiente instrucción. Ninguno No modifica ningún bit de estado BTFSS PORTB. Indalecio Copete . Si b = 1 no salta y sigue con su ejecución normal. Ninguno No modifica ningún bit de estado BTFSC PORTA. Skip if Set 1b ff 01 11bb bfff ffff F(b) = 1? SI. y si b = 1 entonces se salta la siguiente instrucción. salta una instrucción Esta instrucción comprueba el valor del bit b en el registro f. 7 INSTRUCCIÓN 1 INSTRUCCIÓN 2 Si en PORTB tenemos como valor inicial 10000000. el programa continúa con la instrucción 2. Si b = 0 no salta y sigue con su ejecución normal. y salta la instrucción siguiente si este es uno BTFSC f. el programa sigue con la instrucción 1 y después la instrucción 2. Si tenemos el valor 01111111.b Bit Test. salta una instrucción Esta instrucción comprueba el valor del bit b en el registro f. el programa continúa con la instrucción 2.BTFSC Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comprueba un bit b del registro f. y salta la instrucción siguiente si este es cero BTFSC f. Skip if Clear 1b ff 01 10bb bfff ffff F(b) = 0? SI. 2 INSTRUCCIÓN 1 INSTRUCCIÓN 2 Si en PORTA tenemos como valor inicial 11111011. el programa sigue con la instrucción 1 y después la instrucción 2 1 (2) Si tiene que saltar ocupa dos ciclos Comentarios Registro STATUS Ejemplo Ciclos de máquina BTFSS Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comprueba un bit b del registro f.b Bit Test. saltándose la instrucción 1. saltándose la instrucción 1 Si en PORTA tenemos el valor 00000100.

carga el acumulador W con el valor 3. GOOD LUCK preparó: Ing. ADDLW 1 . MOVLW 10101010 ANDLW 11110000 El resultado de la operación queda en W = 10100000. Si cargamos el acumulador con el número binario 10101010 y hacemos un AND con el binario 11110000.  Z vale 1 si el resultado de la operación es 0. MOVLW 3 .máquina OPERACIONES CON LITERALES Y DE CONTROL ADDLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Suma a W un literal ADDLW Add literal to W 3E kk 11 111x kkkk kkkk W=W+k Esta instrucción suma un valor de un literal al contenido del registro W y lo guarda en W.  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). El resultado se guarda siempre en el acumulador W ninguno Modifica el bit Z. 1 Ejemplo Ciclos de máquina ANDLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Realiza la operación AND entre un literal y W ANDLW k AND W with k 39 ff 11 1001 kkkk kkkk W = W AND k Esta instrucción realiza una operación lógica AND entre el contenido de W y k. nos quedará el resultado de la operación en el acumulador W. Al final el acumulador tendrá el valor 4. DC y C. Indalecio Copete . suma 1 al acumulador.  Z vale 1 si el resultado de la operación es 0. Es igual que su homologo manejando registros Modifica los bits Z.  DC vale 1 si el resultado de la operación es un número superior a 15.

PRINCIPAL CALL RETARDO Comentarios Registro STATUS Ejemplo GOOD LUCK preparó: Ing. sin necesidad de tener que copiar las mismas instrucciones. No modifica ningún bit de estado. con el consiguiente ahorro de memoria. 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. RETARDO: etiqueta que identifica el comienzo de una subrutina. por lo que el número máximo de CALL reentrantes (instrucciones CALL que contengan otra instrucción CALL) queda limitado a 8.RETURN  PC+1. Siempre termina con la instrucción de retorno (RETURN o RETLW)..Ciclos de máquina 1 CALL Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Llama a una subrutina en la dirección k CALL k Call subroutine 2k kk 10 0kkk kkkk kkkk CALL  k. PRINCIPAL: etiqueta que identifica una dirección de memoria. Utilidad de las subritunas: sirven para utilizarlas varias veces en cualquier parte del programa. donde k puede ser un valor numérico o una etiqueta. 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. BUCLE: etiqueta que identifica una dirección de memoria. ejecutando la instrucción de retorno RETURN o RETLW. ejecutando la instrucción de retorno RETURN o RETLW. Funcionamiento: cuando un programa ejecuta una instrucción CALL.. Esta instrucción llama a un grupo de instrucciones (subrutina) que comienzan en la dirección k. 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. Indalecio Copete . sin necesidad de tener que copiar las mismas instrucciones. con el consiguiente ahorro de memoria. 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. Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack. Utilidad: sirven para utilizarlas varias veces en cualquier parte del programa. por lo que el número máximo de CALL reentrantes (instrucciones CALL que contengan otra instrucción CALL) queda limitado a 8. Funcionamiento: cuando un programa ejecuta una instrucción CALL. Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack.

Para evitar el reset del PIC... 1 GOTO BUCLE RETURN Ciclos de máquina 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. RB0 GOTO PRINCIPAL * * * CLRF CONTADOR DECFSZ CONTADOR. Bucle CLRWDT * * * GOTO Bucle 1 GOTO Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Salto incondicional a k. Si no se pone a cero a tiempo. Indalecio Copete . 2 CLRWDT Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Ciclos de máquina Pone el temporizador WDT a cero. el WDT interpretará que se ha bloqueado el programa y ejecutará un reset para desbloquearlo. CLRWDT Clear WatchDog Timer 00 64 00 0000 0110 0100 WDT = 0 Esta instrucción se utiliza cuando programamos el PIC con la opción Watch Dog habilitada. GOTO k Go to address (label) 28 kk 10 1kkk kkkk kkkk Salto  k GOOD LUCK preparó: Ing. ninguno No modifica ningún bit de estado.RETARDO BUCLE BTFSC PORTB.). el programa debe contener cíclicamente la instrucción CLRWDT para ponerlo a cero.

 Z vale 1 si el resultado de la operación es 0. Modifica el bit Z. Supongamos que W= 00001111 y l = f0. Ejecutanado la instrucción IORWF f. 4 y 5. El resultado siempre se guarda en el acumulador. La tabla de verdad de la suma lógica es la que sigue: ENTRADA f 0 0 1 1 W 0 1 0 1 SALIDA S 0 1 1 1 Registro STATUS Ejemplo La operación lógica que describe esta instrucción es esta: F+W=S Se puede ver que basta con que uno de los dos registros tenga un uno para que la salida sea un uno también.d Inclusive OR W with l Comentarios W = W OR l Esta instrucción realiza una operación lógica OR inclusivo entre el acumulador W y un literal. El parámetro k puede ser un valor numérico o una etiqueta. obtenemos: ENTRADA RESULTADO W l Bit 7 0 1 W+l 1 GOOD LUCK preparó: Ing.d. Indalecio Copete . 2 Ciclos de máquina IORLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Operación lógica OR entre el acumulador y un literal IORWF f.Descripción Comentarios Registro STATUS Ejemplo Esta instrucción ejecuta un salto del programa a la dirección k. después GOTO y continúa con la instrucción 6 saltándose las instrucciones 3. Ninguno No modifica ningún bit de estado. La operación OR inclusivo suele llamarse OR a secas. INSTRUCCIÓN 1 GOTO ABAJO INSTRUCCIÓN 3 INSTRUCCIÓN 4 INSTRUCCIÓN 5 ABAJO INSTRUCCIÓN 6 Primero se ejecuta la instrucción 1. pero se pone así para diferenciarla de la Suma Exclusiva que veremos más adelante.

Bit 6 0 Bit 5 0 Bit 4 0 Bit 3 1 Bit 2 1 Bit 1 1 Bit 0 1 Ciclos de máquina 2 1 1 1 0 0 0 0 1 1 1 1 1 1 1 MOVLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Copia el contenido de un literal al acumulador MOVLW f Move literal to W 30 kk 11 00xx kkkk kkkk W=f Esta instrucción asigna al acumulador W el valor del literal k. Si tenemos el acumulador a cero o con cualquier valor. Indalecio Copete . Con distinto valor de partida del acumulador: W = 225. Valor a asignar = 100. Instrucción: MOVLW 100 El acumulador valdrá 100 (W = 100). 1 Ciclos de máquina RETFIE Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Retorno de la llamada a una subrutina RETFIE Return From Interrupt 00 09 00 0000 0000 1001 GOOD LUCK preparó: Ing. el cual debe estar comprendido entre 0 y 255. MOVLW 100 El acumulador valdrá 100 (W = 100). y queremos que contenga el que le asignemos nosotros directamente entonces usaremos esta instrucción: W = 0. Ninguno No modifica ningún bit de estado.

carga W = 0B y retorna. retorna de la interrupción Este código de programa ejecuta un bucle infinito. 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 igual que RETURN. Indalecio Copete . llama a Subrut2. ORG 04H. carga W = 0A y retorna. MOVWF DATO2 . MOVWF DATO 1 . RETFIE .Operación Descripción Comentarios Registro STATUS Ejemplo 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. 2 Ciclos de máquina RETLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Retorno de subrutina y carga literal k en el acumulador RETLW Return with Literal in W 34 kk 11 01xx kkkk kkkk RETORNO con W = k Esta instrucción retorna de una subrutina al programa principal. Si habilitamos una de las interrupciones del 16F84. Ninguno No modifica ningún bit de estado ORG 00H BUCLE GOTO BUCLE . vector de interrupción. * * SUBRUT1 RETLW 0A . No modifica ningún bit de estado CALL SUBRUT1 . SUBRUT2 RETLW 0B . 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. carga W en Dato2. 2 Comentarios Registro STATUS Ejemplo Ciclos de máquina GOOD LUCK preparó: Ing. ¿Y para qué me sirve regresar de una subrutina con un determinado literal en el acumulador? Nos será muy útil al programar con TABLAS. con la diferencia que carga en W el valor de k. cargando el acumulador W con el literal k. Con la instrucción RETFIE ponemos de nuevo el bit GIE a 1 para así atender de nuevo a futuras interrupciones. carga W en Dato1. CALL SUBRUT2 . llama a Subrut1. bucle infinito. Es la última instrucción que forma una subrutina. Al ejecutarse una interrupción.

Estos mismos pasos debemos seguirlos para la instrucción RETLW No modifica ningún bit de estado. Durante este modo.RETURN Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Retorno de una subrutina. Es la última instrucción que forma una subrutina (al igual que RETLW). ejecuta return * * COMPARA INSTRUCCIÓN R1 INSTRUCCIÓN R2 RETURN Aquí llamamos a la subrutina COMPARA. al final de la subrrutina se debe escribir la instrucción denominada RETURN. RETURN Return from subroutine 00 08 00 0000 0000 1000 RETORNO Esta instrucción retorna de una subrutina al programa principal en la instrucción siguiente a la llamada de la subrutina. INSTRUCCION1 . el contador del Watch Dog sigue trabajando. tenemos que crear la subrrutina y darle el nombre para poder ser llamada. 2 y sigue con el programa. Así. Esta instrucción detiene la ejecución del programa. Entonces podemos concluir que una subrrutina esta 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 subrrutina. deja el PIC en modo suspendido y el consumo de energía es mínimo. CALL COMPARA . tomando el valor almacenado en el stack para continuar. El procedimiento es siempre el mismo. se ejecutan las instrucciones R1 y R2 y con el RETURN regresa a la instrucción siguiente al CALL y ejecuta las instrucciones 1. llama a Compara. No ejecuta ninguna instrucción hasta que sea nuevamente reinicializado (reset) o surja una interrupción. vuelve aquí cuando se INSTRUCCION2 . Indalecio Copete . y si lo GOOD LUCK preparó: Ing. 2 Ciclos de máquina SLEEP Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Paso a modo de bajo consumo SLEEP Go into Standby Mode 00 63 00 0000 0110 0011 EN ESPERA.

 Z vale 1 si el resultado de la operación es 0. No creo que haga falta… . SUBLW 15 . carga el acumulador W con el valor 10. la suma exclusiva está tratada en el capítulo de electrónica digital. Al final el acumulador tendrá el valor W = 5.) 1 SUBLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Ciclos de máquina Resta al literal k el valor del acumulador. En caso contrario C vale 0 (resultado negativo). SUBLW k Substract W from Literal 3C kk 11 110x kkkk kkkk W=k-W Esta instrucción resta al literal k el valor almacenado en W y el resultado se guarda en el acumulador.Comentarios Registro STATUS Ejemplo Ciclos de máquina tenemos activado el PIC se reseteará por este medio. MOVLW 10 . no un registro).  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. Ninguno No modifica ningún bit de estado. ninguno Modifica los bits Z. No obstante expongo las tablas de verdad correspondientes a esta operación ENTRADA f 0 0 W 0 1 SALIDA S 0 1 Comentarios GOOD LUCK preparó: Ing. Indalecio Copete . resta a 15 el valor del acumulador. DC y C. 1 XORLW Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Operación lógica OR exclusivo entre el acumulador y el literal k XORLW k Exclusive OR Literal with W 3A kk 11 1010 kkkk kkkk W = W XOR k Esta instrucción realiza un OR exclusivo entre el contenido del acumulador W y el valor del literal k. Al igual que las otras operaciones lógicas. El resultado se guarda siempre en el acumulador (recuerda que k es un literal.

 Z vale 1 si el resultado de la operación es 0. Esta operación algebraicamente se expresa así: S=f+W Modifica el bit Z. W = 01110011 y k = 00101001 antes de ejecutar la instrucción XORWF k ENTRADA RESULTADO W k W+k Bit 7 0 0 0 Bit 6 1 0 1 Bit 5 1 1 1 Bit 4 1 0 1 Bit 3 0 1 1 Bit 2 0 0 0 Bit 1 1 0 1 Bit 0 1 1 0 Registro STATUS Ejemplo Ciclos de máquina 1 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. Esto es útil cuando tenemos una suma lógica en la que 1 + 1 es 10 y nos llevamos 1. La razón por la cual no pertenecen a estas 35 instrucciones es por que fueron creadas pensando en la gama baja. aunque normalmente son acogidas dentro de las instrucciones con literales y de control. no pueden ser clasificadas en ninguna de las categorías expuestas anteriormente. RETURN y SUBLW. RETFIE. Indalecio Copete .1 1 0 1 1 0 La salida únicamente se podrá a nivel alto cuando las dos entradas sean distintas. ya que carece de 4 de las instrucciones de la gama media: ADDLW. Estas instrucciones son OPTION y TRIS. No por ello se ha prohibido a la gama media disponer de estas instrucciones: OPTION Acción Sintaxis Funcionamiento Hexadecimal Guarda el valor del acumulador en el registro OPTION OPTION 00 62 GOOD LUCK preparó: Ing.

RP0 . carga el registro OPTION con el acumulador. carga el acumulador con 10h OPTION_REG . Los registros TRIS determinan el funcionamiento como entrada y salida de las líneas I/O del PIC. carga el acumulador con el valor 10h. carga el registro PORTA con W. OPTION . MOVLW 10H . 10H . carga el acumulador con el valor 16h MOVWF TRISA . RP0 ..Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo 00 0000 0110 0010 OPTION = W Esta instrucción guarda en el registro especial OPTION el valor contenido en el acumulador W ninguno No modifica ningún bit de estado. y como en el futuro podría dejar de implementarse. Esta instrucción existe para mantener la compatibilidad con los PIC producidos con anterioridad. Esta instrucción existe para mantener la compatibilidad con los PIC producidos anteriormente. MOVLW 16h . Microchip aconseja realizar el ejemplo anterior de esta otra forma: BSF MOVLW MOVWF STATUS. activa el banco 1. ninguno No modifica ningún bit de estado.. 1 Ciclos de máquina GOOD LUCK preparó: Ing. Microchip aconseja realizar el ejemplo anterior de esta otra forma (aunque ocupa más memoria. MOVLW 16h . activa el banco 1. Indalecio Copete .): BSF STATUS. carga el acumulador W con el valor 16h TRIS PORTA . y como en el futuro podría dejar de implementarse. carga el registro PORTA con el acumulador. Ciclos de máquina 1 TRIS Acción Sintaxis Funcionamiento Hexadecimal Bits (OPCODE) Operación Descripción Comentarios Registro STATUS Ejemplo Guarda el acumulador en uno de los registros de TRIS. TRIS f 00 6F 00 0000 0110 1111 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. carga OPTION con el acumulador.

d K K Add Carry to File Traducción Operación Equivalente BTFSC INCF BTFSC INCF GOTO BTFSC GOTO BTFSC GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSC GOTO BCF BCF BCF 3.2 k 3. que tiempo de acomodarnos ya tendremos. Mnemónico Parámetros Descripción ADDCF ADDDCF B BC f.0 f. y no debemos usarlo en el caso de que estemos empezando. Este cuadro sólo debe servir de referencia.0 k 3. La mayoría de ellas se basa en las operaciones con los acarreos y con los bits del registro status en general. pero es recomendable usar la forma equivalente.2 Banderas Z Z - BDC K BNC K BNDC K BNZ K BZ CLRC CLRDC CLRZ K Sumar acarreo af Sumar acarreo Add Digit Carry to File de digito a f Saltar a una Branch etiqueta Saltar a una Branch on Carry etiqueta si hay acarreo Saltar a una etiqueta si hay Branch on Digit Carry acarreo de digito Saltar a una Branch on No Carry etiqueta si no hay acarreo Saltar a una Branch on No Digit etiqueta si no Carry hay acarreo de digito Saltar a una Branch on No Zero etiqueta si no hay cero Saltar a una Branch on Zero etiqueta si hay cero Poner a cero Clear Carry acarreo Poner a cero Clear Digit Carry acarreo de digito Poner a cero el Clear Zero flag Zero - - - - - GOOD LUCK preparó: Ing. vamos a ahorrar ciclos de máquina.0 3.d 3. dos o tres de las instrucciones de la gama media.2 k 3.1 k 3.1 3. d f.0 k 3. Estas instrucciones pueden ser implementadas con una. Otra cosa que debemos tener en cuenta es que no por reducir algoritmos a una sola expresión. Indalecio Copete .d k 3.1 k 3. Sólo lo usaremos si vemos muy claro el funcionamiento de las instrucciones.1 f.INSTRUCCIONES ESPECIALES Existe un conjunto de instrucciones especiales diseñadas para facilitar las operaciones a la hora de diseñar nuestros algoritmos.

1 digito Saltar si no hay Skip on No Carry BTFSC 3.0 acarreo Poner a uno el Set Digit Carry acarreo de BSF 3.3 Salto largo a Long GOTO BSF/BCF 0A.2 Zero Saltar si hay Skip on Zero BTFSS 3.d f.1 digito Poner a uno el Set Zero BSF 3.d Restar acarreo Substract Digit Carry BTFSC 3.d registro Test File Probar registro MOVF f.2 Zero Substract Carry from Restar acarreo BTFSC 3.0 acarreo Saltar si no hay Skip on No Digit acarreo de BTFSC 3.d f BSF/BCF 0A. d f. Indalecio Copete .2 Zero Saltar si hay Skip on Carry BTFSS 3.4 una etiqueta GOTO k Mover registro a Move File to W MOVF f.4 una etiqueta CALL k BSF/BCF 0A.1 de dígito del from File DECF f.LCALL K LGOTO MOVFW NEGF SETC SETDC SETZ SKPC SKPDC SKPNC SKPNDC SKPNZ SKPZ SUBCF SUBDCF TSTF K F f.d Poner a uno el Set Carry BSF 3.3 Llamada larga a BSF/BCF 0A.1 Carry digito Saltar si no hay Skip on Non Zero BTFSC 3.0 File del registro DECF f.1 Negate File registro INCF f. Instrucciones orientadas a los bytes Mnemónico Parámetros Descripción Ciclos Banderas GOOD LUCK preparó: Ing.0 acarreo Saltar si hay Skip on Digit Carry acarreo de BTFSS 3.0 W Negar un COMF f.1 Long CALL Z Z Z Z Z CUADRO DE INSTRUCCIONES Para finalizar. las 35 instrucciones de la gama media las encontraremos resumidas en los tres próximos cuadros.

d f. d f. DC. Skip if Clear Bit Test f. d f. d f. d f. Z Z TO. b f. d f. b f. d f.ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF 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 1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1 C. d f. Z Z Z Z Z Z None Z None Z Z None None C C C. Z None Z Instrucciones orientadas a los bits Mnemónico Parámetros Descripción BCF BSF BTFSC BTFSS f. b f. d f. Z GOOD LUCK preparó: Ing. Banderas 1 1 2 1 2 1 1 2 2 2 1 1 C. d f f. d Add W and f AND W with f Clear f Clear W Complement f Decrement f Decrement f. d f. Indalecio Copete . DC. DC.PD None Z None None None None TO. Skip if Set Ciclos Banderas 1 1 1 (2) 1 (2) None None None None Operaciones con literales y de control Mnemónico Parámetros Descripción ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW k k k k k k k k Add literal and W AND literal with W Call subroutine Clear Watchdog Timer Go to address Inclusive OR literal with W Move literal to W Return from interrupt Return with literal in W Return from Subroutine Go into standby mode Subtract W from literal NroCic. d f f.PD C. b Bit Clear f Bit Set f Bit Test f. Skip if 0 Increment f Increment f. DC. d f.

C2 D1 XTAL SW1 Éste consta básicamente de dos partes: Alimentación: Componente Resistencia 100 Resistencia 10k Condensador cerámico 27pF Diodo 1N4148 Cristal de cuarzo 4 Mhz. conectado al pin 4: cuando se introduce un nivel alto de tensión (pulsador abierto) el PIC funciona normalmente y cuando se introduce un nivel bajo (pulsador cerrado) se resetea el PIC. para mantener la compatibilidad con el PIC16CXX.XORLW k Exclusive OR literal with W 1 Z Microchip recomienda no utilizar las instrucciones TRIS y OPTION. Aunque eso no significa que tengamos que hacer caso y no usarlas.Oscilación: la lleva a cabo el cristal de cuarzo (de 4 Mhz en nuestro caso) junto con los dos condensadores cerámicos (27pF). es decir. Se incluye además un pulsador. Circuitería básica En el siguiente esquema podemos ver la circuitería básica. . Existen otros tipos de osciladores que pueden sernos útiles cuando trabajemos con PICs. Pulsador NA se emplean para ello dos pines: 14 VDD (tensión positiva) y 5 GND (masa). GOOD LUCK preparó: Ing. el circuito mínimo para que el PIC empiece a funcionar Identificador R1 R2 C1. Indalecio Copete .

Una de las memorias contiene solamente las instrucciones del programa. antes de que finalicen las transferencias de datos que pudieran resultar de la instrucción anterior. el set de instrucciones y el bus de la memoria de programa pueden diseñarse de manera tal que todas las instrucciones tengan una sola posición de memoria de programa de longitud. Por otro lado este bus único limita la velocidad de operación del microprocesador. y es llamada Memoria de Programa.LA ARQUITECTURA TRADICIONAL La arquitectura tradicional de computadoras y microprocesadores se basa en el esquema propuesto por John Von Neumann. en las computadoras modernas. Ambos buses son totalmente independientes y pueden ser de distintos anchos. Cuando deba acceder a una instrucción o dato de más de un byte de longitud. Una pequeña desventaja de los procesadores con arquitectura Harvard. deberá manejar datos e instrucciones de una o más unidades de 8 bits (bytes) de longitud. Es decir que las dos principales limitaciones de esta arquitectura tradicional son : tanto el microprocesador debe hacer varios accesos a memoria para buscar instrucciones complejas. o RISC (Reduced Instrucción Set Computer). logrando así mayor velocidad y menor longitud de programa.La arquitectura Harvard y sus ventajas La arquitectura conocida como Harvard.LA ARQUITECTURA . y por lo tanto puede ser optimizado para que cualquier instrucción ocupe una sola posición de memoria de programa. Se puede observar claramente que las principales ventajas de esta arquitectura son: Que el tamaño de las instrucciones no esta relacionado con el de los datos. y al mismo tiempo estar leyendo la próxima instrucción a ejecutar. o CPU. de operación (o ancho de banda de operación) esta limitada por el efecto de cuello de botella que significa un bus único para datos e instrucciones que impide superponer ambos tiempos de acceso. deberá realizar más de un acceso a la memoria. Además. El tamaño de la unidad de datos o instrucciones esta fijado por el ancho del bus de la memoria. como los buses son independientes. que tiene además un bus de 8 bits que lo conecta con la memoria. consiste simplemente en un esquema en el que el CPU esta conectado a dos memorias por intermedio de dos buses separados. en el cual la unidad central de proceso. pero innecesaria. práctica bastante usada en las antiguas computadoras que solo tenían acumulador y pocos modos de direccionamiento. Arquitectura von Neumann . ya que no se puede buscar de memoria una nueva instrucción. Es decir que un microprocesador de 8 bits. La arquitectura von Neumann permite el diseño de programas con código automodificable. Indalecio Copete . nerse con el de los datos. La otra memoria solo almacena los datos y es llamada Memoria de Datos. esta conectada a una memoria única que contiene las instrucciones del programa y los datos (ver figura). es que deben poseer instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario GOOD LUCK preparó: Ing. el CPU puede estar accediendo a los datos para completar la ejecución de una instrucción.. logrando una mayor velocidad de operación. Para un procesador de Set de Instrucciones Reducido.

incluir en los programas. Así. pero podíamos haber escogido otros. y una memoria de programa que. 16CXX y 17CXX poseen arquitectura Harvard. por ejemplo.En el caso de las entradas. GOOD LUCK preparó: Ing.La elección de los pines ha sido arbitraria: se han escogido éstos. mientras sea posible es mejor organizar el esquema y el programa. pues lo único que queremos es que el PIC pueda detectar un cambio. ya que en ambos casos podremos verificarlo. De lo que hemos comentado en esta práctica. de forma que cuando lo pulsemos se introduzca un cero lógico en el pin y cuando no lo pulsemos se introduzca un uno lógico. A continuación vamos a desarrollar nuestro primer programa. Indalecio Copete . es trivial que cuando se pulse o deje de activar el pulsador se envíe un cero o un uno. caben destacar dos cosas: . y una forma de hacerlo es agrupando por un lado las entrada (Puerta A) y por otro las salidas (Puerta B). ya que estas tablas se encontraran físicamente en la memoria de programa (por ejemplo en la EPROM de un microprocesador). Para ello vamos a montar el siguiente circuito: En el circuito podemos ver como lo único que hemos añadido al circuito base es un pulsador conectado al pin 17 (RA0). con una memoria de datos de 8 bits. puede ser de 12 bits para los 16C5X. 14 bits para los 16CXX y 16 bits para los 17CXX. igual nos da comprobar cuando se envía un cero que cuando se envía un uno. . hemos escogido el pin 0 de cada puerta. Arquitectura Harvard Los microcontroladores PIC 16C5X. según el modelo. No obstante. en vez de escoger en un sitio el 3 y en otro el 7. Éste activará un LED conectado a RB0 siempre que el interruptor conectado a RA0 este cerrado. Por la misma razón. Hemos añadido además un LED con su correspondiente resistencia limitadora de corriente en el pin 6 (RB0).

Así. sino de activar un dispositivo. veamos el programa: Comentarios del primer programa.5 nos permite poner a 1 el bit 5 de ESTADO. donde se encuentran los registros de configuración de las puertas. por lo que se hace necesaria que el PIC "genere" una diferencia de potencial. la forma de indicar al PIC que lo haga es poniendo a uno la salida. cuyo núcleo es EQU. con lo que se consigue que dicha puerta se configure al completo como salida. GOOD LUCK preparó: Ing. Hechas estas aclaraciones. permiten que el compilador interprete a partir de ese momento los nombres de la primera columna con las dirección de memoria de la derecha.En este caso se ha elegido el cero como activado porque es lo más común. que transforma los 0 en 1 y viceversa. pero el primero lo considero más elegante.Las tres primeras líneas. En el caso de las salidas no ocurre lo mismo. como movlw 0xFF junto con movwf PUERTAA. no la analizaremos de momento.clrf PORTB: pone a cero todos los bits del registro PORTB. configurando éste como salida. En este caso lo usamos conjuntamente con comf. . .bsf ESTADO. con lo que conseguimos acceder al banco 1. Simplemente decir que es necesaria para el correcto funcionamiento del programa. .clrf PORTA: pone a cero todos los bits del registro porta. . Podríamos usar otros métodos. ya que es más fácil recordar un nombre que nos sugiere algo que dirección en hexadecimal. Así. PIC 16F84 Comentemos el código: . El objetivo de estas instrucciones es obvio: facilitar la comprensión del código. ya que en este caso no se trata de detectar un cambio. ya que indica el comienzo del código.La siguiente instrucción. Indalecio Copete . se consigue configurar la puerta a como entrada. org 0.

Finalmente volvemos a INICIO.bcf ESTADO. una realiza un salto si está a 0 y la otra si está a 1. se pone a 1 el bit 0 de PORTB. cuya utilidad es marcar un punto del programa. En ese caso. Si no está pulsado el interruptor vamos a APAGAR. esto es. vamos a ENCENDER mediante goto ENCENDER. cuando se activó el pulsador. El segundo se basa en las instrucciones que preguntan sobre el estado de un bit. que es donde está conectado el led y volvemos a INICIO.0 sirve para saltar si el bit 0 de PORTA vale 0. apagar y encender son etiquetas. volviendo así al banco 0. es decir. BTFSS y BTFSC . Y dependiendo del bit. GOOD LUCK preparó: Ing. y hacemos la operación contraria a la anterior. Indalecio Copete .5 pone a 0 el bit 5 de ESTADO. si queremos volver a ese punto sólo tendremos que hacer referencia a su nombre.btfsc PORTA. Indalecio Copete R. .Inicio.. . así.

Sign up to vote on this title
UsefulNot useful