Está en la página 1de 51

IUT

Cuman

MICROCONTROLADORES II
INTERRUPCIONES Y
TEMPORIZADORES
TEMA 2
PROF. LUIS ZURITA

(PIC16F84) CAUSAS DE INTERRUPCIN

IUT
Cuman

1. Activacin del pin RB0/INT


2. Desbordamiento del TMR0
3. Cambio de estado de una de los 4 pines de
ms peso (RB7:RB4) del puerto B
4. Finalizacin de la escritura en la EEPROM de
datos

REGISTRO INTCON

Prof. Luis Zurita

INTERRUCCIONES PIC16F87X
CLSICAS PIC16F84

IUT
Cuman

NUEVAS

GIE PEIETOIEINTERBIETOIFINTFRBIF

PIE1
PSPIE

ADIE

RCIE

TXIE

PIR1
SSPIE

CCP1IE

PIE2
---

Prof. Luis Zurita

---

EEIE

TMR2IE

TMR1IE

PIR2
BCLIE

--

--

CCP2IE

REGISTRO PIE1

IUT
Cuman

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


PSPIE ADIE RCIE TXIE SSPIE CCP1I TMR2 TMR1
IE
IE por
bit 7: PSPIE: bit de habilitacin Ede interrupcin
Bit 7 / escritura en el Puerto Paralelo Esclavo. Para
Bit 0 los
lectura

modelos de 40 pines.
1 = Habilita la interrupcin por lectura/escritura en el
PSP
0= inhabilita la interrupcin por lectura/escritura en el
PSP
bit 6: ADIF: bit de habilitacin de interrupcin por
finalizacin de la conversin A/D.
1 = Habilita la interrupcin del convertidor A/D
0 = Inhabilita la interrupcin del convertidor A/D
bit 5: RCIE: bit de habilitacin de interrupcin en
recepcin por el USART, cuando se llena el buffer.
1 Zurita
= Habilita interrupcin por recepcin en el USART
Prof. Luis

REGISTRO PIE1

IUT
Cuman

bit 4: TXIE: bit de interrupcin al transmitir por el USART,


cuando se vaca el buffer.
1 = Habilita la interrupcin de transmisin por el USART
0 = Inhabilita la interrupcin de transmisin por el USART
bit 3: SSPIE: bit de habilitacin de interrupcin por el Puerto
Serie Sncrono (SSP)
1= Habilita la interrupcin del SSP
0= Inhabilita la interrupcin del SSP
bit 2: CCP1IE: bit de habilitacin de interrupcin del mdulo
CCPI cuando se produce una captura o una comparacin.
1= Habilita la interrupcin del CCPI
0= Inhabilita la interrupcin del CCPI
bit 1: TMR2IE: bit de habilitacin de interrupcin por
desbordamiento de TMR2 que est emparejado con el
registro PR2 (92h)
1= Habilita la interrupcin por desbordamiento de TMR2
emparejado a PR2
0= Inhabilita la interrupcin de TMR2 emparejado a PR2
Prof. Luis Zurita
bit 0: TMR1IE: bit de habilitacin de interrupcin por

REGISTRO PIE2
U
---

0 R/W 0 U
0
---

0 R/W 0 R/W 0 U
EEIE BCLI -E como 0
bit 7: No implementado: se lee
bit 6
Bit
7 Reservado, Mantiene este bits a cero

IUT
Cuman

0U
--

0 R/W
CCP2
IE
Bit 0

bit 5: No implementado: se lee como 0


bit 4: EEIE: Habilita la interrupcin por escritura en la EEPROM de
datos
1= Habilita la interrupcin por escritura de la EEPROM de
datos
0 =Deshabilita la interrupcin por escritura en la EEPROM de
datos
bit 3: BCLIE: Habilita la interrupcin por colisin en el bus SSP
cuando dos o ms maestros tratan de transferir al mismo tiempo.
1 = Habilita la interrupcin por colisin de bus SSP
0 = Deshabilita la interrupcin por colisin en el bus SSP.
bit 2-1 No implementados, se leen como 0
bit 0: CCP2IE: Habilita la interrupcin del modulo CCP2
1 = habilita la interrupcin de CCP2

