Vous êtes sur la page 1sur 48

MICROCONTROLADORES

1. Introducción.

En las aplicaciones sencillas resultan preferibles las soluciones no programables que no requieren desarrollo
de software. Escribir software consume mucho tiempo por lo que resulta más costoso y en aplicaciones
sencillas y/o de poca tirada a menudo es más razonable efectuar tareas en hardware. Sin embargo, conforme
aumenta la complejidad del sistema, aumentan las ventajas del uso de sistemas programables.

Una de las principales ventajas de los sistemas programables es su flexibilidad, lo que permite actualizar el
funcionamiento de un sistema tan sólo mediante el cambio del programa sin tener que volver a diseñar el
hardware. Esta flexibilidad es muy importante, al permitir que los productos se actualicen con facilidad y
economía.

1.1. Referencia histórica.

En el año 1971 la compañía de semiconductores Intel lanzó al mercado el primer microprocesador, lo que
supuso un cambio decisivo en las técnicas de diseño de los equipos de instrumentación y control. Este circuito
integrado contenía todos los componentes de la unidad central de procesos (CPU) de una computadora dentro
de un solo dispositivo. Los fabricantes, conscientes de la importancia de este mercado, crearon una amplia
gama de estos circuitos integrados, constituyendo familias de microprocesadores.

En el año 1976, gracias al aumento de la densidad de integración de componentes en un circuito integrado,


salió a la luz el primer ordenador en un chip, es decir se integraron junto con el microprocesador otros
subsistemas que anteriormente formaban unidades independientes (memoria, entradas/salidas, etc.). A este
nuevo integrado se le denominó microcomputadora
monopastilla.

Cuando los sistemas basados en microprocesadores se especializan en aplicaciones industriales, aparece la


versión industrial de la microcomputadora monopastilla, el microcontrolador (µC). Estos dispositivos
producen un obvio beneficio en aplicaciones pequeñas. Su característica más sobresaliente es que son
sistemas integrados.

1
¿Qué es un microcontrolador?

Es un circuito integrado programable que puede ejecutar un sin número de tareas y procesos, con la
capacidad para manejar señales de entrada y salida, así como para procesar datos y tomar decisiones gracias a
las instrucciones de un programa almacenado en su memoria interna.

Es un circuito integrado que contiene todos los componentes de un computador. Se emplea para controlar el
funcionamiento de una tarea determinada y, debido a su reducido tamaño, suele ir incorporado en el propio
dispositivo al que gobierna. Esta última característica es la que le confiere la denominación de «controlador
incrustado» (embedded controller). Se dice que es “la solución en un chip” porque su reducido tamaño
minimiza el número de componentes y el coste.

El microcontrolador es un computador dedicado. En su memoria sólo reside un programa destinado a


gobernar una aplicación determinada; sus líneas de entrada/salida soportan e conexionado de los sensores y
actuadores del dispositivo a controlar. Una vez programado y configurado el microcontrolador solamente
sirve para gobernar la tarea asignada.

“Un microcontrolador es un computador completo, aunque de limitadas prestaciones, que está contenido en el
chip de un circuito integrado y se designa a gobernar una sola tarea”.

El número de productos que funcionan en base a uno o varios microcontroladores aumenta de forma
exponencial. Casi todos los periféricos del computador (ratón, teclado, impresora, etc.) son regulados por el
programa de un microcontrolador. Los electrodomésticos de línea blanca lavadoras, hornos, etc.) y de línea
marrón (televisores, videos, aparatos de música, etc.) incorporan numerosos microcontroladores. Igualmente,
los sistemas de supervisión, vigilancia y alarma en los edificios utilizan estos chips para optimizar el
rendimiento de ascensores, calefacción, alarmas de incendio, robo, etc. Ofrecen la única solución práctica a
muchos problemas de diversos campos:

1. Periféricos y dispositivos auxiliares de los computadores.


2. Electrodomésticos.
3. Aparatos portátiles y de bolsillo (tarjetas, monederos, teléfonos, etc.)
4. Máquinas expendedoras y juguetería.
5. Instrumentación.
6. Industria de automoción (Figura 1).
7. Control industrial y robótica.
8. Electromedicina.
9. Sistema de navegación espacial.
10. Sistemas de seguridad y alarma. Domótica en general.

Figura 1. Aplicaciones del microcontrolador en un utomovila

2
1.3. Diferencia entre microcontrolador y microprocesador.

El microprocesador es un circuito integrado que contiene la Unidad Central de Proceso (CPU), también
llamada procesador de un computador. Al microprocesador se le conecta la Memoria y Módulos de E/S para
configurar un computador implementado por varios circuitos integrados.

Un microprocesador es un sistema abierto (configuración variable) con el que puede construirse un


computador con las características que se desee, acoplándole los módulos necesarios. Un microcontrolador es
un sistema cerrado que contiene un computador completo y de prestaciones limitadas que no se pueden
modificar.

Figura 2 (a)Estructura de un sistema abierto basado en un microprocesador. (b) Microcontrolador.

Decidirse por construir el sistema con el microprocesador, o utilizar directamente el microcontrolador


dependerá de la economía. Si el C está limitado por su propia CPU, es necesario elegir un P potente y
añadir los buffers, drivers, decodificadores, memorias, etc. pertinentes. Generalmente, salvo que la aplicación
exija grandes prestaciones, el µC será una solución válida, con la ventaja de que reduce el espacio y el
hardware.

3
Fabricantes.

Gran parte de los fabricantes de circuitos integrados disponen de su propia línea de microcontroladores. En la
tabla 1 se relacionan los fabricantes más destacados.

Tabla 1. Algunos fabricantes de C con algunos modelos.

Cada fabricante de microcontroladores oferta un elevado número de modelos diferentes, desde los más
sencillos hasta los más poderosos, de forma que es posible seleccionar la capacidad de la memoria, el número
de líneas de E/S, la cantidad y potencia de elementos auxiliares, la velocidad de funcionamiento, etc.

Se considera a Intel como el padre de los microcontroladores y al 8048 como el primer microcontrolador de 8
bits (fabricado por Intel en la década de los 70). Otra de las principales empresas del mundo de dispositivos
programables es Motorola, que dispone del potente microcontrolador 68HC11.

Los microcontroladores PIC de la empresa americana Microchip se emplean en la actualidad cada vez más
debido a su reducido consumo, bajo coste, pequeño tamaño, facilidad de uso y la abundancia de información
y herramientas de apoyo.

4
Arquitectura interna de un microcontrolador.

Un microcontrolador posee todos los componentes de un computador, pero con características fijas que no se
pueden alterar.

Las partes principales son:

• Procesador o Unidad Central de Proceso (CPU).


• Memoria no volátil para contener el programa.
• Memoria de lectura y escritura para guardar los datos.
• Líneas de E/S para los periféricos (comunicación serie, paralela, etc.).
• Recursos auxiliares:
• Circuito de reloj.
• Temporizadores.
• Perro guardián (Watchdog).
• Convertidores A/D y D/A.
• Comparadores analógicos.
• Protección ante fallos de alimentación.
• Estado de reposo en bajo consumo.

La comunicación entre las principales secciones de un sistema computador (basado en microcontrolador o en


microprocesador) tiene lugar sobre un cierto número de buses. Un bus está compuesto de líneas paralelas de
datos que permiten flujo de información en uno o ambos sentidos (se pueden considerar un conjunto de
conductores paralelos). La Figura 4 muestra la estructura de buses de un sistema típico. Se usan tres buses:

• Bus de datos. Se emplea para transferir datos. El número de líneas de este bus igual a la longitud de
palabra del dispositivo.

• Bus de direcciones. Permite transferir información de direcciones. El número de líneas en el bus de


direcciones determina el numero de posiciones de memoria que el procesador puede especificar. Un bus
de direcciones de 8 líneas sería capaz de posicionar sólo 28 (256) direcciones.

• Bus de control. El procesador utiliza las líneas del bus de control para sincronizar operaciones con
componentes externos.

Figura 4. Estructura de buses un sistema típico

Por ejemplo, si el procesador o microcontrolador deseara almacenar una palabra de datos en una ubicación de
memoria particular, colocaría los datos en el bus de datos, la dirección en la que se van a almacenar los datos
en el bus de direcciones y diversas señales de control para sincronizar la operación de almacenamiento en el
bus de control.

5
Procesador.

Es el elemento más importante del microcontrolador tanto a nivel hardware como software. Se encarga de
direccionar la memoria de instrucciones, recibir el código OP (opcode) de la instrucción en curso, su
decodificación y la ejecución de la operación aritmética o lógica que implica la instrucción, así como la
búsqueda de los operandos y el almacenamiento del resultado.

La necesidad de conseguir rendimientos elevados en el procesamiento de las instrucciones ha desembocado


en el empleo generalizado de procesadores de arquitecturaHardvard, frente a los tradicionales que seguían la
arquitectura de Von Neuman. Esta última se caracteriza porque la CPU se conectaba a una memoria única
donde coexistían datos e instrucciones a través de un sistema de buses. En la arquitectura Harvard son
independientes la memoria de instrucciones y la memoria de datos y cada una dispone de su propio sistema de
buses para el acceso. Esto propicia el paralelismo (Figura 5).

Figura 5 arquitectura Harvard

Almacenamiento y ejecución del programa.

Un programa es una lista de instrucciones al procesador. Todos los µP y µC tiene un conjunto de


instrucciones que pueden ejecutar. Cada tipo de procesador y controlador tiene su propio conjunto de
instrucciones (set de instrucciones), y por lo general los programas escritos para una máquina no funcionarán
en otra.

Un µC típico tendrá instrucciones para: transferir información entre registros y memoria; realizar operaciones
aritméticas y lógicas; efectuar comparaciones y pruebas sobre el contenido de sus registros de memoria;
controlar la secuencia de ejecución de programas.

Por lo general la operación que una instrucción ha de ejecutar está definida por un código de operación, (en
C sencillos generalmente de un solo byte) conocido también como opcode. Algunas instrucciones requieren
además del opcode información extra (operandos). Por ejemplo, una instrucción para almacenar el contenido
de un registro en una posición de memoria,
necesitará incluir la dirección de memoria de destino.

