57
Características especiales del PIC16F84A Índice de contenidos Características especiales del PIC16F84A o Índice de contenidos o Palabra de configuración CP PWRTE WDTE FOSC1, FOSC0 o Programar la palabra de configuración o Oscilador Oscilador externo Oscilador TTL o El reset Reset a la alimentación Power-on Reset (POR) Power-up Timer (PWRT) Oscillator Start-up Timer (OST) Secuencia de reset Circuito de reset a la alimentación externo Reset manual Origen del reset o Las interrupciones Funcionamiento Fuentes de interrupción Proceso genérico para crear interrupciones DISPOSITIVOS LÓGICOS MICROPROGRAMABLES Características especiales del PIC16F84A 7. 2 Palabra de configuración Hay ciertos aspectos del PIC que han de ser activados o desactivados cuando se programa y no se pueden volver a cambiar hasta que el PIC no se reprograme de nuevo. 1

Caracteristicas Especiales Del Pic 16f84

Embed Size (px)

Citation preview

Page 1: Caracteristicas Especiales Del Pic 16f84

Características especiales del PIC16F84A

Índice de contenidos

Características especiales del PIC16F84A o Índice de contenidos o Palabra de configuración

CP PWRTE WDTE FOSC1, FOSC0

o Programar la palabra de configuración o Oscilador

Oscilador externo Oscilador TTL

o El reset Reset a la alimentación

Power-on Reset (POR) Power-up Timer (PWRT) Oscillator Start-up Timer (OST) Secuencia de reset Circuito de reset a la alimentación externo

Reset manual Origen del reset

o Las interrupciones Funcionamiento Fuentes de interrupción Proceso genérico para crear interrupciones

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.2

Palabra de configuración

    Hay ciertos aspectos del PIC que han de ser activados o desactivados cuando se programa y no se pueden volver a cambiar hasta que el PIC no se reprograme de nuevo.

    El PIC16F84 dispone de 4 elementos programables (los modelos superiores tienen más) que se encuentran en la llamada palabra de configuración. A estos 4 elementos o bits de configuración también se les conoce como fuses (fusibles).

    La palabra de configuración se encuentra en la dirección de memoria de programa 2007 h. Esta posición está más allá del espacio de memoria de programa destinada al usuario y pertenece al espacio de memoria de prueba y configuración (2000h - 3FFFh). Solamente se puede acceder a este espacio durante la programación del dispositivo.

1

Page 2: Caracteristicas Especiales Del Pic 16f84

R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W

CP CP CP CP CP CP CP CP CP CP /PWRTE WDTE FOSC1 FOSC0

B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0

CP, bit 4 a 13: Bits de protección de código.o 1: Protección de código deshabilitada.o 0: Memoria protegida por código.

PWRTE, bit 3: Bit para habilitar el Power-up Timer o temporizador de encendido. o 1: Power-up timer deshabilitado.o 0: Power-up Timer habilitado.

WDTE, bit 2: Bit para habilitar el Watchdog timer o temporizador perro guardián.o 1: WDT habilitado.o 0: WDT deshabilitado.

FOSC1, FOSC0, bit 0 y 1: Selección del oscilador.o 00: Oscilador LP.o 01: Oscilador XT.o 10: Oscilador HS.o 11: Oscilador RC.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.3

CP

    Activando CP, Code Protection, tendremos la garantía de que el código escrito en el PIC no pueda ser leído por otra persona, para que no se copie, modifique, etc. Esto no impide que el PIC funcione como siempre, ni que no se pueda sobrescribir su contenido. Lo único que nos impide es leerlo.

PWRTE

    Si activamos el bit PWRTE, conseguimos que se genere un retardo en la inicialización del microcontrolador. Esto se utiliza para que la tensión se estabilice, por lo que se recomienda su uso.

WDTE

    El "perro guardián" del PIC se configura aquí. Con esto el PIC tiene la capacidad de autorresetearse. Es útil ante problemas que impidan el funcionamiento del programa del PIC, como un bucle infinito, el WDT lo sacará de él reseteándo al PIC.

    Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos borrar cada cierto tiempo. Si pasa un tiempo (entre 2.5ms y 2.5 seg) y el registro no ha sido borrado, el PIC se resetea. La instrucción para borrar el registro es CLRWDT. Con poner un par de ellos a lo largo de nuestro código es suficiente para tener una garantía de que nuestro PIC no se quede "colgado".

FOSC1, FOSC0

2

Page 3: Caracteristicas Especiales Del Pic 16f84

    Mediante FOSC1 y FOSC0 controlamos el modo de oscilación que usará el PIC para funcionar. Como ya sabemos, el oscilador se puede configurar de 4 maneras distintas, dependiendo de la velocidad y del tipo de circuito oscilador empleado. Vamos a recordar como eran y como podemos configurarlos.

XT: Tendremos que disponer de un cristal de cuarzo y dos condensadores. Esto permitirá generar los pulsos necesarios para el microcontrolador con una frecuencia determinada. La exactitud es muy alta, por lo que se recomienda para casi todas las aplicaciones. El valor del cristal generalmente será de 4Mhz (como máximo) y los condensadores serán cerámicos de entre 15 y 33 nF.

RC: Este es el sistema más sencillo y económico. Se basa en un montaje con una resistencia y un condensador. La velocidad a la que oscile el PIC dependerá de los valores del condensador y de la resistencia. La máxima frecuencia que podremos emplear con este sistema será de 5.5MHz (con el PIC16F84A-20).

HS: Para cuando necesitemos aplicaciones de alta velocidad, entre 4 y 20 Mhz. Este montaje se basa también en un cristal de cuarzo, como el XT.

LP: (Low Power) Esta modalidad permite un descenso del consumo en el PIC gracias a que la frecuencia de oscilación es menor que en la configuración XT. Al igual que con XT y HS, necesitaremos un cristal de cuarzo (de 32 a 200 KHz) y dos condensadores.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.4

Programar la palabra de configuración

    Existen dos maneras de programar la palabra de configuración:

1) Cuando se programa el PIC. En todos los programadores es posible activar o desactivar estas opciones a nuestra conveniencia. En la siguiente figura puede verse una captura del programa ICProg, el más extendido en la programación de microcontroladores y en la parte derecha, las opciones de configuración.

2) Activación por código. La línea de memoria de configuración es creada por el programa ensamblador con los valores por defecto. Podemos hacer que estos valores cambien introduciendo una línea de código en el nuestro algoritmo. Este código está contenido en el fichero que incluimos en la cabecera (P16F84A.INC):

_CP_ON EQU H'000F' ; Activa code protect_CP_OFF EQU H'3FFF' ; Desactiva code protect_PWRTE_ON EQU H'3FF7' ; Activa power on reset_PWRTE_OFF EQU H'3FFF' ; Desactiva power on reset_WDT_ON EQU H'3FFF' ; Activa Watchdog

_WDT_OFF EQU H'3FFB' ; Desactiva Watchdog_LP_OSC EQU H'3FFC' ; Oscilador LP_XT_OSC EQU H'3FFD' ; Oscilador XT_HS_OSC EQU H'3FFE' ; Oscilador HS_RC_OSC EQU H'3FFF' ; Oscilador RC

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.5

3

Page 4: Caracteristicas Especiales Del Pic 16f84

    Como podemos ver los nombres de las etiquetas son bastante intuitivos. Este código debe situarse al principio del programa, después del tipo de PIC a usar y de la definición de las etiquetas. La línea de configuración siempre comienza con la directriz __CONFIG y cada opción debe estar separada de otra con el carácter & . Veamos un ejemplo:

LIST P=PIC16F84A ; Pic a usar

#INCLUDE <P16F84A.INC> ; Lista de etiquetas de microchip

; Bits de configuración. Configuran opciones externas de hardware para la programacion

__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

    En este ejemplo, Code Protect y Watchdog Timer están desactivados, Power on Reset en cambio está activado, y el cristal usado no supera los 4 MHz.

    Cuando cargemos el archivo del PIC en el programador (por ejemplo, en Ic-Prog), estarán marcadas las opciones que hemos configurado en el código. Aunque lo hayamos hecho así, podemos cambiar estas opciones en la ventana del programador.

Oscilador

    Todo microprocesador o microcontrolador requiere de una señal de reloj que sincronice su funcionamiento. Esta señal se obtiene mediante un oscilador de frecuencia.

    Existen microcontroladores que tienen un oscilador interno y no requieren de componentes externos. El microcontrolador PIC16F84 requiere de un circuito externo de oscilación o generador de pulsos de reloj.

    La frecuencia de reloj máxima es de 4 MHz para el PIC16F84A-04 y de 20 MHz para el PIC16F84A-20.

    El PIC16F84 puede utilizar cuatro tipo diferentes configuraciones de reloj. La elección dependerá de la precisión y velocidad que requiramos; por otro lado, el coste también es un aspecto a tener en cuenta a la hora de elegir uno u otro.

    En el momento de programar el microcontrolador se deberá especificar en los parámetros el tipo de oscilador que utilizamos en el circuito electrónico. En ese momento, se programan dos bits de configuración denominados FOSC1 y FOSC2. Por ejemplo si su frecuencia de trabajo es de 20 MHz entonces la configuración del microcontrolador deberá estar en "HS"; pero si su frecuencia de trabajo es de 4 Mhz entonces la configuración del microcontrolador deberá estar en "XT".

    Existen 4 modos de oscilador para el PIC16F84A. Tres (LP,XT y HS) utilizan cristal de cuarzo y el cuarta (LP) utiliza una resistencia y un condensador

    Relacionados con los modos de oscilador y la frecuencia máxima a la que el PIC podrá trabajar tenemos 3 versiones del PIC16F84A:

El PIC16LF84A-04, ideal para aplicaciones de bajo consumo, puede trabajar con una Vdd de 2 a 5,5 voltios en los modos LP, XT y RC, pero no dispone del modo HS. Puede utilizarse en el modo LP para frecuencias entre 0 y 200 KHz, en el modo XT para frecuencias entre 100 KHz y 2 MHz y en el modo RC desde 0 hasta 2 MHz.

4

Page 5: Caracteristicas Especiales Del Pic 16f84

El PIC16F84A-04, para aplicaciones generales, puede trabajar en los cuatro modos. En el modo LP para frecuencias entre 32 KHz y 200 KHz, en el modo XT para frecuencias entre 100 KHz y 4 MHz y en el modo RC hasta 4 MHz. Puede trabajar con una Vdd de 4 a 5,5 voltios en los modos XT, LP y RC, pero el rango se acorta de 4,5 a 5,5 voltios con el modo HS.

El PIC16F84A-20 se reservará normalmente para el modo HS y frecuencias entre 4 MHz y 20 MHz. Puede trabajar con una Vdd de 4 a 5,5 voltios en los modos XT, LP y RC, pero el rango se acorta de 4,5 a 5,5 voltios con el modo HS.

    A continuación entraremos en algunos detalles sobre los modos de oscilador

Modo oscilador XT, LP y HS

    XT (XTal): Oscilador estándar de cristal de cuarzo, desde una frecuencia de 100 kHz hasta un máximo de 4 MHz para el PIC16F84A-04.

    La frecuencia máxima en el modo XT para el PIC16F84A-04 es de 4 MHz.

    La condición más importante para que este oscilador funcione es que los condensadores C1 y C2 deberán ser iguales. En una tabla mas adelante están reflejados algunos valores de los condensadores C1 y C2.

    Debe utilizarse una resistencia en serie (Rs) para cristales AT.

    LP (Low Power): Con cristal de cuarzo desde 32 a 200 KHz. Este oscilador es igual que el anterior, con la diferencia de que el PIC trabaja de una manera distinta. Este modo está destinado para trabajar con un cristal de menor frecuencia, que, como consecuencia, hará que el PIC consuma menos corriente. Es el modo ideal para el PIC16LF84A-04.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.6

    HS (High Speed): Alta velocidad, también con cristal de cuarzo de 4 a 20 MHz. Habremos de usar esta configuración cuando usemos cristales mayores de 4 MHz. Es el modo adecuado para un PIC16F84A-20.

5

Page 6: Caracteristicas Especiales Del Pic 16f84

Selección de condensadores para osciladores de cristal.

Modo Frecuencia OSC1/C1 OSC2/C2

LP32 Khz200 Khz

68 - 100 pF15 - 33 pF

68 - 100 pF15 - 33 pF

XT100 Khz2 Mhz4 Mhz

100 - 150 pF15 - 33 pF15 - 33 pF

100 - 150 pF15 - 33 pF15 - 33 pF

HS4 Mhz20 Mhz

15 - 33 pF15 - 33 pF

15 - 33 pF15 - 33 pF

    Para una VDD > 4,5 V, se recomienda que C1 = C2 = 33 pF.

    Nota: Sólo el PIC16F84A-20 podrá llegar a trabajar a 20 MHz.

Modo oscilador RC

    RC (Resistor/Capacitor): Oscilador Resistencia/Capacidad. Es el más económico por que tan solo se utiliza un condensador no polarizado y una resistencia. Es adecuado para las aplicaciones donde las temporizaciones no requieran precisión. La frecuencia depende de:

La tensión de alimentación El valor de la resistencia El valor del condensador La temperatura de funcionamiento

    Además de esto, la frecuencia de oscilación puede variar de un microcontrolador a otro debido a variaciones en algunos parámetros en la fabricación de cada integrado. También han de tenerse en cuenta la variación debidas a la tolerancia de la resistencia y condensador utilizados. Incluso las capacidades parasitas que puedan aparecer, como el trazado de las pistas o con los contactos del zócalo donde va insertado el microcontrolador pueden afectar a la frecuencia de la oscilación, sobre todo si se utilizan condensadores de pequeño valor. En general las variaciones de la frecuencia de oscilación son mayores cuanto mayor sea R y menor sea C.

    En la figura siguiente aparece como debe conectarse el circuito RC al PIC:

6

Page 7: Caracteristicas Especiales Del Pic 16f84

    La frecuencia máxima en el modo RC para el PIC16F84A-04 es de 4 MHz.

    Los valores de R deben estar comprendidos entre 5 y 100 K, mientras que los valores de C no deben ser inferiores a 20 pF.

    Es importante saber que para valores de resistencia menor a 5 K, el sistema se hace inestable o se podría detener la oscilación completamente. Para valores de resistencias mayores a 100 K (por ejemplo 1 MOhmio), el oscilador se hace muy susceptible al ruido, humedad y a la temperatura por lo tanto se recomienda que este tipo de oscilador se encuentre en el siguiente rango (5K < R < 100 K). Por otro lado se recomienda utilizar un condensador no polarizado mayor de 20 picoFaradios para disminuir el ruido y aumentar la estabilidad del sistema.

    La frecuencia del oscilador, dividida por 4, está disponible en el terminal OSC2/CLKOUT y puede utilizarse para comprobar la frecuencia o para sincronizar otros dispositivos.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.7

    A continuación se muestran algunos gráficos que muestran valores de frecuencia de oscilación según el condensador y la resistencia. También es importante saber que la tensión de alimentación que tendrá el microcontrolador influye directamente en la frecuencia final. En la figura siguiente se muestran algunas combinaciones de resistencias y condensador. En la gráfica se muestra que la frecuencia máxima que puede conseguirse es de unos 800 Khz con un condensador de 300 pF.

7

Page 8: Caracteristicas Especiales Del Pic 16f84

    Si nos damos cuenta, para algunos valores del voltaje, el valor de frecuencia se hace verdadero para la expresión de la frecuencia que da la fórmula:

    ;f = R x C

    Donde C está expresado en Faradios y R en Ohmios. Por desgracia el punto en el que coincide la frecuencia y el voltaje no es lineal para todos los valores de V.

    En la siguiente gráfica tenemos que la máxima frecuencia que podrá ser obtenida es de unos 1,8 Mhz colocando un condensador de 100 pF.

8

Page 9: Caracteristicas Especiales Del Pic 16f84

    Finalmente en la tercera gráfica tenemos que la máxima frecuencia obtenida con un oscilador RC es de unos 15 Mhz utilizando un condensador de 22 pF.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.8

9

Page 10: Caracteristicas Especiales Del Pic 16f84

Oscilador externo

    A continuación se exponen dos configuraciones que se pueden emplear con tres de los cuatro modos de funcionamiento: XT, HS ó LS. En ambos casos se utiliza un oscilador externo.

    Conviene recordar que según la frecuencia de la señal inyectada, debemos usar la opción LP para frecuencias comprendidas entre 32 y 200 KHz, la opción XT para frecuencias situadas entre los 100 KHz y los 4 MHz, y la opción HS para frecuencias comprendidas entre 4 y 20 MHz (dependiendo esta última de la velocidad máxima permitida por el PIC).

    Señal de reloj externa:

    En ciertas ocasiones disponemos una fuente de reloj que proviene de una fuente externa como puede ser un oscilador TTL o CMOS. La onda generada por esta fuente externa puede servir para poner en funcionamiento el PIC. En la siguiente figura tenemos la forma de conexionar la entrada digital a traves de un inversor lógico.

    Como se puede observar, todos los circuitos oscilatorios que se conectan al PIC a través de una sola patilla, van conectadas a la entrada OSC1, dejando la entrada OSC2 abierta.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.9

Oscilador TTL

    Este tipo de oscilador está basado en un cristal que contiene toda la circuitería para generar una onda cuadrada. Este ha de ser conectado como si de un generador de señal externa se tratase. Al incluir toda la circuitería esto lo convierte en la opción más costosa; pero resulta una forma interesante por la precisión en la señal de reloj emitida.

    Estos tipos de cristales están diseñados especialmente para tecnologías TTL. La frecuencias disponibles para esta versión de cristal son muy amplias y las mas usuales son 1 - 1.8432 - 2 - 4 - 8 - 10 - 11.059 - 12 - 14.31818 - 16 - 20 - 25 - 32 - 33 - 40 - 50 - 80 y 100 Mhz.

    En la imagen siguiente se muestra como debe conectarse al microcontrolador y las características del cristal.

10

Page 11: Caracteristicas Especiales Del Pic 16f84

El reset

    Cuando se ejecuta un reset, se producen dos acciones importantes.