Prof. Luis Zurita

PC<12:0>

IUT
Cuman

CALL, RETURN
RETFIE, RETLW
Nivel 1 de la Pila

1
3

Nivel 2 de la Pila

Nivel 8 de la Pila
Vector de Reset

Vector de
Interrupcin
Pgina 0
Pgina 1
Pgina 2
Pgina 3

0000h

0004h
0005h
07FFh
0800h
0FFFh
1000h
17FFh
1FFh

INTERRUPCIONES EN LENGUAJE C

IUT
Cuman

Ventajas de usar las directivas de


interrupciones
El compilador genera el cdigo necesario
para saltar a la funcin que va tras esta
directiva en el momento de la interrupcin.
Tambin genera el cdigo para salvar al
principio y restituir al final el contexto
(salvar y restaurar el entorno), y borrar el
flag que se activ con la interrupcin.
El
programador
debe
seguir
encargndose nicamente de habilitar las
interrupciones y establecer las sentencias
que se ejecutarn en cada funcin de las
Prof. Luis Zurita
interrupciones deseadas a ejecutarse.

#INT_RTCC
#INT_RB
#INT_EXT
#INT_AD
#INT_TBE
#INT_RDA
#INT_TIMER
1
#INT_TIMER
2
#INT_CCP1
#INT_CCP2
#INT_SSP
#INT_PSP

Desborde del TMR0


Cambio en RB<4:7>
Cambio en RB0
Fin de conversin A/D
Fin de transmisin USART
Dato recibido en USART
Desborde del TMR1

TOIF
RBIF
INTF
ADIF
TXIF
RCIF
TMR1IF

Desborde del TMR2

TMR2IF

Captura/Comparacin en CCP1
Captura/Comparacin en CCP2
Envio/Recepcin de dato serie
sncrono
Dato entrante en puerto esclavo

CCP1IF
CCP2IF
SSPIF
PSPIF

INTERRUPCIONES EN LENGUAJE
C

IUT
Cuman

La directiva #INT_DEFAULT
Indica que la funcin que viene a continuacin
ser llamada si se dispara una interrupcin y
ninguno de los flags est activo.
La directiva #INT_GLOBAL
Indica que la funcin que va a continuacin
sustituye todas las acciones que inserta el
compilador al aceptarse una interrupcin. Slo se
ejecuta lo que vaya en dicha funcin.
GLOBAL equivale a GIE=PEIE=1 y debe activarse
de forma independiente. El resto activarn la
mscara correspondiente.
Prof. Luis Zurita

FUNCIONES PARA GESTIN DE


INTERRUPCIONES

IUT
Cuman

enable_interrupts (nivel);
nivel es una constante definida en el 16F877.h y
genera el cdigo necesario para activar las
mscaras necesarias.
Etiquetas de nivel definidas para el 16F877:
GLOBAL
INT_RTCC
INT_RB
INT_EXT
INT_AD
INT_TBE
INT_RDA
INT_TIMER1
INT_TIMER2
INT_CCP1
INT_CCP2
INT_SSP
INT_PSP
INT_BUSCOL
INT_EEPROM
La mscara global (hace a GIE=1) debe activarse
de manera independiente. Las otras activan la
mscara particular y el PEIE si es necesario.
disable_interrupts(nivel);

Prof. Luis Zurita

INTERRUPCIN EXTERIOR POR RB0


Es una interrupcin clsica en la mayora de
los PICs. Permite generar una interrupcin por
cambio de nivel en la entrada RB0.
La directiva que se utiliza es #INT_EXT y se
debe acompaar de las siguientes funciones:

IUT
Cuman