La unidad de control y decodificación de instrucciones es el corazón del procesador. Es la encargada de


extraer de forma secuencial las instrucciones de la memoria y luego ejecutarlas.
Unido a la unidad de control se encuentra un generador de reloj, que utiliza un oscilador para producir una
señal de reloj muy precisa. El tiempo se divide en un cierto número de ciclos de reloj.

El funcionamiento de la unidad de control y decodificación de instrucciones se puede dividir en dos partes


(ambas duran varios ciclos de reloj):

6
• Ciclo de búsqueda de instrucciones. En él se transfiere la dirección de la siguiente instrucción al bus de
direcciones, se envía una orden de lectura a los dispositivos de memoria a través del bus de control, se lee
la información del bus de datos, y si se trata del primer byte de una instrucción, se transfiere este byte al
registro de instrucciones.

• Ciclo de ejecución de instrucciones. En él se ejecuta la instrucción. El registro de instrucciones está


conectado a un decodificador, que determina cuántos bytes de información adicionales se requieren.
Éstos se cargan mediante ciclos de búsqueda, como se indicó con anterioridad.

Cuando la ejecución está completa, la máquina comienza automáticamente el ciclo de búsqueda de la


siguiente instrucción del programa. La ejecución es por tanto, una secuencia continua de ciclos de búsqueda y
ejecución.

El procesador de los modernos microcontroladores responde a la arquitectura RISC (Computadores de Juego


de Instrucciones Reducido), que se identifica por tener un repertorio de instrucciones máquina pequeño y
simple, de forma que la mayor parte de las instrucciones se ejecutan en un ciclo de instrucción.

7
Memoria de programa.

El microcontrolador está diseñado para que en su memoria de programa se almacenen todas las instrucciones
del programa de control. Como el programa a ejecutar siempre es el mismo, debe estar grabado de forma
permanente. Son posibles cinco tipos de memoria:

• ROM de máscara. Esta memoria se graba en el chip durante el proceso de fabricación. Los altos costes
de diseño sólo aconsejan usarla cuando se precisan series grandes.

• EPROM. En la superficie de la cápsula del microcontrolador existe una ventana de cristal por la que se
puede someter al chip a rayos ultravioletas para producir el borrado de la memoria y emplearla
nuevamente. Su coste unitario es elevado.

• OTP (One Time Programmable). Este modelo de memoria sólo se puede grabar una vez por parte del
usuario. Su bajo precio y la sencillez de la grabación aconsejan este tipo de memoria para prototipos
finales y series de producción cortas.

• EEPROM. La grabación es similar a la EPROM y OTP, pero el borrado es mucho más sencillo al
poderse ejecutar eléctricamente las veces que se quiera.

• FLASH. Se trata de una memoria no volátil de bajo consumo que se puede escribir y borrar en circuito al
igual que la EEPROM, pero suele disponer de mayor capacidad que estas últimas. El borrado sólo es
posible de bloques completos y no se puede realizar de posiciones concretas. Por sus mejores
prestaciones está sustituyendo a la memoria EPROM para contener instrucciones.

Memoria de datos.

Los datos que manejan los programas varía continuamente y eso exige que la memoria que los contiene deba
ser de lectura y escritura. La memoria RAM estática (SRAM) es la más apropiada aunque sea no volátil. Hay
microcontroladores que poseen como memoria de datos una memoria de escritura y lectura no volátil del tipo
EEPROM. De este forma, un corte en el suministro de la alimentación no ocasiona la pérdida de la
información.

8
Líneas de E/S para los controladores de periféricos.

A excepción de las patillas destinadas a recibir la alimentación, el cristal que regula la frecuencia de trabajo y
el reset, las restantes patillas de un microcontrolador sirven para la comunicación con los periféricos externos.

Recursos auxiliares.

Según las aplicaciones cada modelo de microcontrolador incorpora una diversidad de complementos que
refuerzan la potencia del dispositivo. Entre los más comunes se encuentran:

• Circuito de reloj, encargado de generar los impulsos que sincronizan el funcionamiento de todo el
sistema.
• Temporizadores, orientados a controlar tiempos.
• Perro guardián (watchdog), destinado a provocar una reinicialización cuando el programa se queda
bloqueado.
• Conversores A/D y D/A para poder recibir y enviar señales analógicas.
• Estado de reposo, en el que el consumo de energía se reduce al mínimo.

9
La familia PIC.

Dado que las aplicaciones sencillas precisan pocos recursos y las aplicaciones más complejas requieren
numerosos y potentes recursos, Microchip construye diversos modelos de microcontroladores orientados a
cubrir las necesidades de cada proyecto. Siguiendo esta filosofía Microchip oferta diferentes gamas de
microcontroladores:

• PIC12CXXX gama baja( 8-pin, palabra de programa de 12 bits/14 bits):


o Bajo consumo.
o Memoria de datos EEPROM.
• PIC16C5X, gama baja o clásica ( palabra de programa de 12 bits):
o Encapsulados de 14, 18, 20 y 28 pines.
o Óptimo para aplicaciones que trabajan con baterías (bajo consumo).
• PIC16CXXX, gama media (palabra de programa de 14 bits).
o Convertidores A/D y puerto serie.
o Encapsulados desde 18 a 68 pines.
• PIC17CXXX, gama alta (palabra de programa de 16 bits).
o Arquitectura abierta, memoria ampliable.
• PIC18XXX, gama alta (palabra de programa de 16 bits).
o Conjunto de instrucciones mejorado.
o Detección de bajo voltaje programable (PLVD).

Dentro de cada gama se dispone de una gran variedad de modelos y encapsulados, pudiendo seleccionar el
que mejor se adapte a cada proyecto (Tabla 2). En el año 2000 se comercializaron más de un centenar de
modelos de PIC que cubren desde los “enanos” de ocho patillas y mínimos recursos hasta los “avanzados” de
84 patillas enormemente potentes.

Tabla 2. Familias de microcontroladores PIC.

Continúa en la siguiente página......

10
Estos microcontroladores han logrado en pocos años ocupar un elevado puesto del ranking mundial de ventas
de microcontroladores, dada su economía, fiabilidad, rapidez, abundante información técnica y el precio
asequible de las herramientas que se precisan para desarrollar las aplicaciones.

11
EL MICROCNTROLADOR PIC 16F84

El " PIC 16F84 " es un MICROCONTROLADOR de 8 bits, perteneciente a la subfamilia de la gama media
de los microcontroladores fabricados por compañía Microchip Tecnology. Posee memoria de programa tipo
FLASH, lo que ofrece una gran facilidad en el desarrollo de prototipos y en su aprendizaje ya que no se
requiere de borrado con luz ultravioleta como las versiones EPROM sino, permite reprogramarlo nuevamente
si ser borrado con anterioridad. Esta es una de las principales características por la que se elige para el
desarrollo de muchas aplicaciones.

Los PIC16F84, es un grupo de microcontroladores de bajo costo, alta ejecución, con tecnología CMOS,
completamente estático, esto quiere decir que el reloj puede detenerse y los datos de la memoria no se
pierden. Emplean arquitectura RISC (set reducido de instrucciones), con solo 35 instrucciones, fácil de usar y
recordar lo que permite reducir el tiempo de desarrollo significativamente. Estos microcontroladores están
equipados con dispositivos especiales que reducen el costo del sistema y los requerimientos de potencia. El
reset de encendido (POR) y el temporizador de reset, ofrecen la posibilidad de no usar circuito externo de
reset. Se tiene la alternativa de escoger entre cuatro configuraciones del oscilador, y además presenta un modo
SLEEP de bajo consumo, temporizador Watchdog (perro guardián) y código de protección (encriptación)

El encapsulado más común para el PIC16F84 es el DIP (Dual In-Line Pin) de 18 pines, aunque también
existe el dispositivo con encapsulado tipo Surface Mount (de montaje superficial). Una de las referencias
más comerciales es el PIC16F84-04/P, donde “–04” indica la frecuencia máxima de trabajo(4MHz) y la “P”
indica el tipo de encapsulado plástico tipo DIP.

El PIC 16C84 es un microcontrolador de la familia MICROCHIP, totalmente compatible con el PIC 16F84.
Su principal característica es que posee memoria "EEPROM" en lugar de memoria Flash, pero su manejo es
igual. Con respecto al PIC16F84, este microcontrolador presenta dos diferencias:

• La memoria de datos tiene menor tamaño, aquí se tienen 32 registros de propósito general (el mapa de
memoria de datos llega hasta 2Fh).

• En el momento de programar el microcontrolador, el fusible de selección del temporizador de arranque


(Power Up Timer) trabaja de forma inversa, es decir, si en el PIC 16F84 se selecciona la opción "Low"
para activarlo, en el PIC 16C84 se debe seleccionar "High".

El microcontrolador PIC16C84 ha sido reemplazado de forma gradual por el PIC16F84, por lo tanto, los
diseños que lo utilizan como elemento de control deben ser actualizados. Aunque, por lo tratado
anteriormente, es un proceso casi transparente.

Este microcontrolador se basa en la Arquitectura Harvard, en la cual el programa y los datos se pueden
acceder desde memorias separadas, lo que posibilita que las instrucciones y los datos posean longitudes
diferentes. Esta misma estructura es la que permite la superposición de los ciclos de búsqueda y ejecución de
las instrucciones, lo cual se ve reflejado en una mayor velocidad del microcontrolador.

12
La siguiente es la tarjeta de presentación de los PIC16C/F84:

• CPU de 8 bits de alto rendimiento y • Retención de la EEPROM de datos hasta 40