El contador de programa se vuelve a colocar en el principio del programa (0000 h). Los registros modificados vuelven a su estado por defecto.

    El reset puede ser provocado por 3 causas diferentes que dan origen a 5 modos:

1. Conexión de la alimentación al PIC POR (Power On Reset).2. Activando la patilla MLCR mientras el PIC está en modo normal.3. Activando la patilla MLCR mientras el PIC está en modo SLEEP.4. Un desbordamiento del WDT mientras el PIC está en modo normal.5. Un desbordamiento del WDT mientras el PIC está en modo SLEEP.

    En todos los casos, salvo en el quinto, el contador de programa PC se pone a 0000 h (vector de reset), donde debe encontrarse la primera instrucción ejecutable del programa. Además todos los registros específicos (SFR) son colocados en estados predeterminados (ver Estado predeterminado de los registros específicos en Registros del PIC16F84A).

    En el quinto caso, cuando se produce un desbordamiento del WDT mientras el PIC está en modo SLEEP, no se produce un reset propiamente dicho, sino que el PIC se sale del modo SLEEP, se "despierta" mediante el temporizador watchdog y el PC se incrementa en una unidad para pasar a la instrucción que sigue a la instrucción SLEEP, igual que cuando se sale de este modo mediante una interrupción, si el bit GIE del registro INTCON está a uno.

Reset a la alimentación

Power-on Reset (POR)

11

Page 12: Caracteristicas Especiales Del Pic 16f84

    Cuando se alimenta al PIC, se genera automáticamente un reset gracias a un circuito interno que detecta la subida de la tensión de alimentación en el rango de 1.2 a 1,7 voltios. Esto elimina la necesidad de utilizar un circuito externo mediante resistencia y condensador para conseguir un reset a la alimentción y si no va a utilizarse un reset manual, la patilla MCLR, puede conectarse a positivo (VCC) directamente o a través de una resistencia para desactivarla.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.10

Power-up Timer (PWRT)

    PWRT es un sistema interno del microcontrolador que lo mantiene reseteado durante unos 72 ms hasta que se estabilice la tensión de alimentación. Utiliza un circuito oscilador RC interno y un contador para conseguir ese tiempo.

    El tiempo en que está activo PWRT puede ser distinto entre distintos PIC, según el valor de Vcc, la temperatura y otras variables.

    PWRT puede se habilitado/deshabilitado mediante el bit de configuración PWRTE , recomendandose su activación (ver Palabra de configuración ).

Oscillator Start-up Timer (OST)

    OST es un temporizador interno que proporciona un retardo de 1024 ciclos del oscilador después de que termine el retardo que proporciona PWRT . Se utiliza para mantener reseteado al microcontrolador para asegurarse que la oscilación del cristal de cuarzo o resonador se ha iniciado y se ha estabilizado.

    OST actúa solamente si se utilizan los modos XT , LP y HS y cuando se alimenta al PIC o cuando se despierta desde el modo SLEEP.

Secuencia de reset

    Teniendo en cuenta lo que hemos visto sobre POR, PWRT y OST , la secuencia que que se sigue si PWRT y OST están habilitados es:

PWRT actúa después de que POR termine. OST actúa después de que PWRT termine.

    El tiempo total variará según el modo del oscilador y la configuración de PWRTE. Por ejemplo, en el modo RC con PWRT deshabilitado el tiempo de reset será mínimo.

Configuración osciladorAlimentación

Despertar desde SLEEPPWRT habilitado PWRT deshabilitado

XT, HS, LP 72 ms + 1024 TOSC 1024 TOSC 1024 TOSC

RC 72 ms - -

12

Page 13: Caracteristicas Especiales Del Pic 16f84

Circuito de reset a la alimentación externo

    Este circuito de reset a la alimentación externo es únicamente necesario si la subida de la tensión de alimentación es muy lenta. En la figura siguiente se muestra la configuración necesaria para realizar un reset automático:

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.11

    Algunas reglas básicas para realizar este circuito son:

Es recomendable que R1 sea menor de 40 K para asegurarse que su tensión no supere los 0,2 voltios cuando MCLR esté a nivel alto (la corriente máxima en la patilla MCLR es menor de 5 μA). Un voltaje mayor puede degradar el nivle VIH de la patilla MCLR.

Se recomienda que R2 esté entre 50 y 100 ohmios. El diodo D1 ayuda a provocar una descarga rápida del condensador cuando se elimina la alimentación.

    Nota: Si en MCLR se aplica una tensión por debajo de VSS se pueden inducir corrientes mayores de 80 mA, que pueden causar problemas. Para solucionar esto se coloca una resistencia de 50 a 100 ohmios para aplicar un nivel bajo a la patilla MCLR en lugar de llevar esta patilla directamente a VSS. En nuestro caso esta resistencia es R2.

    Para terminar habría que decir que, en la mayoría de los casos será más que suficiente con conectar MCLR a la alimentación positiva (VCC) y usar los dispositivos de reset del PIC.

Reset manual

    En el caso de que sea necesario se puede aplicar un reset manual a la patilla MCLR mediante un pulsador y una resistencia.

    La siguiente figura muestra una configuración básica para realizar un reset manual:

13

Page 14: Caracteristicas Especiales Del Pic 16f84

    La resistencia de 100 ohmios puede eliminarse del circuito al no existir peligro de que en MCLR aparezcan tensiones menores de VSS. Pero debería mantenerse si se coloca un condensador en paralelo al pulsador.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.12

Origen del reset

    Es posible distinguir por software el origen del reset, para lo que basta con leer los bits TO (Timer Out) y PD (Power Down) del registro de estado como se muestra el la tabla siguiente:

TO PD ORIGEN DEL RESET

0 0 Desbordamiento WDT en modo SLEEP. Se ha salido del modo SLEEP.

0 1 Desbordamiento WDT en modo normal.

1 0 Activación MCLR en modo SLEEP

1 1Conexión de alimentación (POR)Activación MCLR en modo normal

Las interrupciones

    El sistema de interrupciones consiste en un mecanismo por el cual un evento interno o externo, asíncrono respecto al programa, puede interrumpir la normal ejecución de éste produciendo automáticamente un salto a una subrutina, de manera que pueda atender inmediatamente el evento, y retomar luego la ejecución del programa exactamente en donde estaba en el momento de ser interrumpido.

    Este mecanismo es muy útil por ejemplo para el manejo de timers o rutinas que deben repetirse periódicamente (refresco de display, antirrebote para teclado, detección de pulsos externos, recepción de datos, etc.).

Funcionamiento

14

Page 15: Caracteristicas Especiales Del Pic 16f84

    Las interrupciones se comportan casi exactamente igual que las subrutinas. Desde el punto de vista del control del programa, al producirse una interrupción se produce el mismo efecto que ocurriría si el programa tuviese un CALL 0004 h (una llamada a una subrutina situada en la posición de memoria 0004h) en el punto en que se produjo la interrupción. En el registro de control del sistema de interrupciones principal (INTCON) existe un bit de habilitación general de interrupciones GIE , que debe ser programado a 1 para que las interrupciones puedan actuar. Al producirse una interrupción, este bit se borra automáticamente para evitar nuevas interrupciones.

    La instrucción RETFIE se utiliza al final de la rutina de interrupción, y es idéntica a un retorno de subrutina, salvo que además coloca a uno automáticamente el bit GIE volviendo a habilitar las interrupciones. Dentro de la rutina de interrupción, el programa deberá comprobar el estado de las banderas de interrupción de cada una de las fuentes habilitadas, para detectar cual fue la que causó la interrupción y así decidir que acción tomar.

    En la siguiente figura se muestra la lógica combinacional que usa el PIC16F84A para detectar una interrupción. Cada interrupción se autoriza manualmente a través del bit XXXE y después generalmente, a través del bit GIE. Ver Registro INTCON .

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.13

Fuentes de interrupción

    La señal que produce la interrupción es en realidad una sola, que resulta de la combinación de todas las fuentes posibles y de los bits de habilitación.

    Las fuentes de interrupción varían con cada versión de PIC, y pueden ser, por ejemplo:

Interrupción externa por pin RB0/INT. Desbordamiento del Timer 0. Desbordamiento del Timer 1. Desbordamiento del Timer 2. Cambio en el estado de los bits 4 a 7 del puerto B. Interrupción del capture/compare 1. Interrupción del capture/compare 2. Transmisión o recepción de un carácter por la interface serie sincrónica. Transmisión o recepción de un carácter por la interface serie asincrónica. Fin de conversión A/D.

15

Page 16: Caracteristicas Especiales Del Pic 16f84

Lectura/escritura del puerto paralelo de comunicación con otros microprocesadores. Escritura de EEPROM finalizada.

    En el caso del PIC16F84A, las fuentes de interrupción son 4:

Interrupción externa por patilla RB0/INT. Desbordamiento del Timer 0 (TMR0). Cambio en el estado de los bits 4 a 7 del puerto B. Escritura de EEPROM finalizada.