ext_int_edge(H_TO_L);
La interrupcin es activada por flanco de
bajada (antiva el flag INTF).
ext_int_edge(L_TO_H);
La interrupcin es activada por flanco de
subida (activa el flag INTF).
Prof. Luis Zurita

EJEMPLO 1. INTERRUPCIN POR


RB0/INT
#INT_EXT
ext_isr( ){
..//aqu se colocan las sentencias que se
..//desean ejecutar durante esta interrupcin.
}
void main ( ){
enable_interrupts(INT_EXT); //Activa INTE
ext_int_edge(H_TO_L); //Flanco de bajada
enable_interrupts(GLOBAL); //Habilita GIE
while (TRUE){
}
}
Prof. Luis Zurita

IUT
Cuman

EJEMPLO 2. Active dos leds de forma intermitente


cada 1 segundo. Si presiona RB0/INT, los leds se
activan a razn de 250 ms de manera intermitente
hasta que se presione RA1 para volver a su estado
normal.
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_IO(B)
#use fast_IO(D)
#use fast_IO(A)
#INT_EXT
void ext_interm( ){ //funcin de interrupcin por RB0/INT:
while (TRUE){
if (input(PIN_A0)==0)
{break;}
delay_ms(250);
output_toggle(PIN_D0);
output_toggle(PIN_D1);
}
Prof. Luis Zurita
}

IUT
Cuman

Continuacin Ejemplo 2.
void main(){
set_tris_b(0x01);
set_tris_d(0);
set_tris_a(0x01);
output_d(0);
port_b_pullups(true);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
enable_interrupts(global);
while(TRUE){
output_high(PIN_D0);
output_low(PIN_D1);
delay_ms(1000);
output_low(PIN_D0);
output_high(PIN_D1);
delay_ms(1000);}
}
Prof. Luis Zurita

IUT
Cuman

TIMER 0

IUT
Cuman

TMR0:
Registro
de
8
bits
de
lectura/escritura
OPTION: Configura al TMR0 para que
trabaje como temporizador contador y
asigna el valor al prescaler
INTCON: Da informacin mediante el bit
TOIF cuando el TMR0 se ha desbordado.
TRISA (PUERTO A): Permite el ingreso de
Prof. Luispulsos
Zurita
cuando el TMR0 est configurado

REGISTRO OPTION (Direccin 81H)

bit 7, RPBU : Resistencia Pull-up, Puerto


B, habilita el bit
1: Desactivadas
0: Activadas
bit 6, INTEDG: Flanco activo para el
control de interrupciones
1: Con flanco Ascendente
0: Con flanco Descendente
bit 5, TOCS: Fuente de Reloj para TMR0
1: Pulsos introducidos a travs de
RA4/T0CK1 (Contador)
0: Pulsos de reloj interno Fosc/4
(Temporizador)
bit 4, TOSE: Tipo de flanco en TOCK1
1: Incremento de TMR0 cada flanco
descendente
0: Incremento de TMR0 cada flanco
ascendente
Prof. Luis Zurita
bit 3, PSA: Bit de asignacin del prescaler

IUT
Cuman

QU ES EL PRESCALER?

IUT
Cuman

Divide la frecuencia de reloj de entrada del Timer0, entre valores


predefinidos, como se ve en la tabla asociada al registro OPTION,
1:32, 1: 64, 1:256, etc., genera una nueva seal de menor
frecuencia a la salida, que ser la seal de reloj de entrada al
registro TMR0.
Ralentiza seales de entrada demasiado rpidas para nuestros
propsitos.
Tambin existe un postescaler, asociado al perro guardin WDT
(Watch Dog Timer) del microcontrolador, pero en este caso recibe
el nombre de postcaler ya que se usa a la salida del WDT, no
pudiendo estar asignado a la vez al Timer0 o al WDT. El preescaler
es transparente para el programador, no se puede leer ni escribir
sobre l, pero se puede seleccionar por software, como ya se ha
dicho, mediante el registro OPTION.
Nota: Para evitar un RESET no deseado del sistema, es necesario
ejecutar una secuencia de instrucciones especficas cuando se
cambia la asignacin del prescaler del TMR0 al WDT. Esta
secuencia debe ser seguida, an cuando el WDT est inactivo.