estructura RISC. años.
• Conjunto de instrucciones de solo 35 • 13 pines de entrada / salida para el control
sencillas instrucciones. individual de periférico que permiten un
• Todas las instrucciones son ejecutables en un suministro considerable de corriente para el
solo ciclo (400 nS a 10 MHz), excepto para manejo directo de LED’s (20 mA máximo
las instrucciones con bifurcación en las por pin en modo sourcing y 25 mA máximo
cuales se emplean dos ciclos de instruccioón. por pin en modo sinking).
• Velocidad de operación desde DC hasta 20 • Temporizador/countador de 8 bits.
MHz, con un ciclo de instrucción de DC • Reset de encendido (POR: power-on reset).
hasta 400 nS, respectivamente. • Dispositivo temporizador de reset (PWRT:
• Ancho de instrucción de 14bits. power-up timer).
• Bus de datos de 8 bits. • Temporizador o de vigilancia watchdog
• 15 registros de función especial (SFR’s). para recuperación por fallas de programa,
• Pila (Stack ) de 8 niveles hacia abajo. lográndose una confiable operación.
• Direccionamiento directo e indirecto. • Código de protección programable.
• Cuatro fuentes de interrupción. • Modo de operación SLEEP para bajo
- Interrupción externa por pin RB0/INT. consumo de potencia.
- Por sobreflujo del Timer0. • Opciones de selección del oscilador.
- Por cambio en el puerto B <RB4:RB7>. • Programación serial en sistema, vía dos
- Escritura completa en la EEPROM de pines.
datos. • Bajo consumo de potencia:
• 1.000.0000 de ciclos de borrado/escritura de - < Típicamente 2mA a 5V, 4Mhz.
la memoria EEPROM. - Típicamente 15µA a 2V, 32 KHz.
- Corriente típica en standby a 2V.

13
Arquitectura interna.

El microcontrolar 16F84, como todos los microcontroladores PIC, están basados en la arquitectura Harvard
que posee buses y espacios de memoria diferenciados para los datos y las instrucciones.

Por otro lado, esta independencia entre datos e instrucciones permite que cada uno tenga el tamaño más
adecuado. Así, los datos tienen una longitud de 8 bits, mientras que las instrucciones son de 14 bits (Figura 6).

Figura 6. Arquitectura Hardvard.

Como se observa en la Figura 7 el PIC16F84 consta de un procesador con una ALU y un Decodificador de
Instrucciones, una memoria de programa tipo FLASH de 1K palabras de 14 bits, una memoria de datos
SRAM con 68 posiciones de 8 bits. También existe una zona de 64 bytes de EEPROM para datos no volátiles.
Finalmente dispone de interrupciones, un temporizador, perro guardián y dos puertas A y B de entrada y
salida de información digital.

3.1.1. El procesador o CPU.

El procesador responde a la arquitectura RISC, que se identifica porque el juego de instrucciones se reduce a
35, donde la mayoría se ejecutan en un solo ciclo de reloj, excepto las instrucciones de salto que necesitan dos
ciclos.

La ALU (Arithmetic Logic Unit) ubicada dentro del procesador realiza las operaciones lógicas y aritméticas
con dos operandos, uno que recibe desde el registro W (registro de trabajo) y otro que puede provenir de
cualquier registro interno (Figura 7).

Pasa a la siguiente página....

14
Figura 7. Diagrama de bloques del PIC16F84.

15
PINES Y FUNCIONES

Los PUERTOS son el puente entre el microcontrolador y el mundo exterior. Son líneas digitales que trabajan
entre cero y cinco voltios y se pueden configurar como entradas o como salidas.

El PIC 16F84 tiene dos puertos. El puerto A con 5 líneas y el puerto B con 8 líneas. Cada pin se puede
configurar como entrada o como salida independiente programado por un par de registros diseñados para tal
fin. En ese registro un "0" configura el pin del puerto correspondiente como salida y un "1" lo configura como
entrada.

Figura No. 8 Distribución de pines de los microcontroladores de la serie PIC16C/F84.

• PUERTO A

RA0 = Pin de Entrada/Salida (TTL).

RA1 = Pin de Entrada/Salida (TTL).

RA2 = Pin de Entrada/Salida (TTL).

RA3 = Pin de Entrada/Salida (TTL).

RA4/TOCKI = Pin de Entrada/Salida o entrada de Reloj Externo para el TMR0, cuando este pin se configura
como salida es de tipo Open Drain (ST), cuando funciona como salida se debe conectar a Vcc (+5V) a través
de una resistencia.

• PUERTO B

RB0/INT = Pin de Entrada/Salida o entrada de interrupción externa. (TTL/ST).

RB1 = Pin de Entrada/Salida (TTL).

RB2 = Pin de Entrada/Salida (TTL).

RB3 = Pin de Entrada/Salida (TTL).

RB4 = Pin de Entrada/Salida con Interrupción por cambio de Flanco. (TTL).

RB5 = Pin de Entrada/Salida con Interrupción por cambio de Flanco.(TTL).

RB6 = Pin de Entrada/Salida con Interrupción por cambio de Flanco. (TTL/ST).

RB7 = Pin de Entrada/Salida con Interrupción por cambio de Flanco. (TTL/ST).

16
• PINES ADICIONALES

MCLR = Pin de Reset del Microcontrolador (Master Clear) ), el cual se produce cuando se aplica un nivle
bajo o cuando la tensión en dicho pin desciende entre 1,2V a 1,7V.

Vss = Ground o Tierra

VDD = Fuente Positiva (+5V)

OSC2/CLKOUT = Entrada del Oscilador del Cristal. Se conecta al Cristal o Resonador en modo XT
(Oscilador de Cristal). En modo RC (Resistencia-Condensador), este pin actúa como salida el cual tiene 1/4
de la frecuencia que entra por el pin OCS1/CLKIN.

OSC1/CLKIN = Entrada del Oscilador del Cristal / Entrada de reloj de una Fuente Externa

El pin RB0/INT se puede configurar por software para que funcione como interrupción externa.

El pin RA4/TOCKI del puerto A puede ser configurado como un pin de entrada/salida como se mencionaba
anteriormente o como entrada del temporizador/contador. Cuando este pin se programa como entrada digital,
funciona como un disparador de Schmitt (Schmitt trigger, ST), esto quiere decir que puede reconocer señales
un poco distorsionadas y llevarlas a niveles lógicos (cero y cinco voltios). Cuando se usa como salida digital
se comporta como colector abierto, por lo tanto se debe poner una resistencia de pull-up (resistencia externa
conectada a un nivel lógico de cinco voltios). Como salida, la lógica es inversa: un "0" escrito al pin del
puerto entrega en el pin un "1" lógico. Además como salida no puede manejar cargas como fuente, sólo en el
modo sumidero.

Como este dispositivo es de tecnología CMOS, todos los pines deben estar conectado a alguna parte, nunca
dejarlos al aire por que se puede dañar el integrado. Los pines que no se estén usando se deben conectar la
fuente de alimentación +5V con una resistencia de 5 a 10 Kilo Ohmio.

17
ORGANIZACIÓN DE LA MEMORIA

Hay dos bloque de memoria: la memoria de programa y la memoria de datos. Cada bloque tiene su propio bus
de acceso, de manera que se puede acceder simultáneamente a ambos bloques durante el mismo ciclo de
instrucción.

En general, para los microcontroladores, la memoria de datos se asume como una RAM (Random Access
Memory: memoria de acceso aleatorio), es decir, una memoria que puede ser leída y escrita pero que tiene
la desventaja de ser volátil, o sea, que su información se pierde al desenergizar el dispositivo. De aquí en
adelante se le llamará registro a cada posición de la memoria de datos. La memoria RAM de datos a su vez
puede esta dividida en dos secciones: en los registros de propósito general y los registros de función especial
(SFRs: Special Function Registers). Los registros de función especial están dedicados a funciones dirigidas
al control del dispositivo en sí mismo y de los módulos funcionales que lo componen. Los de propósito
general y vienen a ser ni más ni menos que los registros que utilizará el usuario para almacenar los datos
temporales de su programa en particular, son los registros de trabajo del usuario.

En el PIC16F84, del área de la memoria de datos también hace parte una Memoria EEPROM de datos. Esta
memoria no se encuentra directamente mapeada dentro la memoria de datos, pero se puede acceder
indirectamente. El direccionamiento indirecto se realiza a través de un registro apuntador de direcciones (09h
o EEADR) que contiene la dirección de la EEPROM de datos en la cual se va leer o escribir. Los 64 bytes de
EEPROM de datos tienen un rango de direcciones que abarca desde 00h a 3fh.

18
MEMORIA DE PROGRAMA

En la memoria de programa se graba o almacena el programa o códigos que le microcontrolador debe


ejecutar. En le PIC16F84 la memoria de programa es de 1 K byte de longitud con palabra de 14 bits. Como es
del tipo FLASH se puede programar y borrar eléctricamente, en otras palabras, se puede programar o borrar
sin necesidad de un borrador de luz ultravioleta, lo que facilita el desarrollo de programas, la experimentación
y el aprendizaje. Como el PIC 16F84 tiene un contador de programa de 13bits, tiene una capacidad de
direccionamiento de 8K x 14, pero solamente tiene implementado el primer 1K x 14 (000h hasta 03FFh), es
decir, permite hasta 1024 (2 10 ) instrucciones de 14 bits cada una (de la 0000h a la 03FFh). Si se direccionan
posiciones de memoria superiores a 3FFh se causará un solapamiento o desborde con el espacio del primer
1K.

En la memoria de programa se encuentra el vector de reset y el vector de interrupción.

VECTOR DE RESET

En la figura 8 se indica que a la posición 0000h de la memoria de código se le llama vector de reset. Esto
significa que la posición 0000h será la primera instrucción en ser leída por la etapa de control y
decodificación de instrucciones como respuesta a cualquier evento de reset o se encienda el microcontrolador.
En otras palabras, todo programa de usuario debe comenzarse a escribirse a partir de la posición 0000h pues
es allí en donde comenzará la ejecución del programa en el momento en que se encienda el sistema o se active
alguna condición de reinicio.

VECTOR DE INTERRUPCION

Cuando el microcontrolador recibe una señal de interrupción el contador de programa apunta a la dirección
04h de la memoria de programa, por eso allí se debe escribir toda la programación necesaria para atender
dicha interrupción. Las causas por las que se produce un reset son las siguientes:

• Conexión de la alimentación.
• Cuando durante el funcionamiento normal, o en el modo bajo consumo (sleep) se aplican cero voltios al
terminal de MCLR .
• Desbordamiento del perro guardián (watchdog) en funcionamiento normal o en funcionamiento en bajo
consumo (sleep).