Proceso genérico para crear interrupciones

    Como ya sabemos una interrupción sólo puede ejecutar un solo vector de interrupción. Esto significa, que a diferencia de otros microcontroladores, que tienen un vector para cada tipo de interrupción, aquí sólo disponemos de uno para todas las interrupciones. Por consiguiente, en la interrupción tendremos que comprobar las banderas correspondientes para saber que fuente ha sido la que ha causado la interrupción.

    Veamos un ejemplo. En el siguiente fragmento de código, definimos el vector de reset en la posición 0x00, como siempre, y en la instrucción siguiente saltamos al principio del programa. Después definimos el vector de reset, mediante la instrucción ORG 0x04 y a continuación está situado el código perteneciente a la subrutina de la instrucción. Esta termina con la instrucción RETFIE . Si nos damos cuenta, al principio el programa pregunta si la instrucción fue provocada por la patilla de interrupción externo. Antes de retornar el control al programa principal se baja la bandera que provocó la interrupción. La instrucción de retorno vuelve a habilitar las instrucciones.

DISPOSITIVOS LÓGICOS MICROPROGRAMABLES

Características especiales del PIC16F84A

7.14

;************************************************;; ESTE PROGRAMA HACE UN CONTADOR DECIMAL DE UN ;; DISPLAY DE 7 SEGMENTOS, SE INCREMENTA CADA VEZ ;; QUE EL MICRO TIENE UNA INTERRUPCION POR EL PIN ;; RBO/INT ;;************************************************;

LIST P=PIC16F84A

; EN VEZ DE INCLUIR EL ARCHIVO P16F84A.INC; DEFINIMOS AQUÍ LAS ETIQUETAS QUE USAREMOSSTATUS EQU 03hPORTA EQU 05h TRISA EQU 05hPORTB EQU 06hTRISB EQU 06hINTCON EQU 0BhCONTA EQU 0ChLOOPS EQU 0DhLOOPS2 EQU 0EhOPCION EQU 01h

Z EQU 02hW EQU 00h

16

Page 17: Caracteristicas Especiales Del Pic 16f84

ORG 0X00 ; VECTOR DE RESETGOTO INICIO ; SALTA AL INICIO DEL PROGRAMA

ORG 0X04 ; VECTOR QUE ATIENDE LA INTERRUPCION

CALL RETARDO ; LLAMA A RETARDOBTFSC PORTB,0 ; PREGUNTA POR EL PIN RB0GOTO SALE ; SALTA A LA ETIQUETA SALEBTFSS INTCON,1 ; CONFIRMA SI LA INTERRUPCION FUE

; CAUSADA POR EL PIN INTGOTO SALE ; SALTA A LA ETIQUETA SALEINCF CONTA ; INCREMENTA EL CONTADORMOVF CONTA,W ; CARGA W CON EL CONTADORXORLW 0X0A ; XOR PARA VER SI ES IGUAL A 0AhBTFSC STATUS,Z ; PRUEBA SI EL CONTADOR LLEGÓ A 0AhCLRF CONTA ; SI LLEGÓ A 10 PASA A 0

MOVF CONTA,W ; PASA EL DATO AL DISPLAYMOVWF PORTA CALL RETARDO ; LLAMA A RETARDO

SALE BCF INTCON,1 ; PONE A CERO LA BANDERA DE INTERRUPCIONRETFIE ; REGRESA AL PROGRAMA PRINCIPAL

RETARDOMOVLW .100 MOVWF LOOPS

TOP2 MOVLW .110MOVWF LOOPS2

TOP NOPNOPNOPNOPNOPNOPDECFSZ LOOPS2GOTO TOPDECFSZ LOOPSGOTO TOP2RETLW 0

INICIO……..

1. Descripción de sus pines

RA0, RA1, RA2, RA3 y RA4: son los pines del puerto A

RB0, RB1, RB2, RB3, RB4, RB5, RB6 y RB7: son los pines del puerto B.

17

Page 18: Caracteristicas Especiales Del Pic 16f84

MCLR: Pin de reseteo del pic, cuando se pone a "0" el pic se resetea.

Vdd y Vss: pines de alimentación (Vdd 5V y Vss a masa)

OSC1/CLKIN y OSC2/CLKOUT: son para el oscilador Los tipos de osciladores mas usados son el XT (cristal de cuarzo) y el RC (resistencia y condensador) el modo de conexionado es el siguiente:

Oscilador XT Oscilador RC

C1=C2=33pFCrystal ≤ 4MHz

C1 alrededor de 20pF

5KΩ ≤ R1 ≤ 100KΩ

 

2. Organización de la memoria

En primer lugar tenemos que distinguir claramente entre tres tipos de memoria:

Una: la memoria EEPROM donde almacenaremos el programa que haremos, esta memoria solo podrá ser leida por el pic (el pic va leyendo las instrucciones del programa almacenado en esta memoria y las va ejecutando). Al apagar el pic esta memoria no se borra.

Dos: la memoria RAM en cuyos registros se irán almacenando los valores de las variables que nosotros queramos y cuando nosotros queramos (por programa), al apagar el pic esta memoria se borra.

Tres: la memoria EEPROM para datos, es un espacio de memoria EEPROM en la que se pueden guardar variables que queremos conservar aunque se apague el pic. No se tratará aquí por ser una memoria mas difícil de emplear.

 

18

Page 19: Caracteristicas Especiales Del Pic 16f84

2.1 La memoria EEPROM o memoria de programa

El espacio marcado como "User memory Space" es el espacio de memoria donde irá nuestro programa, comprende las direcciones de memoria desde la 0000h hasta la 3FFh (3FFh en decimal es 1023, mas la dirección 0000h hacen 1024 direcciones, es decir, 1Kbyte)

"Reset Vector" es la primera dirección a la que se dirige el pic al encenderlo o al resetearlo.

"PC" y los "Stack Level" son empleados por el pic y nosotros no tenemos acceso a ellos.

 

 

 

   

 

 

2.2 La memoria RAM

La memoria RAM no solo se usa para almacenar nuestras variables, también se almacenan una serie de registros que configuran y controlan el PIC.

Podemos observar en la imagen que esta memoria esta dividida en dos bancos, el banco 0 y el banco 1, antes de acceder a un registro de esta memoria tenemos que preguntarnos en que banco estamos, generalmente se trabaja en el banco 0, ya veremos mas adelante como cambiamos de

19

Page 20: Caracteristicas Especiales Del Pic 16f84

banco de memoria.

Fijándonos en el banco 1, las direcciones desde la 00h hasta la 0Bh están ocupadas por registros del pic, por lo que tendremos que empezar a guardar nuestras variables a partir de la dirección 0Ch.

Podremos acceder al resto de registros para cambiar la configuración o el estado del pic.

Faltaría añadir a este cuadro el registro mas utilizado de todos, el acumulador (W) o registro de trabajo. No se trata de un registro propiamente dicho ya que no tiene dirección pero se usa constantemente para mover datos y dar valore a las variables (registros). Por ejemplo, si queremos copiar la información del registro 0Ch en el registro 0Dh no podremos hacerlo directamente, deberemos usar una instrucción para cargar el valor del registro 0Ch en el acumulador y después otra instrucción para cargar el valor del acumulador en el registro 0Bh.

3. Registros internos

A continuación se explican todos los registros de configuración y control de la memoria RAM. Estos registros se usan para controlar los pines del pic, consultar los resultados de las operaciones de la ALU (unidad aritmética lógica), cambiar de banco de memoria... entre otras cosas.

 

En BANCO "0"

INDF (direccionamiento indirecto): Dirección 00h, sirve para ver el dato de la dirección a la que apunta el registro FSR (dir. 04h) que veremos mas adelante.

TMR0 (Timer/contador): Dirección 01h, Aquí se puede ver el valor en tiempo real del Timer/contador. También se puede introducir un valor y alterar así el conteo. Este conteo puede ser interno (cuenta ciclos de reloj) o externo (cuneta inpulsos introducidos por RA4).

PCL (Parte baja del contador de programa): Dirección 02h, Modificando este registro se modifica el contador de programa, este contador de programa es el que señala al pic en que dirección (de EEPROM) tiene que leer la siguiente instrucción. Esto se utiliza mucho para consultar tablas (ya veremos mas adelante)

STATUS: Dirección 03h, este es uno de los registros mas importantes y el que mas vas a utilizar. Hay que analizar el funcionamiento de este registro bit a bit:

o CARRY, Dirección STATUS,0 (bit 0): bit de desbordamiento. Este bit se pone a "1" cuando la operación anterior ha rebasado la capacidad de un byte. Por ejemplo, si

20

Page 21: Caracteristicas Especiales Del Pic 16f84

sumo dos números y el resultado no cabe en 8 bit el CARRY se pone a "1", Pasa lo mismo cuando resto dos números y el resultado es un número negativo. Se puede usar para saber si un número es mayor que otro (restándolos, si hay acarreo es que el segundo era mayor que el primero). Una vez que este bit se pone a "1" no se baja solo (a"0"), hay que hacerlo por programa si queremos volverlo a utilizar.

o DC (digit carry), Dirección STATUS,1 (bit 1): lo mismo que el anterior pero esta vez nos avisa si el número no cabe en cuatro bits.

