Está en la página 1de 70

Esc.: 4-003 “Ing.

Emilio Civit” Profesor: Paulino Martínez


Curso: 6° Año Mat.: Apuntes de Electrónica II

Micro-controladores PIC

Introducción

Tema: Micro-controlador PIC 16F84 Página 1 de 70


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Micro-controladores PIC.
QUÉ ES UN MICRO-CONTROLADOR

Un micro-controlador contiene toda la estructura de un microcomputador. Es decir:


circuitos lógicos, memorias, unidad aritmética/lógica, contadores, conversores analógico/digital,
etc. (ALU, RAM, ROM o EPROM). Alojado en una única pastilla semiconductora, no es más
que un circuito integrado fabricado con una gran escala de integración. Posee partes separadas
interconectadas entre sí.

Es un dispositivo que procesa una determinada información (datos) y que puede


obtener resultados visibles. En términos generales su funcionalidad radica en que posee una
lógica conocida que mediante un programa se traduce en determinados efectos pudiendo ser
modificado por un cambio en sus entradas.

Son pocos los componentes electrónicos externos que se necesitan para hacer
funcionar este dispositivo.

Desde la aparición de los micro-controladores se ha originado una fuerte


transformación en las técnicas de diseño y control electrónicos.

Un buen micro-controlador debe contener primariamente, por supuesto en un solo


chip, los siguientes elementos:

 ROM, EPROM, EEPROM.


 RAM.
 Puertos de entradas y salidas.
 Un reloj programable.
 Reset interno y externo.
 Conjunto de interrupciones.
 Conversores Analógico a Digital y Digital a Analógico. (No necesariamente).
 Uno o más temporizadores.

Si en general se cumple lo puntualizado anteriormente y además le agregamos lo


siguiente:

 Bajo consumo.
 Un buen precio.
 Un conjunto de instrucciones de fácil manejo (Reducido juego de instrucciones RISC).

Entonces estamos en presencia de un micro-controlador de excelentes prestaciones y


parece ser que los productos de la firma MICROCHIP, cumplen con la mayoría (cuando no
todas) de estas premisas.

ALGUNAS DEFINICIONES.

Registro: Es una locación de memoria capaz de retener, durante un tiempo ilimitado,


una combinación de estados binarios (asociados a valores de tensión). Esta situación se
mantendrá estable hasta que desaparezca la alimentación, de ser una memoria volátil ó
permanecerá hasta que el registro se destruya físicamente, de ser una memoria permanente.
Estos son llamados registros generales. Algunas locaciones de memoria presentan una posición
especial y fija, en cuanto a su ubicación, dentro del micro-controlador. Su interpretación y su

Tema: Micro-controlador PIC 16F84 Página 3 de 70


uso definen en forma correcta y ordenada el manejo del micro-controlador. Estos son llamados
registros especiales.

RAM: (Random Access Memory ó Memoria de Acceso Aleatorio): Es un conjunto


de registros o memorias que pueden ser leídas y/ó escritas y permiten alojar datos temporarios,
son del tipo estáticas y como se mencionó en el párrafo anterior, pierden la información
almacenada en ese registro, ante la falta de la alimentación.

Los registros de la RAM son de mucha utilidad para el almacenamiento temporario de


datos variables.

ROM: (Read Only Memory ó Memoria de solo lectura) Son memorias de un número
mayor de bits (de 12 bits o más) para contener el programa, no es posible alterar ninguna
posición. La más leve alteración produciría un error en el funcionamiento del micro-controlador.

EPROM: La principal ventaja de esta memoria es que se puede borrar y reescribir el


programa nuevamente. Es sabido que cuando se está ensayando un proyecto, es necesario
depurarlo y probarlo por lo general más de una vez, hasta eliminar todos los errores que se
pudieran haber deslizado. Esta memoria ha sido desarrollada para este uso. La manera de
borrarla es exponerla a rayos ultravioletas, mediante una pequeña ventana transparente que
posee para tal fin. Cabe aclarar que las memorias EPROM son bastantes más caras que
cualquiera de su gama.

EEPROM: Este tipo de memoria es similar a la EPROM pero más fácil y simple de
utilizar, ya que se puede grabar, regrabar o borrar completamente su contenido mediante
procedimientos eléctricos. Este proceso es más rápido y se puede reiterar tantas veces como se
desee. Su precio además es más barato que la EPROM.

PUERTOS DE ENTRADAS Y SALIDAS: Los puertos de entradas y salidas son


terminales que tiene el micro-controlador para conectarse con los circuitos externos. Cada
puerto tiene típicamente 8 pines. En los micro-controladores de la gama baja (PIC 6C54)
encontramos medio puerto de 4 pines. Cada puerto conforma un registro (memoria) y tiene una
dirección preestablecida. Cualquier pin de cada puerto puede configurarse como entrada o como
salida. Cuando un pin se lo configura como entrada, permanece en modo de alta impedancia. Si
por olvido no se coloca una resistencia de referencia y por error se dejara la pata libre, generará
lecturas erróneas. La figura 1-1 nos muestra cómo es usualmente un pin de un puerto típico.

Figura 1-1.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Como podemos observar un pin de un puerto consiste en dos MOSFET de salida
complementaria uno del tipo N y otro del tipo P (configurado como salida).

Si el MOSFET P está conduciendo la salida estará en ‘1’ ó + 5V, en este caso el pin
no puede suministrar más de 20mA como fuente (I source).

Si el MOSFET N está conduciendo la salida estará en ‘0’ o 0V, en este caso el pin no
puede drenar más de 25mA como sumidero (I sink).

FAMILIA PIC

Veremos a continuación en primer lugar algunas características que hacen esta familia
muy completa a la hora de decidirse por un micro-controlador.

• Familia de micro-controladores fabricada con tecnología C-MOS de 8 bits.


• Arquitectura Harvard. Este tipo de estructura posee dos bloques de memoria
independientes y se puede acceder a ellas en forma simultánea. Hay dos buses, uno de
ellos comunica instrucciones y el otro lleva datos de manera bidireccional, cuyas
longitudes son diferentes. Esta estructura, permite una gran velocidad, dado que realiza
simultáneamente el ciclo de búsqueda y el de ejecución de las instrucciones. Es decir
que mientras se está ejecutando una instrucción, se está leyendo la segunda instrucción,
para luego ser ejecutada.
• La memoria de programa se encuentra alojada en la misma pastilla del micro-
controlador. Es aquí donde se almacenan las instrucciones del programa, a diferencia de
lo que ocurre en un microprocesador que se requiere de la interconexión con memorias
externas.
• Memoria de datos RAM interna (también en la misma pastilla).
• El chip contiene, en un solo circuito integrado, el PROCESADOR, la EPROM, la RAM
y los puertos de I/O.
• Bajo consumo de potencia.
• Alta inmunidad al ruido.
• Distintos modelos para la elección correcta del diseño.
• Muy bajo costo.
• Herramientas de desarrollo muy accesibles.
• De manejo simple.
• Abundante información técnica, tanto provista por el distribuidor directamente, como la
que se suministra por Internet.
• Protección de código de programa por encriptación.
• Modo SLEEP de muy bajo consumo.
• Cuatro modos de osciladores: RC, XT, RS y LP.
• Sólo 35 instrucciones modo RISC (Reduced Instruction Set Computer). Que significa
“Ordenador con un juego de instrucciones reducido”. La mayoría de estas instrucciones
son ejecutadas en un solo ciclo de reloj. No subestime este micro-controlador por la
pequeña cantidad de instrucciones que presenta, le puedo asegurar que son casi tan
poderosas como muchos otros que se presentan en el mercado.
• Interrupciones programables.
• Circuito de vigilancia para el óptimo funcionamiento del micro (WDT).
• Conversor Analógico/Digital.
• Salida por modulación de ancho de pulso PWM.
• Temporizadores internos.

Todos los PIC tienen códigos de protección que pueden habilitarse por programa para
hacerlos inmunes a la lectura y como consecuencia a su copia ilegal.

Tema: Micro-controlador PIC 16F84 Página 5 de 70


DIAGRAMA SIMPLIFICADO

La arquitectura HARVARD es una característica esencial del PIC, ésta le permite


acceder tanto a la memoria de instrucciones como a la memoria de datos en forma simultánea.
La gráfica siguiente es el esquema de la familia P1C.

Figura 1-2

DETALLE DE PINES

Los pines o terminales, son los elementos físicos mediante los cuales el micro-
controlador tiene acceso al y desde el exterior, puede recibir o enviar señales y cumplir el
cometido para el que fue diseñado. En la figura 1-3 se observa las líneas de pines del micro-
controlador 16F84.

Figura 1-3

TIPOS DE RESET

En los micro-controladores de la familia l6Fxx, existe un pin de entrada de Reset,


llamado MCLR (Master CLear Reset). Tiene la particularidad de actuar como reset general en el
momento de conectarlo al negativo de la alimentación. De no utilizarlo este pin deberá ser
conectado a la alimentación de 5Vcc. Es esto último lo que comúnmente se realiza en la
práctica. Observe la figura 1-4.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Figura 1-4.

Como puede observarse en la figura 1-5 se puede implernentar un reset muy simple
conectando un pulsador normalmente abierto y luego presionarlo para que el pin MCLR tome el
valor de cero voltios, de esta manera se puede resetear manualmente el micro-controlador
mientras esté en funcionamiento.

Figura 1-5

QUÉ SUCEDE CON EL RESET EN UN MICRO

Si por algún motivo se produce un reset (reinicialización) el comportamiento de los


P1C 16F84 será el siguiente:

• Se detiene el reloj y luego arranca nuevamente.


• El contador de programa se carga con todos ‘Unos’, por lo que se
posicionará en la dirección de memoria más elevada.
• Todos lo pines de los puertos de entrada y salida se configuran como
entradas y se colocan en estado de alta impedancia.
• El temporizador WATCHDOG tomará un valor en función del pre-
escalador.
• Todos los bits del registro OPTION se colocarán en unos ‘1’.

Tema: Micro-controlador PIC 16F84 Página 7 de 70


Rigurosamente las condiciones detalladas anteriormente son muy generales y en
algunos casos, particulares de reset, suelen existir diferencias. Podemos sintetizar las
condiciones para que en el micro se origine un reset.

a) En el momento de alimentar al micro-controlador POR. (Power On Reset).


b) Por desbordamiento del temporizador WATCHDOG.
c) Por una señal de activación del pm MCLR.

EFECTO DEL RESET EN LOS REGISTROS ESPECIALES

Es importante conocer qué valores toman todos los registros, tanto especiales como
generales, en el momento de conectar la alimentación (POR). De esta manera, sabiendo el
estado inicial, se interpretará mejor de qué forma comenzará el programa su ejecución. Para tal
fin se ha esquematizado una tabla, que permite observar la aleatoriedad de valores en algunos
registros cuando se conecta la alimentación. La interpretación correcta de estos valores, nos
guiará en las previsiones que se deben tomar para evitar un desempeño deficiente del programa.
Dicha tabla se verá más adelante.

PRECAUCIONES EN LA ALIMENTACIÓN

Normalmente en los circuitos industriales, donde los niveles de ruido eléctrico son
elevados, usualmente se registran disturbios en la alimentación. Es importante lograr eliminar o
filtrar estos espurios. Uno de los métodos para lograr este cometido, es desacoplar mediante
capacitores de bajas pérdidas. Los terminales se deben soldar lo más cerca posible de las patillas
de la alimentación del circuito integrado. Desgraciadamente están cruzadas y para cumplimentar
este requisito por ejemplo para el PIC 16F84, es necesario soldarlos debajo del CI, entre las
patas 5(-) y 14(+) respectivamente.

A lo largo de todo el libro se insistirá acerca de la incidencia del ruido eléctrico y sus
consecuencias en circuitos con micro-controladores. La reiteración de este tema en varios
párrafos se debe al convencimiento de que resolviendo esta problemáticas el producto resultante
puede ser la diferencia entre un equipo que funcione bien y otro que no está exento de fallar
bajo determinadas circunstancias.

Se logran excelentes resultados soldando cerca de las patas del CI, un capacitor de
tantalio de alrededor de 10µF o más si es posible.

En aplicaciones con equipos instalados en vehículos, especialmente en aquellos con


sistemas eléctricos de regulación de estados, se han observado condiciones bastantes críticas,
particularmente debido a cables de bujías inapropiados o carencia de filtros en la alimentación
de 12Vcc. Se pueden obtener muy buenos resultados en la minimización del ruido eléctrico,
intercalando en serie con la alimentación una barra de antena de ferrite y un doble devanado 30
vueltas de alambre de cobre aislado (para el positivo y negativo). Conviene complementarlo,
agregando después de la bobina un capacitor de poliéster de .47µf y si es posible un capacitor
electrolítico de 1000µf, cerca de la placa electrónica.

REQUISITOS DE LA FUENTE DE 5Vcc

Se requieres por especificación del fabricante, colocar algunos capacitores de apoyo


después del regulador de 5Vcc. Es muy frecuente además conectar un capacitor electrolítico de
100µf. Observe con atención que todas las líneas de cobre convergen en un punto de soldadura
lo más cerca posible del regulador, figura 1-6. De todos modos esto no es riguroso.
Acostúmbrese, en lo posible, a llevar una pista de cobre por cada negativo, según las distintas
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
áreas de electrónica (analógica, digital, de potencia, etc.) evitando así la necesidad de mezclar
las diferentes corrientes que circulan por las pistas.

Figura 1-6

Suelde los capacitores de filtro lo más cercanos a la masa del regulador.

Tome esta recomendación como regla en el diseño de equipos electrónicos con micro-
controladores.

Una vez calculada la resistencia en serie del regulador (recuerde considerar el


máximo valor esperado de corriente), compruebe que la caída de tensión en ésta no cause que el
regulador no reciba la alimentación suficiente, de ser así la tensión de salida será deficiente y no
regulada. Es aconsejable asegurar que la tensión a la entrada del regulador sea 3Vcc superior a
la tensión del mismo (Para un regulador de 5Vcc esta tensión será de 8Vcc).

Esta forma en la conexión de los filtros trae aparejada una seria eventualidad:

Estamos disminuyendo la velocidad de crecimiento de la tensión de salida del


regulador (debe ser superior a 0,06V/ms), si esto no se cumple, puede fallar el reset del micro-
controlador. Por lo que se requerirá otro tipo de reset más efectivo.

