Anda di halaman 1dari 36

PIC 16F84 una gua para el aprendizaje

1 Arquitectura Von Newmann y Harvard


2 Mapa de memoria
3 Registros 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11,
4 Puertos de Entrada y Salida
5 Interrupciones
6 Instrucciones assembler del 16F84
6 Instrucciones de control y manejo de literales
6 Instrucciones orientadas a bits
6 Instrucciones orientadas a registros
7 Modos de direccionamiento
8 Tcnicas de programacin 1, 2, 3, 4

1 Arquitectura Von Newmann

La arquitectura tradicional de computadoras y microprocesadores est basada en la arquitectura Von
Neumann, en la cual la unidad central de proceso (CPU), est conectada a una memoria nica donde se
guardan las instrucciones del programa y los datos.

El tamao de la unidad de datos o instrucciones est fijado por el ancho del bus que comunica la
memoria con la CPU. As un microprocesador de 8 bits con un bus de 8 bits, tendr que manejar datos e
instrucciones de una o ms unidades de 8 bits (bytes) de longitud. Si tiene que acceder a una instruccin
o dato de ms de un byte de longitud, tendr que realizar ms de un acceso a la memoria.

Y el tener un nico bus hace que el microprocesador sea ms lento en su respuesta, ya que no puede
buscar en memoria una nueva instruccin mientras no finalicen las transferencias de datos de la
instruccin anterior.

Resumiendo todo lo anterior, las principales limitaciones que nos encontramos con la arquitectura Von
Neumann son:

1. La limitacin de la longitud de las instrucciones por el bus de datos, que hace que el microprocesador
tenga que realizar varios accesos a memoria para buscar instrucciones complejas.

2. La limitacin de la velocidad de operacin
a causa del bus nico para datos e
instrucciones que no deja acceder
simultneamente a unos y otras, lo cual
impide superponer ambos tiempos de acceso.

Arquitectura Harvard

La arquitectura Harvard tiene la unidad central de proceso (CPU) conectada a dos memorias (una con las
instrucciones y otra con los datos) por medio de dos buses diferentes.

Una de las memorias contiene solamente las instrucciones del programa (Memoria de Programa), y la
otra slo almacena datos (Memoria de Datos).

Ambos buses son totalmente independientes y pueden ser de distintos anchos. Para un procesador de
Set de Instrucciones Reducido, o RISC (Reduced Instruccin Set Computer), el set de instrucciones y el
bus de memoria de programa pueden disearse de tal manera que todas las instrucciones tengan una
sola posicin de memoria de programa de longitud.

Adems, al ser los buses independientes, la CPU puede acceder a los datos para completar la ejecucin
de una instruccin, y al mismo tiempo leer la siguiente instruccin a ejecutar.

Ventajas de esta arquitectura:

1. El tamao de las instrucciones no est relacionado con el de los datos, y por lo tanto puede ser
optimizado para que cualquier instruccin ocupe una sola posicin de memoria de programa, logrando
as mayor velocidad y menor longitud de programa.

2. El tiempo de acceso a las instrucciones puede superponerse con el de los datos, logrando una mayor
velocidad en cada operacin.

Una pequea desventaja de los procesadores con arquitectura Harvard, es que deben poseer
instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario incluir en
los programas, ya que estas tablas se encontraran fsicamente en la memoria de programa (por ejemplo
en la EPROM de un microprocesador).

La arquitectura harvard funciona de la siguiente manera


El microcontrolador PIC 16F84 posee arquitectura Harvard, con una memoria de datos de 8 bits, y una
memoria de programa de 14 bits.
Diagrama de bloques del microcontrolador PIC16F84
En la figura anterior vemos la arquitectura interna organizada en bloques interconectados, en donde se incluye la
memoria RAM, la memoria EEPROM, los puertos de entrada y salida (I/O), etc.
2 Mapa de memoria
MEMORIA RAM
El microcontrolador PIC16F84 puede direccionar 128 posiciones diferentes de memoria RAM; pero
Microchip Tecnologies solamente ha implementado 80 posiciones para este PIC. Esta memoria esta
dividida en dos partes:
La primera parte consta de 12 registros que sern utilizados por funciones especiales del
microcontrolador. Comienza en la direccin 00h y termina en la 0Bh.
La segunda parte consta de 68 registros de memoria RAM que sern utilizados para almacenar datos
temporales requeridos por los programas. Comienza en la direccin 0Ch y termina en la posicin 4Fh
Este tipo de memoria (RAM), se caracteriza por perder los datos si se llegase a desconectar el
microcontrolador o la tensin baja por debajo de los lmites mnimos.
La memoria RAM as como algunos registros especiales son los mismos en los dos bancos del mapa de
memoria del PIC.
MEMORIA DE PROGRAMA TIPO EEPROM
Esta memoria tiene 1 K x 14 Bits de memoria tipo Flash. Esta memoria es la que utilizaremos para
almacenar nuestro programa dentro del microcontrolador PIC16F84.
El tipo de memoria utilizada en este microcontrolador, podr ser grabada o borrada elctricamente.
La memoria tipo Flash tiene la caracterstica de poderse borrar en bloques completos y no podrn
borrarse posiciones concretas o especficas.
Este tipo de memoria no es voltil, es decir, no pierde los datos si se interrumpe la energa.
En la siguiente imagen se muestra como est organizada la memoria dentro del microcontrolador.


La memoria del programa comienza en la posicin 000h y
termina en la posicin 03FFh.

Nota: El contador de programa PC del microcontrolador
PIC16F84 tiene una longitud de 13 Bits por lo que implica
que podr direccionar cualquier posicin comprendida en
un rango de los 8 K x 14; pero la empresa Microchip
Tecnologies slamente ha implementado internamente 1
K que representa desde 000h hasta 03FFh. En el caso de
que se direccione fuera de este rango, automticamente
causar un solapamiento.



La memoria para almacenar el programa, tipo EEPROM (Electrical Erasable Programmable Read Only
Memory), que puede ser reescrita, nos resultar perfecta para realizar pruebas y experimentos, adems
de para la programacin on-board (actualizacin del programa interno de chip sin necesidad de retirarlo
del circuito de prueba).
La memoria de programa siempre est direccionada desde el Contador de Programa (PC), mientras que
la memoria de datos puede direccionarse directamente desde parte del cdigo OP de la instruccin o
indirectamente a travs de un registro denominado FSR (Registro de Seleccin del Banco).
Y aqu tenemos una vista exterior de los pins del PIC16F84:
PIC16F84 esta dotado de un
total de 18 pines distribuidos
en dos filas paralelas de 9
pines cada una. Los pines
marcados con AZUL
representan las lneas de I/O
disponibles para nuestras
aplicaciones, los pines ROJO
y NEGRO son los pines de
alimentacin, los pines en
VERDE estn reservados para
el funcionamiento del PIC
(MCLR para el reset y OSC1-2
para el reloj).
3 Registros 01
ORGANIZACIN
La memoria interna de datos, tambin llamada archivo de registros (register file), esta dividida en dos
grupos:
Los registros especiales (8 registros).
Los registros de propsito generales(72 registros).
Los registros especiales ocupan las 8 primeras posiciones que van desde la 00 a la 07, y los registros de
propsito generales las posiciones que siguen, de la 08 a la 4F.
Los registros especiales contienen la palabra de estado (STATUS), los registros de datos de los tres
puertos de entrada salida (Puerto A, Puerto B, Puerto C), los 8 bits menos significativos del Program
Counter (PC), el contador del Real Time Clock/Counter (RTCC) y un registro puntero llamado File Select
Register (FSR). La posicin 00 no contiene ningn registro en especial y es utilizada en el mecanismo de
direccionamiento indirecto.
Los registros de propsito general se dividen en dos grupos:
Los registros de posicin fija (8 registros).
Los bancos de registros (64 registros).

Los primeros ocupan las 8 posiciones que van de la 08 a la 0F. Los bancos de registros consisten en hasta
cuatro grupos o bancos de 16 registros cada uno, que se encuentran superpuestos en las direcciones
que van de la 10 a la 4F. Se puede operar con un solo banco a la vez, el cual se selecciona mediante los
bits 5 y 6 del File Select Register (FSR).
OTROS REGISTROS ESPECIALES
Las ocho primeras posiciones del rea de datos estn reservadas para alojar registros de propsito
especial, quedando las restantes libres para contener los datos u operandos que se desee (registros de
propsito general).
El registro INDF que ocupa la posicin 0 no est implementando fsicamente y, como se ha explicado, se
le referencia en el direccionamiento indirecto de datos aunque se utiliza el contenido de FSR.
En la direccin esta el registro TMR0 (Temporizador) que puede ser ledo y escrito como cualquier otro
registro.
El PC ocupa la posicin 2 del rea de datos en donde se halla el registro PCL al que se aaden 3 bits
auxiliares y se conectan con los dos niveles de la Pila en las instrucciones CALL y RETLW.
El registro de Estado (STATUS) ocupa la posicin 3 y entre sus bits se encuentran los sealizadores C,
DC y Z y los bits IRP, RP1 y RP0 que seleccionan la pgina en la memoria de programa.
FRS se ubica en la direccin 4 y puede usarse para contener las direccin del dato en las instrucciones
con direccionamiento indirecto y tambin para guardar operandos en sus 5 bits de menos peso.
Los registros que ocupan las posiciones 5 y 6 soportan los Puertos A y B de E/S. Pueden ser ledos y
escritos como cualquier otro registro y manejan los valores de los bits que entran y salen por los pines
de E/S del microcontrolador.
Registros 02
Los registros especiales (SFR o Special Function
Registers) son una serie de registros usados por el PIC
para funciones de control de funcionamiento del
hardware, direccionamiento especial, etc. En la
siguiente tabla estn los registros especiales
disponibles.