Las causas por las que se puede producir una interrupción son la siguientes:

• Activación de la patilla de interrupción externa INT.


• Desbordamiento del temporizador.
• Cambio de estado en alguno de los terminales de entrada del puerto B (RB4-RB7).
• Finalización del proceso de escritura de la EEPROM de datos.

Cuando se produce una interrupción se activan unos indicadores (flags) para identificar la causa de la
interrupción, se detiene la ejecución del programa almacenando la posición de la instrucción actual, para que
una vez finalizadas las operaciones asociadas a la interrupción, el programa pueda continuar por donde iba y
el programa salta a la posición 0004h. A partir de aquí se ejecutará la rutina de interrupción. Con la última
instrucción de la rutina de interrupción automáticamente el programa continuará por donde se había quedado.

Continúa en la página siguiente....

19
Memoria de datos
Figura 8. Mapa de la memoria de programa.
Se encuentra en dos zonas bien diferenciadas:

a) Memoria tipo RAM (SRAM):


b) La memoria de datos del tipo EEPROM.

20
ORGANIZACIÓN DE LOS REGISTROS (Memoria SRAM)

En general, para los microcontroladores de Microchip, la memoria de datos se asume como una RAM
(Random Access Memory: memoria de acceso aleatorio), es decir, una memoria que puede ser leída y escrita
pero que tiene la desventaja de ser volátil, o sea, que su información se pierde al desenergizar el dispositivo.
De aquí en adelante se le llamará registro a cada posición de la memoria de datos. La memoria RAM de datos
a su vez puede esta dividida en dos secciones: en los registros de propósito general y los registros de función
especial (SFRs: Special Function Registers).

El PIC 16F84 puede direccionar 128 posiciones de memoria RAM, pero solamente tiene implementado
físicamente los primeros 80 (0 a 4Fh). De estos los primeros 12 son registros que cumplen un propósito
especial en el control del microcontrolador y los 68 siguientes son registros de uso general que se pueden
usar para guardar los datos temporales de la tarea que se esta ejecutando. Los registros están organizados
como dos bancos(paginas) de 128 posiciones de 8 bits cada una (128 x 8); todas las posiciones se pueden
accesar directa o indirectamente (este ultimo modo de direccionamiento se realiza a través del registro FSR).
Para seleccionar que pagina de registro se trabaja en un momento determinado se utiliza el bit RP0 del
registro STATUS.

00h INDF(1) INDF(1) 80h


01h TIMER0 OPTION 81h
02h PCL PCL 82h
03h STATUS STATUS 83h
04h FSR FSR 84h
05h PORTA TRISA 85h
06h PORTB TRISB 86h
07h 87h
08h EEDATA EECON 1 88h
09h EEADR EECON 2(1) 89h
0AH PCLATH PCLATH 8Ah
0Bh INTCON INTCON 8Bh
0Ch 8Ch

68
registros de uso Mapadeados en el
general banco 0

4Fh CFh
50h DFh
NO NO
IMPLEMENTADOS IMPLEMENTADOS

7Fh FFh

Mapa de archivos de registros

21
MEMORIA DE DATOS DE LA EEPROM

El PIC 16F84 tiene una memoria EEPROM de datos de 64 posiciones (00h a 3Fh), de 8 bits cada una. Este
bloque de memoria no se encuentra mapeado en ningún banco, el acceso a esas posiciones se consigue a
través de dos registros de la RAM:

• El registro EEADR (posición 09), que debe contener la dirección de la posición de la EEPROM a ser
accesada.

• El registro EEDATA (posición 08), que contiene el dato de 8 bits que se va a escribir o el que se obtuvo
de la ultima lectura.

Adicionalmente, existen dos registros de control: el EECON1 (88h), que posee cinco bits que manejan las
operaciones de lectura/escritura y el EECON2 (89h), que aunque no es un registro físico, es necesario para
realizar las operaciones de escritura.

La lectura toma un ciclo de reloj de instrucciones, mientras que las escritura, por ser controlada por un
temporizador incorporado, tiene un tiempo nominal de 10 milisegundos, este tiempo puede variar con la
temperatura y el voltaje. Cuando se va a realizar una operación de escritura, automáticamente se hace primero
la operación de borrado. El numero típico de ciclos de borrado/escritura de la EEPROM de datos es de
1.000.000.

22
Puertos de entrada/salida

Los PUERTOS son el puente entre el microcontrolador y el mundo exterior. Son líneas digitales que trabajan
entre cero y cinco voltios. Para trabajar con los puertos previamente se pueden configurar como entradas o
como salidas.

El PIC 16F84 tiene dos puertos. El puerto A con 5 líneas y el puerto B con 8 líneas. Cada pin se puede
configurar como entrada o como salida independiente programado por el par de registros diseñados para tal
fin: TRISA para configurar los pines del puerto A y TRISB para los del B. En cada uno de estos registros un
"0" configura el pin del puerto correspondiente como salida y un "1" lo configura como entrada.

La máxima capacidad de corriente de cada uno de los pines de los puertos en modo sumidero (sink) es de 25
mA y en modo fuente (source) es de 20 mA.

El consumo de corriente del microcontrolador para su funcionamiento depende del voltaje de operación, la
frecuencia y de las cargas que tengan sus pines. Por Ejemplo: Para un reloj de 4 MHz el consumo es de
aproximadamente de 2mA; aunque este se puede reducir a 40 microamperios cuando está en el modo sleep
(en este modo el micro se detiene y disminuye el consumo de potencia). Se sale de este estado cuando se
produce alguna condición especial que veremos mas adelante.

El Puerto B tiene internamente unas resistencias de pull-up conectadas a sus pines (sirven para fijar el pin a un
nivel de cinco voltios), su uso puede ser habilitado o deshabilitado bajo control del programa. Todas las
resistencias de pull-up conectan o desconectan a la vez mediante un bit de control. La resistencia de pull-up es
desconectada automáticamente en un pin si este se programa como salida. El pin RB0/INT se puede
configurar por software para que funcione como interrupción externa.

23
LAS OPCIONES DEL OSCILADOR EXTERNO

Todo microcontrolador, al igual que un microprocesador, requiere un circuito oscilador que genere pulsos de
frecuencia y duración constante, los cuales se utilizan como señal de sincronismo para la operación del todo el
sistema. Este circuito, que se conoce con el nombre de reloj o clock, es de vital importancia para el buen
funcionamiento del sistema. Generalmente, en los microcontroladores el reloj está incorporado en el chip y
sólo se necesitan unos pocos componentes exteriores para seleccionar y estabilizar la frecuencia de trabajo.

Los PIC brinda la posibilidad de establecer la frecuencia de oscilación a través de un circuito externo. El PIC
16F84 admite cuatro tipos de osciladores diferentes:

♦ Oscilador tipo RC. Se trata de un oscilador de bajo costo formado por una simple resistencia y
un condensador. Suministra una estabilidad mediocre de la frecuencia de oscilación, cuyo valor
depende de los elementos que conforman la red RC. Este sistema se debe emplear en aquellas
aplicaciones donde no se requiere mucha precisión en el oscilador. se puede utilizar una
resistencia y un condensador, como se muestra a continuación:

Los valores recomendados para este tipo de oscilador son: 5 KΩ < Rext <100 KΩ y Cext >
20 pF.

Nota: Cuando el oscilador del dispositivo esta en modo RC, no maneje el pin OSC1 con un
reloj externo por que puede dañar el dispositivo.

La frecuencia del oscilador dividida por cuatro está disponible en el pin OSC2/CLKOUT, y
puede ser usada para chequear propósitos o para sincronizar otra lógica.

• XT. Cristal de cuarzo. Es un oscilador de cristal o resonador cerámico para frecuencia estándar
comprendidas entre 100Khz y 4Mhz. El cristal de cuarzo o resonador cerámico se coloca entre los
terminales identificados como OSC1 y OSC2.

24
• HS. Cristal de alta velocidad. Es un oscilador que alcanza una alta velocidad comprendidas entre 4 y
10 Mhz , y está basado en un cristal de cuarzo o resonador cerámico.

• LP. Cristal para baja frecuencia (entre 36 a 200Khz) y bajo consumo de potencia.

El tipo de oscilador a utilizar se debe elegir en el momento de programar o "quemar" el microcontrolador.


Esto se hace a través de unos fusibles llamados "fusibles de configuración".

En la mayoría de las practicas que realizaremos se sugiere el cristal de 4 MHz, por que garantiza una mayor
precisión y un buen arranque del microcontrolador. Internamente esta frecuencia esta dividida por cuatro, lo
que hace que la frecuencia efectiva de trabajo sea de 1 MHz, por lo que cada instrucción se realiza en un
microsegundo (1 µS). El cristal debe ir acompañado de dos condensadores y se conecta como se muestra en la
figura siguiente.

Dependiendo de la aplicación, se pueden utilizar cristales de otras frecuencias; por ejemplo se usa el cristal de
3.579545 MHz por que es muy económico, el de 32.768 KHz cuando se necesita crear bases de tiempo de un
segundo muy precisas. El límite de velocidad de estos microcontroladores es de 10 MHz.

La frecuencia del oscilador dividida por cuatro está disponible en el pin OSC2/CLKOUT, y puede ser usada
para chequear propósitos o para sincronizar otra lógica.

La frecuencia del reloj determina el ciclo de instrucción (tiempo que tarda una instrucción en ejecutarse). En
los PICs, un ciclo de instrucción emplea cuatro periodos de oscilación del reloj principal. Por ejemplo si la
frecuencia del reloj principal es de 4 MHz, un ciclo de instrucción tardará en realizarse:

25
T oscilación del reloj principal = 1/F del reloj principal = 1/4 MHz = 250 ns

Ciclo de instrucción = T oscilación x 4 = 250 ns x 4 = 1 µs.(un microsegundo)

Si por ejemplo el programa tuviera 250 líneas de instrucciones, la ejecución completa tardaría:

250 x 1µs = 250 µs.

26
RESET