Esto se complica aún más si estamos haciendo oscilar al micro-controlador con


frecuencias bajas, debido a que toma más tiempo en estabilizarse.

Resumiendo: En el momento de conectar la alimentación se produce un retardo en las


áreas del circuito influenciadas por filtros y/o capacitores. Por lo tanto la alimentación del CI no
es instantánea sino que crece lentamente en forma de rampa. Si la tensión no ha alcanzado un
valor aceptable y si el oscilador es lento, es posible que el micro-controlador arranque mal. Para
evitar este problema debe usarse el circuito de la Figura 1-7.

En este circuito, en el momento de conectar la tensión de 5Vcc, por la acción del


capacitor de 0,1µf (que está descargado), la pata MCLR permanece a masa. Esto obliga al
micro-controlador a seguir en estado de reset, hasta que se cumpla la constante de tiempo fijada
por la carga del capacitor a través de la resistencia de 47K. La tensión en este pin llega a Vdd
mucho después de estabilizada la tensión y recién entonces se habilita al micro a comenzar las
rutinas de funcionamiento. Esta forma de retardar la alimentación de MCLR la denominaremos
reset extendido.

Tema: Micro-controlador PIC 16F84 Página 9 de 70


Figura 1-7

ALIMENTACIÓN

Usualmente a toda la línea de micro-controladores PIC se la hace funcionar con 5Vcc,


si bien es posible alimentarlos desde 2.5Vcc a 6Vcc.

VDD = Alimentación desde 2,5Vcc a 6Vcc positiva Si deseamos hacer esta


alimentación compatible con TTL, deberá ser de 4,75 a 5,25Vcc.

VSS = Negativo de fuente 5Vcc.

PT = Potencia total de disipación = 800mW.

Ip = Máxima corriente por puerto = entre 50mA a 150mA según el puerto.

Io = Máxima corriente de salida por pin = 20mA.

Ii = Máxima corriente de entrada por pm = 25rnA.

Los puertos absorben más corriente de la que pueden suministrar.

CLASES DE OSCILADORES