CMO CUENTA EL TMR0?

IUT
Cuman

00H
FFH

El
TMR0
exclusivamente
ascendente,
descendente.

de

cuenta
forma
nunca
00H
(28 N10)

Si el TMR0 se carga con un


valor, ste comenzar a
contar
desde
el
valor
cargado
hasta
que
se
desborda (cuando pasa a
00H)

00H
FFH
Valor cargado
En el TMR0
00H

Prof. Luis Zurita

CLCULOS CON EL TMR0

IUT
Cuman

Cuando se carga en el registro TMR0 un valor


XXH, l mismo contar: (FFH XXH) impulsos y el
tiempo que tarda en hacerlo viene dado por la
expresin:
Temporizacin= 4 * TOSC * Valor Real TMR0 *
Rango del divisor de Frecuencia
Valor Real TMR0 = (28 N10) = (256 N10)
N10= Valor a cargar en el TMR0
Ejemplo: Sea un valor a cargar en el TMR0 de 100,
un prescaler seleccionado de 1:32 y un oscilador
XT. Determine el tiempo en que tardar el TMR0
en desbordarse.
Solucin: Sea XT = Frecuencia = 4 MHz, T = 0.25
s.
Prof. Luis Zurita

OTROS EJEMPLOS

IUT
Cuman

Se desea saber: Qu valor debemos cargar en el


TMR0, si deseamos obtener una temporizacin de
10,24 ms, utilizando un preescaler de 128 y un
cristal XT?
Temporizac in
10,24ms
Solucin:
0.25s 128
(256 N10) =4 TOSC Rgodivisor
=
=480
(256 N10) = 80, despejando N10 = (256 80) = 176, el
valor que debemos cargar en el TMR0 es 176, para que
ste cuente desde 176 hasta 256.

Elegir el TMR0, para generar un retraso de 1.5 ms


utilizando un oscilador de 10 MHz.
inMHz, T = 1001.ns
5ms
Solucin: SeaTemporizac
Fosc= 10
4 TOSC Rgodivisor
4 100ns RgoDivisor
(256 N10) =
=
N

10
Prof. Luis Zurita

= 256 - (3750/RgoDivisor)

CONTINUACIN EJEMPLO ANTERIOR

IUT
Cuman

Dmosle valores al Rango del divisor, hasta obtener un


valor que se acerque lo ms posible al retardo propuesto:
Si Prescaler= 256, Valor a cargar en el TMR0= 241
(redondeado)
Si Prescaler= 128, Valor a cargar en el TMR0= 227
(redondeado)
Si Prescaler= 64, Valor a cargar en el TMR0= 197
(redondeado)
Si Prescaler= 32, Valor a cargar en el TMR0= 139
(redondeado)
Etc
A manera de prctica, realice usted, el clculo de la
Temporizacin, para cada uno de los valores que se
consiguieron en los clculos anteriores. Escoja uno y
justifique. Particularmente parece que el que tiene el rango
de divisor de 64, es el mejor.
Nota: En este ejercicio resuelto, usted puede darse cuenta
de que no hay un solo resultado para los ejercicios, pero lo
Prof. Luis Zurita
que si debe cumplirse es que sea cualquiera que sean los

TIMER0 EN LENGUAJE C
La funcin para configurar el TIMER0 es:
setup_timer_0 (modo);
Donde modo est definido en el fichero de
setup_timer_0
OPTION_REG
cabecera
y afecta a los bits
5:0 del OPTION_REG:

IUT
Cuman

(modo);

(81h)

RTCC_INTERNAL

00000000

RTCC_EXT_L_TO_H

00100000

RTCC_EXT_H_TO_L

00110000

RTCC_DIV_1