o Z (zero), Dirección STATUS,2 (bit 2): Se pone a "1" si la operación anterior ha sido cero. Y pasa a "0" si la operación anterior no ha sido cero. Se usa para comprobar la igualdad entre dos números (restándolos, si el resultado es cero ambos números son iguales)

o PD (Power - Down bit), Dirección STATUS,3 (bit3) se pone a "0" después de ejecutar la instrucción SLEEP*, se pone a "1" después de ejecutar la instrucción CLRWDT* o después de un power-up*.

o TO (Timer Up), Dirección STATUS,4 (bit4) se pone a "0" cuando se acaba el tiempo del WATCHDOG*, Se pone a "1" despues de ejecutar las instrucciones, CLRWDT* o SLEEP* o despues de un power-up*.

o RP0 y RP1 (selección de banco), Dirección STATUS,5 y STATUS,6. Como el PIC16F84 solo tiene dos bancos de memoria el RP1 no se usa para nada, la selección del banco se hace mediante RP0 (STATUS,5), si está a "0" nos encontramos en el banco 0, y si está a "1" nos encontramos en el banco 1.

o IRP, Dirección STATUS,7, En este PIC no se usa para nada.

 

FSR (Puntero), Dirección 04h, se usa para direccionamiento indirecto en combinación con el registro INDF (dir. 00h): se carga la dirección del registro que queremos leer indirectamente en FSR y se lee el contenido de dicho registro en INDF.

PORTA (Puerto A), Dirección 05h. Con este registro se puede ver o modificar el estado de los pines del puerto A (RA0 - RA4). Si un bit de este registro está a "1" también lo estará el pin correspondiente a ese bit. El que un pin esté a "1" quiere decir que su tensión es de 5V, si está a "0" su tensión es 0V.

Correspondencia:

o RA0 ==> PORTA,0

o RA1 ==> PORTA,1

21

Page 22: Caracteristicas Especiales Del Pic 16f84

o RA2 ==> PORTA,2

o RA3 ==> PORTA,3

o RA4 ==> PORTA,4

 

PORTB (Puerto B), Dirección 06h igual que PORTA pero con el puerto B

Correspondencia:

o RB0 ==> PORTB,0

o RB1 ==> PORTB,1

o RB2 ==> PORTB,2

o RB3 ==> PORTB,3

o RB4 ==> PORTB,4

o RB5 ==> PORTB,5

o RB6 ==> PORTB,6

o RB7 ==> PORTB,7

 

Dirección 07h, No utilizada por este PIC.

EEDATA, Dirección 08h. En este registro se pone el dato que se quiere grabar en la EEPROM de datos

EEADR, Dirección 09h. En este registro se pone la dirección de la EEPROM de datos donde queremos almacenar el contenido de EEDATA

PCLATH, Dirección 0Ah. Modifica la parte alta del contador de programa (PC), el contador de programa se compone de 13 bits, los 8 bits de menor peso se pueden modificar con PCL (dir. 02h) y los 5 bits de mayor peso se pueden modificar con PCLATH

INTCON (controla las interrupciones), Dirección 0Bh. Se estudia bit a bit:

o RBIF (Flag de interrupción por cambio de PORTB) Dirección INTCON,0 (bit 0) se pone a "1" cuando alguno de los pines RB4, RB5, RB6, o RB7 cambia su estado.

22

Page 23: Caracteristicas Especiales Del Pic 16f84

Una vez que está a "1" no pasa a "0" por si mismo: hay que ponerlo a cero por programa.

o INTF (Flag de interrupción de RB0) Dirección INTCON,1. Si está a "1" es que ha ocurrido una interrupción por RB0, si está a "0" es que dicha interrupción no ha ocurrido. Este bit es una copia de RB0.

o TOIF (Flag de interrupción por desbordamiento de TMR0) Dirección INTCON,2. Cuando TMR0 se desborda este Flag avisa poniendose a "1". Poner a "0" por programa.

o RBIE (Habilita la interrupción por cambio de PORTB) Dirección INTCON,3. Si está a "1" las interrupciones por cambio de PORTB son posibles.

o INTE (Habilita la interrupción por RB0) Dirección INTCON,4. Si lo ponemos a "1" la interrupción por RB0 es posible

o TOIE (Habilita la interrupción por desbordamiento de TMR0) Dirección INTCON,5. Si este bit esta a "1" la interrupción por desbordamiento de TMR0 es posible.

o EEIE (Habilita la interrupción por fin de escritura en la EEPROM de datos) Dirección INTCON,6. Cuando este bit está a "1" la interrupción cuando acaba la escritura en la EEPROM de datos es posible.

o GIE (Habilita las interrupciones globalmente) Dirección INTCON,7. Este bit permite que cualquier interrupción de las anteriores sea posible. Para usar alguna de las interrupciones anteriores hay que habilitarlas globalmente e individualmente.

4. Registros internos (continuación)

Ahora vamos con el banco 1, solo un comentario antes de empezar: ¿recuerdas la tabla de registros internos que veíamos en el punto 2.2? ves que los registros del banco 0 y los del banco 1 tienen direcciones distintas, en realidad podemos utilizar las mismas direcciones para referirnos a registros que están en uno u otro banco. El pic las diferenciará sin problemas gracias al bit de selección de banco (RP0). Por ejemplo, la dirección 05h se refiere a PORTA si estamos en el banco 0 y a TRISA si estamos en el banco 2.

Sabiendo esto vamos con los registros del BANCO 1:

INDF, Dirección 00h, Igual que en el Banco 0

OPTION, Dirección 01h, (configuración del prescaler, Timer, y alguna cosa mas) Se estudia bit a bit

23

Page 24: Caracteristicas Especiales Del Pic 16f84