La familia de los PIC utiliza para su funcionamiento y generar la señal del reloj de
instrucción, diferentes tipos de osciladores. Las características comunes a todos ellos es que el
oscilador se conecta siempre en los pines OSC1/CLKIN y OSC2/CLKOUT (excepto en el
oscilador RC que se conecta sólo en OSC l/CLKINT. La elección del tipo de oscilador en las
versiones OTP, se debe realizar en el momento de la compra del chip virgen.

En las versiones con memoria EEPROM y en aquellos con ventana para borrarlo con
luz ultravioleta, el tipo de oscilador se puede seleccionar programando los bits de un registro
especial accesible al momento de programar el micro-controlador.

Cuanto más rápido sea el oscilador más velozmente se ejecutarán las instrucciones.

A frecuencias más elevadas, mayor consumo de potencia del micro-controlador.


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Existen 4 tipos ó versiones de osciladores.

1. RC: El oscilador RC es una cadena básica de resistencia y capacitor, puede


trabajar hasta 4Mhz. La estabilidad es bastante aceptable, pero los
condensadores cambian su capacitancia con la temperatura, haciendo
que el oscilador modifique su frecuencia. Se recomienda usar una
resistencia no menor de 4K7 y un condensador no menor de 20pF.
2. XT: Esta versión usa un oscilador a cristal o resonador cerámico
obteniéndose muy buena estabilidad de frecuencia, siendo la máxima
frecuencia de funcionamiento de 4Mhz.
3. HS: Es una versión de muy alta velocidad, utiliza un oscilador a cristal y -
puede funcionar hasta 20Mhz.
4. LP: Es una versión también para oscilador de cuarzo. Se lo utiliza en donde
se requiere bajo consumo. Su funcionamiento está limitado a 200KHz.

Los osciladores RC y XT son los más utilizados en la práctica.

Si los niveles de ruido son elevados use el oscilador RC, NO el oscilador XT.

CONEXIONADO Y TABLA DE FRECUENCIAS DE OSCILADORES RC

En la figura 1-8 se muestra el conexionado de un oscilador RC.

Figura 1-8

Se describe una tabla de frecuencia del rango de oscilación, en función de los valores
de resistencia y condensador a utilizar. Los valores consignados en la tabla 1-1, son sólo
orientativos y aproximados.

Esta tabla nos permite determinar la frecuencia a la que trabajará nuestro micro-
controlador, en correspondencia con el resistor y capacitor asociado.

Tabla de frecuencia del oscilador RC


Capacidad Resistencia F. Oscilador
20pf 3k3 4,9MHz
20pf 5k 3,8MHz
20pf 10k 2,2MHz
20pf 100k 260kHz

Tema: Micro-controlador PIC 16F84 Página 11 de 70


100pf 3k3 1,6MHz
100pf 5k 1,2MHz
100pf 10k 650kHz
100pf 100k 72kHz
300pf 3k3 660kHz
300pf 5k 480kHz
300pf 10k 268kHz
300pf 100k 30kHz

Tabla 1-1

CONEXIONADO Y TABLA DE OSCILADOR A CRISTAL.

En los osciladores a cristal es este el que fija la frecuencia de oscilación, por lo que
directamente se compra el cristal a la frecuencia que se requiera para hacer funcionar el
oscilador del micro-controlador. El conexionado se muestra a continuación.

Figura 1-9

El valor de los capacitores C los determina el fabricante del micro-controlador,


dependiendo del valor de frecuencia del cristal. En la siguiente tabla se muestra el valor de
capacidad de los C para distintos cristales.

Modo Frecuencia C
32kHz 68pf-100pf
LP
200kHz 15pf-33pf
100kHz 100pf-150pf
XT 2MHz 15pf-33pf
4MHz 15pf-33pf
4MHz 15pf-33pf
HS
10MHz 15pf-33pf

RELOJ DE INSTRUCCIÓN

La señal que proviene del oscilador externo, conectado a los pines OSC1I CLKIN y
OSC2/CLKOUT del micro-controlador, se divide, en cuatro ciclos, obteniéndose así la señal
requerida por el procesador interno para realizar las operaciones. Este procedimiento permite el
montaje en paralelo de la búsqueda y ejecución de la instrucción. Llámese reloj de instrucción,
al ciclo interno que posee el micro-controlador para cronometrar el tiempo de ejecución de las
instrucciones. Las fases de esta tarea se muestran en el diagrama de la figura 1-9.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Figura 1-10

Los pulsos entrantes del reloj son divididos por 4, generando diferentes señales
denominadas Q1, Q2, Q3 y Q4. El estado Q1 hace incrementar el contador de programa, Q2 y
Q3, se encargan de la decodificación y ejecución de la instrucción y por último, Q4 es la fase de
búsqueda de la instrucción, además el código se almacena en el registro de instrucciones. Por
consiguiente, cada instrucción se ejecuta en un ciclo llamado ciclo de instrucción.

Es decir que si no se tuviese una estructura Hardvare y se trabajase con una estructura
de Von Neumann, una instrucción se demoraría 8 ciclos de reloj (se demoraría el doble de
tiempo en ejecutarse la instrucción), pero por contar con una estructura Hardvare, cada
instrucción se demora 4 ciclos de reloj. Al periodo que demora en ejecutarse una instrucción
simple se denomina ciclo de instrucción y demora 4 ciclos de reloj en ejecutarse. El tiempo de
instrucción se calcula como sigue:

Donde:

Fo: es la frecuencia del oscilador del micro-controlador.

Fi: es la frecuencia de instrucción.

Ti: es el tiempo de instrucción.

Tema: Micro-controlador PIC 16F84 Página 13 de 70


UNIDAD ARITMÉTICA Y LÓGICA (ALU)

La unidad aritmética y lógica tiene un tamaño de 8 bits y es de fundamental


importancia en el funcionamiento del micro-controlador, ya que es la encargada de realizar las
operaciones matemáticas y/o lógicas entre un registro temporario llamado W y los demás
registros de la memoria RAM.

Esta se encuentra dentro de la CPU (Unidad central de proceso) y a continuación se


muestra un detalle de la misma.

Figura 1-11

MEMORIAS

Existen tres versiones diferentes de memorias:

1. ROM (Se programa una sola vez).

Es el modelo de memoria en que el usuario puede grabar una única vez y no


es posible borrarla, es el tipo de memoria que convencionalmente están
incorporados en los equipos que se venden en el mercado en su totalidad, es
decir aquellos que se usarán para la producción en serie.

2. EPROM

Es el tipo de memoria que frecuentemente se utiliza para hacer pruebas y/o


prototipos, ya que es posible grabarla repetidas veces y se borra empleando
radiación ultravioleta. Son fáciles de reconocerlas por una pequeña ventana
transparente que posee en el centro de la cara superior de la cápsula del
integrado.

3. EEPROM

Para este modelo, el borrado y la escritura es más simple y directa, ya que es


factible sobrescribir (grabar) arriba del programa anterior en forma eléctrica.
Esta particularidad la ofrece el PIC 16F84, que se comporta en forma
excelente para la elaboración de prototipos ya que podemos producir
cambios en el programa e inmediatamente observar las variantes de
funcionamiento del equipo bajo ensayo.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
INTERRUPCIONES

Cuando una aplicación requiera que la señal o excitación externa sea atendida en
forma inmediata, necesitaremos utilizar un programa de interrupción de tiempo real. Este
recurso es muy importante en muchas aplicaciones.

Expuesto en forma muy simple sería:

• Ante una señal externa se interrumpe inmediatamente el programa que se


estaba ejecutando.
• Salta a una dirección específica.
• Se ejecuta la rutina de interrupción.
• Retorna al programa principal.

Si el reloj es rápido, la atención también será veloz.

Tema: Micro-controlador PIC 16F84 Página 15 de 70


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Micro-controladores PIC

PIC 16F84

Tema: Micro-controlador PIC 16F84 Página 17 de 70


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
El PIC 16F84.

SÍNTESIS

El PIC 16F84 es un micro-controlador de la gama media. Por lo tanto, como es de


esperarse, es más poderoso que los de la gama baja. Además de presentar todas las
características de los modelos anteriores, se modifican algunos registros y aparecen algunas
diferencias que a continuación se detallan:

 Un set muy simple de 35 instrucciones (dos más que en la gama baja).


 La longitud de la instrucción es de 14 bits (12 bits en la gama baja).
 1024 (1K) posiciones de memoria EEPROM (se pueden borrar
eléctricamente).
 36 registros de propósitos generales RAM.
 64 posiciones de memoria de datos EEPROM, que no se pierden al
desconectar la fuente.
 Cuatro nuevas instrucciones: addlw, sublw, return y retfie.
 Se aumenta a ocho la cantidad de pilas o STACK.
 El vector de inicio se ubica en la dirección 0000h.
 El selector de registros FSR es de 8 bits.
 Posibilidad o aptitud de atender interrupciones (4 modos diferentes).
 Los reset modifican de diferente forma los registros internos.
 Posee un total de 13 pines que se pueden configurar como entradas o salidas.
 Aparecen dos temporizadores (TMR0 y WDT).
 Programación de los puertos en modo “pull-up”, es decir referirlos o no, con
resistencias internas a la fuente (cuando se los configura como entradas).

MEMORIA DE PROGRAMA DEL PIC 16F84

En el diagrama de la figura 2-1 se presenta un bosquejo muy simple para entender en


forma general, el mapa de memoria del PIC l6C84. Centraremos en principio nuestra atención
en la cantidad de pilas, la que ha sido aumentada y además aparece una ubicación llamada
vector de interrupción.

Tema: Micro-controlador PIC 16F84 Página 19 de 70


Figura 2-1

El contador de programa posee una longitud de 13 bits (0-12), por lo que tendría una
capacidad como para direccionar una memoria de 8192 instrucciones. Microchip ha
implementado a este popular micro-controlador (como también es válido para el PIC 16F71)
con una memoria de 1K. Es decir que puede almacenar hasta 1024 instrucciones.

Por lo tanto los tres bits de mayor peso del contador de programa PC, no son tenidos
en cuenta, es decir que si se pretende llegar a esas direcciones, se producirá un solapamiento con
la posición 03FF, ya que los mencionados 3 bits se ignoran.

A continuación la tabla de la tabla 2-1, muestra la equivalencia entre la longitud del


contador de programa y el tamaño de la memoria de programa.

Capacidad de Cantidad de
memoria bits del PC
256 8bits
512 9bits
1024 10bits
2048 11bits
4096 12bits
8192 13bits

Tabla 2-1

En el momento del arranque, el micro-controlador PIC 1 6F84 se dirige a la dirección


0000h, denominado vector de reset, (recuerde que en la gama baja, el contador de programa se
cargaba con unos). En la gama media, por el contrario, el contador de programa se carga con
todos sus bits en ‘0’.

Si se implementan interrupciones, el vector de interrupción se ubicará en la dirección


0004h, por lo que esta palabra de memoria de programa no se la puede utilizar para el programa,
sino que se la tiene que cargar con un vector de interrupciones.

El contador de programa toma el valor 0000000000000’ (todos sus bits en cero) 1 en


el momento de conectar la alimentación.

El programa debería iniciarse en la dirección 0005h, pudiendo extenderse hasta la


dirección O3FFh. Es conveniente reservar el espacio de memoria, por si en un futuro se utilizan
interrupciones.

De esta manera el programa comenzará en la dirección 0005h, gracias a la directiva


ORG 05h. Con esto evitamos que el programa se interne en la dirección 0004h, que es el vector
de reset para las interrupciones. De todos modos, si no se utilizan las interrupciones, el
programa podría comenzar en la dirección 0000h y seguir la secuencia. Haga esto último sólo si
se ve muy necesitado de memoria.

Cuando existe una interrupción, el contador de programa se carga automática mente


con la dirección 0004h y salta ahí a ejecutar la primera instrucción de la rutina de servicio de
interrupción. Previo a esto, se almacena en el (STACK) la dirección de retorno. Tenga en cuenta
que el STACK, se utiliza tanto para almacenar las direcciones de retorno de las subrutinas,
como de las interrupciones.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
En la dirección 0004h deberá existir un salto a la rutina de interrupción o, en su
defecto, la primera de una serie de instrucciones o de decisiones, para el desarrollo de esa
interrupción. Para este segundo caso, el programa deberá comenzar después de la finalización
de la rutina mencionada.

ORGANIZACIÓN DE REGISTROS DEL PIC 16F84

En la tabla 2-2 y figura 2-2, se muestran un mapa de memoria de datos y la


correspondiente ubicación relativa de los registros de las funciones especiales y de propósitos
generales.

Rango Uso
00h-0Bh Registro de funciones especiales.
0Ch-4Fh Registros de propósito general.
80h-8Bh Registro de funciones especiales.
8Ch-CFh Registros de propósito general.

Tabla 2-1

Figura 2-2

DIRECCIONAMIENTO INDIRECTO Registro 00h.

Esta primera posición de memoria, es el registro F0 o INDF, no tiene implementación


física y sirve para transferir (leer o escribir) un dato, a la dirección que apunta su registro
complementario FSR (siempre trabajan conjuntamente).

Tema: Micro-controlador PIC 16F84 Página 21 de 70


Cada vez que se intenta efectuar la lectura, o escritura, de la posición de memoria F0,
nos llevará al lugar señalado por el registro FSR. El efecto no es otro que leer o escribir, en el
registro direccionado por FSR.

El direccionamiento indirecto consiste en leer, o escribir, mencionando F0


efectuándolo en realidad en la dirección donde apunta FSR.

CONTADOR DE TIEMPO REAL TMR0 Registro 01h

Es un registro de 8 bits de suma utilidad, tiene la particularidad de ser un contador


ascendente. Permite la cuenta de eventos y la medición de tiempos.

Es muy útil, ya que incrementa su contenido, en forma independiente de la secuencia


del programa. Puede recibir señales de dos caminos diferentes, ya sea externo o interno,
particularidad que lo hace muy interesante en la medición de tiempos o eventos. En el modo
interno la señal es el propio reloj interno, llamado reloj de instrucción (no olvide que es la
frecuencia del oscilador dividido 4).

El incremento del registro TMR0 se puede determinar por medio de un escalador


interno que se programa, mediante la configuración de ciertos bits denominados PS0, PS1 y PS2
ubicados en otro registro llamado OPTION.

Originariamente, Microchip denominó a este registro RTCC. Cuando hagamos


referencia a micro-controladores que no disponen de interrupciones, se mantendrá la misma
denominación original. Emplearemos el nombre de TMR0, cuando nos refiramos a este registro
en dispositivos con interrupciones.

Este registro incrementa su contenido en una unidad por cada cierto número de ciclos,
proveniente de una señal externa al micro-controlador o bien del ciclo de reloj interno. El
divisor será el resultado de cómo se haya elegido (cargado) el pre-escalador interno. Posee la
flexibilidad de incrementar su cuenta con la señal del flanco descendente o ascendente.

Recuerde cargar nuevamente los valores del temporizador TMR0 cada vez que se
desborda, si desea repetir la división escogida.

El TMR0 es un registro que se puede leer o escribir en cualquier momento de la fase


del programa. Cuando se lo escribe, presenta un retardo de tiempo de dos ciclos de reloj. Su
comportamiento es tal que, después de llegar a FF cuando pase a cero, si está habilitada la
interrupción, salta a otro espacio del programa con dirección 04h, llamado vector de
interrupción. En esa dirección se puede efectuar otra tarea diferente y regresar. De esta manera
no es necesario consultar o conocer permanentemente su estado o cuenta, esto permite no
distraernos y atender esta secuencia del programa sólo a través de una secuencia de
interrupción.

Mencionamos que el incremento del registro TMR0, está íntimamente ligado a la


configuración de ciertos bits que conforman un pre-escalador ubicado en otro registro
denominado OPTION, que estudiaremos ahora.

REGISTRO OPTION: registro 81h

Es un registro especial dedicado a controlar las funciones específicas que va a tener


TMR0, de acuerdo a los valores que tomen sus bits, determinará qué tipo de tarea va a realizar
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
este contador o temporizador. En la línea baja de los PIC 16C5x, OPTION es una instrucción,
ahora es un registro y se ubica en la posición 01h del banco 1 (81h).

La configuración de los bits de este registro puede dar una gran cantidad de
combinaciones. No es el propósito de este libro explicarlos a todos, sino más bien servir de
orientación para configurar este registro correctamente.

Si el lector tiene interés en ampliar sus conocimientos en este tema, le sugiero


consultar el DATABOOK de MICROCHIP, para comprender con detenimiento todas las
variantes que se pueden presentar.

Según se pretenda utilizar el TMR0 ó el WDT, será como debamos configurar los bits
en el registro OPTION. Para que el lector los pueda individualizar fácilmente, se les ha asignado
un nombre mnemotécnico que permite recordar la función que realizan.

Usualmente en el inicio del programa, bastará colocarles unos o ceros a determinados


bits del registro OPTION, para configurar la utilización de TMR0 ó de WDT, en
correspondencia con la función que se desee.

Este registro especial ocupa la posición 81h de la memoria de datos, es decir que se
ubica en la posición 01h, del banco 1.

Veremos a continuación un diagrama y posteriormente un ejemplo, tratando de


facilitar su comprensión.

Figura 2-3

• PS0, PS1, PS2: Estos tres bits sirven para definir el factor de división (pre-
escalador) que se le aplicará al registro TMR0, o al WDT. Observe que los
factores a aplicar no son iguales.

PS2 PS1 PS0 Div. De TMR0 Div. De WDT Tiempo WDT


0 0 0 1:2 1:1 18mseg
0 0 1 1:4 1:2 36mseg
0 1 0 1:8 1:4 72mseg

Tema: Micro-controlador PIC 16F84 Página 23 de 70


0 1 1 1:16 1:8 144mseg
1 0 0 1:32 1:16 288mseg
1 0 1 1:64 1:32 576mseg
1 1 0 1:128 1:64 1,152seg
1 1 1 1:256 1:128 2,304seg

Tabla 2-3

• PSA: Es el bit que determina si la pre-división se le asignará a la entrada


TMR0, o al temporizador Watchdog WDT.

PSA = 0: La pre-división se asigna a TMR0.

PSA = 1 La pre-división se asigna a WDT.

Si se utiliza el TMRO, como es obvio, no se podrá usar el WDT y viceversa.

• TOSE: Bit que determina si el incremento de TMR0 se realizará con el


flanco creciente, o decreciente, de los pulsos entrantes en el pin de entrada
RA4/TOCKI del micro-controlador.

TOSE = 0: El incremento de TMR0 se realizará con el flanco de bajo a alto.

TOSE = 1: El incremento de TMR0 se realizará con el flanco de alto a bajo.

• TOCS: Bit que determina si el incremento de TMR0 se producirá con los


pulsos del ciclo de instrucción (reloj externo /4 del micro-controlador), o con
los pulsos externos que provienen del pin RA4.

TOCS = 0: El incremento de TMR0 se realizará con el reloj interno.

TOCS = 1: El incremento de TMR0 se realizará con pulsos externos entrantes


al pin RA4/TOCKI (pata 3).

• INTEDG: Bit que determina qué tipo de flanco de la señal provocará una
interrupción en el pin RB0/INT (pata 6).

INTEDG = 0: El flanco será ascendente.

INTEDG = 1: El flanco será descendente.

• RBPU: Bit que permite habilitar, o no, una conexión interna mediante una
débil corriente a positivo (transistor MOS de canal P), siempre y cuando el
puerto haya sido configurado como entrada. Esta característica es muy útil, ya
que permite dejar libre los pines, eliminando la necesidad de colocar las
resistencias de las líneas del puerto B a positivo (PULL-UP).

RBPU = 0: Se activan las PULL-UP internas del puerto B.

RBPU = 1: Se desactivan las PULL-UP del puerto B.


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
De la tabla 2-3, se desprende que el valor mínimo del pre-divisor para TMR0, para
incrementar su cuenta, estaría comprendido entre 2 y 256. Usted podría preguntarse si el divisor
lo quisiera en 1, que debería ser. Parece ser que no se refleja esta posibilidad en la tabla 2-3.
Pero se equivoca amigo lector, si se asigna la cuenta a WDT (PSA = 1) el TMRO se
incrementará de uno en uno.

CONTADOR DE PROGRAMA Registro 02h

El contador de programa de la gama media tiene una longitud de 13 bits, decir que es
posible direccionar hasta 8 K de palabras. Se muestra en la tabla 2-4 la relación entre el tamaño
del PC y el de los STACK.

Tamaño de
Tamaño del contador de
memoria de
programa
programa
512 9bits (0-8)
1024 10bits (0-9)
2048 11bits (0-10)
4096 12bits (0-11)
8192 13bits (0-12)

Tabla 2-4

El contador de programa del PIC l6F84, posee un tamaño de 13 bits pero dado el
tamaño de su memoria de programa, de solamente 1K, es decir media página de programa,
bastan 10 bits de longitud del contador de programa PC para abarcar esa media página.

Algunos micro-controladores de la gama superior, pueden presentar más páginas de


memoria de programa, ordenadas en bloques de 2K. Para este caso sí se hace necesario recurrir
a toda la longitud del contador de programa, para tener acceso a todas las páginas.

La longitud del código de instrucción de estos micro-controladores es de 14 bits (los


de la gama baja tienen 12 bits). Por lo tanto estos dos bits de diferencia sirven para alojar la
mayor longitud de direccionamiento.

Dado que el contador de programa tiene una longitud de 13 bits, se hace necesario
recurrir a un registro auxiliar para conformar la sección de los bits más altos. Entonces, el
contador de programa está dividido en dos, una parte baja de 8 bits alojados en la dirección 02h
denominada PCL, que se puede acceder perfectamente y otra sección de bits de mayor peso,
llamada PCLATH, ubicada en la dirección 0Ah. Veamos mediante la figura 2-4 lo expresado.

Tema: Micro-controlador PIC 16F84 Página 25 de 70


Figura 2-4

Como ya se mencionó, los bits de mayor peso, l0, 11 y 12 se ignoran, puesto que el
PIC 16F84 tiene sólo 1K de memoria de programa, o sea un total de 1024 posiciones (comienza
en la posición 0000h y se extiende hasta la 03FFh).

Resulta sumamente interesante interpretar qué sucede cuando se aplican determinadas


instrucciones que modifican el contenido del contador de programa PC, con lo que se modifica
la secuencia del mismo.

El PIC 16F84 utiliza para direccionar el programa, sólo los primeros diez bits del
contador de programa PC.

REGISTRO DE ESTADO STATUS Registro 03h

Este registro es de suma importancia, su misión es informarnos de todos los estados


y/o condiciones de la Unidad Lógico Aritmética (ALU). Con la ejecución de la mayoría de las
instrucciones, el registro STATUS modifica alguno de sus bits. Del resultado de una operación
aritmética o lógica, podemos conocer mediante la comprobación del estado de los bits de este
registro, si se ha verificado alguna condición deseada.

Los bits 3 y 4 de este registro, son banderas y delatan la existencia de alguna


condición de reset. Además, la configuración de los bits 5 y 6, permiten acceder a los bancos 0 y
1 de la memoria de datos.

En la figura 2-5 se puede contemplar la arquitectura de este registro de 8 bits, que es


el que más utilidades nos brinda. Ocupa la posición 03h en el banco 0 y la 83h en el banco 1,
por lo que se puede tener acceso a este registro en los dos bancos indistintamente.

Figura 2-5

En la siguiente tabla se puede observar la descripción de los bits del registro


STATUS.

BIT DESCRIPCION
C Acarreo
DC Acarreo decimal
Z Indicador de resultado cero
PD Bit de bajo consumo
T0 Bit de temporización WDT
Bit de selección de bancos en el
RP0, RP1
direccionamiento directo
Bit de selección de pares de
IRP bancos en el direccionamiento
indirecto

Tabla 2-5
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
A continuación pasaremos a definir la función que cumplen cada uno de los bits que
componen el registro STATUS.

• Bit C (CARRY ó Acarreo). Es una bandera. Al ejecutarse una instrucción de


adición o de sustracción, es posible que el resultado sea mayor que la
capacidad de almacenamiento de un byte. Como es de prever, el resultado de
la operación afectará a un noveno bit (C) (desborde u OVERFLOW), que
automáticamente se colocará en ‘1’. Se dice por lo tanto que se ha realizado
el acarreo de un bit. En la rotación, el bit C tomará el valor del bit 0 ó del bit
7, dependiendo del sentido de la rotación.

Veamos un ejemplo de adicción.

Es decir que necesitaríamos un registro de 9 bits, para contener el valor del


resultado, pero como los registros son de 8 bits (es decir que soportan un
valor máximo de 255d), el resultado será B’00000011’ (= 03d), ya que se
truncará el 1 ubicado a la izquierda, colocándoselo en el bit de acarreo (C =
1).

• Bit DC (DIGIT CARRY ó Acarreo decimal). Es una bandera. Funciona


igual que el bit de acarreo C, pero cuando el acarreo se produce entre el bit 3
y bit 4.

DC = 0: Si la operación aritmética no realiza un acarreo del bit 3 al bit 4.

DC = 1: En operaciones aritméticas este bit se coloca en 1 cuando existe un


acarreo desde el bit 3 al bit 4.

• Bit Z (ZERO ó Cero). Es una bandera.

Z = 0: Siempre permanecerá en ‘0’ si el resultado de la operación lógica o


aritmética no es nulo.

Z = 1: Si alguna operación lógica o aritmética da como resultado cero, este


bit se coloca en ‘1’. Es muy útil cargar memorias, puertos o banderas de
señalización en el registro de trabajo W, para luego, operación de por medio,
preguntar cómo es el bit Z, en el registro STATUS, para efectuar una toma
de decisión en el programa.

• Bit PD (POWER DOWN ó Bajo consumo). Es un bit que se coloca en ‘1’


en el momento de conectar la alimentación al micro-controlador ó después
de aplicar la instrucción CLRWDT. Al aplicar la instrucción SLEEP, el
integrado consume apenas algunos microamperios y la bandera ó bit PD se
coloca en cero.
• Bit TO (TIMER OUT ó tiempo fuera). Este bit se coloca en ‘0’ cuando el
temporizador de vigilancia del programa WATCHDOG, termina la

Tema: Micro-controlador PIC 16F84 Página 27 de 70


temporización. Se coloca en ‘1’ después de la conexión de la alimentación, o
cuando se aplica las instrucciones CLRWDT y SLEEP.
• Bit RP0 y RP1. Son los bits de selección del banco de datos, en el caso de
usar direccionamiento directo. En el PIC 16F84 se, usa sólo RP0. En la tabla
siguiente podemos ver los bits de selección de banco.

RP0 Banco
0 Banco 0
1 Banco 1

• Bit 7 IRP. Bit utilizado para el direccionamiento indirecto su valor es ‘0’


para el PIC 16F84, ya que no lo utiliza por tener sólo dos bancos.

Veamos qué sucede con el registro STATUS cuando se intenta borrarlo con la
instrucción CLRF. Los bits señalizadores de estado, TO y PD son de lectura únicamente. Luego
de la ejecución de una de las instrucciones especiales SLEEP ó CLRWDT, el micro-controlador
automáticamente coloca estos bits en ‘1’ ó ‘0’ dependiendo del tipo de instrucción ejecutada.
Debido a que estos bits nos reflejan un determinado estado del micro es imposible borrarlos.
Después de la instrucción el registro estado queda de la siguiente manera.

STATUS 000XX100

En donde la X, representa que el bit no se ha modificado o presenta un estado


desconocido, todos los otros bits se colocaron en cero con excepción de Z, ya que toda
operación de borrado coloca a Z en ‘1’. Por lo tanto se recomienda instrucciones BCF ó BSF,
ya que éstas sólo modifican el bit que deseamos cambiar.

SELECTOR DE REGISTROS FSR Registro 04h

Trabaja en conjunto con el registro INDF para seleccionar indirectamente un registro


de la RAM ó banco de datos. El registro FSR señala la dirección donde se escribirá o leerá
realmente, toda vez que intentemos escribir ó leer en INDF.

PUERTOS DE ENTRADAS Y SALIDAS (I/O) Registros 05h y 06h.

Estos registros especiales corresponden a los puertos de entrada y/ó salida. Se llaman
respectivamente Puerto A y Puerto B. Mediante el control de programa se pueden leer o escribir
como cualquier otro registro. Ante un reset, todos los pines de los puertos quedan definidos
como entradas.

Mediante los registros de configuración TRIS, cada bit ó pin de los puertos, se puede
configurar como entrada o salida de acuerdo a la configuración de unos o ceros en el registro.

Resumiendo, los ‘1’ previamente cargados en el registro TRIS definirán los pines
como entradas. Los ‘0’ configurarán a los pines del puerto como salidas.

Recuerde la regla:

Los unos 1 serán entradas (In). Los ceros 0 serán salidas (Out)

El PIC 16F84 tiene 13 pines que pueden definirse como entradas o como salidas. Un
pin de cada puerto, además de las particularidades comunes del puerto, presenta una función
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
adicional. El pin RA4 puede usarse como entrada de impulso para TMR0 y el pin RB0 puede
emplearse como entrada o línea de interrupción.

Si se configura un pin como entrada, tiene un comportamiento para interpretar los


estados, similar a los niveles lógicos de TTL. Mientras que si se configura el pin como salida,
presenta la típica configuración de un par complementario MOS.

El puerto A tiene cinco pines.

El puerto B es un registro completo de 8 bits, sus pines pueden programarse para que
se comporten como entrada o salida. Determinados pines (RB0 y RB4 a RB7), tienen una
conducta muy diferente cuando se los configura como entrada, éstos pueden utilizarse para
producir una interrupción de acuerdo a la señal que se presente en sus entradas. Por supuesto
siempre que se haya habilitado la autorización para utilizarlas, mediante un registro que controla
las interrupciones.

MEMORIA EEPROM DE DATOS

Una particularidad muy importante que presenta el PIC 16C84, es la de poseer un


pequeño bloque de 64 bytes de memoria del tipo EEPROM. Ante una falla de fuente o corte
permanente de la misma, no se pierde su contenido que se mantiene casi indefinidamente.
Mediante una técnica que explicaremos con posterioridad, es posible almacenar determinados
datos en este bloque. En cualquier momento del programa se pueden recuperar los datos así
almacenados.

Según las características extraídas del manual, soporta hasta un 1.000.000 de ciclos de
escritura o los datos pueden quedar retenidos hasta 40 años.

Estas locaciones de memorias no son parte de las direcciones habituales a que


estábamos acostumbrados a trabajar, por el contrario tienen su propio mapa de memoria. Se las
puede leer y escribir. Hace uso de algunos registros especiales.

Este bloque tiene 64 posiciones de memoria de 8 bits (1 byte), que comienza en la


posición 00h y finaliza en la posición 3Fh, en un mapa de memoria de datos muy diferente de
los dos que hemos visto hasta ahora.

El proceso de lectura es muy sencillo, pero el de escritura es lento, demora casi 10 ms


y además requiere de una cierta clave para poder efectuarlo.

Si comparamos estos 10 ms con el tiempo de instrucción de 1 microsegundo del


micro-controlador, (se supone que utiliza un reloj de 4Mhz), en el tiempo de espera de
grabación de un byte en la EEPROM, el micro-controlador podría efectuar 10.000 instrucciones.

En el presente capítulo, mediante ejemplos, explicaremos la utilización de los


registros asociados, para luego poder aplicarlos en trabajos futuros.

Si en el momento de grabar el micro-controlador se habilita el bit del código de


protección CP, será imposible ya leer el programa, pero no se inhibe la lectura y escritura de ese
bloque de memoria EEPROM (a través del programa).

Si bien este tema se trata con mayor profundidad más adelante, veremos brevemente
los pasos a seguir para leer y escribir en la EEPROM.

Tema: Micro-controlador PIC 16F84 Página 29 de 70


PROCESO DE LECTURA

a) En el registro EEADR coloque la dirección que desea leer en la EEPROM.