00001000

RTCC_DIV_2

00000000

RTCC_DIV_4

00000001

RTCC_DIV_8

00000010

RTCC_DIV_16

00000011

RTCC_DIV_32

00000100

RTCC_DIV_64

00000101

RTCC_DIV_128

00000110

RTCC_DIV_256

00000111

TIMER0 EN LENGUAJE C

IUT
Cuman

Los distintos modos se pueden agrupar mediante


el empleo del smbolo |. Ejemplo:
setup_timer_0 (RTCC_DIV_2 | RTCC_EXT_L_TO_H);
El compilador C suministre una serie de funciones
para leer o escribir en el TIMER0. Para escribir un
valor en el registro:
set_timer0(valor);
valor : es un entero de 8 bits.
Para leer el valor actual del registro:
valor= get_timer0 ( );
valor: entero de 8 bits.
Prof. Luis Zurita

Ejemplo 3. Generar una seal cuadrada


de 1 kHz utilizando la interrupcin del
TIMER0

IUT
Cuman

Para generar una seal cuadrada de 1 kHz con un duty


cycle del 50 %, se necesita un perodo de 0,5 ms en nivel
alto y 0,5 ms en nivel bajo.
Paso 1. Clculos: Aplicando las frmulas del TIMER0:
Solucin:
0,5ms
Temporizac
in
(256 N10) = =
= 62,5
4 TOSC Rgodivisor
4 0.25s 8
(256 N10) = 62,5 y despejando N 10 = (256 62,5) =
193,5 194, por lo tanto el valor que debemos cargar en
el TMR0 es 194, para que ste cuente desde 194 hasta
256, generndonos la temporizacin de 0,5 ms. Estos
clculos se cumplen fielmente en lenguaje ensamblador,
sin embargo en lenguaje C, al generarse cdigos
adicionales, se realiza un ajuste de los valores hasta en 4
unidades por encima de lo que se calcul, por lo tanto el
valor a cargar definitivo en el TIMER0 es 198.
Prof. Luis Zurita

Ejemplo 3. Generar una seal cuadrada


de 1 kHz utilizando la interrupcin del
TIMER0

IUT
Cuman