Registros 03
ACUMULADOR Y REGISTRO W
Los siguientes grficos representan un diagrama simplificado de la arquitectura interna del camino de
los datos en la CPU de los microcontroladores PIC y de los microprocesadores tradicionales.
Observamos que la principal diferencia entre ambos se encuentra en la ubicacin del registro de trabajo,
que para los PICs se denomina W (Working Register), y para los tradicionales es el Acumulador.
En los microcontroladores
tradicionales todas las
operaciones se realizan
sobre el acumulador. La
salida del acumulador esta
conectada a una de las
entradas de la Unidad
Aritmtica y Lgica (ALU),
y por lo tanto ste es
siempre uno de los dos
operandos de cualquier
instruccin. Por
convencin, las
instrucciones de simple
operando (borrar,
incrementar,
decrementar,
complementar), actan
sobre el acumulador. La
salida de la ALU va
solamente a la entrada del acumulador, por lo tanto el resultado de cualquier operacin siempre
quedara en el acumulador. Para operar sobre un dato de memoria, despus de realizar la operacin
tendremos que mover siempre el acumulador a la memoria con una instruccin adicional.
En los microcontroladores PIC, la salida de la ALU va al registro W y tambin a la memoria de datos, por
lo tanto el resultado puede guardarse en cualquiera de los dos destinos. En las instrucciones de doble
operando, uno de los dos datos siempre debe estar en el registro W, como ocurra en el modelo
tradicional con el acumulador. En las instrucciones de simple operando el dato en este caso se toma de
la memoria (tambin por convencin).
La gran ventaja de esta arquitectura es que permite un gran ahorro de instrucciones ya que el resultado
de cualquier instruccin que opere con la memoria (sea de simple o doble operando), puede dejarse en
la misma posicin de memoria o en el registro W, segn se seleccione con un bit de la misma
instruccin. Las operaciones con constantes provenientes de la memoria de programa (literales) se
realizan slo sobre el registro W.
En la memoria de datos de los PICs se encuentran ubicados casi todos los registros de control del
microprocesador y sus perifricos autocontenidos, y tambin las posiciones de memoria de usos
generales.

Registros 04
CONTADOR DE PROGRAMA
Este registro, normalmente denominado PC, es equivalente al de todos los microprocesadores y
contiene la direccin de la prxima instruccin a ejecutar. Se incrementa automticamente al ejecutar
cada instruccin, de manera que la secuencia natural de ejecucin del programa es lineal, una
instruccin despus de la otra. Algunas instrucciones (que llamaremos de control) cambian el contenido
del PC alterando la secuencia lineal de ejecucin. Dentro de estas instrucciones se encuentran GOTO y
CALL que permiten cargar en forma directa un valor constante en el PC haciendo que el programa salte a
cualquier posicin de la memoria. Otras instrucciones de control son los SKIP o saltos condicionales, que
producen un incremento adicional del PC si se cumple una condicin especfica, haciendo que el
programa salte, sin ejecutar, la instruccin 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 1024.
A diferencia de la mayora de los microprocesadores convencionales, el PC es tambin accesible al
programador como registro de memoria interna de datos, en la posicin 02. Es decir que cualquier
instruccin comn que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecucin
del programa.
Stack:
En los microcontroladores PIC el stack es una memoria interna dedicada, de tamao limitado, separada
de las memorias de datos y de programa, inaccesible al programador, y organizada en forma de pila, que
es utilizada solamente, y en forma automtica, para guardar las direcciones de retorno de subrutinas e
interrupciones. Cada posicin es de 11 bits y permite guardar una copia completa del PC. Como en toda
memoria tipo pila, a los datos se accede de forma LIFO (Last In First Out) de manera que el ltimo en
entrar es el primero en salir.
El tamao del stack en los 16F84 es de 8 posiciones.
El stack y el puntero interno que lo direcciona, son invisibles para el programador, solo se accede a ellos
automticamente para guardar o rescatar las direcciones de programa cuando se ejecutan las
instrucciones de llamada o retorno de subrutinas, cuando se produce una interrupcin o cuando se
ejecuta una instruccin de retorno de ella.
Registros 05
STATUS
La palabra de estado del procesador contiene los tres bits de estado de la ALU (C, DC y Z), y otros 5 bits
que se incluyeron en este registro.

El bit Z indica que el resultado de la ltima operacin fue CERO. El bit C indica acarreo del bit ms
significativo (bit 7) del resultado de la ltima operacin de suma. En el caso de la resta se comporta a la
inversa, C resulta 1 si no hubo pedido de prstamo. El bit DC (digit carry) indica acarreo del cuarto bit
(bit 3) del resultado de la ltima operacin de suma o resta, con un comportamiento anlogo al del bit
C, y es til para operar en BCD (para sumar o restar nmeros en cdigo BCD empaquetado). El bit C es
usado adems en las operaciones de rotacin derecha o izquierda como un paso intermedio entre el bit
0 y el bit 7.
El bit PD (POWER DOWN) sirve para detectar si la alimentacin fue apagada y encendida nuevamente,
tiene que ver con la secuencia de inicializacin, el watch dog timer y la instruccin sleep, y su uso se
detallara en la seccin referida al modo POWER DOWN. El bit TO (TIME-OUT) sirve para detectar si una
condicin de reset fue producida por el watch dog timer, esta relacionado con los mismos elementos
que el bit anterior y su uso se detallara en la seccin referida al WATCH DOG TIMER. Los bits de
seleccin de pagina RP0/RP1/IRP se utilizan en las instrucciones de salto GOTO y CALL,
Manipulando el bit nmero 5 (RP0) del registro STATUS podremos indicar al microcontrolador si
queremos trabajar en el banco 0 o en el 1.
La operacin normal del microcontrolador se efecta en el banco 0. Pero cuando nos cambiamos del
banco 0 al banco 1 es para efectuar ciertos cambios que definen como estarn configurados los
puertos del microcontrolador.
Registros 06
En la siguiente imagen vemos la asignacin que tienen cada uno de los ocho bits del registro STATUS:
Si observamos de nuevo la tabla de registros del PIC16F84 vemos que existen algunas diferencias entre
el banco 0 y el banco 1. Los registros denominados OPTION, TRISA, TRISB, EECON1 y EECON2 no
existen en el banco 0.
Si necesitamos acceder al registro TRISA, que solamente se encuentra en el banco 1, obligatoriamente
habr que cambiarse del banco 0 al banco 1 por medio de las instrucciones del microcontrolador.
Y tendremos que acceder al banco 1 solamente para utilizar los registros que no se encuentran en el
banco 0. Una vez utilizados esos registros ( y modificados si fuese necesario), regresaremos al banco
0 para que el microcontrolador siga con su tarea asignada en la memoria del programa.
En el caso de los registros OPTION y TRISA y B no ser necesario realizar el cambio de banco, ya que
tenemos dos instrucciones que podremos utilizar para hacerlo, a pesar de que Microchip recomienda no
usarlas para mantener la compatibilidad con el juego de instrucciones del microprocesador 16CXX.
Registros 07
TIMER 0
El registro TMR0 es un contador de 8 bits, es decir un particular tipo de registro cuyo contenido es
incrementado con una cadencia regular y programable directamente por el hardware del PIC.
Este registro puede usarse para contar eventos externos por medio de un pin de entrada especial (modo
contador) o para contar pulsos internos de reloj de frecuencia constante (modo timer). Adems, en
cualquiera de los dos modos, se puede insertar un prescaler, es decir un divisor de frecuencia
programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256. Este divisor puede ser utilizado
alternativamente como prescaler del TMR0 o como postscaler del Watch Dog Timer, segn se lo
programe.
En la prctica, a diferencia de los otros registros, el
TMR0 no mantiene inalterado el valor que tiene
memorizado, sino que lo incrementa
continuamente.
Si por ejemplo escribimos en l el valor 10, despus
de un tiempo igual a cuatro ciclos de maquina, el
contenido del registro comienza a ser incrementado
a 11, 12, 13 y as sucesivamente con una cadencia
constante y totalmente independiente de la
ejecucin del resto del programa.
Una vez alcanzado el valor 255, el registro TMR0 es
puesto a cero automticamente comenzando
entonces a contar desde cero y no desde el valor
originalmente cargado.
La frecuencia de conteo es directamente
proporcional a la frecuencia de reloj aplicada al chip
y puede ser modificada programando
adecuadamente algunos bits de configuracin.
Registros 08
En la figura siguiente est representada la cadena de bloques internos del PIC que determinan el
funcionamiento del registro TMR0.
Los bloques Fosc/4 y T0CKI, mostrados en azul, representan las dos posibles fuentes de seal de reloj,
para el contador TMR0.
Fosc/4 es una seal
generada internamente
por el PIC tomada del
circuito de reloj y que es
igual a la frecuencia del
oscilador dividida por
cuatro.
T0CKI es una seal
generada por un posible circuito externo y aplicada al pin T0CKI correspondiente al pin 3 del PIC16F84.
Los bloques T0CS y PSA mostrados en verde son dos conmutadores de seal en cuya salida se presenta
una de las dos seales de entrada en funcin del valor de los bits T0CS y PSA del registro OPTION.
Registros 09
EL PRESCALER
Consiste en un divisor programable de 8 bits a utilizar en el caso de que la frecuencia de conteo enviada
al contador TMR0 sea demasiado elevada para nuestros propsitos. Se configura a travs de los bits PS0,
PS1 y PS2 del registro OPTION.
La frecuencia Fosc/4 es una cuarta parte de la frecuencia de reloj. Utilizando un cristal de 4Mhz
tendremos una Fosc/4 igual a 1 MHz. Tal frecuencia es enviada directamente al registro TMR0 sin sufrir
ningn cambio. La cadencia de conteo que se obtiene es por lo tanto igual a 1 milln de incrementos por
segundo del valor presente en TMR0, que para muchas aplicaciones podra resultar demasiado elevada.
Con el uso del PRESCALER podemos dividir posteriormente la frecuencia Fosc/4 configurando
oportunamente los bits PS0, PS1 y PS2 del registro OPTION segn la siguiente tabla:
Ejemplo prctico: introducir un retardo igual a
un segundo utilizando el registro TMR0.
Debemos programar el bit T0CS a 0 para
seleccionar como fuente de conteo el reloj del
PIC, el bit PSA a 0 para asignar el PRESCALER al
registro TMR0 en lugar de al Watch Dog Timer
(del que trataremos ms adelante) y los bits de
configuracin del PRESCALER a 100 para
obtener una frecuencia de divisin igual a 1:32.
La frecuencia que obtendremos en TMR0 ser
igual a:
Fosc = 1Mhz / 32 = 31.250 Hz
Memorizamos en TMR0 el valor 6 de modo
que el registro TMR0 alcanza el cero despus
de 250 cuentas (256 6 = 250) obteniendo as
una frecuencia de paso por cero del TMR0
igual a:
31.250 / 250 = 125 Hz
El siguiente paso ser memorizar en un registro de 8 bits el valor 125 de tal modo que, decrementando
este registro en 1 por cada paso por cero de TMR0, se obtenga una frecuencia de pasos por cero del
registro igual a:
125/125 = 1Hz (1 segundo).
En resumen: se trata de controlar si TMR0 ha alcanzado el cero, luego de reinicializarlo a 6 y
decrementar el valor contenido en un registro con valor 125. Cuando el registro alcance tambin el valor
cero, entonces habr trascurrido un segundo.