b) En el registro EECONI coloque un 1’ en RD, para iniciarla lectura.
c) Lea ahora el registro EEDATA.

PROCESO DE ESCRITURA

Por razones de seguridad el proceso de escritura es bastante más complejo, ya que se


ha perfeccionado para que en ningún momento por fallas de direccionamiento o de
almacenamiento de registros, pueda existir el cambio involuntario de algún byte de la memoria
EEPROM. Además, se necesita una llave para acceder correctamente. Los pasos a seguir son:

a) En el registro EEADR coloque la dirección de memoria que desea escribir.


b) En el registro EEDATA coloque el dato que desea enviar a esa dirección.
c) Ejecute un pequeño programa de clave y seguridad.

MOVLW H’55’
MOVWF EECON2
MOVLW H’AA’
MOVWF EECON2
BSF EECON1, WR

Las primeras instrucciones muestran la escritura de datos en un registro que no tiene


representación física. Si la secuencia no es tal como la mostrada, no se iniciará la escritura
correctamente. La última instrucción es la que permite que la EEPROM inicie el proceso de
escritura,

Para asegurar una correcta escritura, existen pasos adicionales que utilizan otros bits
de control. Además habrá que esperar el aviso (10 ms de demora aproximadamente) de que la
escritura se efectúo. Este tiempo es variable y depende de la temperatura y de las características
de fabricación.

El procedimiento de escritura debe ser perfecto porque así lo requiere el programa,


existe un bit de fallo que presenta un registro en particular que permite asegurarse que no exista
ningún error. Alternativamente, como es muy fácil la lectura se puede comparar el valor recién
escrito de la EEPROM, con el dato que oportunamente se colocó en EEDATA. Esto es posible
haciendo una resta o una OR exclusiva, ya que de ser iguales los operandos el bit Z será igual a
‘1’.

REGISTRO EEDATA. Registro 08h

Es un lugar ubicado en el banco 0 en la dirección 08h, posee la particularidad de ser


un registro en el que se ubica el dato a transferir a la EEPROM o viceversa, el dato que leemos
de esa EEPROM.

Para la escritura, es el dato a ser ubicado en algún lugar del bloque de memoria
EEPROM. Concluida la fase de escritura en la EEPROM, tanto el registro EEDATA y la
dirección seleccionada (una de las 64 posiciones de memoria de la EEPROM) contendrá el valor
de EEDATA.

Para el procedimiento de lectura, será en este registro EEDATA en donde se ubicarán


los datos leídos de la EEPROM, Este registro es el que se utiliza como “puerta”, tanto de
entrada como de salida de datos, a la memoria EEPROM.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
REGISTRO EECON1. Registro 88h

El registro de control EECON1 posee cinco bits que, debidamente configurados,


permiten escribir o leer la EEPROM. Los bits implementados para este fin, son suficientes para
un perfecto control de la EEPROM. Refiérase a la figura 6- 16 para familiarizarse con este
registro.

Figura 2-6

• Bit RD (Reed Data ó Lectura de dato): Este bit establece el modo de lectura
en la EEPROM. Le toma solamente un ciclo de instrucción.

RD = 1: Se debe colocar un ‘1’ por programa, si se desea leer el dato que se


ubica en la EEPROM.

RD = 0: Después de leer el dato, automáticamente se coloca en ‘0’.

• Bit WR (Write Data ó Escritura de dato): Este bit establece el modo de


lectura en la EEPROM. Le toma 10 ms completar la instrucción.

WR = 1: Se debe colocar un ‘1’ por programa si se desea escribir un dato en


la EEPROM.

WR = 0 Después de escribir el dato en la EEPROM, sólo se coloca en ‘0’.

• Bit WREN (Write Enable ó habilitación de escritura): Este bit habilita o


autoriza la escritura del dato.

WREN = 1 Si se coloca un ‘1’ se autoriza la posibilidad de que se grabe un


dato en la EEPROM. Con esta acción se habilita la escritura.

WREN = 0: Si este bit se coloca en cero, es imposible escribir en la


EEPROM.

• Bit WRERR (Write Error ó Error de escritura): Bit que determina si ha


ocurrido algún error de escritura. Debido a que este proceso es muy lento y
nunca se está exento de la posibilidad de fallas, es muy útil consultar este bit.

WRERR = 1: Este bit se coloca en 1 cuando ha ocurrido un error de


escritura. Esto puede ser consecuencia de una falla en la tensión, un ruido
eléctrico o una condición de reset, entre otras causas.

Tema: Micro-controlador PIC 16F84 Página 31 de 70


WRERR = 0: Si la escritura no presenta fallas, este bit permanecerá en ‘0’.

• Bit EEIF (EEPROM Interrup Flag ó Bandera de interrupción por


EEPROM): Es el bit que señala que el proceso de escritura ha finalizado.
Durante aproximadamente 10 ms permanecerá en cero, cuando se haya
completado la fase de grabación en la EEPROM, se colocará en ‘1’. La
consulta de este bit es muy útil.

EEIF = 1: Este indicador sólo se colocará en ‘1’ cuando haya finalizado la


escritura. Por programa se debe colocar en ‘0’,

• EEIF = 0: Si este bit permanece en ‘0’, es señal de que la escritura no ha


finalizado.

REGISTRO EECON2. Registro 89h

Es importante aprender a utilizar este registro, puesto que el empleo del mismo es
esencial para almacenar datos en una zona especial de memoria. El uso de este registro auxiliar
es imprescindible para lograr la escritura de la EEPROM con éxito. Está ubicado en la zona de
los registros especiales, pero no está imple- mentado en forma física. Ante un intento de leerlo
su lectura da cero.

Este registro es como una clave que habilita y permite posteriormente grabar un dato
en la EEPROM. No se podrá grabar si con anterioridad, como hemos visto, no se escriben en
este registro una serie correlativa de datos:

Movlw H’ 55’
Movwf EECON2
Movlw H ‘AA’
Movwf EECON2

Además de la secuencia de seguridad mostrada, se hace necesario cumplimentar dos


pasos adicionales (recuerde cargar EEADR y EEDATA).

• La acción de colocar un ‘1’ en el bit WREN habilita la escritura.


• La acción de colocar un ‘1’ en el bit WR inicia el ciclo de escritura.

Como se puede observar resulta improbable, por la cantidad de requisitos inherentes


al proceso, que por causas fortuitas, se sobre-escriba en la EEPROM.

REGISTRO PCLATH CONTADÓR DE PROGRAMA. Registro 0Ah

Es el registro que contiene la parte alta del contador de programa. Cuando el contador
de programa es destino de una instrucción, se requiere que se compaginen los dos bits menos
significativos de PCLATH que se transferirán al contador de programa. Para mayor información
remítase a lo visto anteriormente.

REGISTRO CONTROL DE INTERRUPCIONES INTCON. Registro 0Bh

Por ser un micro-controlador de la gama media, presenta un recurso muy importante


que son las interrupciones. Esto significa que el programador tiene la posibilidad desviar el
curso del programa, al decidir qué alternativa o rutina se ejecutará, ante la solicitud de atender
una interrupción.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
El registro INTCON contiene señalizaciones y el modo de programar las
interrupciones del micro.

Este registro está duplicado en el otro banco de memoria. Si por cualquier motivo
debemos utilizarlo, no será necesario cambiar de banco al hacerlo.

De la figura 2-7 se desprende que los tres bits de menor peso (0, 1 y 2) corresponden
a los avisos de señalización de los sucesos y los coloca el procesador (una vez atendida la
interrupción deberá borrarlos el programador). Los bits 3, 4, y 5 son los utilizados para habilitar,
o no, los modos de interrupción, estos bits se configuran a voluntad del programador.

Figura 2-7

Veremos la función que cumple cada uno de los bits de este registro.

• RBIF: Bit que nos indica que ha existido un cambio de estado en los pines
RB4, RB5, RB6 y/o RB7 del puerto B. El retomo a su valor original es
colocándole un cero y deberá realizarse por programa.

RBIF = 1: Se coloca en ‘1’ cuando se ha detectado un cambio de estado en


cualquiera de los pines RB4, RB5, RB6 y/o RB7. Este aviso siempre se
cumple, no interesando si se han habilitado las interrupciones.

RBIF = 0: Este bit permanecerá en ‘0’ hasta tanto no se realice un cambio de


estado en alguno de los pines RB4, RB5, RB6 y/o RB7.

• INTF: Bit que señaliza (bandera) que se ha producido un flanco en la señal


que ingresa al pin RBO/INT, del puerto B (pata 6). El retomo a su valor
original se realiza por programa.

INTF = 1: Cuando este bit sea ‘1’, significa que ha existido un cambio de
flanco de la señal en el pin 6 (RB0/INT).

Tema: Micro-controlador PIC 16F84 Página 33 de 70


INTF = 0: Por el contrario, mientras no se produzca ningún cambio de flanco
de un pulso en el pin 6 (RB0/INT), este bit se mantendrá en ‘0’.