#INCLUDE <16F877.h>
#FUSES
XT,NOWDT,NOPROTECT,NOLVP
#USE
DELAY(CLOCK=4000000)
#USE
fast_io(B)
NOTA: El compilador se
#INT_RTCC
encarga al entrar en la
RTCC_isr(){
interrupcin de inhabilitar
output_toggle(PIN_B7);
las interrupciones y al
set_timer0(198);}
salir de borrar los flags,
void main(){
por
lo
que
no
es
set_tris_B(0x00);
necesario hacerlo por
output_low(PIN_B7);
programa
setup_timer_0(RTCC_DIV_8);
set_timer0(198);
enable_interrupts(INT_RTCC);
Prof. Luis Zurita
enable_interrupts(GLOBAL);

TIMER 1

IUT
Cuman

Caractersticas bsicas:
1. Es de 16 bits.
2. Puede actuar como temporizador o como
contador bit (TMR1CS).
3. Se puede leer y escribir en los registros TMR1H,
TMR1L.
4. Puede pararse o habilitarse mediante el bit
TMR1ON.
5. Tiene un pre-divisor programable por software.
6. El oscilador de bajo consumo est situado entre
los pines T1OSI (entrada) y T1OSO (salida).
Prof. Luis Zurita

TIMER 1

IUT
Cuman

7. Al desbordase (FFFFh -> 0000h) produce la


interrupcin TMR1:
El bit de interrupcin del timer1 es TMR1IF
[Registro PIR1(0)].
Puede deshabilitarse mediante TMR1IE
[Registro PIE1(0)].
8. La frecuencia de oscilacin mx. es 200kHz. No
se apaga durante SLEEP.
9. Monitorea tiempo entre transiciones de una seal
en pin de entrada.
10. Controla con precisin el tiempo de transicin
de pin de salida.
11. Sirve para contar eventos externos y generar
interrupciones cuando ha ocurrido un nmero
deseado.
Prof. Luis Zurita

DIAGRAMA DE BLOQUE TIMER 1

Prof. Luis Zurita

IUT
Cuman

REGISTROS ASOCIADOS AL TIMER


1

IUT
Cuman

TMR1H = Parte alta del TIMER 1 (L/E)


TMR1L = Parte baja del TIMER 1 (L/E)
T1CON = Registro de control del TIMER 1
INTCON = Control de Interrupciones
PIE1 = Control de Interrupciones de
Perifricos
PIR1 = Sealizadores de Interrupciones
TRISC = Registro de configuracin PortC
PORTC= Registro de 8 bits.

Prof. Luis Zurita

IUT
Cuman

T1CON

Bit 7-6: No implementados: Se lee como 0


Bit 5-4: TlCKPS1:T1CKPS0: bit de seleccin del preescaler de la seal de reloj
delTIMER1:
11 = valor del preescaler 1:8
10 = valor del preescaler 1:4
01 = valor del preescaler 1:2
00 = valor del preescaler 1: 1

Bit 3: T1OSCEN: bit de habilitacin del oscilador del TIMER1. Cuando se emplea un
oscilador externo, hay que poner este bit a 1. El TMR1 puede trabajar a una
frecuencia totalmente independiente de la del sistema.
1 = Habilita el oscilador
0 = Deshabilita el oscilador
Nota: El oscilador y la resistencia se desconectan para reducir el consumo

Bit 2: #TlSYNC: bit de control de sincronizacin de la seal de entrada.


Con TMR1CS = 1
1= No sincroniza la entrada de reloj externa
0 = Sincroniza la entrada de reloj externa
Con TMR1CS = 0
En esta condicin se ignora. El TIMER1 utiliza el reloj interno cuando TMRICS=0

Bit 1 TMR1CS: bit de seleccin de la fuente de reloj del TIMER1


1 = Reloj externo por el pin RC0/T1OSO/T1CK1 (flanco ascendente)
0 = Reloj interno (FOSC/4)
Prof. Luis Zurita

Bit 0: TMR1ON: TIMER1 activo. Hace entrar o no en funcionamiento el TIMER1.

CLCULOS PARA EL TIMER 1

IUT
Cuman

Temporizacin= 4 * TOSC * (Valor Real


TMR1)* Rango del predivisor.
Valor
Real
TMR1=
(65536

(TMR1H:TMR1L))
(TMR1H:TMR1L) = Valor a cargar en el
TIMER1
Ejercicio:
Cul es el mximo valor de temporizacin
que se puede alcanzar con el TIMER 1?
Prof. Luis Zurita

IUT
Cuman

Realice un programa para que se genere una


interrupcin cada 0,5 segundos, utilizando un XT.
INICI
O

RSI

Configurar
TIMER 1

Deshabilitar GIE

Cargar TIMER 1

Limpiar
sealizador

Habilitar TIMER
1

Habilitar GIE

SLEEP
FIN

Prof. Luis Zurita

RETFIE

TIMER1 EN LENGUAJE C
La funcin para configurar el TIMER0 es:
setup_timer_1 (modo);
Donde modo est definido en el fichero de
cabecera
y afecta a los bitsT1CON
5:0 del (10h)
T1CON:
setup_timer_0
(modo);
T1_DISABLED
00000000
T1_INTERNAL
10000101
T1_EXTERNAL
10000111
T1_EXTERNAL_SYNC 10000011
T1_CLK_OUT
00001000
T1_DIV_BY_1
00000000
T1_DIV_BY_2
00010000
T1_DIV_BY_4
00100000
00110000
Prof. Luis Zurita T1_DIV_BY_8

IUT
Cuman

TIMER1 EN LENGUAJE C

IUT
Cuman

Los distintos modos se pueden agrupar mediante el


empleo del smbolo |. Ejemplo:
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_2);
El compilador C suministre una serie de funciones para
leer o escribir en el TIMER1. Para escribir un valor en el
registro:
set_timer1(valor);
valor : es un entero de 16 bits.
Para leer el valor actual del registro:
valor= get_timer1 ( );
valor: entero de 16 bits.
Prof. Luis Zurita