Registros 10
Funcionamiento del modo de bajo consumo
(POWER DOWN MODE)
El Power Down Mode o Sleep Mode, es un estado particular de funcionamiento del PiC, utilizado para
reducir el consumo de corriente en los momentos que no realiza ninguna tarea o est a la espera de un
suceso externo.
Si tomamos como ejemplo un control remoto para TV, veremos que la mayor parte del tiempo el micro
permanece a la espera de la presin de alguna tecla. Apenas oprimida, efecta una breve transmisin y
queda nuevamente a la espera de la presin de otra tecla.
El tiempo de uso efectivo de la CPU del micro est por tanto, limitado a unos pocos milisegundos
necesarios para efectuar la transmisin mientras que durante varias horas no efecta ninguna tarea
particular (en el caso de utilizar la tcnica secaremote, en la que se hace un uso ms intensivo del
mando, ocurre todo lo contrario).
Para no consumir intilmente la energa de las bateras, es posible apagar varios de los circuitos del
micro y reencenderlos slo en correspondencia con algn suceso externo.
Veamos como.
INSTRUCCIN SLEEP
La instruccin SLEEP es utilizada para colocar el PIC en Power Down Mode y reducir la corriente
absorbida, que pasar de unos 2 mA (a 5 volt y el clock en 4MHz) a unos 2uA, o sea, unas 1000 veces
menos.
Para entrar en Power Down Mode basta insertar la instruccin SLEEP en cualquier parte del programa.
Cualquier instruccin siguiente a SLEEP no ser efectuada por el PIC el cual finalizar en este punto la
ejecucin, apagar los circuitos internos, excepto aquellos necesarios para mantener el estado de los
puertos de I/O y aquellos que lo sacarn de esa condicin, los cuales comentaremos a continuacin.
Para despertar al PIC se utilizan diversas tcnicas:
Reset del PIC llevando a cero el pin 4 (MCLR).
Timeout del Watch Dog Timer (si est habilitado).
Verificacin de una interrupcin (interrupcin desde el pin RB0/INT, cambio de estado en el puerto B,
finalizacin de la escritura sobre la EEPROM).
En los dos primeros casos, el PIC es reseteado y la ejecucin es retomada en la situacin 0 de memoria.
En el tercer caso, el PIC se comporta como en el caso de una interrupcin normal, siguiendo
primeramente el Interrupt handler, retomando la ejecucin despus de la instruccin SLEEP. Para que el
PIC sea despertado por una interupt deben ser habilitados los flag del registro INTCON.
Registros 11
WATCH DOG TIMER
El Watch Dog Timer (que podra traducirse como temporizador perro guardin) es un oscilador interno
al PIC, pero completamente independiente del resto de la circuitera, cuya funcin es eliminar
eventuales bloqueos de la CPU del PIC y resetearlo para que retome la ejecucin normal del programa.
Para poder eliminar un eventual bloqueo de la CPU durante la ejecucin del programa principal, se
inserta en l una instruccin especial:
CLRWDT (CleaR Watch Dog Timer)
La cual pone a cero en intervalos regulares el WDT, no permitindole llegar al final de su temporizacin.
Si la CPU no realiza esta instruccin antes del trmino de la temporizacin, entonces, se asume que el
programa se ha bloqueado por algn motivo y se efecta el reset de la CPU.
El periodo mnimo alcanzado el cual la CPU es reseteada es de unos 18 ms (depende de la temperatura y
de la tensin de alimentacin). Es posible, sin embargo, asignar el prescaler al WDT a fin de obtener
retardos mayores (hasta unos 2,3 segundos).
Para habilitar el WDT debemos, en la fase de programacin, habilitar el flag WDTE de la palabra de
configuracin. La modalidad de activacin de este flag, depende del programador usado.
Asignacin del prescaler al WDT
Actuando sobre el bit PSA del registro OPTION_REG es posible asignar el prescaler al WDT para obtener
tiempos de intervencin mayores. El bit PSA va seteado a uno con la instruccin:
bsf OPTION REG,PSA
En caso contrario, el prescaler ser asignado al TIMER 0. Obviamente, asignando el prescaler al WDT, no
ser posible usarlo con el TIMER 0 y viceversa.
Segn los valores de los bits PS0, PS1 y PS2 del OPTION_REG podremos obtener distintos intervalos de
retardo. La eleccin correcta deber ser hecha teniendo en cuenta el mximo retardo que logramos
obtener en nuestro programa tras la ejecucin de dos instrucciones CLRWDT sucesivas.
En la tabla siguiente vemos los retardos, segn los valores de PS0, PS1 y PS2:


4 Puertos de Entrada y Salida
Los microprocesadores PIC16F84 tienen 2 puertos de entrada/salida paralelos de usos generales
denominados Puerto A y Puerto B.
El Puerto A es de 4 bits y el Puerto B es de 8 bits.
Los puertos del microcontrolador PIC16F84 son el medio de comunicacin con el mundo exterior, en
ellos podremos conectar los perifricos o circuitos necesarios como por ejemplo los mdulos LCD,
motores elctricos, etc; pero estas conexiones no se podrn realizar arbitrariamente. Existen unas reglas
bsicas que debern cumplirse para que el microcontrolador no sufra daos o se destruya. Para ello es
necesario conocer los limites de corriente que puede manejar el microcontrolador.
LIMITE DE CORRIENTE PARA LOS PUERTOS A Y B
Los puertos A y B del microcontrolador podrn ser programados como entradas y salidas
indiferentemente. Para el caso de que sean programados como salida se denominan Modo Fuente por
que suministran corriente y cuando son programados como entrada se denominan Modo Sumidero
por que reciben corriente.
La mxima corriente que puede suministrar una lnea programada como salida es de 20 mili-amperios,
pero si utilizamos toda las lneas del puerto A programadas como salida, no deber exceder de 50mA
para todo el puerto A. Para el caso del puerto B no deber exceder de 100 mA.
Si las programamos como entradas (Sumidero), la corriente mxima que puede manejar una sola lnea
es de 25 mA. Para el caso del puerto A programado con todas sus lneas como entrada, la mxima es
de 80 mA. En el caso del puerto B es de 150 mA.
En caso de querer utilizar perifricos que manejen mayor cantidad de corriente de la especificada, habr
que aplicar un circuito acoplador como por ejemplo los buffers, transistores que se encarguen de
controlar la corriente, etc.
IDENTIFICACIN DE LOS PINES UTILIZADOS PARA LOS PUERTOS DE ENTRADA Y SALIDA
En la imagen siguiente se podr observar claramente que el microcontrolador tiene dos puertos
denominados A y B. El puerto A tiene 5 lneas disponibles (RA0, RA1, RA2, RA3, RA4) y el puerto
B tiene 8 lneas disponibles (RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7). Ambos Puertos suman un total
de 13 lneas que podrn ser programadas independientemente como entradas o como salidas. Estas son
las lneas que estarn destinadas a comunicar el microcontrolador con el mundo exterior, como por
ejemplo motores, diodos luminosos Leds, mdulos LCD, teclados matriciales, etc.
Tambin hay que hacer
mencin a que el Pin
nmero 3 perteneciente al
puerto A (RA4) tambin
tiene otra nomenclatura
denominada TOCKI, lo
cual quiere decir que esta
lnea se puede programar
como entrada, salida y
temporizador/contador.