o PS0, PS1 y PS2 (Bits del 0 al 2) Configuración del preescaler: El preescaler es un divisor de pulsos que está a la entrada del Timer-contador. El prescaler divide el número de pulsos que le entran al timer-contador o al Wachtdog. El factor de división es el siguiente (según los valores de PS2, PS1 y PS0 respectivamente.

o

o PSA, Dirección OPTION,3. Bit de asignación de prescaler: si está a "1" el prescaler se asigna a WDT (Wachtdog), si está a "0" se asigna al TMR0

o TOSE, Dirección OPTION,4. Bit de selección del tipo de flanco para TMR0. A "1" se incrementa TMR0 por flanco descendente de RA4, a "0" se incrementa TMR0 por flanco ascendente de RA4.

o TOCS, Dirección OPTION,5. Selecciona la entrada de reloj de TMR0. A "1" la entrada de reloj de TMR0 es por flanco de la patilla RA4, a "0" la entrada de reloj de TMR0 es por ciclo de reloj interno.

o INTEDG, Dirección OPTION,6. Tipo de flanco para la interrupción por RB0: A "1" la interrupción será por flanco ascendente, a "0" la interrupción será por flanco decendente.

o RBPU, dirección OPTION,7. Carga Pull-Up en puerto B. A "0" todas las salidas del puerto B tendrán una carga de pull-Up interna.

 

PCL, Dirección 02h, igual que en el banco 0

STATUS, Dirección 03h, Igual que en el banco 0

FSR, Dirección 04h, Igual que en el banco 0

24

Page 25: Caracteristicas Especiales Del Pic 16f84

TRISA, Dirección 05h, Configura el puerto A como entrada o salida. Si un bit de este registro se pone a "0" el pin correspondiente en el puerto A será una salida, por el contrario, si se pone a "1" el pin correspondiente en el puerto A será una entrada.

TRISB, Dirección 06h, Igual que el anterior pero con el puerto B

Dirección 07h, No usada en este pic

EECON1, Dirección 08h, Controla la lecturo y escritura en la EEPROM de datos. Se estudia bit a bit:

o RD, Dirección EECON1,0 (bit 0) A "1" iniciamos el ciclo de lectura, cuando acaba el ciclo se pone a "0" el solito

o WR, Dirección EECON1,1 (bit 1) A "1" indicamos que comienza el ciclo de escritura, cuando acaba el ciclo se pone a "0" él solito

o WREN, Dirección EECON1,2 (bit 2) si lo ponemos a "1" se permite la escritura, a "0" no se permite.

o WRERR, Dirección EECON1,3 (bit 3) error de escritura, si está a "1" indica que no se ha terminado el ciclo de escritura.

o EEIF, Dirección EECON1,4 (bit 4) interrupción de ciclo de escritura de la EEPROM, si está a "1" indica que el ciclo de escritura ha terminado, hay que ponerlo a "0" por programa.

o Bits del 5 al 7 no se utilizan.

 

EECON2, Dirección 09h, Se utiliza para la escritura en la EEPROM de datos como medida de seguridad: para poder guardar algo en la EEPROM hay que  cargar el valor 55h en este registro.

PCLATH, Dirección 0Ah, Igual que en el banco 0

INTCON, Dirección 0Bh, Igual que en el banco 1

6. Instrucciones para el ensamblador

Podemos usar para escribir los programas el bloc de notas de Windows, una vez escrito se guarda con extensión .asm y se convierte (ensambla) con un programa ensamblador, el MPASM. El resultado es un archivo con extensión .hex que podemos transferir al PIC16F84. Todo esto se explica mas

25

Page 26: Caracteristicas Especiales Del Pic 16f84

detalladamente en Programador del PIC16F84.

Existen una serie de instrucciones que son para el ensamblador y nos hacen la tarea de programación mas sencilla y mas legible.

EQU: Un ejemplo de esto son las etiquetas, podemos poner un nombre a un registro de memoria, esto se hace mediante la instrucción EQU. Por ejemplo:

VARIABLE1    EQU    0CH

A partir de ahora en lugar de escribir 0CH podemos escribir VARIABLE1

Con EQU también podemos poner nombre a constantes de la misma forma.

#DEFINE: Otra instrucción para el ensamblador que usaremos será la instrucción #DEFINE. Es parecido a EQU, solo que aquí no ponemos etiquetas a un registro, podemos ponerla a una instrucción entera, Por ejemplo:

#DEFINE    BANCO1    BSF   STATUS,5#DEFINE    BANCO0    BCF   STATUS,5

A partir de ahora, cuando escribamos BANCO1 se pondrá a "1" el bit de selección de banco y pasaremos al banco 1, al escribir BANCO0 pasaremos al banco 0

ORG: Indica al ensamblador la dirección (de memoria de programa) donde se guardará la instrucción que vaya a continuación. Por ejemplo:

ORG    00HCLRF   VARIABLE1    

La instrucción CLRF está en la dirección de memoria de programa 00H (será la primera instrucción en ser ejecutada por el pic)

END: Se escribe al final del programa para indicar que ya ha acabado. (es obligatorio, si no da error).

Etiquetas a direcciones de Programa: muy útiles para usar con instrucciones CALL (Llamada a subrutina) o GOTO (Salto). Por

26

Page 27: Caracteristicas Especiales Del Pic 16f84

ejemplo:

.........[Hay programa anterior].........BTFSC   VARIABLE1,0       ;Si el bit 0  de VARIABLE1 es                                                 ;"0" se salta la siguiente                                                 ;instrucciónGOTO     ESUNO                  ;Salta a ESUNO solo si el bit 0                                                 ;de VARIABLE1 es "1"BSF        VARIABLE1,0       ;Si el bit 0 de VARIABLE1 es 0                                                 ;se ejecuta esta instrucción y el                                                 ;programa sigue por aquí............[Continúa el programa]............

ESUNO                                            ;Etiqueta a una dirección de                                                          ;programa

BCF       VARIABLE1,0        ;Si el bit 0 de VARIABLE1 es                                                ;"1" se ejecuta esta otra                                                ;instrucción y el programa                                                ;sigue por aquí......[Cuntinúa el programa]......

Un poco de orden:

Es importante llevar un poco de orden a la hora de escribir el programa, nos ayudará mucho:

Al principio van los EQU y los #DEFINE, después comenzamos con el programa.

27

Page 28: Caracteristicas Especiales Del Pic 16f84

El programa se escribe en cuatro columnas separadas por tabuladores:

o En la primera columna se ponen las etiquetas a direcciones de programa

o En la segunda columna se ponen las instrucciones (BSF, CLRF, BTFSC... etc.)

o En la tercera columna se ponen Los registros o parámetros a los que afecta la instrucción.

o En la cuarta columna se ponen los comentarios que creas pertinentes (cuantos mas mejor) seguidos de un punto y coma.

Ejemplo de programa bien ordenado:

;************************************;* El siguiente programa configura                    *;* RA1 como entrada y RA0 como                  *;* salida y hace que la salida (RA0)                  *;* sea la inversa de la entrada                           *;* (RA1)                                                          *;************************************

;(Conviene poner título y una;pequeña explicación de lo que;hace el programa)

;(Primero los ECU y los #DEFINE)

STATUS  EQU 03HTRISA     EQU 05HPORTA    EQU 05H

#DEFINE     BANCO0  BCF  STATUS,5#DEFINE     BANCO1  BSF   STATUS,5

;(Después empezamos con el programa)

ORG              00H                                 ;Empezamos siempre a escribir en esta direcciónBANCO1                                              ;Pasamos al banco 1 para hacer algunas                                                              ;configuracionesBCF               TRISA,0                         ;Configuramos RA0 como salidaBSF                TRISA,1                         ;Configuramos RA1 como entradaBANCO0                                              ;Volvemos al banco 0

INICIO           BTFSC PORTA,1          ;Comprueba la entrada (RA1), si es "0" se salta la                                                              ;siguiente instrucciónGOTO            ESUNO                          ;si la entrada (RA1) es "1" va a ESUNO

28

Page 29: Caracteristicas Especiales Del Pic 16f84

BSF                PORTA,0                        ;Pone a "1" la salida RA0. Ejecuta esta instrucción                                                               ;porque la entrada RA1 era "0"GOTO            INICIO                            ;Vuelve otra vez a comprobar el estado de la                                                               ;entrada RA1

ESUNO          BCF PORTA,0                ;Pone a "0" la salida RA0. Ejecuta esta instrucción                                                               ;porque la entrada RA1 era "1"GOTO             INICIO                           ;Vuelve otra vez a comprobar el estado de la                                                                ;entrada RA1

END                                                        ;Indica final del programa

7. Subrutinas

Una subrutina o subprograma es una parte de programa que hace algo concreto y se repite a menudo, para ahorrar memoria y esfuerzo y para hacer el programa mas comprensible se agrupa en forma de subrutina. Una subrutina se debe ejecutar siempre llamándola con la instrucción CALL y al final de dicha subrutina debe haber siempre un RETURN. El esquema de la derecha muestra como funcionan las subrutinas:

Durante el programa principal se llama varias veces a la subrutina SUBR (el nombre es lo de menos) con la instrucción CALL. Cuando el pic ejecuta una instrucción CALL se guarda en memoria la dirección de código de programa a la que tiene que retornar de tal forma que cuando se encuentra con la instrucción RETURN vuelve al programa principal donde lo dejó.

Una subrutina no solo puede ser llamada desde el programa principal, también puede hacerse desde otra subrutina (una subrutina que llama a otra subrutina) o desde una interrupción (enseguida las veremos).

El siguiente ejemplo muestra un programa que utiliza una subrutina de retardo a la que llama DELAY. Esta subrutina de retardo se hace decrementando el registro CUENTA2 desde FFh hasta 00h 16 veces (las veces que se decrementa CUENTA2 son contadas hacia atrás por CUENTA1) De esta forma se consigue perder tiempo (el tiempo perdido con esta subrutina

29

Page 30: Caracteristicas Especiales Del Pic 16f84

depende de la frecuencia a la que opere el pic)

;**********************************;* Este programa configura RB0 como salida*;* y genera una intermitencia en dicha           *;* salida                                                       *;**********************************

STATUS                 EQU                    03HTRISB                     EQU                    06HPORTB                   EQU                    06H

CUENTA1              EQU      0CH                       ;Las variables que usemos siempre a                                                                            ;partir de la dirección 0ChCUENTA2              EQU      0DH

F                              EQU        1w                             EQU         0

ORG                        00HBSF                         STATUS,5                            ;banco 1BCF                         TRISB,0                                ;RB0 como salidaBCF                         STATUS,5                            ;banco 0

INICIO                    BSF TRISB,0                        ;Pone a "1" RB0 (enciende)CALL                       DELAY                                 ;Llama a la subrutina de retardoBCF                         TRISB,0                                 ;Cuando vuelve del retardo pone                                                                               ;a "0" RB0 (apaga)CALL                       DELAY                                  ;llama a la subrutina de retardoGOTO                      INICIO                                  ;cuando vuelve del retardo                                                                               ;ejecuta el GOTO

;===================================================;= DELAY:                                                                Subrutina de retardo =;=                                                             Modifica los siguientes registros: =;=                                                                           CUENTA1                  =;=                                                                           CUENTA2                  =;=                                                                           ACUMULADOR        =;=                                                                           STATUS                      =

;(Conviene hacerse un pequeño resumen de lo que;hace cada subrutina, puede sernos muy útil para;usarla en otros programas)

DELAY                      MOVLW        010H                ;Carga el acumulador con el valor                                                                                   ;10H (16 en decimal)MOVWF                    CUENTA1                              ;Mueve el contenido del acumulador

30

Page 31: Caracteristicas Especiales Del Pic 16f84

                                                                                   ;a CUENTA1ACA1                        MOVLW 0FFH                       ;Carga el acumulador con el valor FFHMOVWF                   CUENTA2                               ;Mueve el contenido del acumulador                                                                                   ;a CUENTA2ACA                          DECFSZ CUENTA2,F ;Decrementa CUENTA2, guarda el resultado                                                                                   ;en f, y si es cero se salta la siguiente                                                                                   ;instrucciónGOTO                        ACA                                        ;vuelve a decrementar mientras                                                                                   ;CUENTA2 no sea ceroDECFSZ                    CUENTA1,F                        ;Se decrementa CUENTA1 cada vez que                                                                                   ;CUENTA2 llega a ceroGOTO                        ACA1                            ;mientras CUENTA1 no llegue a cero recarga                                                                         ;CUENTA2 y repite el procesoRETURN                                                                     ;retorna al programa principal

;=                                                         =;= FIN DE LA SUBRUTINA DELAY =;===========================

END                                                                            ;Fin del programa

8. Interrupciones

Cuando se produce una interrupción el pic deja automáticamente lo que esté haciendo, va directo a la dirección 04h de programa y ejecuta lo que encuentre a partir de allí hasta encontrarse con la instrucción RETFIE que le hará abandonar la interrupción y volver al lugar donde se encontraba antes de producirse dicha interrupción.

Para que se pueda producir una interrupción hay que habilitar las interrupciones globalmente y la interrupción en concreto que queremos utilizar (con el registro INTCON). Este pic tiene 4 tipos de posibles interrupciones:

1.  

1. Por cambio en los bits RB4-RB7 2. Por el estado de RB0 3. Por desbordamiento del Timer-contador 4. Por fin de ciclo de escritura de la EEPROM de datos

Mientras se está ejecutando una interrupción no se puede producir otra interrupción, el pic no lo permite.

Una cosa importante a tener en cuenta al usar interrupciones es que cuando estas se producen podríamos estar trabajando con registros que pueden ser modificados en la propia interrupción, como el acumulador o el STATUS. Para que la interrupción no eche a perder el buen funcionamiento del programa

31

Page 32: Caracteristicas Especiales Del Pic 16f84

principal conviene guardar los valores de estos registros en otras variables que no vayamos a modificar. Antes de salir de la interrupción volvemos a restaurar los valores guardados y todo solucionado.

El siguiente ejemplo muestra un programa que usa la interrupción por cambio en el puerto B (En pines RB4 a RB7)

;*******************************************;* Este programa invierte el estado del pin*;* RA0 cada vez que se modifica el estado *;* de alguno de los pines RB4, RB5, RB6 o *;* RB7. Para ello habilita la interrupción *;* por cambio de RB4-RB7 *;*******************************************

STATUS EQU 03HTRISA EQU 05HPORTA EQU 05HTRISB EQU 06HPORTB EQU 06HINTCON EQU 0BH

ACUM EQU 0CHSTAT EQU 0DH

F EQU 1w EQU 0

#DEFINE BANCO0 BCF STATUS,5#DEFINE BANCO1 BSF STATUS,5

ORG 00HGOTO INICIO                                       ;ponemos este GOTO al principio para poder poner                                                               ;el subprograma de las interrupciones a partir de                                                               ;la dirección 04h

;Comienza la interrupción:;=========================

ORG  04H                                             ;El pic salta a esta dirección cuando se produce                                                              ;una interrupciónBCF  INTCON,0                                  ;bit que indica un cambio en RB4-RB7, recuerda que                                                              ;hay que ponerlo a "0" por programa, este es el                                                              ;momento

32

Page 33: Caracteristicas Especiales Del Pic 16f84

                                                             ;comenzamos guardando el contenido del acumulador                                                             ;y del STATUS para restaurarlos antes de salir de                                                             ;la interrupción (es recomendable hacer esto                                                             ;siempre que se usen interrupciones)

MOVWF  ACUM                                ;Copia el acumulador al registro ACUMMOVF  STATUS,W                            ;Guarda STATUS en el acumuladorBANCO0                                             ;Por si acaso, nunca se sabe en que parte de                                                             ;programa principal salta la interrupciónMOVWF  STAT                                   ;Copia el acumulador al registro STAT

                                                              ;Invertimos el estado de RA0:;============================

BTFSC  PORTA,0                                ;si RA0 es "0" salta la siguiente instrucciónGOTO ESUNO                                     ;vete a ESUNOBSF PORTA,0                                      ;Pon a "1" RA0 (porque era "0")GOTO HECHO                                     ;ya está invertido RA0, vete a HECHO

ESUNO BCF PORTA,0                       ;Pon a "0" RA0 (Porque era "1")

                                                              ;Ya se ha invertido el estado de RA0;===================================

                                                               ;ahora hay que restaurar los valores del STATUS y                                                               ;del acumulador antes de salir de la interrupción:

HECHO MOVF STAT,W                       ;Guarda el contenido de STAT en el acumuladorMOVWF STATUS                                 ;Restaura el STATUSSWAPF ACUM,F                                   ;Da la vuelta al registro ACUMSWAPF ACUM,W                                  ;Vuelve a dar la vuelta al registro ACUM y restaura                                                               ;el acumulador (Con la instruccion SWAPF para no                                                                ;alterar el STATUS, la instrucción MOVF altera el                                                                 ;bit 2 del STATUS)RETFIE                                                   ;fin de la interrupción

                                                                ;Fin de la interrupción;======================

INICIO BANCO1                                   ;Pasamos al banco 1MOVLW 0FFH                                       ;Todos los bits del acumulador a "1"MOVWF TRISB                                      ;configuramos todo el puerto B como entradasBCF TRISA,0                                          ;RA0 como salidaBANCO0                                                 ;Volvemos al banco 0

                                                                  ;Configuración de las interrupciones:;====================================

BSF INTCON,7                                         ;Habilita las interrupciones globalmente

33

Page 34: Caracteristicas Especiales Del Pic 16f84

BSF INTCON,3                                        ;Habilita la interrupción por cambio de puerto B

;====================================                                                                   ;ya están configuradas las interrupciones, a                                                            ;partir de ahora cuando haya un cambio en RB4-RB7                                                                   ;saltará la interrupción (a la dirección 04h de                                                                   ;programa)

NADA  GOTO  NADA                               ;En este ejemplo no se hace nada en el programa                                                                     ;principal, simplemente se espera a que salte la                                                                     ;interrupción. La verdadera utilidad de las                                                                     ;interrupciones es que se pueden hacer "cosas"                                                                     ;mientras sin preocuparse de la interrupción

END                                                             ;FIN DE PROGRAMA

9. Timer - Contador TMR0

El registro TMR0 puede contar ciclos de instrucción interna o pulsos de entrada por RA4 según el valor del bit 5 del registro OPTION (TOCS). Si este bit está a "1" TMR0 cuenta pulsos por RA4 y se le llama Contador; si el bit está a "0" cuenta ciclos de instrucción interna y se le llama Timer.

Cada ciclo de instrucción dura 4 veces el ciclo del reloj del pic (para un reloj de 4MHz ==> Ciclo reloj=0,25 µSeg ==> Ciclo instrucción = 4 X 0,25 = 1µSeg)

Cuando lo usamos como contador (Por RA4) podemos determinar si el incremento se hará por flanco ascendente o descendente con el bit 4 del registro OPTION (TOSE)

Podemos leer o escribir el registro TMR0 en cualquier momento. Cuando escribamos en él deja de contar durante dos ciclos, cuando lo leamos no pasa nada.

Podemos asignar el prescaler al TMR0, si hacemos esto podemos elegir el factor en el que se verá dividido el conteo mediante los bits del 0 al 2 del registro OPTION según la tabla del factor de división. Por ejemplo, si elegimos un factor de división de 1/2 tienen que entrar 2 pulsos para que TMR0 se incremente en uno, si está a 1/4 tienen que entrar 4... etc.

También podemos utilizar la interrupción que se produce cuando se desborda el TMR0, es decir, cuando pasa de FFh a 00h. (se configura desde el registro INTCON)

El siguiente ejemplo usa la interrupción por desbordamiento de TMR0 para 34

Page 35: Caracteristicas Especiales Del Pic 16f84

obtener una onda cuadrada a la salida RB0:

;**********************************;* Este programa crea una señal cuadrada a *;* la salida RB0, para ello utiliza el TMR0   *;* y la interrupción por desbordamiento del *;* mismo. Se le asignará el prescaler con    *;* un factor de división de 1/2. De esta        *;* forma las interrupciones saltarán a           *;* intervalos fijos de tiempo. Invirtiendo       *;* el estado de RB0 durante las                    *;* interrupciones se conseguirá una onda      *;* cuadrada perfecta                                    *;**********************************

OPTIONR EQU 01H ;Registro para configuración del TMR0STATUS EQU 03HTRISB EQU 06HPORTB EQU 06HINTCON EQU 0BH

ACUM EQU 0CHSTAT EQU 0DH

F EQU 1w EQU 0

#DEFINE BANCO0 BCF STATUS,5#DEFINE BANCO1 BSF STATUS,5

ORG 00HGOTO INICIO ;ponemos este GOTO al principio para poder poner                         ;el subprograma de las interrupciones a partir de                         ;la dirección 04h

                         ;Comienza la interrupción:;=========================

ORG 04H         ;El pic salta a esta dirección cuando se produce                         ;una interrupciónBCF INTCON,2 ;bit que indica desbordamiento de TMR0, recuerda                           ;que hay que ponerlo a "0" por programa, este es                           ;el momento

                         ;comenzamos guardando el contenido del acumulador                          ;y del STATUS para restaurarlos antes de salir de                         ;la interrupción (es recomendable hacer esto

35

Page 36: Caracteristicas Especiales Del Pic 16f84

                          ;siempre que se usen interrupciones)

MOVWF ACUM          ;Copia el acumulador al registro ACUMMOVF STATUS,W      ;Guarda STATUS en el acumuladorBANCO0                     ;Por si acaso, nunca se sabe en que parte de                                      ;programa principal salta la interrupciónMOVWF STAT            ;Copia el acumulador al registro STAT

                                       ;Para generar una onda cuadrada Invertimos el                                       ;estado de RB0 cada vez que salta una interrupción;=================================================

BTFSC PORTB,0           ;si RB0 es "0" salta la siguiente instrucciónGOTO ESUNO              ;vete a ESUNOBSF PORTB,0                ;Pon a "1" RB0 (porque era "0")GOTO HECHO              ;ya está invertido RB0, vete a HECHO

ESUNO BCF PORTB,0 ;Pon a "0" RA0 (Porque era "1")

                                        ;Ya se ha invertido el estado de RB0;===================================

                                         ;ahora hay que restaurar los valores del STATUS y                                         ;del acumulador antes de salir de la interrupción:

HECHO MOVF STAT,W ;Guarda el contenido de STAT en el acumuladorMOVWF STATUS          ;Restaura el STATUSSWAPF ACUM,F           ;Da la vuelta al registro ACUMSWAPF ACUM,W          ;Vuelve a dar la vuelta al registro ACUM y restaura                                         ;el acumulador (Con la instruccion SWAPF para no                                         ;alterar el STATUS, la instrucción MOVF altera el                                         ;bit 2 del STATUS)RETFIE                             ;fin de la interrupción

                                          ;Fin de la interrupción;======================

INICIO BANCO1             ;Pasamos al banco 1BCF TRISB,0                    ;RB0 como salidaBCF OPTIONR,3              ;Asignamos el preescaler a TMR0BCF OPTIONR,0              ;\BCF OPTIONR,1              ; }Prescaler a 1/2BCF OPTIONR,2              ;/BCF OPTIONR,5             ;Entrada de TMR0 por ciclo de                                          ;instrucción interna (se pone a contar)BANCO0                          ;Volvemos al banco 0

                                          ;Configuración de las interrupciones:

36

Page 37: Caracteristicas Especiales Del Pic 16f84

;====================================

BSF INTCON,7                 ;Habilita las interrupciones globalmenteBSF INTCON,5                 ;Habilita la interrupción por desbordamiento de TMR0

;====================================                                            ;ya están configuradas las interrupciones, a                                            ;partir de ahora cuando cuando se desborde TMR0                                            ;saltará la interrupción (a la dirección 04h de                                            ;programa)

NADA GOTO NADA         ;En este ejemplo no se hace nada en el programa                                            ;principal, simplemente se espera a que salte la                                            ;interrupción. La verdadera utilidad de las                                            ;interrupciones es que se pueden hacer "cosas"                                            ;mientras sin preocuparse de las interrupciones

END                                    ;FIN DE PROGRAMA

 

1. Tablas con la instrucción RETLW

Es muy común utilizar la instrucción RETLW para la creación de tablas de valores. Esta instrucción devuelve un valor en el acumulador al retornar de una subrutina, la usaremos conjuntamente con el registro PCL (echale un vistazo si no lo recuerdas). La creación de la tabla se hará de la siguiente forma:

TABLA            MOVWF       PCL

VALORES       RETLW        VALOR0                       RETLW        VALOR1                       RETLW        VALOR2                       RETLW        VALOR3                       ....

Donde VALOR0, VALOR1, VALOR2... etc. son los valores que queremos almacenar en la tabla.

La estrategia a seguir para consultar algún valor de la tabla es cargar en el acumulador la dirección de memoria de programa donde se encunetra el valor que quieres leer y después llamar a la subrutina TABLA (con un CALL). Y te estarás preguntando como se en que dirección esta cada valor, pues bien, el

37

Page 38: Caracteristicas Especiales Del Pic 16f84

VALOR0 está en la dirección VALORES (es la etiqueta que hemos puesto a esa dirección), el VALOR1 está en la dirección VALORES+1, VALOR2 está en la dirección VALORES+2... etc.

Y como no hay como un ejemplo para ver las cosas mas claras ahí va uno: El siguiente ejemplo cuenta las veces que se acciona un pulsador conectado en RA0 y muestra el valor del conteo en un display de 7 segmentos de ánodo común conectado al puerto B. La tabla contiene los valores necesarios para iluminar el display con cada número del 0 al 9. A continuación se muestran el esquema y el programa:

;****************************;* El siguiente programa cuenta las  *;* veces que se acciona un pulsador *;* conectado a RA0 y muestra el     *;* resultado de la cuenta en un         *;* display de 7 segmentos de ánodo *;* común conectado en el puerto B *;****************************

PCL               EQU                   02HSTATUS        EQU                   03HTRISA           EQU                   05HPORTA          EQU                   05HTRISB           EQU                    06HPORTB         EQU                    06H

CUENTA EQU 0CH                         ;Registro donde contaremosRETARDO EQU 0DH                       ;Registro para el retardo

F                    EQU                      138

Page 39: Caracteristicas Especiales Del Pic 16f84

w                   EQU                       0

#DEFINE     BANCO0  BCF  STATUS,5#DEFINE     BANCO1  BSF  STATUS,5

ORG              00HGOTO          INICIO                          ;Dejamos sitio a continuación para escribir                                                            ;nuestra tabla

TABLA       MOVWF    PCL              ;cargamos el valor del acumulador en el registro                                                            ;PCL. Cuando se ejecute esta instrucción el pic                                                            ;saltará inmediatamente a la dirección de programa                                                            ;que le hayamos metido.

                                                            ;en esta tabla almacenaremos los valores que hay                                                            ;que sacar por el puerto para que se muestren en                                                            ;el display los números del 0 al 9:DISP   RETLW    40H                         ;Para mostrar el 0RETLW 79H                                       ;Para mostrar el 1RETLW 24H                                       ;Para mostrar el 2RETLW 30H                                       ;Para mostrar el 3RETLW 19H                                       ;Para mostrar el 4RETLW 12H                                       ;Para mostrar el 5RETLW 02H                                       ;Para mostrar el 6RETLW 78H                                       ;Para mostrar el 7RETLW 00H                                       ;Para mostrar el 8RETLW 10H                                       ;Para mostrar el 9

INICIO   BANCO1                            ;Pasamos al banco 1BSF TRISA,0                                      ;Configuramos RA0 como EntradaCLRF TRISB                                       ;Configuramos el puerto B como salidasBANCO0                                            ;Volvemos al banco 0

CLRF   CUENTA                                ;Pone a cero la cuenta

MUESTRA  MOVLW  DISP               ;Carga en el acumulador la dirección donde                                                             ;se encuentra el primer valor de la tablaADDLW  CUENTA                             ;Le suma el valor de la cuenta para obtener                                                             ;la dirección del valor que nos interesaCALL  TABLA                                    ;Llama a la subrutina TABLA que nos devolverá                                                             ;el valor correspondiente de la tabla                                                             ;en el acumulador.MOVWF  PORTB                               ;Saca dicho valor por el puerto B que hará que se                                                             ;muestre en el display el número correspondiente

BTFSS  PORTA,0                                ;si RA0 es "1" salta la siguiente                                                             ;instrucción (si no se acciona el pulsador)CALL  SUMA1                                    ;Llama a la subrutina SUMA1 (porque RB0 es "0" y,                                                             ;por lo tanto, se ha accionado el pulsador)GOTO  MUESTRA

39

Page 40: Caracteristicas Especiales Del Pic 16f84

;================================================; SUMA1: Subrutina que suma uno al registro; CUENTA. Solo cuenta pulsaciones entre; 0 y 9 (ya que no se pueden mostrar mas; números en un display de 7 segmentos). ; Después espera a que se suelte el pulsador; conectado a RA0

SUMA1  INCF  CUENTA,F                  ;Incrementa el registro CUENTA

                                                                ;a continuación se mira si el registro                                                                ;CUENTA ha llegado a 0AH, en tal caso se                                                                ;pone a cero para comenzar de nuevo.

MOVLW  0AH                                       ;Carga 0AH en el acumuladorSUBWF  CUENTA,W                            ;Le resta CUENTA al acumuladorBTFSC  STATUS,2                                ;mira si el resultado ha sido                                                                ;cero (de serlo CUENTA sería igual a 0AH)CLRF  CUENTA                                    ;si CUENTA es 0AH la pone a cero

                                                                ;A continuación espera a que se suelte el pulsador                                                                ;(previene los rebotes)

CALL  REBOTE                                     ;Llama a la subrutina que previene los rebotesESPERA  BTFSS  PORTA,0                  ;\GOTO  ESPERA                                    ; Espera a que se suelte el pulsador para retornarRETURN ;/

                                                                ; Fin de SUMA1;================================================

;================================================                                                                ; REBOTE: Subrutina que hace una pequeña                                                                ; temporización para prevenir                                                                ; los rebotes

REBOTE  MOVLW  0FFH                     ;Carga el acumulador con 0FFhMOVWF  RETARDO                             ;Mueve el contenido del acumulador a RETARDOREBO  DECFSZ  RETARDO,F              ;\GOTO  REBO                                         ; }No retorna hasta que RETARDO llega a ceroRETURN ;/

                                                                 ; Fin de REBOTE;=================================================

END                                                         ;Indica final del programa 

40

Page 41: Caracteristicas Especiales Del Pic 16f84

41