En los microcontroladores se requiere un pin de reset para reiniciar el funcionamiento del sistema cuando sea
necesario, ya sea por una falla que se presente o por que así se halla diseñado el sistema. El pin de reset en los
PIC es llamado "Master Clear" (MCLR). El PIC 16F84 admite diferentes tipos de reset:

• Al encendido (Power On Reset)


• Pulso en el pin Master Clear durante operación normal
• Pulso en el pin Master Clear durante el modo de bajo consumo (modo Sleep)
• El rebase del conteo del circuito de vigilancia (watchdog) durante operación normal.
• El rebase del conteo del circuito de vigilancia (watchdog) durante el modo de bajo consumo (Sleep)

El reset al encendido se consigue gracias a dos temporizadores. El primero de ellos es el OST (Oscillator Star-
Up Timer: Temporizador de encendido del oscilador), orientado a mantener el microcontrolador en reset hasta
que el oscilador de cristal es estable. El segundo es el PWRT (Power-Up Timer: Temporizador de encendido),
que provee un retardo fijo de 72 mS (nominal) en el encendido únicamente, diseñado para mantener el
dispositivo en reset mientras la fuente se estabiliza. Para utilizar estos temporizadores, solo basta con conectar
el pin “Master Clear” (MCLR/VPP, pin 4) a la fuente de alimentación evitándose utilizar las tradicionales
redes RC externas en el pin de reset.

- El reset por Master Clear se consigue llevando momentáneamente este pin a un estado lógico bajo,
mientras que el watchdog WDT produce un reset cuando su temporizador rebasa la cuenta, o sea que pasa
de 0FFh a 00H. Cuando se quiere tener control sobre el reset del sistema se puede conectar un botón
como se muestra en la siguiente figura.

- Reset por Brown-Out: Un brown-out es una condición en donde la alimentación del dispositivo (Vdd) baja
a un valor mínimo, pero no a cero (nivel tensión baja entre 2.8 y 4.2V) y luego se normaliza. El dispositivo
debe resetearse en caso de presentarse un brown-out. Para resetear un PIC 16F84 cuando un brown-out ocurre
se debe construir un circuito de protección externo como el de la siguiente figura:

Circuito de Protección No. 1.

Este circuito entrará en un reset activo cuando VDD baja por debajo de Vz + 0.7, en donde Vz = Voltaje del
Zener.

27
Circuito de Protección No. 2.

Este circuito es más económico, aunque menos eficaz. El transistor Q1 pasará a un estado de corte cuando
VDD está por debajo de un cierto nivel tal que:

VDD * (R1 / (R1 + R2)) = 0.7 V

28
Recursos auxiliares.

El microcontrolador PIC16F84 dispone de los siguientes recursos adicionales:

• Estado de reposo. Cuando el microcontrolador funciona en modo de reposo (sleep) la potencia necesaria
es menor de 3 µA. Esta característica permite que el microcontrolador entre en un estado pasivo donde
consume muy poca potencia. Cuando se entra en este modo el oscilador principal se detiene, pero el
temporizador del circuito de vigilancia (watchdog) se reinicia y empieza su conteo nuevamente. Se entra
en ese estado por la ejecución de una instrucción especial (llamada SLEEP) y se sale de él cuando el
microcontrolador sufre un reset por un pulso en el pin MCLR, por que el watchdog hace que se reinicie el
sistema o por que ocurre una interrupción al sistema.

Cuando se ejecuta la instrucción SLEEP, y si esta habilitado el WDT, este registro se limpiará (se cargará
con cer0s), el bit PD se colocará a cero (0), el bit T0 en 1 y el oscilador principal se detendrá. Los puertos
conservan la condición que tenían antes de la ejecución de la instrucción. Para el más bajo consumo en
este modo, todos los pines de entrada deben estar conectados a 5 voltios o atierra, evitando que queden
entradas flotantes. La entrada TOKI también debe estar a 5 voltios o tierra, y el pin MCLR a 5 voltios.

• TEMPORIZADOR DE ENCENDIDO (Power-up Timer). Este proporciona un reset al


microcontrolador en el momento de conectar la fuente de alimentación, lo que garantiza un arranque
correcto del sistema. En el momento de grabar el microcontrolador se debe habilitar el fusible de
configuración "Power-up Timer", para ello se debe seleccionar "ON". Su tiempo de retardo es de 72
milisegundos.

• Registro Temporizador (TMER/COUNTER). Se incrementará en una unidad por cada pulso de reloj.
Cuando llegue al valor máximo FFh (los 8 bits a ‘1’), se producirá el desbordamiento del registro
asociado al temporizador (TMR0), se iniciará tomando el valor 00h y generará una interrupción (si se
había autorizado), repitiendo dicho ciclo indefinidamente. El temporizador puede recibir la señal de reloj
que hace que se incremente de una señal externa a través de una patilla de entrada, o del reloj principal
del microcontrolador (en ese caso dividida por cuatro). Se puede trabajar directamente con estas señales o
bien pasarlas por un divisor, cuyo valor se puede seleccionar por software.

• CIRCUITO DE VIGILANCIA (Watchdog Timer)

Su función es restablecer el programa cuando éste se ha perdido por fallas en la programación o por
alguna razón externa. Es muy útil cuando se trabaja en ambientes con mucha interferencia o ruido
electromagnético. Esta conformado por un oscilador RC que se encuentra dentro del microprocesador, y
que no requiere de componentes externos. El oscilador Watchdog corre de manera independiente al
oscilador principal. Cuando se habilita su funcionamiento, dicho circuito hace que el microcontrolador
sufra un reset cada determinado tiempo (que se puede programar entre 18 mS y 2,3 segundos). El periodo
nominal del Watchdog es de 18ms, los períodos más largos se logran utilizando el prescalador del
registro OPTION.

Continúa en la página siguiente.....

29
Este reset lo puede evitar el usuario mediante una instrucción especial del microcontrolador (CLRWT:
Borra el contenido del watchdog), la cual se debe ejecutar antes de que termine el periodo nominal de
dicho temporizador. De esta manera si el programa se ha salido de su flujo normal, por algún ruido o
interferencia externa, el sistema se reiniciará (cuando se acabe el tiempo programado y no se haya
borrado el contador) y el programa puede restablecerse para continuar con su funcionamiento normal.

En las primeras practicas no se utiliza el circuito de vigilancia para facilitar el trabajo; por eso, en el
momento de programar el microcontrolador se debe seleccionar en los fusibles de configuración
"watchdog timer OFF".

• Perro guardián. El temporizador perro guardián (watchdog) es independiente del reloj principal (posee
su propio oscilador), por tanto, en el modo en bajo consumo puede seguir funcionando. Cuando llegue al
valor máximo FFh, se produce el desbordamiento del perro guardián, se iniciará tomando el valor 00h y
provocará un reset. El tiempo típico es de 18ms, pero utilizando un divisor de frecuencia (programable
por software) se pueden alcanzar 2,5s.

La utilización del perro guardián permite controlar los posibles “cuelgues” del programa, esto es, si durante el
programa hemos previsto el poner a cero el perro guardián para evitar que se genere un reset, en el momento
que por un fallo no previsto el programa se quede en un bucle sin fin, al no poder poner a cero el perro
guardián, éste generará un reset sacando al programa del bucle.

LAS PULL-UP INTERNAS

Cada uno de los pines del puerto B tiene un elemento débil pull-up interno (250 uA típico); este elemento es
automáticamente desconectado cuando el pin se configura como salida. Adicionalmente, el bit RBPU
(OPTION) controla todos estos elementos, los cuales están deshabilitados frente a una condición de reset.
Estos elementos pull-up son especialmente útiles cuando el microcontrolador va a colocarse en el modo de
bajo consumo, ya que ayudan a no tener las entradas flotantes, significado una reducción en el consumo de
corriente.

FUSIBLES DE CONFIGURACION

El PIC 16F84 posee cinco fusibles, cada uno de los cuales es un bit. Estos fusibles se pueden programas para
seleccionar varias configuraciones del dispositivo: tipo de oscilador, protección de código, habilitación del
circuito de vigilancia y el temporizador al encendido. Los bits se localizan en la posición de memoria 2007h,
posición a la cual el usuario sólo tiene acceso durante la programación del microcontrolador. Cuando se
programa la protección del código, el contenido de cada posición de la memoria no se puede leer
completamente, de tal manera que el código del programa no se puede reconstruir. Adicionalmente, todas las
posiciones de memoria del programa se protegen contra la reprogramación.

Una vez protegido el código, el fusible de protección solo puede ser borrado (puesto a 1) si se borra toda la
memoria del programa y la de datos.

30
INTERRUPCIONES

Las interrupciones son otra manera de hacer llamados a subrutinas por medios físicos. Es decir, es provocar la
ejecución de una subrutina (un programa dentro de otro programa principal) cada vez que ocurra un evento
físico determinado. Al programa, o bloque de programa, que se ejecuta sólo cuando se produce la interrupción
la denominaremos rutina de servicio de la interrupción (RSTI). Al evento que provoca la interrupción se le
denomina fuente de la interrupción.

La fuente de la interrupción puede ser de dos tipos: externas, como por ejemplo la transición de alto a bajo de
una señal externa aplicada a uno de los pines de entrada del microcontrolador, o internas, como el sobrepaso
de la cuenta del temporizador interno del microcontrolador. Uno, o dos, de los registros de la RAM del
microcontrolador se encuentran localizados unos bits encargados de informar sí a ocurrido algún tipo de
interrupción. A cad uno de estos bits se denomina banderas de interrupción (IF, Interrupt flags).

Para que la CPU de un PIC responda al llamado de una determinada bandera interrupción, se debe habilitar el
bit asociado a la interrupción colocando en uno. Los habilitadores de interrupción (IE, Interrupt Enable)se
encuentran en uno de los registros de la RAM, el INTCON. Cada bandera de interrupción está asociada con
un bit habilitador de interrupción.
El programador es quien decide en que valor colocar los bits de habilitación según las fuentes de interrupción
que desee utilizar para la aplicación que este desarrollando.

Los microcontroladores PIC16C/F84 incluyen el manejo de interrupciones, lo cual representa grandes


ventajas. Estos microcontroladores poseen cuatro formas de interrupción que son:

• Interrupción externa en el pin RB0/INT


• Finalización del temporizador/contador TMR0
• Finalización de escritura en la EEPROM de datos
• Cambio de estado en los pines RB4 a RB7

El registro 0Bh o INTCON contiene las banderas de las interrupciones INT, cambio en el puerto B y
finalización del conteo del TMR0, al igual que el control para habilitar o deshabilitar cada una de las fuentes
de interrupción, incluida la de escritura de la memoria EEPROM. Sólo la bandera de finalización de la
escritura reside en el registro 88h o EECON1 (EECON1<4>).

Si el bit GIE (Global Interrupt Enable) se coloca en 0, deshabilita todas las interrupciones. Cuando una
interrupción es atendida, el bit GIE se coloca en 0 automáticamente pare evitar interferencias con otras
interrupciones que se pudieran presentar, la dirección de retorno se coloca en la pila y el PIC se carga con la
dirección 04h. Una vez en la rutina de servicio, la fuente de interrupción se puede determinar examinando las
banderas de interrupción. La bandera respectiva se debe colocar, por software, en cero antes de regresar de la
interrupción, para evitar que se vuelva a detectar nuevamente la misma interrupción. La instrucción RETFIE
permite al usuario retornar de la interrupción, a la vez que habilita de nuevo las interrupciones, al colocar el
bit GIE en uno.
Debe tenerse presente que solamente el contador de programa es puesto en la pila al atenderse la interrupción;
por lo tanto, es conveniente que el programador tenga cuidado con el registro de estados y el de trabajo, ya
que se pueden introducir resultados inesperados si dentro de ella se modifican.

☛ Interrupción Externa. Actúa sobre el pin RB0/INT y se puede configurar para activarse con el flanco de
subida o el de bajada, de acuerdo al bit INTEDG (Interrup Edge Select Bit, localizado en el registro
OPTION). Cuando se presenta un flanco valido en el pin INT, la bandera INTF (INTCON) se coloca en
uno. La interrupción se puede deshabilitar colocando el bit de control INTE (INTCON<4>) en cero.

Cuando se atiende la interrupción, a través de la rutina de servicio, INTF se debe colocar en cero antes de
regresar al programa principal. La interrupción puede reactivar al microcontrolador después de la
instrucción SLEEP, si previamente el bit INTE fue habilitado.
Continúa en la siguiente página......

31
☛ Interrupción por finalización de la temporización. La superación del conteo máximo (0FFh) en el
TMR0 colocara el bit TOIF (INTCON) en uno. El bit de control respectivo es TOIE (INTCON<5>).

☛ Interrupción por cambio en el puerto RB. Un cambio en los pines del puerto B (RB4 a RB7) colocará
en uno el bit RBIF (INTCON). El bit de control respectivo es RBIE (INTCON<3>).

☛ Interrupción por finalización de escritura. Cuando la escritura de un dato en la EEPROM finaliza, se


coloca en 1 el bit EEIF (EECON1). El bit de control respectivo es EEIE (INTCON<6>).

32
Conexionado típico fijo para cualquier aplicación.

En los circuitos donde se utiliza el PIC16F84 es habitual emplear tensión de alimentación de +5V y como
circuito de reloj externo uno del tipo XT a una frecuencia de 4MHz. Con esta configuración, el conexionado
fijo para cualquier aplicación es el mostrado en la Figura 13.

Las patillas que no están conectadas son las dedicadas a transferir la información con los periféricos que
utilice la aplicación.

Figura 13. Conexionado fijo del PIC16F84.

Periféricos de E/S.

Los diseños reales utilizan diversos periféricos que hay que conectar a las patillas del microcontrolador que
soportan las líneas de E/S.

Periféricos digitales de entrada.

Pulsadores.

Estos dispositivos permiten introducir un nivel lógico en el momento que se les acciona, pasando al nivel
contrario cuando se deja de hacerlo (vuelven a la posición de reposo).

En el esquema de la izquierda de la Figura 14 la línea de entrada (IN) recibe un nivel lógico alto cuando el
pulsador está reposo y un nivel lógico bajo cuando se acciona. El pulsador de la derecha funciona al revés.
Continua en la página siguiente.....

33
Figura 14. Dos posibles formas de conectar un pulsador.

Hay multitud de detectores, finales de carrera y sensores digitales que funcionan de la misma manera que los
pulsadores.

Interruptores.

Los interruptores tienen dos estados estables y hay que accionarlos para cambiar de uno a otro. El interruptor
admite el estado abierto y el estado cerrado. Las formas de conectar un interruptor a una entrada del
microcontrolador son iguales a las de la figura 14, sustituyendo el pulsador por el interruptor.

Todos los circuitos electromecánicos (pulsadores, interruptores,...) originan un fenómeno denominado


“rebotes”: las láminas se abren y se cierran varias veces en el momento de la transición (Figura 15). El efecto
que produce es semejante a abrir y cerrar el interruptor o pulsador varias veces, por lo que puede provocar
resultados erróneos.

Figura 15 Efecto de los rebotes.

El efecto de los rebotes se puede solucionar bien mediante software, o bien por hardware. En la Figura 16 se
muestran dos circuitos hardware antirrebotes. El circuito de la izquierda emplea un condensador y el de la
derecha un flip-flop R-S.

Figura 16. Esquemas para eliminar rebotes.

. Periféricos digitales de salida

Diodos LED.
El diodo led es un elemento que se emplea como indicador luminoso. Cuando la diferencia de potencial entre
su ánodo y su cátodo supere un determinado valor umbral el diodo led se encenderá. Las líneas de los PIC
pueden suministrar suficiente corriente como para encender a un diodo led, por eso se pueden conectar
directamente a través de una resistencia como muestra la Figura 17. Si empleamos la conexión de la izquierda
de la figura, el diodo led se encenderá al poner a ‘1’ la salida del microcontrolador, mientras que con la
conexión de la derecha lo hará cuando la salida se ponga a ‘0’.
Continuar en la siguiente página.....

34
Figura 17. Dos posibles formas de conectar un led.

En ocasiones, los diodos u otro tipo de carga necesitan más corriente que la que pueden entregar las líneas de
los PIC. En ese caso es necesario intercalar una etapa amplificadora.

Relés

La activación y desactivación de un relé brinda la oportunidad de poder controlar cargas mucho mayores (más
corriente) porque pueden ser controladas por los contactos de dicho relé (Figura 18). Cuando la línea de
salida, OUT, aplica un nivel alto a la base del transistor Darlington (etapa amplificadora) hace que conduzca y
se active el relé. Al cerrarse los contactos del relé se controla una carga mayor. El valor de la resistencia
depende del tipo de relé y del transistor.

Figura 18. Esquema del control de un relé.

35
EL CONJUNTO DE INSTRUCCIONES

En la siguiente tablase resume el conjunto de instrucciones del PIC16F4, este set de instrucciones es similar al
de los PIC16C5X aunque aquí ya no aparecen, las instrucciones OPTION y TRIS. A pesar de que los
PIC16CXX(PIC’s de la gama media) tienen una mayor cantidad de memoria y una versatilidad mucho mayor
que la de sus antecesores (los PIC16C5X), el conjunto de instrucciones básicamente permanece igual. Lo
anterior se debe a que los controles de los módulos funcionales que se adicionan en los PIC16C6XX se
encuentran localizados en registros de los bancos RAM y por tanto para modificarlos o leerlos se hace de la
misma manera a como se accedería a un registro de la RAM.

Las 35 instrucciones se subdividen en: instrucciones orientadas a registros, instrucciones orientadas a bits y
instrucciones orientadas a constantes y de control. Cada instrucción es una palabra de 14 bits, dividida en un
código de operación, el cual específica la orden a ejecutar y uno o más operandos sobres los que se actúa. La
convención de la sintaxis de las instrucciones es: f es un valor de 7 bits (entre 00h y 7Fh) el cual se refiere a la
dirección de un registro, d puede tener el valor 0 ó 1 e indica en qué lugar se almacenará el resultado de la
sentencia, si d es 0 el resultado se cargará en el registro de trabajo W; si d es 1 entonces el resultado se
cargará en el mismo registro f al que se refiere la instrucción; b es un valor entre 0 y 7 y se refiere a la
posición de un bit dentro de un registro; k es una constante y/o posición de memoria de código aportada por la
instrucción.

Operaciones orientadas a registros


nemotécnico operación Código de la Estados
operación afectados
ADDWF f,dSumar F y W. 00 0111 dfff ffff C, DC, Z
ANDWF f,dAND entre F y W. 00 0101 dfff ffff Z
CLRF f,dLimpiar f 00 0001 1fff ffff Z
CLRW Limpiar W 00 0001 0xxx xxxx Z
COMF f,d Complementar F 00 1001 dfff ffff Z
DECF f,d Decrementar f 00 0011 dfff ffff Z
DECFSZ f,d Decrementar f, saltar la 00 1011 dfff ffff -
próxima línea si llego a cero
INCF f,d Incrementar f 00 1010 dfff ffff Z
INCFSZ f,d Incrementar f, saltar la próxima 00 1111 dfff ffff -
línea si llego a cero.
IORFW f,d Or entre W y f. 00 0100 dfff ffff Z
MOVF f,d Mover f. 00 1000 dfff ffff Z
MOVWF f,d Mocer W a f. 00 0000 1fff ffff -
NOP No operación. 00 0000 0xxx 0000 -
RLF f,d Rotar a la izquierda a través del 00 1101 dfff ffff C
carry.
RRF f,d Rotar a la derecha a través del 00 1100 dfff ffff C
carry
SUBWF f,d Restar W a f ( F – W) 00 0010 dfff ffff C, DC, Z
SWAPF f,d Intercambiar los nibbles de f. 00 1110 dfff ffff -
XORWF f,d Or exclusiva entre f y W. 00 0110 dfff ffff Z
Operaciones orientadas a bits
BCF f,b Limpiar bit b de f. 01 00bbbfff ffff
BSF f,b Activar bit b de f. 01 01bbbfff ffff
BTFSC f,b Probar bit b de f, y saltar si es 01 10bbbfff ffff
cero
BTFSS f,b Probar bit b de f, y saltar si es 01 11bbbfff ffff
uno
Operaciones orientadas a literales y de control
ADDLW k Sumar literal k a W 11 111xkkkk kkkk C, DC, Z
ANDLW K AND entre k y W 11 1001kkkk kkkk Z