CONFIGURACIN DE LOS PUERTOS DE ENTRADA/SALIDA
Los bits de cada puerto se configuran mediante los bits correspondientes de un registro de control
asociado que recibe el nombre de TRIS. En realidad cada puerto soporta dos registros:
1. El registro de datos, al que se denomina Puerto A o B (PortA o PortB).
2 El registro de control TRISA o TRISB, con el que se programa el sentido (Entrada o Salida) de las lneas
de cada puerto.
Los Puertos A y B se corresponden con las posiciones 5 y 6 del rea de datos. Cada uno de sus bits
puede programarse como una lnea de Entrada o de Salida, segn se ponga un 1 un 0 en el bit del
registro de control TRIS correspondiente.
Un 1 en el bit x del registro TRISA pone en alta impedancia (Entrada) la lnea asociada x del Puerto A.
Si en el bit x de TRISA hubiese un 0, el contenido del biestable de datos correspondiente del Puerto A
pasara a la patita de E/S externa.
Cualquier lnea puede funcionar como Entrada o como Salida. Sin embargo, si acta como Entrada, la
informacin que se introduce desde el exterior no se memoriza o graba, pasa simplemente por un
dispositivo triestado por lo cual el valor de dicha informacin debe mantenerse hasta que sea leda. La
lectura se realiza en tiempo real.
Cuando una patita de E/S funciona como salida, el bit que proviene del bus de datos se guarda en el
biestable del dato con lo cual la informacin que ofrece esta patita permanece invariable hasta que se
reescriba otro bit.
Para configurar la patita como Entrada, hay que cargar un 1 en el biestable de control de E/S mientras
que hay que cargar un 0 si se desea que sea Salida.
Cada lnea de E/S de los puertos se programa de forma independiente y puede ser Entrada o Salida.
Cuando se produce un reset, todos los bits de los registros TRIS pasan a tener el valor 1 y todas las lneas
de E/S actan como Entrada por evidentes motivos de seguridad para evitar daos irreparables.
Los puertos que contienen entradas y salidas necesitan una atencin especial al escribir el programa.
Instrucciones como bsf y bcf comienzan leyendo el valor del puerto y cargndolo en el registro W; all
ejecutan la puesta a 1 a 0 del bit seleccionado y, luego, depositan el registro W en el puerto. Tambin
hay que tener en cuenta las modificaciones que se produzcan en las patitas que son entrada y pasan a
salida, pues pueden estar presentes datos antiguos en el registro de salida del puerto al ser
memorizados.
Hay que prestar mucha atencin a las operaciones que, tras una lectura de un puerto. Sigue una
escritura de la misma. Se debe dejar pasar un tiempo determinado para que se estabilice el voltaje de
las patitas. Insertando entre la lectura y la escritura una instruccin NOP o cualquier otra que no
implique a los puertos, se eliminan estos errores potenciales.

5 Interrupciones
El sistema de interrupciones consiste en un mecanismo por el cual un evento interno o externo,
asncrono respecto del programa, puede interrum
Funcionamiento
Las interrupciones se comportan casi exactamente igual que las subrutinas. Desde el punto de vista del
control del programa, al producirse una interrupcin se produce el mismo efecto que ocurrira si el
programa tuviese un CALL 0004h en el punto en que se produjo la interrupcin. En uno de los registros
de control del sistema de interrupciones existe un bit de habilitacin general de interrupciones GIE, que
debe ser programado en 1 para que las interrupciones puedan actuar.
Al producirse una interrupcin, este bit se borra automticamente para evitar nuevas interrupciones. La
instruccin RETFIE que se utiliza al final de la rutina de interrupcin, es idntica a un retorno de
subrutina, salvo que adems coloca en uno automticamente el bit GIE volviendo a habilitar las
interrupciones. Dentro de la rutina de interrupcin, el programa deber probar el estado de los flags de
interrupcin de cada una de las fuentes habilitadas, para detectar cual fue la que caus la interrupcin y
as decidir que accin tomar.
pir la ejecucin de ste produciendo automticamente un salto a una subrutina de atencin, de manera
que pueda atender inmediatamente el evento, y retomar luego la ejecucin del programa exactamente
en donde estaba en el momento de ser interrumpido.
Este mecanismo es muy til por ejemplo para el manejo de timers o rutinas que deben repetirse
peridicamente (refresh de display, antirebote de teclado, etc.), deteccin de pulsos externos, recepcin
de datos, etc.

Fuentes
La seal que produce la interrupcin es en realidad una sola, que resulta de la combinacin de todas las
fuentes posibles y de los bits de habilitacin. Existen dos grupos de fuentes, unas que se habilitan con
solo colocar en uno el bit GIE, y otras que adems necesitan que este puesto a uno el bit PEIE. Adems,
cada fuente de interrupciones tiene su respectivo bit de habilitacin individual.
Las fuentes de interrupcin varan con cada versin, y pueden ser por ejemplo:
Interrupcin externa por pin RB0/INT.
Desborde del Timer 0 (TMR0).
Cambio en el estado de los bits 4 a 7 del puerto B.
Desborde del timer 1.
Desborde del timer 2.
Interrupcin del capture/compare 1.
Interrupcin del capture/compare 2.
transmisin o recepcin de un carcter por la interface serie sincrnica.
transmisin o recepcin de un carcter por la interface serie asincrnica.
Fin de conversin A/D.
Lectura/escritura del puerto paralelo de comunicacin con otros microprocesadores.
Escritura de EEPROM finalizada.

6 Instrucciones assembler del 16F84

El microcontrolador PIC 16F84 tiene un total de 37 instrucciones de una sola palabra, y adems otras 28
instrucciones especiales que se corresponden con combinaciones de 2 3 instrucciones simples.

Las instrucciones tienen letras relacionadas (parmetros) y que tienen una interpretacin diferenciada.

La letra W es el registro ms importante que tiene el PIC y se le denomina ACUMULADOR, ya que las
operaciones pasan a travs de l.
La letra k es un literal (valor numrico) que puede contener cualquier valor asignado por el
programador entre 0 y 255 (es el mximo que se puede representar con un byte).

La letra f es cualquier nombre dado a un registro.

La letra d indica en que lugar se almacenar el resultado de la instruccin (en el acumulador W o en
el registro f).

Si d = 0, el resultado se almacenar en W.

Si d = 1, el resultado se almacenar en f.

Instrucciones orientada a los bytes

6 Instrucciones de control y manejo de literales