Ejemplo 4. Generar una interrupcin


cada un segundo utilizando el TIMER1

IUT
Cuman

Para generar un retardo de 1 segundo, se deben


generar dos veces 0,5 segundos, motivado a que
directamente el TIMER1 no puede alcanzarlo.
Paso 1. Clculos: Aplicando las frmulas del TIMER1:
Solucin:
Nota: este trmino debe
ser menor o igual a 65536.
Es por ello que se utiliz el
=predivisor
62500 de 8.

(65536 N16) = Temporizac


=
0,5s
in
4 TOSC Rgodivisor
4 0.25s 8
(65536 N16) = y despejando N16 = (65536 62500)
= 3036, por lo tanto el valor que debemos cargar en
el TMR1 es 3036, para que ste cuente desde 3036
hasta 65536, generndonos la temporizacin de 0,5
s.
Prof. Luis Zurita

EJEMPLO 4. Generar una interrupcin


cada un segundo utilizando el TIMER1
#INCLUDE <16F877.h>
#FUSES
XT,NOWDT,NOPROTECT,NOLVP
#USE
DELAY(CLOCK=4000000)
#USE
fast_io(B)
int1
cont=0;
#INT_TIMER1
temp1_isr(void){
if (cont==1) output_toggle(PIN_B0);
set_timer1(3036);
cont++;}
void main(){
set_tris_B(0x00);
output_low(PIN_B0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(3036);
Prof. Luis
Zurita
enable_interrupts(INT_TIMER1);

IUT
Cuman

Otra forma de realizar el ejemplo 4:


Mediante la espera de desborde del
TIMER1:
#INCLUDE <16F877.h>
#FUSES
XT,NOWDT,NOPROTECT,NOLVP
#USE
DELAY(CLOCK=4000000)
#USE
fast_io(B)
temp1s( ){
int
cont=0;
output_toggle(PIN_B0);
while (cont<2)
{ //para contar dos tiempos de 0,5 s.
set_timer1 (3036);
while (get_timer1()>=3036);
Prof. Luis Zurita
cont++;}

IUT
Cuman

TIMER 2

IUT
Cuman

Caractersticas bsicas:
1. Es de 8 bits.
2. Se puede leer y escribir en los registros
TMR2.
3. Puede pararse o habilitarse mediante el
bit TMR2ON.
4. Tiene un pre-divisor y un post-divisor
programable por software
5. Slo tiene modo temporizador.
6. Posee un registro (PR2) que ajusta el
momento de desborde.
7. PR2(Registro de 8 bits) que puede leerse
y escribirse PR2 con el cual compara su
valor:
Prof. Luis Zurita

TIMER 2

IUT
Cuman

9. Al igualarse TMR2 y PR2 se produce la


interrupcin TMR2:
1. El bit de interrupcin del timer2 es
TMR2IF (Registro PIR1(1)).
2. Hay un post-divisor a la salida del
comparador.
10. Los registros de pre-divisor y post-divisor
se limpian al:
1. Escribir en TMR2.
2. Escribir en el registro T2CON.
3. Cualquier tipo de RESET.
Prof. Luis Zurita
11. TMR2 no se limpia al escribir en T2CON.

IUT
Cuman

REGISTROS ASOCIADOS AL TIMER2

TMR2 = Registro de 8 bits. (L/E)


T2CON = Registro de control del TIMER 2
PR2 = Registro de ajuste del desborde
INTCON = Control de Interrupciones
PIE1 = Control de Interrupciones de
Perifricos
PIR1 = Sealizadores de Interrupciones

Prof. Luis Zurita

DIAGRAMA DE BLOQUE DEL TIMER


2

IUT
Cuman

Prof. Luis Zurita

T2CON

Bit 7: No implementado: Se lee como 0


Bit 6-3:TOUTPS3:TOUTPS0: bit de seleccin del rango del divisor del
Postescaler para el TIMER2:
0 0 0 0 Divisor del postescaler 1:1
0001
Divisor del postescaler 1:2
0010
Divisor del postescaler 1:3
0011
Divisor del postescaler 1:4
0 1 0 0 Divisor del postescaler 1:5
0101
Divisor del postescaler 1:6
0110
Divisor del postescaler 1:7
0111
Divisor del postescaler 1:8
1 0 0 0 Divisor del postescaler 1:9
1001
Divisor del postescaler 1:10
1010
Divisor del postescaler 1:11
1011
Divisor del postescaler 1:12
1 1 0 0 Divisor del postescaler 1:13
1101
Divisor del postescaler 1:14
1110
Divisor del postescaler 1:15
1 1 1 1 Divisor del postescaler 1:16
Bit 2: TMR2ON: bit de activacin del TIMER2
1 = habilita el funcionamiento del TIMER2
0 = Inhibe el funcionamiento del TIMER2
Prof. Luis
Zurita
Bit 1-0:T2CKPS1:T2CKPS0 Seleccin del rango de divisor del Preescaler del

IUT
Cuman

CLCULOS TIMER2

IUT
Cuman

Temporizacin= 4 * TOSC * Valor PR2 *


Rango del prescaler Timer2 * Rango del
postcaler Timer2
Ejercicio
Determine, cuanto tarda en desbordarse el
TMR2, si se utiliza un XT, con un prescaler
= 4 y un postcaler = 10, considerando que
PR2 = D200. Cargue el TMR2 con 00H

Prof. Luis Zurita

TIMER2 EN LENGUAJE C

IUT
Cuman

La configuracin del TIMER2 en el


compilador de C se realiza con la funcin:
setup_timer_2(modo , periodo , postcaler);
donde:
perodo es un valor entero de 8 bits (0-255)
que se carga en el registro PR2.
postcaler es el valor del postcaler (1 a 16).
Afecta a los bits 6:3 del registro T2CON
modo afecta a los bits 2:0 del registro T2CON.
Prof. Luis Zurita

TIMER2 EN LENGUAJE C
setup_timer_2(modo , periodo ,
postcaler);
T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
T2_DIV_BY_16

T2CON(12h
)
00000000
00000100
00000101
00000110

Para escribir un valor en el registro:

set_timer2(valor);
valor : es un entero de 16 bits.
Para leer el valor actual del registro:
Prof. Luis Zurita

IUT
Cuman

Ejemplo 5. Generar una seal de 1


kHz utilizando interrupcin con el
TIMER2

IUT
Cuman

Para una seal de 1 kHz se necesitan dos


semiperodos de 0,5 ms, se utilizar un XT, un
predivisor de 4 y un postcaler de 1:
Temporizacin= 4 * TOSC * Valor PR2 * Rango
del prescaler Timer2 * Rango del postcaler
Timer2
0,5 ms=(4/4000000)(4*1)*Valor PR2
Valor PR2=125
Sin embargo este valor se cumple en
lenguaje ensamblador, por lo que debe
ajustarse para lenguaje C reduciendo su valor
Prof. Luis
Zurita
hasta
11, o por tanteo.

IUT
Cuman

#INCLUDE <16F877.h>
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#USE
DELAY(CLOCK=4000000)
#USE
fast_io(B)
int1
cont=0;
#INT_TIMER2
void temp2_isr(void){
output_toggle(PIN_B0);
set_timer2(11);}
void main(){
set_tris_B(0x00);
output_low(PIN_B0);
Prof. Luis Zurita
setup_timer_2(T2_DIV_BY_4 , 124 , 1);

También podría gustarte