36
CALL K Llamar a subrutina. 10 0kkkkkkk kkkk -
CLRWDT Limpiar WDT. TO, PD
GOTO K Saltar a la dirección. 10 1kkkkkkk kkkk -
IORLW K Or entre k y W 11 1000kkkk kkkk Z
MOVLW K Cargar a W con literal k. 11 00xxkkkk kkkk -
RETFIE Retornar de interrupción. 00 00000000 1001 -
RETLW k Retornar de subrutina y cargar 11 01xxkkkk kkkk -
W con la literal k.
RETURN Retornar de subrutina. 00 00000000 1000 -
SLEEP Ir al modo de bajo consumo. 00 00000110 0011 TO, PD
SUBLW k Restarle W de la literal K 11 110xkkkk kkkk C, DC, Z
XORLW k Or exclusiva entre W y K 11 1010kkkk kkkk Z

Conjunto de instrucciones de los PIC16F84

37
Programación.

Un programa es un conjunto ordenado de instrucciones que determinan el procesado de los datos y la


obtención de los resultados. Cada procesador entiende un conjunto de instrucciones, que en el caso del
PIC16F84 son 35. A dichas instrucciones se les llama “instrucciones máquina” y en este microcontrolador
cada una de ellas consta de 14 bits con los cuales se indica el código de la operación.

Como sería muy complejo escribir las instrucciones con 14 bits, a cada una se la referencia con un
neumónico, que es un conjunto de letras que expresan de forma resumida la operación que hace la
instrucción. Al lenguaje que utiliza estos neumónicos se le llama ensamblador.

Programar en lenguaje ensamblador es programar con las mismas instrucciones que directamente puede
ejecutar el procesador. Hay lenguajes de alto nivel en los que una instrucción equivale a muchas instrucciones
máquina. Son más fáciles de utilizar, pero la utilización de los lenguajes más cercanos a la máquina
(ensamblador) representan un considerable ahorro de código en la confección de los programas, lo que es muy
importante dada la limitada capacidad de la memoria de instrucciones.

Entre los lenguajes de alto nivel que se pueden emplear con microcontroladores PIC se encuentran l lenguaje
C y Basic.

Los compiladores son programas que se encargan de traducir el programa escrito en lenguaje ensamblador (u
otro lenguaje) a código máquina, único lenguaje que el microcontrolador es capaz de entender. Tras la
compilación, se grabará este código binario en la memoria de programa del microcontrolador.

3.4.1. Estructura general de un programa en ensamblador.

En una programa escrito en lenguaje ensamblador, además de las 35 instrucciones que interpreta el
procesador también se colocan directivas, que son comandos para realizar ciertas operaciones con el
programa. A continuación se comentan las partes que generalmente hay en un programa:

1º. Modelo de procesador y sistema de numeración.

Los programas comienzan con la directiva list que referencia el modelo de microcontrolador. También se
suele especificar el tipo de numeración que se empleará con la directiva radix. Lo usual es emplear el sistema
hexadecimal, en el que los valores se expresan precedidos de “0x”. En los ejemplos que se desarrollarán a lo
largo del tema comenzaremos el programa ensamblador con las siguientes directivas (detrás del punto y coma
se pueden añadir comentarios):

List p=16F84 ;Se utiliza el microcontrolador PIC16F84


Radix hex ; Se usará el sistema hexadecimal
2º. Variables.

Las posiciones de la memoria de datos se utilizan para guardar operandos y resultados, además de almacenar
registros especiales.

Para que al programador le sea más sencillo confeccionar el programa, en lugar de hacer referencia a las
posiciones de la memoria donde se encuentran los datos que va a emplear, a cada una de estas posiciones se le
asocia un nombre. La directiva equ relaciona un nombre con la dirección que se asigna, así el programador
trabaja con nombres y el compilador traduce automáticamente éstos a las direcciones correspondientes. Por
ejemplo el registro que contiene la información de estado se encuentra en la dirección 0x03, el puerto de
entrada A en 0x05, etc.. Si queremos emplear nombres de variables para estas direcciones de memoria
escribiríamos:

ESTADO equ 0x03 ;La etiqueta “ESTADO” está asociada a la dirección 0x03

38
PUERTAA equ 0x05 ;La etiqueta “PUERTAA” está asociada a la dirección 0x05

3º. Origen del programa.

Antes de comenzar a escribir instrucciones máquina debe definirse la dirección de la memoria de programa a
partir de la cual se desea comenzar a cargar el programa. Para ello se emplea la directiva org. En los PIC el
origen del programa siempre se pone en la dirección 0x00 porque es donde comienza a ejecutarse el programa
después de hacer un reset. Definiremos el origen de la siguiente manera:

org 0x00 ;Inicio de programa

Cuando el programa maneja interrupciones, no se comienza a cargar el programa desde la dirección 0x00,
porque si se genera una interrupción el programa que la atiende comienza en la dirección 0x04 (vector de
interrupción). En este caso lo que se suele hacer es poner en la dirección 0x00 un salto a una dirección de la
memoria de programa posterior al vector de reset, por ejemplo saltaríamos a una posición etiquetada como
INICIO que se encuentra en la dirección 0x05.

org 0x00 ;La siguiente instrucción estará al inicio de la memoria


goto INICIO ;Salta a la dirección etiquetada con INICIO
org 0x05 ;La siguiente instrucción estará en la dirección 0x05
INICIO
-------
-------
end

4º. Cuerpo del programa y final.

Tras indicar la dirección donde se comenzará a cargar el programa, sigue el cuerpo del mismo compuesto por
las instrucciones máquina y los operandos de éstas. El código se estructura en columnas. La primera columna
se utiliza para las etiquetas que se emplean para hacer referencia a partes del programa y nos permiten realizar
saltos a estas partes (como INICIO en el ejemplo anterior). Las siguientes columnas contienen el campo de
instrucciones, el campo de datos y el campo de comentarios. Los comentarios comienzan con ; ).

Al final del programa se coloca la directiva end.

3.4.2. Ejemplos de programación.

Ejemplo 1. Sumar el contenido de la posición de memoria 0Ch (5) con el contenido de la posición de
memoria 0Dh (2) y almacenar el resultado en la posición de memoria 0Eh.

El sumador (ALU) del PIC es capaz de sumar dos datos de 8 bits cada uno, pero debido a su configuración
uno de los sumandos debe proceder del registro de trabajo W (Figura 7). El ejemplo maneja tres posiciones de
la memoria de datos de propósito general (figura 19). En la posición 0Ch se colocará el primer operando con
el valor 5; en la posición 0Dh el segundo con el
valor 2 y el resultado se almacenará en 0Eh. Como se vio en la Figura 9 las direcciones 0Ch, 0Dh y 0Eh son
las tres primeras posiciones de la memoria de datos RAM (banco 0) que el usuario
puede emplear para fines propios. Antes de exponer el código del programa se explican las
instrucciones que se van a utilizar:
♦ Instrucción mov

Permite transferir el contenido de un registro fuente f a un registro destino d. En los PIC todos los datos
residen en posiciones de la memoria de datos a excepción del registro W. La instrucción mov puede mover
tres tipos fundamentales de operandos:

1. El contenido del registro W.

39
2. El contenido de una posición de memoria de datos.
3. Un literal o valor.

♦ movf f,d : mueve el contenido del operando fuente f (posición de la memoria de datos) al
destino d (puede ser W o la propia fuente).

Figura 19. Mapa de memoria del ejemplo1.

♦ movwf f : mueve el contenido del registro W a la posición de memoria especificada por f.


♦ movlw k : mueve el valor k al registro W.
♦ addwf f,d : suma el contenido del registro W con el de f y deposita el resultado en W si d = 0 (o W), o en
f si d = 1.
♦ addlw k : suma al contenido del registro W el valor k y deposita el resultado en W.
A continuación se expone el código ensamblador del programa y el diagrama de flujo
(Figura 20).

List p=16f84
OPERANDO1 equ 0x0C
OPERANDO2 equ 0x0D
RESULTADO equ 0x0E
org 0x00 ;origen
INICIO
movlw 0x05 ;W ‘5’
movwf OPERANDO1 ;OPERANDO1 W
movlw 0x02 ;W ‘2’
movwf OPERANDO2 ;OPERANDO2 W
addwf OPERANDO1,W ;OPERANDO1+W W
movwf RESULTADO ;RESULTADO W
end

40
Figura 20. Diagrama de flujo del ejemplo 1.

Ejemplo 2. Confeccionar un programa para el microcontrolador PIC 16F84 que lea el número binario
introducido por los interruptores y lo visualice en los diodos led (Figura 6-21). El PIC16F84 dispone de dos
puertas, PUERTA A (RA0-RA4) y PUERTA B (RB0-RB7). Cada una de las líneas de estas puertas puede
actuar como entrada o como salida. El valor de los datos que entran o salen por cada puerta están
materializados en dos posiciones de la RAM, PORTA para la puerta A y PORTB para la puerta B (figura 21).
Existen otros dos registros de la memoria RAM (TRISA y TRISB) que se emplean para configurar las líneas
de PORTA y PORTB como entrada o salida, de tal forma que cuando en uno de los bits se graba un ‘1’, la
línea correspondiente de la puerta afectada actúa como entrada, mientras que si se graba un ‘0’, actúa como
salida.

En las posiciones 5 y 6 (Figura 22) del banco 0 se ubican los registros de datos de las puertas y en las mismas
posiciones de la memoria, pero en el banco 1, se encuentran los registros de configuración correspondientes.
Si se desea acceder a posiciones del banco 1 hay que poner a ‘1’ el bit 5 (RP0) de un registro llamado
STATUS.

Figura 21. Esquema de conexión del ejemplo 2.