INSTRUCCIN: ADDLW k (hex = 3E kk)
Descripcin: Sumar al acumulador el valor k.
Operacin: W = W + k
Esta instruccin suma un valor de un literal al contenido del registro
W y lo guarda en W.
Ejemplo: MOVLW 3 ; carga el acumulador W con el valor 3.
ADDLW 1 ; suma 1 al acumulador.
Al final el acumulador tendr el valor 4.
Registro STATUS: Modifica los bits Z, DC y C.
Z vale 1 si el resultado de la operacin es 0.
DC vale 1 si el resultado de la operacin es un nmero superior
a 15.
C vale 1 si el resultado de la operacin es positivo o el bit 7 del
registro que contiene el resultado vale 0. En caso contrario C
vale 0 (resultado negativo).
INSTRUCCIN: ANDLW k (hex = 39 kk)
Descripcin: Operacin lgica AND entre el acumulador W y el literal k
Operacin: W = W AND k
Esta instruccin realiza una operacin lgica AND entre el contenido de
W y k. El resultado se guarda siempre en el acumulador W
Ejemplo: Si cargamos el acumulador con el binario 10101010B y hacemos un
AND con el binario 11110000B, nos quedar el resultado de la
operacin en el acumulador W.
MOVLW 10101010B
ANDLW 11110000B
El resultado de la operacin queda en W = 10100000B.
Explicacin de la operacin AND:
Tenemos 4 posibles combinaciones entre dos bits
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Vemos que solamente en el caso de que ambos bits sean 1, el resultado
ser 1. Esta instruccin compara dos bytes, bit a bit.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: CALL k (hex = 2k kk)
Descripcin: Llama a una subrutina en la direccin k.
Operacin: CALL kRETURN PC+1.
Esta instruccin llama a un grupo de instrucciones (subrutina) que
comienzan en la direccin k, donde k puede ser un valor numrico o
una etiqueta. Siempre termina con la instruccin de retorno
(RETURN o RETLW).
Definicin 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 instruccinCALL,
guarda en el stack el valor del registro PC+1 (PC = Program Counter) de
manera que al regresar de la subrutina contina con la instruccin
siguiente recuperndola del stack, ejecutando la instruccin de
retorno RETURN o RETLW.
Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles destack,
por lo que el nmero mximo de CALL reentrantes
(instrucciones CALL que contengan otra instruccin CALL) queda
limitado a 8.
Ejemplo: PRINCIPAL: etiqueta que identifica una direccin de memoria.
RETARDO: etiqueta que identifica el comienzo de una subrutina.
BUCLE: etiqueta que identifica una direccin de memoria.
PRINCIPAL CALL RETARDO
BTFSC PORTB, RB0
GOTO PRINCIPAL
*
*
*
RETARDO CLRF CONTADOR
BUCLE DECFSZ CONTADOR, 1
GOTO BUCLE
RETURN
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 instruccin siguiente al salto (BTFSC).
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: CLRWDT (hex = 00 64)
Descripcin: Pone el temporizador WDT a cero.
Operacin: WDT = 0
Esta instruccin se utiliza cuando programamos el PIC con la opcin
Watch Dog habilitada. Para evitar el reset del PIC, el programa debe
contener cclicamente la instruccin 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.
Ejemplo: Bucle CLRWDT
*
*
*
GOTO Bucle
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: GOTO k (hex = 28 kk)
Descripcin: Salto incondicional a k.
Operacin: Salto k
Esta instruccin ejecuta un salto del programa a la direccin k. El
parmetro k puede ser un valor numrico o una etiqueta.
Ejemplo: INSTRUCCIN 1
GOTO ABAJO
INSTRUCCIN 3
INSTRUCCIN 4
INSTRUCCIN 5
ABAJO INSTRUCCIN 6
Primero se ejecuta la instruccin 1, despus GOTO y contina con la
instruccin 6 saltndose las instrucciones 3, 4 y 5.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: IORLW k (hex = 38 kk)
Descripcin: Operacin lgica OR entre el acumulador W y el literal k
Operacin: W = W OR k
Esta instruccin realiza un OR inclusivo entre el contenido del
acumulador W y el literal k. El resultado se guarda siempre en el
acumulador (k es un valor, no un registro).
Ejemplo: Si cargamos el acumulador con el binario 11110000B y k= 00001111B,
nos quedar el resultado de la operacin en el acumulador W.
MOVLW 11110000B
IORLW 00001111B
El resultado de la operacin queda en W = 11111111B.
Explicacin de la operacin OR:
Tenemos 4 posibles combinaciones entre dos bits
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
Vemos que solamente en el caso de que ambos bits sean 0, el resultado
ser 0. Esta instruccin compara dos bytes, bit a bit.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: MOVLW k (hex = 30 kk)
Descripcin: Mover el literal k al acumulador.
Operacin: W = k
Esta instruccin asigna al acumulador W el valor del literal k(entre 0 y
255).
Ejemplo: Si tenemos el acumulador a cero o con cualquier valor, y queremos que
contenga el que le asignemos nosotros directamente entonces
usaremos esta instruccin:
W = 0.
Valor a asignar = 100.
Instruccin: 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).
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: OPTION (hex = 00 62)
Descripcin: Guarda el valor del acumulador en el registro OPTION.
Operacin: OPTION = W.
Esta instruccin guarda en el registro especial OPTION el valor
contenido en el acumulador W.
Ejemplo: MOVLW 10H ; carga el acumulador con el valor 10H.
OPTION ; carga el registro OPTION con el acumulador.
Esta instruccin existe para mantener la compatibilidad con los PIC
producidos con anterioridad, y como en el futuro podra dejar de
implementarse, Microchip aconseja realizar el ejemplo anterior de esta
otra forma:
BSF STATUS, RP0 ; activa el banco 1.
MOVLW 10H ; carga el acumulador con 10H.
MOVWF OPTION_REG ; carga OPTION con el acumulador.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: RETFIE (hex = 00 09)
Descripcin: Retorna de una interrupcin.
Operacin: FIN INTERRUPCION.
Esta instruccin devuelve el control al programa principal despus de
ejecutarse una subrutina de gestin de interrupcin.
Ejemplo: ORG 00H
BUCLE GOTO BUCLE ; bucle infinito.
ORG 04H; vector de interrupcin.
RETFIE ; retorna de la interrupcin
Este cdigo 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 direccin 04H y la instruccin RETFIE
regresa de la interrupcin.
Al ejecutarse una interrupcin, el bit GIE del registro INTCON se pone a
0 y as evita que otra interrupcin se produzca mientras ya est con una
en marcha.
Con la instruccin RETFIE ponemos de nuevo el bit GIE a 1 para as
atender de nuevo a futuras interrupciones.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: RETLW (hex = 34 kk)
Descripcin: Retorno de subrutina y carga literal k en el acumulador.
Operacin: RETORNO con W = k.
Esta instruccin retorna de una subrutina al programa principal,
cargando el acumulador W con el literal k.
Es la ltima instruccin que forma una subrutina (al igual queRETURN).
Y para qu me sirve regresar de una subrutina con un determinado
literal en el acumulador? Nos ser muy til al programar con TABLAS.
Ejemplo: CALL SUBRUT1 ; llama a Subrut1.
MOVWF DATO 1 ; carga W en Dato1.
CALL SUBRUT2 ; llama a Subrut2.
MOVWF DATO2 ; carga W en Dato2.
*
*
SUBRUT1 RETLW 0A ; carga W = 0A y retorna.
SUBRUT2 RETLW 0B ; carga W = 0B y retorna.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: RETURN (hex = 00 08)
Descripcin: Retorno de subrutina.
Operacin: RETORNO.
Esta instruccin retorna de una subrutina al programa principal en la
instruccin siguiente a la llamada de la subrutina, tomando el valor
almacenado en el stack para continuar.
Es la ltima instruccin que forma una subrutina (al igual queRETLW).
Ejemplo: CALL COMPARA ; llama a Compara.
INSTRUCCION1
INSTRUCCION2
*
*
COMPARA INSTRUCCIN R1
INSTRUCCIN R2
RETURN
Aqu llamamos a la subrutina COMPARA, se ejecutan las instrucciones
R1 y R2 y con el RETURN regresa a la instruccin siguiente al CALL y
ejecuta las instrucciones 1, 2 y sigue con el programa.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: SLEEP (hex = 00 63)
Descripcin: En modo reposo..
Operacin: EN ESPERA.
Esta instruccin detiene la ejecucin del programa y deja el PIC en
modo suspendido.
No ejecuta ninguna instruccin hasta que sea nuevamente
reinicializado (reset).
Durante este modo, el contador del Watch Dog (WDT) sigue
trabajando, y si lo tenemos activado el PIC se resetear por este medio.
El consumo de energa es mnimo.
Ejemplo:
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: SUBLW k (hex = 3C kk)
Descripcin: Resta al literal k el valor del acumulador.
Operacin: W = k W
Esta instruccin resta al literal k el valor almacenado en
elacumulador W y el resultado se guarda en el acumulador.
Ejemplo: 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.
Registro STATUS: Modifica los bits Z, DC y C.
Z vale 1 si el resultado de la operacin es 0.
DC vale 1 si el resultado de la operacin es un nmero superior
a 15.
C vale 1 si el resultado de la operacin es positivo o el bit 7 del
registro que contiene el resultado vale 0. En caso contrario C
vale 0 (resultado negativo).
INSTRUCCIN: TRIS f (hex = 00 6F)
Descripcin: Guarda el acumulador en uno de los registros de TRIS.
Operacin: TRIS de f = W.
Esta instruccin guarda el valor del acumulador W en uno de los
registros especiales de TRIS que indicamos en el parmetro f.
Los registros TRIS determinan el funcionamiento como entrada y salida
de las lneas I/O del PIC.
Ejemplo: MOVLW 16H ; carga el acumulador W con el valor 16H.
TRIS PORTA ; carga el registro PORTA con el acumulador.
Esta instruccin existe para mantener la compatibilidad con los PIC
producidos anteriormente,y como en el futuro podra dejar de
implementarse, Microchip aconseja realizar el ejemplo anterior de esta
otra forma (aunque ocupa ms 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.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: XORLW k (hex = 3A kk)
Descripcin: Operacin lgica OR exclusivo entre el acumulador y el literal k
Operacin: W = W XOR k
Esta instruccin realiza un OR exclusivo entre el contenido
delacumulador W y el valor del literal k. El resultado se guarda
siempre en el acumulador (k es un literal, no un registro).
Ejemplo: Si cargamos el acumulador con el binario 11110000B y hacemos un XOR
con el binario 10101010B, nos quedar el resultado de la operacin en
el acumulador W.
MOVLW 11110000B
XORLW 10101010B
El resultado de la operacin queda en W = 01011010B.
Explicacin de la operacin XOR:
Tenemos 4 posibles combinaciones entre dos bits
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Vemos que si ambos bits son iguales el resultado ser 0. Y si ambos son
diferentes, el resultado ser 1. Esta instruccin compara dos bytes, bit a
bit.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.

6 Instrucciones orientadas a bits

INSTRUCCIN: BCF f,b (hex = 1B ff)
Descripcin: Pone a cero el bit b del registro f.
Operacin: F(b) = 0
Esta instruccin pone a cero un bit que hayamos elegido de un registro
determinado.
Ejemplo: BCF PORTA, RA4 ; pone a 0 el bit RA4 del registro PORTA
BCF PORTA, 4 ; igual, si no conocemos en nombre del bit
Si en el PORTA tenemos como valor inicial 11111111B, despus de
aplicar el ejemplo anterior, PORTA = 11101111B.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: BSF f,b (hex = 1B ff)
Descripcin: Pone a uno el bit b del registro f.
Operacin: F(b) = 1
Esta instruccin pone a uno un bit que hayamos elegido de un registro
determinado.
Ejemplo: BSF PORTA, RA0 ; pone a 1 el bit RA0 del registro PORTA
BSF PORTA, 0 ; igual, si no conocemos en nombre del bit
Si en el PORTA tenemos como valor inicial 00000000B, despus de
aplicar el ejemplo anterior, PORTA = 00000001B.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: BTFSC f,b (hex = 1B ff)
Descripcin: Comprueba un bit b del registro f y se salta la instruccin siguiente
si vale 0.
Operacin: F(b) = 0 ? SI, salta una instruccin
Esta instruccin comprueba el valor del bit b en el registro f, y si b
= 0 entonces se salta la siguiente instruccin.
Si b = 1 no salta y sigue con su ejecucin normal.
Ejemplo: BTFSC PORTA, 2
INSTRUCCIN 1
INSTRUCCIN 2
Si en PORTA tenemos como valor inicial 11111011B, el programa
contina con la instruccin 2, saltndose la instruccin 1
Si en PORTA tenemos el valor 00000100B, el programa sigue con la
instruccin 1 y despus la instruccin 2.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: BTFSS f,b (hex = 1B ff)
Descripcin: Comprueba un bit b del registro f y se salta la instruccin siguiente
si vale 1.
Operacin: F(b) = 1 ? SI, salta una instruccin.
Esta instruccin comprueba el valor del bit b en el registro f, y si b
= 1 entonces se salta la siguiente instruccin.
Si b = 0 no salta y sigue con su ejecucin normal.
Ejemplo: BTFSS PORTB, 7
INSTRUCCIN 1
INSTRUCCIN 2
Si en PORTB tenemos como valor inicial 10000000B, el programa
contina con la instruccin 2, saltndose la instruccin 1.
Si en PORTB tenemos el valor 01111111B, el programa sigue con la
instruccin 1 y despus la instruccin 2.
Registro STATUS: No modifica ningn bit de estado.

6 Instrucciones orientadas a registros

INSTRUCCIN: ADDWF f,d (hex = 07 ff)
Descripcin: Suma el acumulador y el registro f.
Operacin: d = W + f (d puede ser W f).
Esta instruccin suma el contenido del acumulador con el registro f, y
el resultado se guarda dependiendo del valor de d.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si tomamos como valores iniciales W = 5 y DATO = 10.
ADDWF DATO ; DATO = 15 y W = 5.
ADDWF DATO, 1; DATO = 15 y W = 5.
ADDWF DATO, 0; W = 15 y DATO = 10.
ADDWF DATO, W; W = 15 y DATO = 10.
Registro STATUS: Modifica los bits Z, DC y C.
Z vale 1 si el resultado de la operacin es 0.
DC vale 1 si el resultado de la operacin es un nmero superior
a 15.
C vale 1 si el resultado de la operacin es positivo o el bit 7 del
registro que contiene el resultado vale 0. En caso contrario C
vale 0 (resultado negativo).
INSTRUCCIN: ANDWF f,d (hex = 05 ff)
Descripcin: Operacin lgica AND entre el acumulador y el registro f.
Operacin: d = W AND f (d puede ser W o f).
Esta instruccin realiza una operacin lgica AND entre el contenido del
acumulador W y el registro f. El resultado se guarda segn sea el
valor de d.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si queremos extraer los 4 bits menos significativos de un registro,
podremos utilizar una mscara para obtenerlos.
Usamos el valor 00001111B para realizar la operacin ADN y as
obtenerlos (para los 4 bits ms significativos utilizaramos el valor
11110000B).
Cargamos el valor del cual queremos extraer los 4 bits menos
significativos en f (f = 10101010B).
Cargamos el acumulador con la mscara (W = 00001111B).
ANDWF f,W
El resultado queda guardado en el acumulador (W = 00001010B).
Explicacin de la operacin AND:
Tenemos 4 posibles combinaciones entre dos bits
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Vemos que solamente en el caso de que ambos bits sean 1, el resultado
ser 1. Esta instruccin compara dos bytes, bit a bit.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: CLRF f (hex = 01 8f)
Descripcin: Pone a cero el registro f.
Operacin: F = 0.
Esta instruccin pone a cero el valor contenido en el registro
direccionado por el parmetro f. Puede decirse que borra el registro
f.
Ejemplo: Si queremos poner a cero el registro TMR0, cuya direccin es 01H,
tendramos que utilizar
CLRF 01H
Si hemos incluido al inicio del cdigo fuente el ficheroPIC16F84.INC,
podemos utilizar el nombre simblico de dicho registro:
CLRF TMR0
Registro STATUS: Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0).
INSTRUCCIN: CLRW (hex = 01 00)
Descripcin: Pone el acumulador a cero.
Operacin: W = 0
Esta instruccin pone a cero el valor contenido en el registro W
(acumulador)
Ejemplo: No es necesario
Registro STATUS: Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0).
INSTRUCCIN: COMF f,d (hex = 09 ff)
Descripcin: Complementa el registro f.
Operacin: d = NOT f (d puede ser W f).
Esta instruccin efecta el complemento del valor contenido en el
registro direccionado por el parmetro f.
La operacin de complementar consiste en invertir los bits: poner los
ceros a unos y los unos a ceros.
El parmetro d determina el destino del valor obtenido.
Si d = W, el resultado se almacena en el acumulador.
Si d = f, el resultado se almacena en el propio registro f.
Ejemplo: Si tenemos en PORTA el valor 00001111B, al ejecutar:
COMF PORTA
El resultado ser PORTA = 11110000B.
Si aplicamos para el mismo valor inicial, la instruccin:
COMF PORTA, W
El resultado ser W = 11110000B y PORTA = 00001111B.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: DECF f,d (hex = 03 ff)
Descripcin: Decrementa en 1 el registro f.
Operacin: d = f 1 (d puede ser W f).
Esta instruccin decrementa en uno el contenido del registro
direccionado por el parmetro f. El parmetro d determina el
destino del valor obtenido.
Si d = W, el resultado se almacena en el acumulador.
Si d = f, el resultado se almacena en el propio registro f.
Ejemplo: Si tenemos un registro DIA = 7.
Aplicando la instruccin
DECF DIA, 0, tendremos W = 6 y DIA = 7.
Si aplicamos esta otra
DECF DIA, 1, tendremos DIA = 6.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: DECFSZ f,d (hex = 0B ff)
Descripcin: Decrementa en 1 a f, y si f = 0 salta la siguiente instruccin.
Operacin: d = f 1, si d = 0 SALTA (d puede ser W f).
Esta instruccin decrementa el contenido del registro direccionado por
el parmetro f, y si el resultado es 0 se salta la instruccin siguiente.
El parmetro d determina el destino del valor obtenido.
Si d = W, el resultado se almacena en el acumulador.
Si d = f, el resultado se almacena en el propio registro f.
Ejemplo: DECFSZ VALOR, W
INSTRUCCION 1
INSTRUCCIN 2
Si el contenido del registro VALOR al decrementarlo en 1 es igual a 0,
se guarda el resultado en el acumulador y sigue con la INSTRUCCION2,
saltndose la INSTRUCCION1.
Si el resultado que guardamos en W no es 0, sigue con la
INSTRUCCION1 y despus con la INSTRUCCION2 (no se salta la
inmediata siguiente).
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: INCF f,d (hex = 0A ff)
Descripcin: Incrementa en 1 el registro f.
Operacin: d = f + 1 (d puede ser W f).
Esta instruccin incrementa en uno el contenido del registro
direccionado por el parmetro f. El parmetro d determina el
destino del valor obtenido.
Si d = W, el resultado se almacena en el acumulador.
Si d = f, el resultado se almacena en el propio registro f.
Ejemplo: Si tenemos un registro DIA = 7.
Aplicando la instruccin
INCF DIA, 0, tendremos W = 8 y DIA = 7.
Si aplicamos esta otra
INCF DIA, 1, tendremos DIA = 8.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: INCFSZ f,d (hex = 0F ff)
Descripcin: Incrementa en 1 a f, y si f = 0 salta la siguiente instruccin
Operacin: d = f + 1, si d = 0 SALTA (d puede ser W f).
Esta instruccin incrementa en uno el contenido del registro
direccionado por el parmetro f, y si el resultado es 0 se salta la
instruccin siguiente. El parmetro d determina el destino del valor
obtenido.
Si d = W, el resultado se almacena en el acumulador.
Si d = f, el resultado se almacena en el propio registro f.
Ejemplo: INCFSZ VALOR, W
INSTRUCCION 1
INSTRUCCIN 2
Si el contenido del registro VALOR al incrementarlo en 1 es igual a 0,
se guarda el resultado en el acumulador y sigue con la INSTRUCCION2,
saltndose la INSTRUCCION1.
Si el resultado que guardamos en W no es 0, sigue con la
INSTRUCCION1 y despus con la INSTRUCCION2 (no se salta la
inmediata siguiente).
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: IORWF f,d (hex = 04 ff)
Descripcin: Operacin lgica OR inclusivo entre el acumulador y un registro
Operacin: d = W OR f (d puede ser W f).
Esta instruccin realiza una operacin lgica OR inclusivo entre el
acumulador W y el registro direccionado por el parmetro f. El
parmetro d determina donde se almacenar el resultado de la
operacin.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si asignamos los valores W = 10101010B y f = 01010101B.
IORWF f ; W = 10101010B y f = 11111111B.
IORWF f, 1; W = 10101010B y f = 11111111B.
IORWF f, 0; f = 01010101B y W = 11111111B.
IORWF f, W; f = 01010101B y W = 11111111B.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: MOVF f,d, (hex = 08 ff)
Descripcin: Mueve el contenido de f al acumulador o al propio registro f.
Operacin: d = f (d puede ser W f).
Esta instruccin copia el contenido del registro direccionado por el
parmetro f en el acumulador W o en el mismo registro f. El
parmetro d determina el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
El motivo para copiar el contenido de un registro sobre si mismo, no es
otro que poder comprobar en el registro STATUS el estado del bit Z.
Ejemplo: Si tenemos el registro EDAD = 38.
MOVF EDAD, 0 ; hace que W = 38.
MOVF EDAD, 1 ; hace que EDAD = 38.
MOVF EDAD, W ; hace que W = 38.
MOVF EDAD ; hace que EDAD = 38.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.
INSTRUCCIN: MOVWF f (hex = 00 8f)
Descripcin: Mueve el contenido de W al registro f.
Operacin: f = W.
Esta instruccin copia el contenido del acumulador W en el registro
direccionado por el parmetro f.
Ejemplo: Si queremos escribir el valor 10H en el registro TMR0, que est situado
en la direccin 01H, tendremos que cargar primero el valor en
el acumulador y despus copiarlo al registro.
MOVWF 10H ; cargar el valor 10H en el acumulador.
MOVWF 01H ; copia el acumulador en la direccin 01H.
Con los registros utilizados por el PIC para funciones especficas, es
habitual no escribir directamente su direccin, sino el nombre simblico
definido en el fichero PIC16F84.INC. En el ejemplo anterior nos
quedara as:
MOVWF 10H ; cargar el valor 10H en el acumulador.
MOVWF TMR0 ; copia el acumulador en el registro TMR0.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: NOP (hex = 00 00)
Descripcin: No opera.
Operacin: - - - -
Esta instruccin no realiza ninguna funcin especfica, pero consume 4
ciclos de reloj completos. Es til para insertar un retardo igual a un ciclo
de mquina.
Ejemplo: Utilizando un cristal de cuarzo de 4 Mhz. en el oscilador, podremos
obtener un retardo igual a un microsegundo por cada
instruccinNOP que insertemos en el cdigo del programa:
RETARDO NOP
NOP
NOP
RETURN
Cada vez que llamemos a la subrutina RETARDO, obtendremos 3
microsegundos de demora.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: RLF f,d (hex = 0D ff)
Descripcin: Rota a la izquierda el registro f.
Operacin: d = << 1 (d puede ser W f).
Esta instruccin rota a la izquierda todos los bits del registro
direccionado en el parmetro f pasando por el bit CARRY del
registro STATUS (o si se prefiere, desde los bits menos significativos a
los ms significativos).
Es como si multiplicramos por dos el contenido del registro.
El D7 pasa al CARRY del registro STATUS, el contenido delCARRY pasa al
D0, el D0 al D1, etc.
El parmetro d determina el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin
RLF VALOR
el resultado ser VALOR = 00000010B y el bit C = 0.
Si tenemos el registro VALOR = 10000000B y aplicamos la instruccin
RLF VALOR
El resultado ser VALOR = 00000000B y el bit C = 1.
Registro STATUS: Modifica el bit C (CARRY).
INSTRUCCIN: RRF f,d (hex = 0C ff)
Descripcin: Rota a la derecha el registro f.
Operacin: d = f >> 1 (d puede ser W f).
Esta instruccin rota a la derecha todos los bits del registro
direccionado en el parmetro f pasando por el bit CARRY del
registro STATUS (o si se prefiere, desde los bits ms significativos a los
menos significativos).
Es como si dividiramos por dos el contenido del registro.
El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0,
etc.
El parmetro d determina el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin
RRF VALOR
el resultado ser VALOR = 00000000B y el bit C = 1.
Si tenemos el registro VALOR = 10000000B y aplicamos la instruccin
RRF VALOR
El resultado ser VALOR = 01000000B y el bit C = 0.
Registro STATUS: Modifica el bit C (CARRY).
INSTRUCCIN: SUBWF f,d (hex = 02 ff)
Descripcin: Resta el acumulador del registro f.
Operacin: d = f W (d puede ser W f).
Esta instruccin resta el valor contenido en el acumulador W del valor
contenido en el registro direccionado por el parmetro f. El
parmetro d determina el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Segn sean los valores de W y el registro DATO, si aplicamos
SUBWF DATO, obtendremos diferentes resultados en el bitCARRY.
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.
Registro STATUS: Modifica los bits Z, DC y C.
Z vale 1 si el resultado de la operacin es 0.
DC vale 1 si el resultado de la operacin es un nmero superior
a 15.
C vale 1 si el resultado de la operacin es positivo o el bit 7 del registro
que contiene el resultado vale 0. En caso contrario C vale 0 (resultado
negativo).
INSTRUCCIN: SWAPF f,d (hex = 0E ff)
Descripcin: Intercambia los 4 bits ms significativos con los 4 menos (nibbles)
Operacin: f = 0123 SWAP 4567 de f.
Esta instruccin intercambia el valor de los 4 bits ms significativos (D7-
D4) contenidos en el registro direccionado por el parmetro f, con los
4 bits menos significativos (D3-D0) del mismo. El parmetro d
determina el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si tenemos VALOR = 00001111B y W = 00000000B, al aplicar
SWAPF VALOR ; VALOR = 11110000B y W = 00000000B.
SWAPF VALOR, W; VALOR = 00001111B y W = 11110000B.
Con la primera instruccin modificamos el valor del registro DATO, y en
la segunda instruccin modificamos el valor del acumuladorsin que
vare el registro DATO
.
Registro STATUS: No modifica ningn bit de estado.
INSTRUCCIN: XORWF f,d (hex = 06 ff)
Descripcin: Operacin lgica XOR entre el acumulador y f.
Operacin: d = f XOR W (d puede ser W f).
Esta instruccin efecta la operacin lgica XOR (OR exclusivo) entre el
valor contenido en el acumulador W y el valor contenido en el
registro direccionado por el parmetro f. El parmetro d determina
el destino.
Si d = 0, se guarda en W.
Si d = 1, se guarda en f.
Si no se pone nada, el valor por defecto es 1 y se guarda en f.
Tambin se puede indicar directamente W f.
Ejemplo: Si tenemos el registro VALOR = 11110000B y W = 11111111B, al aplicar
la instruccin
XORWF VALOR ; hace VALOR = 00001111B y W no vara.
XORWF VALOR, W ; hace W = 00001111B y VALOR no vara.
Explicacin de la operacin XOR:
Tenemos 4 posibles combinaciones entre dos bits
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Vemos que si ambos bits son iguales el resultado ser 0. Y si ambos son
diferentes, el resultado ser 1. Esta instruccin compara dos bytes, bit a
bit.
Esto nos sirve para comparar dos valores y comprobar si son iguales o
no.
Supongamos que tenemos el registro NUMERO y queremos comprobar
si es igual a 26H.
Tendramos que efectuar las siguientes instrucciones:
MOVLW 26H; carga el acumulador con el valor a comparar.
XORWF NUMERO, W ; compara el acumulador con NUMERO.
BTFSS STATUS, Z ; salta la instruccin siguiente si XOR = 0.
GOTO DISTINTO ; salta a DISTINTO si XOR no es 0.
GOTO IGUAL ; salta a IGUAL.
Registro STATUS: Modifica el bit Z.
Z vale 1 si el resultado de la operacin es 0.

