Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
“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:
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.
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.
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.
• 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 control. El procesador utiliza las líneas del bus de control para sincronizar operaciones con
componentes externos.
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.
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.
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.
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:
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.
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).
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:
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).
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.
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).
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.
• PUERTO A
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
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.
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
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:
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.
19
Memoria de datos
Figura 8. Mapa de la memoria de programa.
Se encuentra en dos zonas bien diferenciadas:
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.
68
registros de uso Mapadeados en el
general banco 0
4Fh CFh
50h DFh
NO NO
IMPLEMENTADOS IMPLEMENTADOS
7Fh FFh
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.
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
Si por ejemplo el programa tuviera 250 líneas de instrucciones, la ejecución completa tardaría:
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:
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:
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:
28
Recursos auxiliares.
• 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.
• 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.
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.
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.
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.
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>).
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.
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.
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.
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.
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.
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.
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
37
Programació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.
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:
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):
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
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:
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.
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 ; ).
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:
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).
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.
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:
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.
A continuación se expone el código ensamblador del programa y el diagrama de flujo (Figura 25).
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).
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.
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:
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).
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.
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