• TOIF: Bit que nos informa que el temporizador TMR0 llegó a cero (por
desbordamiento, es decir, pasa de ‘FFh’ a ‘00h’).

TOIF = 1: Se coloca en ‘1’ cuando la cuenta llegó a cero (después de pasar


por ‘FF’).

TOIF = 0: Mientras este bit permanezca en ‘0’, indica que el TMR0 no se ha


desbordado.

• RBIE: Bit de habilitación que permite que se atienda la interrupción cuando


se origine un cambio de nivel lógico en cualesquiera de las cuatro líneas
RB4, RB5, RB6 y RB7 del puerto B. Es decir que, si por programa se coloca
en ‘1’, entonces se autoriza la atención de la referida interrupción.

RBIE = 1: Recuerde que este bit en ‘1’, habilita sólo la interrupción


generada por un cambio de estado de tensión de las líneas RB4 a RB7.

RBIE = 0: Con este bit en ‘0’, se inhibe la interrupción, por cambio de


estado de las líneas RB4, RB5, RB6 y RB7 del puerto B.

• INTE: Bit de habilitación que permite que se realice el salto a la


interrupción, cuando se origine un cambio de flanco en la línea RB0/INT del
puerto B.

INTE = 1: Esta condición habilita que un cambio de flanco de la línea


RBO/INT, provoque una interrupción.

INTE = 0: Este estado inhibe esta interrupción.

• TOIE: Es el bit de habilitación para permitir que se realice el salto a la


interrupción, cuando el registro TMR0 ha desbordado.

TOIE = 1: Esta condición habilita realizar la interrupción por


desbordamiento de TMR0.

TOIE = 0: Se prohíbe la interrupción, por desbordamiento de TMR0.

• EEIE: Bit de habilitación que permite que se realice un salto a la


interrupción, cuando se ha finalizado la escritura de la EEPROM.

EEIE = 1: Este estado habilita la interrupción por finalización de escritura.

EEIE = 0: Esta condición inhibe esta interrupción.

• GIE: Bit de habilitación general de las interrupciones en sus cuatro


modalidades, en los modelos de micro-controladores que manejen
interrupciones. Su habilitación implica que ante una interrupción, se realice
el salto al vector de interrupción en la posición 04h.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
GIE = 1: Este estado permite que se ejecuten todas las interrupciones
habilitadas en los bits 3, 4, 5 y 6 del registro INTCON.

• GIE = 0: Inhibe todas las interrupciones.

DIFERENTES INTERRUPCIONES

Como su nombre lo indica, se refiere a un evento que produce una alteración o


cambio en la secuencia normal de funcionamiento. Su importancia radica en que existen
determinados estados, que es necesario atenderlos en el instante preciso en que aparecen. Se la
considera entonces algo urgente que debe atenderse, por lo tanto esto conduce a una bifurcación
de la actividad principal.

Una interrupción se origina por dos motivos:

1) Por un agente externo al micro-controlador, a través de los pines de entradas.


2) Por eventos internos del micro-controlador.

De producirse una de las causas mencionadas, el efecto inmediato es:

• Atender la interrupción.
• Determinar la causa que la origina, mediante la inspección de INTCON.
• Ejecutar la subrutina de servicio.
• Retornar al programa principal, para continuar la secuencia correspondiente.

Concretamente, siendo la interrupción una desviación del programa, surge la


necesidad de guardar la dirección siguiente del contador de programa, para recordar dónde se
debe regresar y no perder la secuencia lógica del programa. El ‘registro’ pila o STACK,
resuelve la situación de preservar esta dirección.

Posteriormente salta a una dirección perfectamente definida, llamada vector de


interrupción, ubicado en la posición 04h.

Para que se genere una interrupción deben manifestarse con anterioridad dos
situaciones bien definidas, que se exteriorizan en el registro INTCON.

• El programador debe habilitar (colocando un ‘1’ en el bit correspondiente).


la interrupción que desea utilizar.
• El micro-controlador debe advertir que se ha producido dicha interrupción.

Por disponer de un solo vector de interrupción, es necesario evaluar los estados de los
bits de señalización, para determinar cuál ha sido la causa de la interrupción y poder, de este
modo, elegir la rutina apropiada (esta tarea sería más sencilla y directa, si se dispusiese de más
vectores de interrupción).

Se muestra en el organigrama de la figura 2-8, un simple ejemplo, de lo que serían las


distintas fases de una interrupción.

Según se desprende de dicha figura, existe una serie de acciones que el micro-
controlador realiza cuando se produce una interrupción, en concordancia con las previsiones que
se deben tomar en la elaboración del programa.

Tema: Micro-controlador PIC 16F84 Página 35 de 70


1) Pasa que sea factible la utilización de las interrupciones será necesario
configurar correctamente los bits del registro INTCON. En primer lugar,
deberemos colocar un ‘1’ en el bit 7 de dicho registro, es decir GIE = 1, con
esto efectuamos una habilitación general de todas las interrupciones. De ser
GIE = 0 sería como estar en presencia de un micro-controlador de la serie
baja, pues las interrupciones no serían atendidas.
2) El procesador se encarga de colocar un ‘0’ en GIE. Esta acción es esencial
para evitar que interfiera una nueva interrupción (puede ser la misma),
cuando se está atendiendo la interrupción en curso (los pasos 2 y 3 son casi
simultáneos).
3) Producida la interrupción (que por ahora no sabemos la causa),
inmediatamente se carga en el STACK, la dirección a la que apunta el
contador de programa a la que se le suma una posición de memoria. Si la
pila contenía alguna dirección, literalmente ésta es empujada un nivel.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Figura 2-8

4) El contador de programa se carga con la dirección 04h, destinada a la


atención de las interrupciones, denominado vector de interrupción.
5) Habitualmente, para mantener un orden en la edición del programa, en la
posición 04h, se coloca un salto a otro lugar de la memoria.
6) Es importante almacenar en otras posiciones de memoria de la RAM, ciertos
registros que pueden cambiar, cuando menos STATUS y W (puede ser
también FSR). Esta tarea no es tan sencilla de realizar, pero explicaremos
cómo se resuelve satisfactoriamente, en el trabajo práctico del contador
digital.

Tema: Micro-controlador PIC 16F84 Página 37 de 70


7) Se debe analizar el registro INTCON para saber cuál de los señalizadores se
colocó en ‘1’, de esta manera se podrá determinar el origen de la
interrupción.

Una vez determinado el bit, la secuencia del programa se desviará a atender


la tarea que se programó para tal circunstancia. Tres de las banderas de
señalización se ubican en los bits de menor peso de JNTCON, la cuarta
causa de interrupción, deberemos buscarla en el bit 4 del registro EECON1.

8) Finalizada la atención de la interrupción, debemos forzosamente borrar las


señalizaciones del registro INTCON o EECON1. En caso de no hacerlo, la
rutina se repetiría indefinidamente.
9) Al finalizar la subrutina se encuentra la instrucción RETFIE, su función es
recuperas el valor del STACK, almacenar este dato en el contador de
programa y devolver al bit GIE el estado ‘1’, para habilitar de este modo
nuevamente las interrupciones.

Para habilitar las interrupciones que desee utilizar, coloque un ‘1’ en los bits
correspondientes (los ‘0’ las inhiben).

Un ‘1’ en la bandera indica que de estar habilitada, la interrupción será atendida.

El PIC 16F84 posee cuatro modos de interrupciones, las que son atendidas con el
mismo vector de interrupción. Estas son:

1) Cambio de flanco de RBO/INT del puerto B. Pin 6.


2) Cambio de estado de RB4, RB5, RB6 y/o RB7 del puerto B. Pines 10 al 13.
3) Finalización de la cuenta de TMR0 (OVERFLOW).
4) Finalización de la escritura de la EEPROM de datos.

Llámese cambio de estado en el puerto, a la repentina modificación de la tensión


presente en esa línea del puerto. Esta alteración de niveles de tensión es indistinta, puede ser de
bajo a alto o viceversa. En el primer modo, es posible elegir el flanco de acuerdo al diseño del
equipo o sistema.

A continuación veremos varios ejemplos de interrupciones, a los efectos de ver en la


práctica la aplicación de lo expuesto precedentemente. Comenzaremos por una de las primeras
interrupciones mencionadas.

CAMBIO DE FLANCO DE RB0/INT

Se desea utilizar una interrupción aprovechando el pin 6 (RB0), del puerto B. Para
lograrlo es necesario, como primera medida, cargar convenientemente el registro TRIS, como
por ejemplo B’ 11110001’, con este binario se configura la pata RB0 como entrada (por el ‘1’
del bit de menor peso del registro TRIS). Todos los pines configurados como entradas,
presentan histéresis en los niveles de tensión (característica SCHMITT-TRIGGER).

Como segundo paso se escribe correctamente el registro OPTION con el binario


B’10000101’, por ejemplo. Centraremos nuestra atención en los bits 7 y 6.

Se ordena que desactive las PULL-UP interna, colocando el bit 7 en ‘1’, es decir que,
deberemos conectar resistencias a positivo para no dejar entradas libres. Se ha elegido esta
opción para seleccionar la constante de tiempo que se utilizará, en correspondencia con un
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
capacitor de bajo valor para producir el pulso deseado. Por las características del sensor
utilizado, se supone que nos interesa usar el descendente de la señal para activar la interrupción.
Escribiendo un ‘0’ en el bit 6 del registro OPTION se determina que el flanco sea descendente.
Ver figura 2-9.

Una vez configurado el puerto y los registros especiales, estamos en condiciones de


usufructuar las ventajas del uso de las interrupciones.

Cuando el pin RB0/INT cambie de estado con el flanco descendente, aparecerá un ‘1’
en el bit 1, del registro de control INTCON. Este hecho nos informa del suceso acaecido y es
independiente de que los bits de habilitación estén colocados en ‘l’ ó en ‘0’.

Inmediatamente se comprueba qué valor posee el bit general GIE, si es ‘0’, el micro-
controlador seguirá ejecutando el programa principal, ignorando la interrupción. De ser igual a
‘1’, significa que todas las interrupciones están habilitadas. Además comprueba que el bit INTF
sea igual a ‘1’. De cumplirse esta condición, se estará en presencia de una interrupción que hay
que atender.

El procesador coloca GIE en ‘0’, para evitar que atienda otras interrupciones.
Almacena el contador de programa (STACK) y salta al vector de interrupción en la posición
04h, iniciándose la rutina de servicio. Cumplimentada esta subrutina de servicio, regresará al
programa principal, continuando con el desarrollo normal.

Figura 2-9

Tema: Micro-controlador PIC 16F84 Página 39 de 70


CAMBIO DE ESTADO EN EL PUERTO B (RB4, RB5, RB6 y/o RB7)

Esta modalidad permite que, el cambio del nivel de la tensión de entrada de


cualquiera de los pines RB4 a RB7, del puerto B, genere una interrupción.

Este recurso requiere la aplicación de una cierta metodología, para emplearlo


satisfactoriamente. Ver la figura 2-10.

En muchas aplicaciones, particularmente en teclados matriciales, aplicar la


instrucción SLEEP es un procedimiento atractivo, ya que permite detener el reloj del micro-
controlador, haciendo mínimo el consumo de potencia. Al pulsar una tecla, se genera una
interrupción que saca al dispositivo de ese estado.

Figura 2-10

No olvide borrar el bit bandera RBIF, cuando regrese de la interrupción.

De la figura 2-10, se muestran los pasos que se deben seguir para habilitar la
interrupción correspondiente a los bits RB4-RB7, del puerto B.

Para una aplicación que requiere la utilización.de un teclado matricial, se ha elegido


una disposición que emplea las cuatro entradas mencionadas del puerto B. Esta adaptación es
muy utilizada y va acompañada con la instrucción SLEEP. Mientras el PIC “duerme”, espera
algún cambio en los pines RB4 a RB7.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Los pasos a seguir son;

1) Configurar los puertos para que los pines RB4, RB5, RB6 y RB7 actúen
como entrada. Para ello debemos tener la precaución de colocar ‘1’ en los
bits correspondientes del registro TRISB.
2) Se coloca un ‘0’ en el bit 7 del registro OPTION, para aprovechar las
resistencias internas del micro-controlador y utilizarlas como referencias del
teclado.
3) Se coloca un ‘1’ en el bit 3 del registro INTCON, de este modo, con RBIE =
l se activa esta modalidad de interrupción del Puerto B.
4) Recuerde que con la configuración de GIE = l (bit 7 en 1’), se habilitan todas
las interrupciones (caso contrario, se inhiben todas).

FINALIZACIÓN DE LA CUENTA DE TMR0.

El registro TMR0 tiene 8 bits y tiene la función de ser un contador ascendente. El


incremento de este registro se establece por medio de un divisor interno variable, que se
configura mediante los tres bits de menor peso del registro OPTION, denominados PS0, PS1 y
PS2.

Después de un número preestablecido de ciclos, provenientes del reloj interno o de


una señal externa al micro-controlador, el registro TMR0 se incrementa en una unidad. Además
la cuenta de este registro, puede incrementarse con la señal proveniente del flanco descendente
o con el ascendente.

Se genera una interrupción en esta modalidad, cuando se produce un rebasamiento u


OVERFLOW de la cuenta de este registro, es decir llega a 00h, después de pasar por FFh. Si
está habilitada la interrupción, salta al vector de inicio en la dirección 04h, en donde ejecuta la
rutina de servicio y regresa.

Si desea obtener un tiempo de 5rns utilizando el registro TMR0, usaremos como reloj,
un oscilador a cristal de 4MHz. Empleado como temporizador, TMR0 puede contar desde 00h
hasta FFh (255). Para generar una interrupción, debe existir un rebasamiento de este registro,
entonces, la cantidad de ciclos efectivamente contados es de 256. Si cargamos TMR0 con un
valor predeterminado (para este caso 178), la cuenta ya no comenzará desde cero, sino desde
este valor, es decir que, la máxima cantidad de pulsos a contar, será la diferencia entre 256 y el
valor cargado de TMR0. Si se multiplica este número, por el valor del pre-divisor y por el ciclo
de instrucción, se obtendrá el tiempo total en microsegundos.

El pre-divisor se carga con los bits PS0 (1), PS1 (0) y PS2 (l) del registro OPTION.
El reloj/4 es un microsegundo.

El razonamiento es el siguiente; de cada 64 pulsos del reloj interno se incrementa en