7 Modos de direccionamiento

Direccionamiento directo: la memoria de datos (RAM).

La memoria interna se direcciona en forma directa por medio de los 8 bits f contenidos en las
instrucciones que operan sobre registros. De esta manera se puede direccionar cualquier posicin desde
la 00 a la FF.

En los microcontroladores que tengan ms de un banco, antes de acceder a alguna variable que se
encuentre en la zona de los bancos de registros, el programador deber asegurarse de haber
programado los bits de seleccin de banco en el registro FSR.

Direccionamiento indirecto: el registro FSR.

El registro FSR sirve como puntero para direccionamiento indirecto adems de servir para seleccionar el
banco activo. La posicin 00 del mapa de RAM es la llamada direccin indirecta.
Si en cualquier instruccin se opera con la direccin 00, en realidad se estar operando con la direccin
a donde apunte el contenido del FSR.

Por ejemplo si el FSR contiene el valor 1Ah, una instruccin que opere sobre la direccin 0, en realidad
lo har sobre la direccin 1Ah. Puede decirse que la posicin 1Ah de memoria fue direccionada en forma
indirecta a travs del puntero FSR.

Ejemplo :

; Este programa borra 8 posiciones de memoria a partir de la direccin 1A

FSR equ 04 ;(definicin del puntero FSR)