Por ejemplo si se quisiera configurar como entradas todas las líneas de la puerta A y como salidas las de la
puerta B, habría que direccionar el banco 1 (bit 5 de STATUS=’1’), cargar con ‘1’ los bits de TRISA y con
‘0’ todos los bits de TRISB. Una vez configuradas las puertas habrá que volver a poner a ‘0’ el bit 5 del
registro STATUS (volver al banco 0) para poder leer la información introducida por las líneas configuradas
como entradas o enviar por las líneas configuradas como salidas.

41
Figura 22. Registros STATUS, PORTA y TRISA.

En el esquema de conexión mostrado en la figura 20 se puede observar que cuando se cierre un interruptor se
aplicará un ‘0’ a la entrada correspondiente del microcontrolador y, si este valor se traslada a la salida el
diodo led unido a la misma se apagará. Cuando se abra un interruptor, se aplicará un ‘1’ en la entrada y el
diodo led se encenderá. Aparecen en este ejemplo algunas instrucciones nuevas:

bsf f,d : pone a ‘1’ el bit b del registro f .


bcf f,d : pone a ‘0’ el bit b del registro f .
goto etiqueta : salta hasta la instrucción que va precedida por la etiqueta.
A continuación se expone el código ensamblador del programa y el diagrama de flujo (Figura 23).

Figura 23. Diagrama de flujo del ejemplo 2.

List p=16f84
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
org 0x00
goto INICIO
org 0x05 ;salta el vector de interrupción
INICIO
bsf STATUS,5 ;cambia al banco1
movlw b’00000000’ ;W ‘00’
movwf PORTB ;TRISB W (PORTB salidas)
movlw b’00011111’ ;W ‘1F’
movwf PORTA ;TRISA W (PORTA entradas)
bcf STATUS,5 ;cambia al banco0
BUCLE

42
movf PORTA,W ;W PORTA
movwf PORTB ;PORTB W
goto BUCLE
end

Los valores codificados en binario se escriben entre comilla simple y precedidos de la letra b.

Ejemplo 3. Confeccionar un programa para el PIC 16F84 que explore el estado de un interruptor conectado a
la línea RA0 del puerto A (Figura 24) y que ilumine el diodo led conectado a la línea RB0 del puerto B
cuando el interruptor se halle cerrado. Este ejemplo incorpora la instrucción:

btfsc f,d : salta una instrucción si el bit b del registro f es ‘0’, si no, sigue por la siguiente instrucción.

clrf f : borra el contenido del registro f.

A continuación se expone el código ensamblador del programa y el diagrama de flujo (Figura 25).

Figura 24. Esquema de conexión del ejemplo 3.

Figura 25. Diagrama de flujo del ejemplo 3.

List p=16f84
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
org 0x00
goto INICIO
org 0x05 ;salta el vector de interrupción

43
INICIO
bsf STATUS,5 ;cambia al banco1
clrf PORTB ;Puerto B configurado como salidas
movlw b’00011111’ ;Puerto A configurado como entradas
movwf PORTA
bcf STATUS,5 ;cambia al banco0
BUCLE
btfsc PORTA,0 ;¿RA0=0? salta si RA0 es ‘0’
goto RA0_es_1
bsf PORTB,0 ;pone a ‘1’ RB0, enciende el led
goto BUCLE
RA0_es_1
bcf PORTB,0 ;pone a ‘0’ RB0, apaga el led
goto BUCLE
end

Ejemplo 4. Confeccionar un programa para el PIC 16F84 que comience poniendo a cero un contador y lo
vaya incrementando de unidad en unidad hasta alcanzar el valor 5Fh (95), momento en el cual se encenderá
un led conectado a RB0 y terminará el programa. No existe ninguna instrucción que nos permita comparar el
contenido de los registros de la memoria. Para solucionar este problema lo que haremos será restar al
contenido del registro el valor con el que queremos compararlo y analizar el resultado de dicha operación.

Si el resultado de la resta es cero los dos valores son iguales y si por el contrario el resultado es distinto de
cero los valores comparados son distintos. Existe un bit (Z) en el registro STATUS (figura 25) para indicar
cuando una operación aritmética o lógica realizada en la ALU da como resultado cero.
Las instrucciones nuevas que se van a emplear son:

incf f,d : incrementa en una unidad el contenido del registro f y deposita el resultado en W si d = 0 (o W), o en
f si d = 1.
subwf f,d : resta el contenido de W al contenido de f y deposita el resultado en W si d = 0 (o W), o en f si d
=1.
sublw k : resta el valor de k al contenido de W y almacena el resultado en W.

A continuación se expone el código ensamblador del programa y el diagrama de flujo (Figura 27).

Figura 26. Bit Z del registro STATUS.

44
Figura 27. Diagrama de flujo del ejemplo 4.

List p=16f84
STATUS equ 0x03
PORTB equ 0x06
CONTADOR equ 0x0C
org 0x00
goto INICIO
org 0x05 ;salta el vector de interrupción
INICIO
bsf STATUS,5 ;cambia al banco1
bcf PORTB,0 ;RB0 salida, TRISB.0=0
bcf STATUS,5 ;cambia al banco0
bcf PORTB,0 ;apaga el led (RB0=0)
clrf CONTADOR ;inicializa CONTADOR =0
BUCLE
incf CONTADOR,1 ;incrementa CONTADOR
movwl 0x5f ;W ‘5F’
subwf CONTADOR,W ;resta el valor del contador a W
btfss STATUS,2 ;salta si Z=1(el resultado de la resta es 0)
goto BUCLE ;salta a BUCLE si no son iguales
bsf PORTB,0 ;enciende el led (RB0=1)
end

Ejemplo 5. Confeccionar un programa para el PIC 16F84 trabajando a 4MHz que produzca una señal
cuadrada de periodo 50 ms (25 ms a nivel alto y 25 ms a nivel bajo) en el pin RB0. Para generar la señal
cuadrada en la patilla del microcontrolador RB0 procederemos de la siguiente manera: pondremos el bit RB0
a ‘1’ ejecutaremos un rutina (subprograma) encargada de realizar un retardo de 25 ms; pondremos de nuevo el
bit RB0 a ‘0’ y volveremos a ejecutar la subrutina anterior. Este proceso se repetirá indefinidamente.

Una de las funciones más habituales en los programas de control suele ser determinar intervalos concretos de
tiempo. También suele ser frecuente contar impulsos producidos en el exterior del sistema. En el

45
microcontrolador PIC16F84 estas funciones la realiza un temporizador/contador de 8 bits, llamado TMR0 que
actúa de dos maneras distintas:

• Como contador de sucesos, representados por los impulsos que se aplican a la patilla RA4/T0CKI.
Al llegar al valor FFh se desbordará el contador y, con el siguiente impulso pasa a 00h, advirtiendo
esta circunstancia activando un señalizador y/o provocando una interrupción.
• Como temporizador, se incrementa con cada ciclo de instrucción (4/Freloj),o divisores del mismo,
hasta que se desborda (pasa de 00h a FFh) y avisa poniendo a ‘1’ un señalizador y/o provocando una
interrupción.

Para que el TMR0 funcione como contador de impulsos aplicados en RA4/T0CKI hay que poner a ‘1’ el bit
T0CS, que es el que ocupa la posición 5 del registro OPTION (figura 27). Para que el TMR0 funcione como
temporizador el bit T0CS debe ponerse a ‘0’. TMR0 es un registro de propósito especial ubicado en la
posición 01h del banco 0 de la memoria de datos RAM. En igual dirección pero en el banco 1 se encuentra el
registro de configuración OPTION. El tiempo de la temporización se calcula a partir del periodo de la señal
de reloj (Treloj), el valor de un divisor de frecuencia definido en el registro OPTION y el valor del
temporizador TMR0.

Figura 28. Registro OPTION.

Temporización = 4·Treloj · (255 - TMR0) · Divisor 255 - TMR0 = Temporización / (4 ·Treloj · Divisor)

Si se desea temporizar 25ms (25000 µs) y asignamos al divisor de frecuencia el valor 128 (PSA =’0’, PS2 =
‘1’, PS1 =’1’, PS0 = ‘0’), el temporizador TMR0 deberá contar 195 eventos:

255 -TMR0 = 25·10 –3 / (1·10 –6 · 128) = 195,3

El valor que hay que cargar en el temporizador TMR0 será el complemento de 195, es decir, 255-195= 60,
que equivale al código hexadecimal 0x3c.

Al cargar en el registro TMR0 el valor 60, éste se incrementará cada 128µs (ciclo definido por: Divisor · 4 ·
Treloj ). Cuando llegue al final de la cuenta (255), se habrá incrementado 195 veces, generando un retardo de
aproximadamente 25ms (195 · 128 s). En ese instante se pondrá ‘1’ el bit T0IF del registro INTCON
(registro de propósito especial 0x0B del banco 0, Figura 29).

Aparecen en el código las siguientes instrucciones:

call k : guarda la dirección de la instrucción actual y salta a la dirección k (donde se encuentra la subrutina).

46
return :retorna a la dirección almacenada. Una vez ejecutada la subrutina el programa vuelve a la posición de
la memoria de programa posterior a la llamada call.

A continuación se expone el código ensamblador del programa y el diagrama de flujo


(Figura 30).

Figura 29. Registro INTCON.

Figura 30. Diagrama de flujo del ejemplo 5.

List p=16f84
STATUS equ 0x03
PORTB equ 0x06
TMR0 equ 0x01
INTCON equ 0x0B
org 0x00
goto INICIO
org 0x05
INICIO
bsf STATUS,5 ;cambia al banco1
clrf PORTB ;PORTB salidas
movlw b’00000110 ;configuración OPTION
movwf TMR0
bcf STATUS,5 ;cambia al banco0
BUCLE
bcf PORTB,0 ;RB0 = ‘0’
call RETARDO ;retardo
bsf PORTB,0 ;RB0 = ‘1’

47
call RETARDO ;retardo
goto BUCLE
RETARDO
bcf INTCON,2 ;desconecta el flag de desbordamiento
movlw 0x3c
movwf TMR0 ;carga TMR0
EXPLORA
btfss INTCON,2 ;¿Se ha desbordado TMR0?
goto EXPLORA ;bucle hasta que TMR0 llegue a 256
return
end

48

Vous aimerez peut-être aussi