uno TMR0, cuando se produzca un rebasamiento de este registro, se activará la bandera

Tema: Micro-controlador PIC 16F84 Página 41 de 70


correspondiente TOIF (indica OVERFLOW de TMRO). Las fases del desarrollo de la
interrupción se pueden ver en la figura 6-11.

Figura 2-11

FINALIZACIÓN DE LA ESCRITURA DE LA EEPROM DE DATOS.

Por último y finalizando el estudio de las interrupciones, veremos la metodología a


seguir para utilizar la interrupción de finalización de escritura, de la memoria EEPROM.

Como se explicó oportunamente, se requiere un tiempo de 10ms aproximadamente


para completar el proceso de escritura en la EEPROM, comparado con la velocidad de ejecutar
una instrucción del micro-controlador, es una operación muy lenta. Existe un registro especial
denominado EECON1, que supervisa la finalización y la existencia de errores en la escritura. De
este modo nos informa, si el dato se ha grabado correctamente en la EEPROM. Esto es muy útil
si consideramos el riesgo involucrado en la lentitud del proceso.

Cabe destacar que la bandera que nos indica la finalización de escritura, no se


encuentra en el registro INTCON como todas las demás interrupciones, sino en el registro
EECON1 (bit 4), denominado EEIF. Vea Figura 2-6.

En la figura 2-12 se puede observar cómo la interrupción por escritura necesita de dos
registros diferentes. En realidad el proceso de lectura y escritura presenta algunas variantes, por
lo que más adelante analizaremos ejemplos más complejos que nos permitan entender en
profundidad este tema.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Figura 2-12

Tema: Micro-controlador PIC 16F84 Página 43 de 70


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Micro-controladores PIC

Set de instrucciones

Tema: Micro-controlador PIC 16F84 Página 45 de 70


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

Set de instrucciones

QUÉ ES UNA INSTRUCCIÓN

Una instrucción, como su nombre lo expresa, es un comando o una orden que el


programa le da al micro-controlador, para que éste interprete y ejecute su cumplimiento. Para
esto, la instrucción presenta secciones o campos de bits, es decir posiciones perfectamente
delimitadas, por las cuales el procesador logra interpretar la orden deseada y cuáles son las
variables afectadas por ésta.

Por lo tanto, la instrucción presenta un formato, una codificación que cambia de


acuerdo con la operación que vamos a realizar, por supuesto existe una gran similitud entre las
instrucciones.

Cada instrucción, para los PIC 16F84, es un bloque compacto de una palabra de 14
bits. Esto permite codificar en una sola unidad, la orden, el operador y la ubicación ó salto. Los
bits que actúan como datos de la memoria EPROM se reciben en un lugar llamado
decodificador de instrucciones, que trabajando en conjunción con el contador de programa y el
registro W, permiten acceder a lugares muy específicos del micro-controlador. Uno de ellos es
la unidad ALU para las operaciones aritméticas y lógicas.

FORMATO DE LAS INSTRUCCIONES

Instrucciones orientadas a registros.

El juego de instrucciones presenta una codificación muy particular que llamamos


formato de la instrucción.

Todos los bits que conforman por completo la palabra (bloque), son generados por el
ensamblador a partir de la sintaxis y mnemónico de la instrucción.

Veamos lo que en inglés se llama ENCODING, (Codificación).

Figura 3-1

CÓDIGO DE OPERACIÓN: Los seis bits de mayor peso (bits 8 al 13) definen la
operación que va a realizas la instrucción de acuerdo a lo solicitado. Este campo define una
orden que el PIC interpreta que debe ejecutar sobre un operando en particular, cuya dirección la
busca según lo indicado por los bits (0 al 6) de menor peso.

DESTINO (d): El bit cinco es de reconocimiento y determina en qué lugar va a


depositar el resultado de la operación: Si este bit es cero el destino de la operación será

Tema: Micro-controlador PIC 16F84 Página 47 de 70


acumulado en el registro W de trabajo. Si el bit es uno el destino será el mismo registro f. Como
podemos observar, el valor de ‘d’ cambia rotundamente el destino del resultado de la operación.

DIRECCIÓN DE REGISTRO U OPERANDO (f): Estos cinco bits de menor peso


en el formato de la instrucción representan la dirección donde está guardado el operando, que
por supuesto está en la memoria de datos y por tener cinco bits sólo podemos direccionar una de
las 32 (1Fh) posiciones de memoria RAM.

La mayoría de las instrucciones se realizan en un ciclo de instrucción excepto las


instrucciones de salto que necesitan dos ciclos para ejecutarla.

Un ejemplo de ello se muestra en la siguiente figura:

Figura 3-2

Instrucciones orientadas a bits.


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
En la siguiente figura se muestra la codificación de una instrucción orientada a bits.

Figura 3-3

Donde el código de operación es menor que en las instrucciones orientadas a registro,


ya que solamente son cuatro instrucciones orientadas a bits las que existen en este modelo de
micro-controlador. Pero ha de tenerse en cuenta que el CO de estas instrucciones no puede
coincidir con los bits 10 a 13 del código de una instrucción orientada a registro ya que de ser así
no podría identificar cual código pertenece a cada instrucción.

Un ejemplo de estas instrucciones se muestra a continuación.

Figura 3-4

Tema: Micro-controlador PIC 16F84 Página 49 de 70


Instrucciones orientadas a literal y de control.

A continuación se muestra la estructura que tienen ambas instrucciones.

Figura 3-5

1. OPERACIONES ORIENTADAS A BITS

Son cuatro en total las instrucciones que conforman este paquete.

Dos de ellas se encargan de imponer, que algún bit en particular de un registro, tome
un valor ‘0’ o ‘1’.

Las dos restantes se encargan de examinar si ha existido un cambio en algún bit de un


registro y tomar o no, una decisión de salto.

Para su mejor comprensión se ha dibujado una tabla que contiene las instrucciones y
su efecto en la operación.

Mnemónico Operación Ejecuta Estado


BCF F,B 0F(B) Coloca un 0 en el bit b del registro f -
BSF F,B 1F(B) Coloca un 1 en el bit b del registro f -
BTFSC Salta según bit Lee el bit b del registro f si es 0 salta -
BTFSS Salta según bit Lee el bit b del registro f si es 1 salta -

Tabla 3-1

Las dos primeras instrucciones del diagrama de la tabla 3-1 son de mucha utilidad, ya
que obligan que un bit de un registro cualquiera tome el valor ‘0’ o ‘1’. El estado resultante,
forzado por la instrucción, consiste en que ese bit permanezca en esa condición hasta que una
nueva instrucción altere la misma.

Las dos últimas instrucciones de la Tabla 3-1 son las denominadas de salto
condicional (skip). Según el valor de un bit en particular, ejecutará o saltará la instrucción
siguiente.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
De aquí en adelante se ofrecen varios ejemplos y la explicación detallada le todas las
instrucciones. Al estudiante adelantado podrá parecerle un tanto simple y hasta elemental. Sin
embargo, el compromiso tomado en la preparación de este libro fue que, a la mayoría de los
alumnos de ciclos básicos de los colegios técnicos o institutos, les resultase accesible su
comprensión.

Instrucción bsf (bit set file).

bsf EJEMPLO,.3 ; Coloca un 1 en el bit 3 del registro EJEMPLO

Veamos el estado del registro EJEMPLO antes y después de ejecutar la instrucción.

Figura 3-6

Como se observa claramente en la figura 3-6, se ha modificado el bit de un registro


(dato), podría ser cualquiera de la RAM de la posición 01h en adelante. Si mediante una
instrucción transfiero este registro al puerto B, inmediatamente tendremos que en la salida RB3
del puerto B, aparecerá un ‘1’.

Es decir que, si en ese pin del puerto se hubiese conectado un led a negativo, (a través
de una resistencia), el mismo se encendería, ya que el micro-controlador asume que la acción de
esa instrucción implica elevar la tensión del pin, de ese puerto, a 5Vcc. Figura 4-6.

Figura 3-7

Tema: Micro-controlador PIC 16F84 Página 51 de 70


Otra manera más directa y simple a la vez de realizar el encendido del led, es aplicar
la misma instrucción directamente al puerto de la siguiente manera:

bsf PUERTOB,.3.

Instrucción bcf (BIT CLEAR FILE)

bcf EJEMPLO,.2

Esta instrucción coloca un ‘0’ en el bit 2 del registro ó dato EJEMPLO. Veamos los
estados de EJEMPLO antes y después de aplicar la instrucción.

Figura 3-8

Instrucción btfsc (BIT TEST FILE, SKIP IF CLEAR)

El significado de esta instrucción es el siguiente; examina un bit en particular de un


registro, si es cero salta una instrucción. Veamos un sencillo ejemplo.

Figura 3-9

Si el bit 3 es cero, se ejecutará la instrucción b, ignorando la instrucción a. Pero si el


bit es uno, entonces se ejecutará primero la instrucción a, para luego cumplimentar la
instrucción b.

Es una instrucción de toma de decisiones, es decir que comprueba el estado que tiene
un bit cualquiera (para este caso el bit 3 del registro BANDERA), para luego, en función de ese
estado, realizar un salto, o no.

Si tiene el valor ‘0’, salta omitiendo la instrucción siguiente. En el caso de tener el


valor ‘1’, se remitirá a seguir la secuencia del programa. Recuerde que si el bit se encuentra en
‘0’, el contador de programa se incrementará en dos, para permitir omitir la instrucción que
sigue a continuación. Es decir, esta bifurcación genera un salto de una instrucción si se cumple
la condición, caso contrario no existirá el referido salto.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Mediante esta instrucción podemos realizar una toma de decisión con sólo chequear
un bit cualquiera de un registro.

Instrucción btfss (BIT TEST FILE, SKIP IF SET)

btfss BANDERA,.7

Esta instrucción realiza un examen del bit 7, para el caso de ser ‘1’ indefectiblemente
se producirá el salto de una instrucción. Si este bit es cero, el contador de programa PC,
ejecutará la siguiente instrucción sin realizar ningún tipo de salto.

• Una ventaja bastante importante que ofrece esta instrucción, es que puede
analizar algún bit de un puerto y observar si en éste se ha producido un
cambio no esperado, para así de este modo, cumplir con otra tarea relacionar.
• Otra particularidad es la posibilidad de examinar cambios en los bits
relacionados con registros internos del micro-controlador, especialmente los
susceptibles a modificarse por ciertas operaciones que se realizan entre
registros.

Por último y resumiendo, cuando en un programa se ejecuta ya sea la instrucción


btfsc o la btfss, el contador de programa se incrementa en uno o en dos unidades, dependiendo
del resultado de la comparación.

2. OPERACIONES ORIENTADAS A REGISTROS.

Este grupo. que maneja registros como operandos, es el más abundante del juego de
instrucciones. Cada operación, realizada mediante este tipo de instrucciones, usualmente hace
referencia indirecta a una dirección, Previamente se debe definir el registro con un nombre y
una dirección muy concreta en la RAM. El conjunto de instrucciones se adjunta en la tabla 3-2.

Mnemónico Operación Ejecuta Estado


ADDWF W+F Suma el registro W con otro registro F C, DC, Z
ANDWF W&F Hace una AND entre W y otro registro F Z
CLRF 0F Borra un registro F Z
CLRW 0W Borra el contenido del registro de trabajo W Z
COMF 255 - F Complementa el registro F Z
DECF F-1 Decrementa el registro F en 1 Z
DECFSZ (F -1 = 0) Decrementa el registro F en 1, salta si es 0 -
INCF F+1 Incrementa el registro F en 1 Z
INCFSZ (F + 1 = 0) Incrementa el registro F en 1, salta si es 0 -
IORWF WvF Hace una OR inclusiva entre W y F Z
MOVF F Copia el contenido del registro F Z
MOVWF W F Copia el contenido de W al registro F -
NOP - No operar -
RLF - Rota los bits del registro hacia la izquierda C
RRF - Rota los bits del registro hacia la derecha C
SUBWF F–W Resta del registro F el contenido de W C, DC, Z
SWAPF Intercambia mitades de F -
XORWF FvW Hace una OR exclusiva entre W y F Z

Tabla 3-2

La mayoría de este grupo de instrucciones responde a la siguiente sintaxis:

Tema: Micro-controlador PIC 16F84 Página 53 de 70


Mnemónico F, d como ejemplo: addwf F,d.

Se observa a primera vista que la particularidad de esta notación, es que después del
registro F (dato), aparece una coma seguida de una referencia d (destino). A d le podemos
asignar dos valores, 0 ó 1. Si es 0, el resultado de la operación se coloca en el registro W, si en
cambio es 1, el resultado se almacenará en el mismo registro F.

Si bien la instrucción es la misma, puede dar por resultado dos acciones distintas, ya
que el resultado de la operación, dependiendo del valor de d, puede alojarse en dos registros
diferentes. En este grupo de instrucciones, debemos hacer referencia al campo de los
operadores, en efecto nos referiremos siempre, al registro fuente (F) como aquel involucrado en
la operación. El registro destino es aquél en donde se almacenará el resultado de la operación.
Bastará colocar un ‘1’ para alojar el resultado en el registro F. Si colocamos un ‘0’, el resultado
se almacenará en el registro W. Más adelante mediante referencias podremos visualizar mejor
estas condiciones.

Instrucción addwf (ADD W AND F)

addwf DATO,1

Esta operación es llamada suma o de adición. El contenido del registro de trabajo W


(es el comodín de la mayoría de las instrucciones) se suma al contenido del registro F (DATO) y
queda almacenado en el registro DATO. Entonces el contenido anterior que tenía DATO se ha
perdido, no así el de W. La suma de dos registros cuyo destino se transfiere hacia el registro
DATO, es interpretada por la instrucción por el agregado del 1 al final de la misma.

Realicemos la misma operación con d = 0.

addwf DATO,0

Esta operación es idéntica a la anterior (el resultado es el mismo), pero al haber


reemplazado el ‘1’ con el ‘0’, el resultado de la operación se almacenará ahora en el registro de
trabajo W. El registro W es el que modificará su contenido no así el registro DATO, que
permanece inalterable.

Esta operación altera tres bits del registro STATUS, que son C, DC y Z. En formas
generales y para una mayor comprensión, se ofrece un ejemplo.

Antes de ejecutar la instrucción se tiene:

Binario Decimal Hexadecimal