movlw 8 ;prepara para repetir 8 veces
movwf DATO ;(el registro DATO es el contador del bucle)
movlw 1Ah ;apunta a la direccin 1Ah

movwf FSR ;guarda en FSR la direccin 1Ah
bucle clrf 0 ;borra una posicin de memoria (pone a cero)
incf FSR ;apunta a la siguiente
decfsz DATO ;si todava no borr todas (an no es cero)
goto bucle ;salta a bucle (sigue borrando)

El direccionamiento indirecto es muy til para procesar posiciones consecutivas de memoria (como en el
ejemplo) o para el direccionamiento de datos en subrutinas.

Direccionamiento inmediato:

El dato utilizado por la instruccin se codifica al mismo tiempo que la propia instruccin. En este caso, al
dato se le denomina literal.

Direccionamiento relativo:

No existe este modo de direccionamiento en los microprocesadores PIC.

8 Tcnicas de programacin 1

SUBRUTINAS Y LLAMADAS

La mayora de los microcontroladores incluyen en su repertorio de instrucciones algunas que permiten
saltar a una rutina y, cuando se completa su ejecucin, retornar al programa principal.

El empleo de subrutinas aporta muchas ventajas entre las que se destacan las siguientes:

1. Se pueden escribir como subrutinas secciones de cdigo y ser empleadas en muchos programas (por
ejemplo, la subrutina de exploracin de un teclado).