Número A (DATO) 00001010 10 A
Número B (W) 11110001 241 F1
Acarreo 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00001010 10 A
Número B (W) 11111011 251 FB
Acarreo (Estado, C) 0 0 0
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
En este ejemplo se puede observar que el resultado de la operación es coherente, lo
cual es indicado con la permanencia del bit de acarreo C del registro estado, es decir que el
resultado de la suma es correcto.

Como los registros del PIC son de 8 bits, estos pueden contener valores de hasta 255,
por lo cual si se obtiene como resultado un número superior de 255 (se requieren registros de 9
bits ó superior), este se truncará dando un valor incorrecto por resultado, lo cual se indicará con
el bit C = 1.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010100 20 14
Número B (W) 11110001 241 F1
Acarreo (Estado, C) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010100 20 14
Número B (W) 00000101 5 5
Acarreo (Estado, C) 1 1 1

Como se puede observar en este último caso, el resultado real debería ser de 261
(100000101), pero como los registros son de 8bits el resultado que queda registrado en el
registro W es 5 (00000101).

Instrucción andwf (AND W AND F)

andwf DATO,1

Esta operación es llamada AND lógica. Su acción consiste en efectuar una AND entre
el contenido del registro F (DATO) y el contenido del registro W (registro de trabajo) y por ser
d = 1, obliga a almacenar el resultado en DATO. Por lo tanto se pierde el contenido anterior de
DATO, no así el contenido de W que permanece invariable.

Una vez ejecutada la operación, el resultado se habrá almacenado en el registro


DATO, en este caso el registro DATO se ve alterado.

Tabla de verdad de una compuerta and:

A B Resultado
0 0 0
0 1 0
1 0 0
1 1 1

Tema: Micro-controlador PIC 16F84 Página 55 de 70


A continuación se muestra como trabaja esta instrucción:

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010100 20 14
Número B (W) 11110001 241 F1
Acarreo (Estado, C) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010000 16 10
Número B (W) 11110001 241 F1
Acarreo (Estado, C) 0 0 0

Instrucción clrf (CLEAR F)

clrf REGIS

Esta instrucción borra o limpia el contenido de un registro, es decir, coloca todos sus
bits en cero. El dato del registro REGIS se pone en ‘0’, e inmediatamente el bit Z del registro de
estado (STATUS), se pone en ‘1’.

Es una instrucción que habitualmente se utiliza en el inicio de los programas, es muy


apropiada para borrar el estado inicial de los registros que serán utilizados como datos en el
programa.

Instrucción clrw (CLEAR W)

clrw

Es una instrucción muy similar a la anterior, en efecto borra un registro, pero lo que
realiza es borrar el registro de trabajo W. También activa y coloca un 1’ en el bit Z del registro
STATUS.

Instrucción comf (COMPLEMENT F)

comf MEMO,1

Es una instrucción que realiza el complemento de un registro bit a bit, por ser d = 1 el
resultado se almacenará en MEMO. Para el caso de que d = 0, él resultado se guardará en el
registro de trabajo W. Nuevamente la instrucción afecta al bit Z del registro de estado
(STATUS).

Ejemplo.

Cada bit de un registro de 8 bits, se cambia por su complemento. Donde exista un ‘0’
coloca un ‘1’ y viceversa. Observe el siguiente ejemplo:

Antes de ejecutar la instrucción:


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Binario Decimal Hexadecimal
Número A (MEMO) 00010100 20 14
Número B (W) 11110001 241 F1

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (MEMO) 11101011 235 ED
Número B (W) 11110001 241 F1

Para el caso de que d sea igual a 0:

comf MEMO,0

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (MEMO) 00010100 20 14
Número B (W) 11110001 241 F1

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (MEMO) 00010100 20 14
Número B (W) 11101011 235 ED

Instrucción decf (DECREMENT 1)

decf MEMO,1

Es una instrucción que decrementa en una unidad el contenido de un registro. El


resultado se almacena en el mismo registro, o en su defecto, en el registro de trabajo W. Si el
valor de d es igual a cero, el resultado se cargará en W. Si d es igual 1, el resultado se
almacenará en el propio registro, (que para este caso es MEMO). Esta instrucción afecta el bit Z
del registro STATUS. A continuación se muestra un ejemplo:

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (MEMO) 00010100 20 14
Número B (W) 11110001 241 F1

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (MEMO) 00010011 19 13
Número B (W) 11110001 241 F1

Instrucción decfsz (DECREMENT F, SKIP IF ZERO)

Tema: Micro-controlador PIC 16F84 Página 57 de 70


decfsz DATO,1

Su sintaxis es DECREMENT FILE SKIP IF ZERO. Decrementa el registro en una


unidad y salta la instrucción siguiente cuando el registro se hace cero.

Decrementa el contenido del registro DATO en una unidad, el resultado se guarda en


el mismo registro (después de la coma existe un 1). Instrucción muy utilizada en el diseño de
temporizadores. Preste atención sobre esto: Si el resultado es nulo, ignora la siguiente
instrucción y sigue con la segunda. Es decir, de cumplirse la comparación el contador de
programa se incrementa en dos.

Lo curioso de esta operación es que a pesar de que el registro DATO, en un


determinado momento, tome el valor de cero no existe cambio en ningún bit del registro
STATUS.

Figura 3-10.

En el ejemplo de la figura 3-10 se distinguen los dos caminos que puede seguir la
instrucción decfsz. La instrucción decrementa en una unidad el contenido del registro DATO y a
su vez, pregunta si el registro DATO ha llegado a cero. De cumplirse esta condición, salta a la
segunda instrucción, pues el contador de programa se incrementa en dos, omitiendo la
instrucción siguiente (clrw), paso 1. Si el registro no ha llegado a cero, sigue de forma normal
con la instrucción siguiente, paso 2.

Instrucción incf (INCREMENT 1)

incf TIEMPO, 0

Incrementa en una unidad el contenido del registro TIEMPO, el 0 después de la coma


obliga a que el resultado se almacene en el registro W, por lo cual el valor de TIEMPO
permanecerá constante. Si en cambio después de la coma, se hubiese colocado un 1, se habría
incrementado el registro TIEMPO, almacenándose dicho valor en el mismo registro TIEMPO.
Esta operación modifica el bit Z del registro STATUS.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (TIEMPO) 00010100 20 14
Número B (W) 11110001 241 F1

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (TIEMPO) 00010100 20 14
Número B (W) 00010101 21 15
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Instrucción incfsz (INCREMENT F, SKIP IF ZERO)

incfsz TEMP, 1

La sintaxis que presenta esta instrucción es la siguiente: Incremente f (dato) y salte


(skip) si es cero (z). Su acción es incrementar el contenido del registro TEMP en una unidad,
guardando el resultado en el mismo registro, ya que después de la coma hay un 1. Si el resultado
es nulo ignora la siguiente instrucción y sigue con la segunda. Esta operación no afecta el bit Z
del registro STATUS.

Figura 3-11

Con el ejemplo 3-11, se llega a la conclusión que al realizar la instrucción incfsz


pueden existir dos posibilidades en la decisión.

En la ejecución de la instrucción se incrementa en una unidad el contenido del


registro TEMP y a su vez se pregunta si el registro TEMP ha llegado a cero, por
desbordamiento. De cumplirse la condición, el contador de programa se incrementa en dos
omitiendo la instrucción siguiente (goto ENCENDER), paso 1. Produciéndose un salto a la
segunda instrucción. Si el registro no ha llegado a cero sigue secuencialmente con la instrucción
correlativa paso 2.

Instrucción iorwf (INCLUSIVE OR W WITH F)

iorwf NUN, 1

Esta instrucción efectúa una OR lógico entre el contenido de NUM y el registro de


trabajo W. Debido a que se ha colocado un 1, después de NUM separado por una coma, nos
indica que el resultado se almacena en el registro NUM. Esta operación afecta el Bit Z del
registro especial STATUS.

Tabla de verdad de una compuerta or inclusiva:

A B Resultado
0 0 0
0 1 1
1 0 1
1 1 1

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (NUM) 00010100 20 14
Número B (W) 11110001 241 F1
Acarreo (Estado, Z) 0 0 0

Tema: Micro-controlador PIC 16F84 Página 59 de 70


Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (NUM) 11110101 245 F5
Número B (W) 11110001 241 F1
Acarreo (Estado, Z) 0 0 0

Instrucción movf (MOVE F)

movf NÚMERO, 0

Es un desplazamiento o transferencia que se produce de un registro a otro (o a sí


mismo). En otras palabras se mueve el contenido de un registro llamado fuente a otro registro
llamado destino. Si hay un ‘1’ o un ‘0’ después de la coma, la transferencia será al propio
registro o al registro W, respectivamente.

Cabe preguntar qué sentido tiene transferir un registro a su propio registro. La


respuesta es simples es una manera rápida de conocer si el contenido de esa posición memoria,
es cero. De serlo, el bit Z será ‘1’ en el registro STATUS.

Existen tres tipos de operaciones para esta instrucción.

1. La transferencia del contenido de un registro, se realiza sobre sí mismo.


2. La transferencia se realiza sobre el registro W, muy utilizado en la práctica.
3. La transferencia de literales sobre el registro W.

movf DATO,1

movf DATO,F

En el ejemplo anterior, la instrucción mueve el dato a su misma posición. Ciertamente


no altera el contenido de la memoria, pero si modifica el bit Z del registro STATUS. Esto es de
utilidad para conocer si la memoria presenta algún contenido, o llegó a cero por alguna otra
instrucción. Las instrucciones que se muestran en el ejemplo anterior son iguales (previamente
es necesario definir que F = l), ya que el compilador después de la coma interpreta que debe
alojar el contenido en el mismo registro. Si olvidamos la coma y el dígito 0 ó 1, el ensamblador
tomará el 1 por defecto. Es decir el resultado lo guardará en el mismo registro.

movf PRUEBA, 0

movf PRUEA,W

En el ejemplo anterior, la instrucción es la misma pero para este caso, el registro


especificado como PRUEBA, es transferido al registro de trabajo W, nuevamente se activará el
bit Z del registro STATUS, si el contenido del registro leído de la RAM es cero. La notación
después de la coma en ambos casos representa Jo mismo (recuerde ante haber definido W equ
0).

Es de interés recalcar que la utilización de W y F en el valor de d (destino), por sus


iguales 0 ó 1, es muy útil, porque al nombrarlas de este modo es más fácil su interpretación (es
necesario previamente en el programa definir esas igualdades de F = l y W = 0).

Instrucción movwf (MOVE W TO F)


Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
movwf DATO

Mueve el contenido del registro de trabajo W a un registro o posición de memoria


llamada DATO. Esta instrucción es utilizada frecuentemente para almacenar un dato en una
posición de memoria de la RAM, aprovechando nuestro comodín W. Evidentemente el valor
anterior de DATO se pierde.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010100 20 14
Número B (W) 11110001 241 F1
Acarreo (Estado, Z) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 11110001 241 F1
Número B (W) 11110001 241 F1
Acarreo (Estado, Z) 0 0 0

Las instrucciones mov, movwf y movlw se las llama instrucciones de traslados o


transferencias, pues realizan movimientos de datos.

Las instrucciones addwl, subwf, incf, decf y comf son las llamadas instrucciones
aritméticas, por ser realizadas por la ALU.

Las instrucciones and, or y xor se las denomina instrucciones lógicas.

Instrucción nop (NO OPERATION)

nop

Es una instrucción que no hace nada, es decir, consume un ciclo de instrucción o de


trabajo. Se la utiliza para corregir los temporizadores que se diseñan por decremento o
incremento de un contador, ya que le suma al lazo, el tiempo de un ciclo de instrucción.
También es utilizado para estabilizar las lecturas o escrituras de algunos registros,
especialmente los puertos.

Instrucción rlf (ROTATE LEFT F)

rlf PILA,1

Es una instrucción que realiza un desplazamiento a la izquierda de todos los bits de un


registro, que en este ejemplo se denomina PILA. Por haberse colocado después de la coma un 1,
el resultado queda en el mismo registro PILA. En la rotación interviene el bit Carry C, del
registro STATUS.

Tema: Micro-controlador PIC 16F84 Página 61 de 70


Figura 3-12

Según se observa en la figura 3-12, la instrucción empuja todos los dígitos a la


izquierda. El dígito de mayor peso del registro PILA es transferido al C y el bit de menor peso
del mismo registro es reemplazado por lo que antes tenía C.

En este movimiento de bits, participa el Carry (C) del registro STATUS. Por lo tanto
los resultados obtenidos en la rotación, dependerán del estado binario que posea C.

Si observamos con detenimiento, vemos claramente que la rotación a la izquierda


tiene el mismo efecto de duplicar el registro, o de multiplicar por dos si C es cero.

Instrucción rrf (ROTATE RIGHT F)

rrf DATO,l

Es una instrucción que permite realizar un desplazamiento a la derecha de todos los


bits del registro DATO, si colocamos un 1 después de la coma, el resultado quedará en el mismo
registro DATO. En la rotación interviene el bit C.

Figura 3-13
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
La instrucción rotación a la derecha, es similar a la de rotación a la izquierda, es decir,
se empujan todos los bits del registro involucrado más el bit C del registro STATUS, en uno u
otro sentido. Podemos decir que el registro y el bit C (en total 9 bits), forman un conjunto en
esta acción de desplazamiento.

Cada vez que se realiza esta operación se debe tener especial cuidado de prefijar el
valor de C, ya que este bit participa de la rotación y modifica el resultado de la operación.

Si después de la instrucción hubiéramos colocado un 0 después de la coma, el registro


PILA no se habría visto afectado por la rotación, pero no así el registro de trabajo W que habría
modificado su contenido.

Esta instrucción es muy empleada para manejar teclados matriciales. Se hace rotar un
cero a lo largo de las columnas del teclado, luego al puerto que explora las filas se le realiza una
determinada comparación y se logra ubicar el cero. Desde ese momento se sabe con certeza si se
ha apretado una tecla. Completadas las cuatro rotaciones debemos cargar a C con ‘1’.

Para C = 0, la rotación a la izquierda, rlf es equivalente a multiplicar por dos. Para C


= 0, la rotación a la derecha, rrf es equivalente a dividir por dos.

Instrucción subwf (SUBTRACT W FROM F).

subwf CONTADOR, 1

Mediante la instrucción subwf, el contenido del registro W es restado del registro


variable CONTADOR. La configuración general se muestra en el ejemplo de la figura 3-13.

Figura 3-13

Si comprendió la adición, verá que la sustracción es ejecutar la misma operación de


adición, con un paso previo que consiste en efectuar el complemento a 2 del sustraendo.

Veremos una sustracción en la que el registro CONTADOR es mayor que W.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (CONTADOR) 11110001 241 F1
Número B (W) 00010100 20 14
Acarreo (Estado, Z) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (CONTADOR) 11011101 221 DD
Número B (W) 11110001 241 F1
Acarreo (Estado, Z) 0 0 0

Tema: Micro-controlador PIC 16F84 Página 63 de 70


Minuendo (registro f) sea mayor que el sustraendo (registro w), C = 1.

Minuendo (registro f) sea menor que el sustraendo (registro w), C = 0.

Instrucción swapf (SWAP HALVES F)

swapf MEMO,1

Es una instrucción que realiza el cambio entre los nibbles del registro, es decir que
intercambia los 4 bits de menor peso, por los 4 bits de mayor peso. Permuta mitades de un
registro, tal corno nos muestra la figura 3-14.

Figura 3-14

Cuando esté más familiarizado con los PIC, se dará cuenta de que esta instrucción es
útil, ya que permite implementar contadores de doble efecto. Posibilita incrementar o
decrementar las mitades independientemente teniendo la precaución de no equivocarnos en la
selección de esas mitades o nibbles.

Instrucción xorwf (EXCLUSIVE OR W AND F)

xorwf DATO, 1

Esta instrucción efectúa una OR EXCLUSIVA entre el contenido del registro W


(registro de trabajo) y el contenido del registro f (DATO), almacenándose el resultado en DATO
(por el 1 después de la coma). En consecuencia, se ha perdido el contenido anterior que tenía
DATO, no así el de W, que ha permanecido invariable. Esta operación altera el bit Z del registro
STATUS.

Volvamos a escribir un ejemplo muy simple, para así poder evaluar mejor la
instrucción OR.

Tabla de Verdad para función Exclusive OR (XOR)

A B Resultado
0 0 0
0 1 1
1 0 1
1 1 0
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II

A continuación se muestra como trabaja esta instrucción:

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 00010100 20 14
Número B (W) 11110001 241 F1
Acarreo (Estado, C) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


Número A (DATO) 11100101 229 E5
Número B (W) 11110001 241 F1
Acarreo (Estado, C) 0 0 0

Realiza una lógica OR exclusiva entre dos números binarios de 8 bits, para que el
resultado de ‘1’, los bits correspondientes deben ser diferentes.

Como regla práctica, se puede decir que, cada vez que los bits del mismo peso sean
iguales, en el resultado aparecerá un cero. Solamente se obtendrá un ‘1’, cuando en las
comparaciones bit a bit, exista una desigualdad. En efecto, a valores iguales, el resultado es
cero. La mayoría de las veces, se la utiliza para comparar cantidades o para saber si el contenido
de un registro ha llegado a un número prefijado, porque la OR exclusiva de dos cantidades
iguales, genera un ‘1’ en el bit Z, del registro STATUS.

3. OPERACIONES CON LITERALES

Son instrucciones que realizan alguna función con un literal. Figura 3-15.

Mnemónico Operación Ejecuta Estado


ADDLW W+k Suma el registro W con el literal k C, DC, Z
ANDLW W&k Hace una AND entre W y el literal k Z
IORLW Wvk Hace una OR inclusiva entre W y k Z
MOVLW k W Copia el literal k en el registro W -
SUBLW F–W Resta del literal k el contenido de W C, DC, Z
XORLW Wvk Hace una OR exclusiva entre W y k Z

Figura 3-15

Esta serie de instrucciones son las llamadas literales o inmediatas, ya que realizan una
operación con un valor de 8 bits, que aparece en el formato de la instrucción. El resultado de la
operación se introduce en el registro W.

Son muy útiles, mediante éstas el registro de trabajo realice alguna operación con un
byte constante. El registro destino es aquel en donde se almacena el resultado de la operación.

Tema: Micro-controlador PIC 16F84 Página 65 de 70


Con relación a las instrucciones de operaciones literales, conviene advertir que las
instrucciones primera y quinta, de la figura 3-15, son instrucciones que le pertenecen
únicamente a los micro-controladores de la gama media y alta.

Instrucción addlw (ADD LITERAL TO W)

Es una instrucción de suma, o de adición, entre el registro de trabajo W y un dato


literal, el resultado queda almacenado en el registro W. Las tres instrucciones son exactamente
iguales, utilice cualquiera según su preferencia.

En el primer ejemplo de la figura anterior, se puede observar que si el valor de W es


cero, el resultado que se almacena en el registro W, por supuesto, nos da el mismo valor del
literal, los bits C, DC y Z del registro STATUS, se colocarán en cero. NO ha existido ningún
rebase del nible (DC = 0), tampoco ha existido acarreo (C = 0) y por supuesto al no ser cero el
registro W, el bit Z = 0.

En el segundo ejemplo de la figura anterior, se ha establecido que el registro de


trabajo W, contenga el valor hexadecimal 6D y el literal presenta el valor de 23h. Si se aplica la
instrucción literal de suma, entonces el bit Z, debe ser igual a cero, debido a que toda la
operación no es cero. El nible de menor peso binario de W, que es D, más el nibble de menor
peso del hexadecimal 23, es 3, ambos sumados rebasan el valor máximo de F, entonces la
bandera DC pasará a ‘1’.

Instrucción andlw (AND LITERAL TO W)

andlw F1h
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
Esta operación es llamada AND lógico. Consiste en realizar una AND entre el
contenido del registro W (registro de trabajo), con el literal hexadecimal, el resultado queda en
W.

Esta operación altera el bit Z del registro de estado (STATUS). Este bit será ‘1’,
cuando toda la operación se haga cero. Los bits C y DC no intervienen en esta operación lógica.

Esta instrucción, realiza una lógica AND entre dos números binarios de 8 bits, para
que el resultado de una AND dé como resultado ‘1’, los bits que se comparan tendrán que ser
ambos ‘1’. Cualquier cero presente en uno de los bits de igual peso binario en los registros,
obligará un cero como resultado de ese bit.

Lo que sigue es un ejemplo, que el estudiante avanzado podrá sortear, pero para
aquellos sin tanta experiencia, les será de utilidad para entender mejor la instrucción AND.

A continuación se muestra como trabaja esta instrucción:

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 00010100 20 14
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 00010000 16 10
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Instrucción iorlw (INCLUSIVE OR LITERAL TO W)

iorlw F1h

Esta instrucción efectúa un OR lógico entre el contenido de W y el literal F1h. Esta


operación afecta el bit Z del registro STATUS.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 00010100 20 14
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 11110101 245 F5
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Tema: Micro-controlador PIC 16F84 Página 67 de 70


Esta instrucción es de suma utilidad previo a efectuar transferencias de registros al
puerto (destino), debido a que no afecta el estado de los bits cuyo estado sea un 1’. Si en
cualquier punto del programa, lo que se busca es encender un led o excitar un relé, esta
instrucción es ideal, ya que no afecta el estado de aquellos bits que no deseamos alterar. Bastará
con aplicar esta instrucción entre el puerto y un literal, cuyos bits sean todos 0’, excepto el del
bit que pretendemos colocar en ‘1’ (para excitar ese led o relé).

Instrucción movlw (MOVE LITERAL TO W)

movlw k

Mueve el contenido del literal k al registro de trabajo W, es decir realiza la carga, o


escritura del registro W, con un valor constante. En el ejemplo 4-21 de este mismo capítulo, se
ha explicado brevemente la instrucción para un caso particular.

Instrucción sublw (SUBTRACT W FROM LITERAL)

sublw k

Es una instrucción que permite realizar sustracciones de valores literales con el


contenido que posee el registro de trabajo W.

Los cambios y consideraciones de los bits C, DC y Z, se han tratado con extensión en


las instrucciones subwf.

Instrucción xorlw (EXCLUSIVE OR TO W)

xorlw F1h

Esta operación realiza una OR EXCLUSIVA entre el contenido del registro W


(registro de trabajo) y el contenido del literal k. El resultado queda almacenado en W, por lo
tanto se pierde el contenido anterior que tenía W.

Esta operación altera el bit Z del registro STATUS.

Antes de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 00010100 20 14
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Después de ejecutar la instrucción:

Binario Decimal Hexadecimal


W 11100101 229 E5
LITERAL (K) 11110001 241 F1
CERO (Estado, Z) 0 0 0

Brevemente se puede afirmar que, si los bits de igual peso son iguales, el resultado de
ese bit es cero. Por esta razón la instrucción es muy útil cuando se desea conocer si algún
registro ha llegado a la cuenta deseada. Sólo bastará comparar una constante (literal) y la cuenta
deseada. El bit Z del registro STATUS será ‘1’, cuando el registro y el literal sean iguales.
Esc.: 4-003 “Ing. Emilio Civit” Profesor: Paulino Martínez
Curso: 6° Año Mat.: Apuntes de Electrónica II
4. OPERACIONES DE CONTROL Y ESPECIALES

Mnemónico Operación Ejecuta Estado


CALL PC = k PC salta al STACK y se carga con k -
CLRWDT WDT = .255 Reinicia el WATCHDOG TO, PD
GOTO PC = k PC se carga con k -
RETFIE PC = STACK Retorna de una interrupción -
RETLW W=k Retorna de un CALL y copia k en W -
RETURN PC = STACK Retorna de un CALL -
Se duerme lo despierta WDT ó una
SLEEP TO, PD
interrupción

Instrucción call (CALL SUBRUTINE)

call k

Esta es una instrucción que llama a una subrutina. La secuencia de pasos de esta
instrucción es la siguiente:

• Al encontrar la instrucción call y antes de saltar (dirección de retorno), el


contenido del Contador de Programa, se guarda automáticamente,
incrementado en una unidad, en una memoria PILA o STACK.
• La secuencia del programa salta a la nueva dirección, en donde se ubica esta
subrutina (tenga en cuenta que el PC se modificó).
• Ejecuta las instrucciones que allí existen, hasta encontrar la instrucción
RETLW.
• Cuando ejecuta esta instrucción, finalmente, recupera del STACK la
dirección de retorno. Regresa al programa principal y prosigue en forma
normal.

La estructura de un buen programa debe ser bien legible. En cualquier momento


debemos poder interpretar su funcionamiento en forma clara y precisa. El programador podrá
utilizar el recurso de las subrutinas para programas bien organizados. Las subrutinas se emplean
para evitar la repetición de ciertos pasos del programa y colaboran en hacer más simple su
comprensión. A medida que se familiarice cori la programación, verá la conveniencia en
emplear subrutinas.

Instrucción clrwdt (CLEAR WATCHDOG TIMMER)

clrwdt

Es una instrucción del grupo especial. Es esencial cuando se emplea el Watchdog y


tiene la particularidad de reiniciar la cuenta del mismo. La instrucción carga con el valor
prefijado el WDT, que está permanentemente decrementando. No olvide que si el WDT llega a
cero, obliga a un reset del micro-controlador.

Instrucción goto (GO TO ADDRESS)

goto SAI.TO

Es una instrucción que obliga a que el contador de programa salte a una nueva
dirección, realizando una nueva tarea que se le ha encomendado, en otra parte diferente del
programa. También se la llama instrucción de salto incondicional.

Tema: Micro-controlador PIC 16F84 Página 69 de 70


Instrucción retlw (RETURN, PLACE LITERAL IN W)

retlw k

Esta instrucción está íntimamente relacionada con las subrutinas, dado que nos indica
la terminación de la misma y su retomo inmediato con la carga en W, con un literal que
ubicaremos a la derecha de la instrucción, además carga al.PC con el valor que previamente
almacenó en el STACK. Esta instrucción tarda dos ciclos de instrucción. Siempre es necesario
que W regrese con un valor literal, muchas veces será conveniente colocar retlw O. Es decir que
el registro de trabajo W, regresa con el valor cero.

Una aplicación interesante de la instrucción retlw, es que nos permite retomar con
algún parámetro de la subrutina, que se puede utilizar en el programa principal. Una de las
aplicaciones más útiles consiste en confeccionar tablas a partir de la carga del contador de
programa y retornar con un literal.

Instrucción sleep (STANDBY MODE)

sleep

Es una instrucción que detiene todas las funciones del micro-controlador, inclusive el
oscilador, de este modo su consumo disminuye drásticamente. En este estado, no ejecuta
ninguna instrucción más. Además se modifican los bits TO y PD del registro STATUS.

MODOS DE DIRECCIONAMIENTO

Habiendo estudiado la mayoría de las instrucciones, resulta conveniente ahora tratar


de explicar los modos de direccionamiento. Comenzaremos con la línea PIC 16C5x, de
Microchip. Por la simpleza y arquitectura interna del direccionamiento en esta línea, el
tratamiento de este tema, también resultará simple. Los modos de direccionamiento son los
siguientes:

Direccionamiento inmediato. Utilizan este direccionamiento todas las instrucciones


que realizan manipulaciones de datos, con un operando de 8 bits, llamado literal. Es decir, que
en el código de la instrucción viene junto el valor literal. Por ejemplo la instrucción addlw k,
suma en forma inmediata, el valor literal k, al registro de trabajo W. Todas las instrucciones que
manejan valores literales, las podemos considerar de direccionamiento inmediato.

Direccionamiento directo. Es el direccionamiento más utilizado, ya que la mayoría


de las instrucciones presentan este tipo de direccionamiento. La línea baja de la familia tiene
pocas posiciones de memoria. Este modo de direccionamiento, tiene la particularidad de que en
la codificación de la instrucción, viene incorporada la dirección, de las posiciones existentes en
la RAM.

Direccionamiento indirecto. En este caso, para expresarlo de un modo simple, se dice


que la dirección del operando o dato, se ubica en otro registro de la RAM. Se utiliza como
operando al registro INDF, que ocupa la posición 00h. Este tipo de direccionamiento hace uso,
conjuntamente, de un segundo registro llamado FSR. Los bits de menor peso (0 a 4) de FSR,
seleccionan una posición de la RAM y el banco al cual se quiere acceder, lo determinan los bits
5 y 6. Para el PIC 16C54 los bits 5 y 6 de FSR no son utilizados (ya que tiene un solo banco de
datos). Toda invocación a INDF, utiliza el contenido de FSR, que a su vez nos direcciona un
lugar de la RAM.

También podría gustarte