2. Dan a los programas un carcter modular, es decir, se pueden codificar diferentes mdulos para
utilizarlos en cualquier programa.

3. Se reduce notablemente el tiempo de programacin y la deteccin de errores, utilizando
repetidamente una subrutina.
4. El cdigo es ms fcil de interpretar, dado que las instrucciones de las subrutinas no aparecen en el
programa principal, slo figuran las llamadas (CALL).

LAS INSTRUCCIONES CALL Y RETURN

La instruccin CALL (llamada a subrutina) consigue que la ejecucin del programa contine en la
direccin donde se encuentra la subrutina a la que hace referencia. Es similar a GOTO pero coloca en la
pila la direccin de la siguiente instruccin que se debe ejecutar despus de terminar con la subrutina.

La subrutina finaliza con la instruccin RETURN (retorno de la subrutina) que retoma la direccin
guardada en la pila y la coloca en el contador del programa PC continuando el flujo de control con la
instruccin que sigue a CALL.

En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo LIFO (ltimo en entrar,
primero en salir). Si se produce la llamada a una subrutina durante la ejecucin de otra subrutina, la
direccin de retorno de esta segunda es colocada en la cima de la pila sobre la direccin anterior. Esta
segunda direccin es la primera en salir de la pila mediante la instruccin RETURN.

Con la pila de ocho niveles, una subrutina puede llamar a otra y sta, a su vez, llamar a otra hasta un
mximo de ocho.

CONSULTA A TABLAS

En muchas ocasiones es necesario para un programador efectuar una coincidencia entre alguna
cantidad de valores conocidos y un nmero desconocido que se tiene como ndice.

Por ejemplo: basados en el contenido de una posicin de memoria RAM (ndice) se puede obtener de
una serie consecutiva de datos almacenados en memoria de programa (a los datos conocidos
almacenados se le denomina tabla), el dato desplazado n posiciones hacia delante desde el comienzo de
la tabla. El nmero n corresponde al contenido de la posicin de memoria RAM ndice.

Programa ejemplo:

Apagarset equ 0Ch ; Posicin de memoria RAM
w equ 0 ; Destino W
f equ 1 ; Destino F



movf apagarset,w ; Tomamos a W el nmero n utilizado como ndice.
call tabla ; Posicin en donde se encuentra la serie de datos
; en este sitio luego del retorno de la subrutina se

; tiene en W el dato ledo de la tabla



tabla addwf PCL,f ; Se suma al PC el W obteniendo como resultado un

; salto indexado.
retlw 30h ; S W sumado al PCL es 0 se retorna en esta

; posicin, W=30h.
retlw 31h ; S W sumado al PCL es 1 se retorna en esta

; posicin, W=31h.

retlw 32h ; S W sumado al PCL es 2 se retorna en esta

; posicin, W=32h.
retlw 33h ; S W sumado al PCL es 3 se retorna en esta

; posicin, W=33h.
retlw 34h ; S W sumado al PCL es 4 se retorna en esta

; posicin, W=34h.
retlw 35h ; S W sumado al PCL es 5 se retorna en esta

; posicin, W=35h






Para terminar, despus de observar el ejemplo anterior, debemos tener en cuenta que antes de llamar a
la subrutina tabla, se debe cargar en el registro de trabajo W el valor del ndice y una vez se retorne de
dicha subrutina, es en este mismo registro de trabajo en donde se obtiene el resultado de la consulta a
la tabla (vemos que la sucesin de instrucciones retlw k se encuentra en memoria de programa).

Tcnicas de programacin 2

CONVERSIN A ASCII

El conjunto de caracteres ASCII (American Standard Code for Information Interchange) es el cdigo de
representacin en hexadecimal del alfabeto, los nmeros del 0 al 9, los principales smbolos de
puntuacin y algunos caracteres de control.


Como vemos en la tabla anterior, podemos dividir a cada carcter representado en hexadecimal como
una parte alta de 3 bits (Most significant carcter = nmeros del 0 al 7) y una parte baja de 4 bits (Least
significant carcter = nmeros del 0 al F). En total, la representacin la hacemos con 7 bits.

De los problemas usuales en la programacin est el convertir un nmero hexadecimal representado en
8 bits a dos caracteres ASCII los cuales sean la representacin de dicho nmero para permitir su
visualizacin en pantallas LCD, monitores, impresoras, etc.

Ejemplo:
Para representar el nmero hexadecimal 70h que en binario es 01110000b como los dos caracteres
ASCII 7 y 0, grficamente:



Transportndolo a un programa:

Numerohexa equ 0Ch ; Posicin donde se almacena el nmero a convertir.
asciiH equ 0Dh ; Posicin donde se almacena el resultado parte alta.
asciiL equ 0Eh ; Posicin donde se almacena el resultado parte baja.




movlw 0Fh ; Dato para enmascarar parte alta.
andwf numerohexa,0 ; Se enmascara la parte alta del nmero

; hexadecimal y pasa a W.
iorlw 30h ; Convierte el nmero en ASCII.
movwf ASCII ; El nmero queda salvado en la variable de

; salida.
movlw 0F0h ; Dato para enmascarar parte baja.
andwf numerohexa,1 ; Se enmascara la parte baja del nmero

; hexadecimal y queda all.
swapf NumHex,0 ; Se invierten parte alta y baja.

iorlw 30h ; Convierte el nmero en ASCII.

movwf asciiL ; el nmero queda salvado en la variable de

; salida.
.
.

El ejemplo anterior funciona de forma correcta siempre y cuando los nibbles del nmero hexadecimal a
convertir estn en el rango de 0 a 9. Habr que realizarse un tratamiento adicional a stos si se
encuentran en el rango de Ah a Fh.

Tcnicas de programacin 3

RAMIFICACIN MLTIPLE

Cuando se tiene que solucionar un diagrama de flujo como el de la figura, en el cual tenemos tres
posibles respuestas a una pregunta, se plantean las soluciones aqu presentadas.



Una de las formas de solucionar en un programa este problema es:

Comparando uno por uno los valores de las diferentes opciones almacenadas en memoria RAM en una
variable llamada OPCION

Movlw Opcin1
xorwf OPCION,0 ; Se realiza la verificacin de OPCION respecto a W
btfsc STATUS,Z ; verificando la bandera Z.
goto accion1
movlw opcion2
xorwf OPCION,0 ; Se realiza la verificacin de OPCION respecto a W
btfsc STATUS,Z ; verificando la bandera Z.
goto accion2
movlw opcion3
xorwf OPCION,0 ; Se realiza la verificacin de OPCION respecto a W
btfsc STATUS,Z ; verificando la bandera Z.
goto accion3

accion1
; instrucciones correspondientes a la accin 1.
goto encontrar
accion2
; instrucciones correspondientes a la accin 2.
goto encuentro
accion3
; instrucciones correspondientes a la accin 3.
encuentro ; Sitio de encuentro luego de una de las acciones.
; Continuacin del programa.

Tcnicas de programacin 4
ARITMTICA

Dentro de los microcontroladores PIC se cuenta con instrucciones aritmticas tales como:

ADDWF y ADDLW para efectuar operaciones de suma.

SUBWF y SUBWF para efectuar operaciones de resta.

RLF para realizar multiplicaciones por 2.

RRF para realizar divisiones entre 2.

Hasta este punto podramos ver el conjunto de instrucciones un poco limitado. Sin embargo, utilizando
tcnicas avanzadas de programacin podemos obtener operaciones ms complejas.

TEMPORIZACIN

A veces se necesita realizar un retardo de tiempo cuando programamos. Los retardos de tiempo se
pueden obtener mediante hardware o por medio de ciclos repetitivos
basados en software.

La precisin de los retardos generados por software depende en esencia del tipo de oscilador que se
utilice como base de tiempo en el microcontrolador (la mayor precisin se obtiene de los cristales de
cuarzo).

La velocidad a la que se ejecuta el cdigo (instrucciones) depende de la velocidad del oscilador y del
nmero de ciclos de mquina ejecutados. Las instrucciones necesitan 1 2 ciclos de mquina para ser
ejecutadas.

Un ciclo de mquina es un tiempo utilizado por el microcontrolador para realizar sus operaciones
internas y equivale a cuatro ciclos del oscilador. Por tanto: Tciclo mq.= 4 * Tosc Tciclo mq = 4 / fosc
El nmero de ciclos de mquina utilizados por una instruccin para ser ejecutada depende de la misma.
Las instrucciones que modifican el contador de programa necesitan dos (2) ciclos de mquina, mientras
que todas las dems necesitan tan solo uno (1).

El hecho de generar ciclos repetitivos por medio del programa y calcular el tiempo total de ejecucin
nos puede ayudar a generar tiempos precisos.


El ciclo repetitivo de retardo de la figura se tomar un nmero de ciclos as:



Por cada instruccin agregada debe incluirse en la cuenta total el nmero de ciclos correspondiente a
dicha instruccin.

Trabajando a 4 Mhz y asumiendo que k se remplaza por el valor 15d en el ejemplo tendramos un
tiempo igual a:

Nmero de ciclos = (3*15) +1 = 46 ciclos de mquina,
Tciclo mq.= 4 / 4 Mhz = 1 segundo, el tiempo total entonces ser de 46 segundos.

Anda mungkin juga menyukai