SlideShare una empresa de Scribd logo
MICROCONTROLADORES II
INTERRUPCIONES YINTERRUPCIONES Y
TEMPORIZADORES
TEMA 2
PROF. LUIS ZURITA
(PIC16F84) CAUSAS DE INTERRUPCIÓN
1. Activación del pin RB0/INT
2. Desbordamiento del TMR0
3. Cambio de estado de una de los 4 pines de más peso
(RB7:RB4) del puerto B
4. Finalización de la escritura en la EEPROM de datos
REGISTRO INTCONREGISTRO INTCON
Prof. Luis Zurita Microcontroladores II
INTERRUCCIONES PIC16F87X
CLÁSICAS PIC16F84 NUEVAS
GIE PEIE TOIE INTE RBIE TOIF INTF RBIF
PIE1 PIR1
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PIE1
PIE2
--- 0 --- EEIE BCLIE -- -- CCP2IE
PIR1
PIR2
Prof. Luis Zurita Microcontroladores II
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 CCP1IE TMR2IE TMR1IE
Bit 7 Bit 0
REGISTRO PIE1
bit 7: PSPIE: bit de habilitación de interrupción por lectura / escritura en
el Puerto Paralelo Esclavo. Para los modelos de 40 pines.
1 = Habilita la interrupción por lectura/escritura en el PSP
0= inhabilita la interrupción por lectura/escritura en el PSP0= inhabilita la interrupción por lectura/escritura en el PSP
bit 6: ADIF: bit de habilitación de interrupción por finalización de la
conversión A/D.
1 = Habilita la interrupción del convertidor A/D
0 = Inhabilita la interrupción del convertidor A/D
bit 5: RCIE: bit de habilitación de interrupción en recepción por el
USART, cuando se llena el buffer.
1 = Habilita interrupción por recepción en el USART
0 = Inhabilita interrupción por recepción en el USART
Prof. Luis Zurita Microcontroladores II
REGISTRO PIE1
bit 4: TXIE: bit de interrupción al transmitir por el USART, cuando se vacía el
buffer.
1 = Habilita la interrupción de transmisión por el USART
0 = Inhabilita la interrupción de transmisión por el USART
bit 3: SSPIE: bit de habilitación de interrupción por el Puerto Serie Síncrono
(SSP)
1= Habilita la interrupción del SSP
0= Inhabilita la interrupción del SSP
bit 2: CCP1IE: bit de habilitación de interrupción del módulo CCPI cuando sebit 2: CCP1IE: bit de habilitación de interrupción del módulo CCPI cuando se
produce una captura o una comparación.
1= Habilita la interrupción del CCPI
0= Inhabilita la interrupción del CCPI
bit 1: TMR2IE: bit de habilitación de interrupción por desbordamiento de
TMR2 que está emparejado con el registro PR2 (92h)
1= Habilita la interrupción por desbordamiento de TMR2 emparejado a
PR2
0= Inhabilita la interrupción de TMR2 emparejado a PR2
bit 0: TMR1IE: bit de habilitación de interrupción por desbordamiento del
TMRI
1= Habilita la interrupción por desbordamiento de TMR1
0= Inhabilita la interrupción por desbordamiento de TMR1
Prof. Luis Zurita Microcontroladores II
REGISTRO PIE2
U 0 R/W 0 U 0 R/W 0 R/W 0 U 0 U 0 R/W
--- 0 --- EEIE BCLIE -- -- CCP2IE
Bit 7 Bit 0
bit 7: No implementado: se lee como “0’
bit 6 Reservado, Mantiene este bits a cero
bit 5: No implementado: se lee como “0”
bit 4: EEIE: Habilita la interrupción por escritura en la EEPROM de datos
1= Habilita la interrupción por escritura de la EEPROM de datos1= Habilita la interrupción por escritura de la EEPROM de datos
0 =Deshabilita la interrupción por escritura en la EEPROM de datos
bit 3: BCLIE: Habilita la interrupción por colisión en el bus SSP cuando dos o más
maestros tratan de transferir al mismo tiempo.
1 = Habilita la interrupción por colisión de bus SSP
0 = Deshabilita la interrupción por colisión en el bus SSP.
bit 2-1 No implementados, se leen como “0”
bit 0: CCP2IE: Habilita la interrupción del modulo CCP2
1 = habilita la interrupción de CCP2
0 = inhabilita la interrupción de CCP2
Prof. Luis Zurita Microcontroladores II
PC<12:0>
Nivel 1 de la Pila
Nivel 2 de la Pila
………………
Nivel 8 de la Pila
CALL, RETURN
RETFIE, RETLW
Vector de Reset 0000h
13
Vector de Reset
………………
Vector de Interrupción
0000h
0004h
0005h
Página 0
Página 1
Página 2
Página 3
07FFh
0800h
0FFFh
1000h
17FFh
1FFh
INTERRUPCIONES EN LENGUAJE C
Ventajas de usar las directivas de interrupciones
El compilador genera el código necesario para
saltar a la función que va tras esta directiva en el
momento de la interrupción.
También genera el código para salvar al principio
y restituir al final el contexto (salvar y restaurar el
entorno), y borrará el flag que se activó con la
interrupción.
El programador debe seguir encargándoseEl programador debe seguir encargándose
únicamente de habilitar las interrupciones y establecer
las sentencias que se ejecutarán en cada función de las
interrupciones deseadas a ejecutarse.
Las directivas #INT_xxxx
Indican que la función que aparece a
continuación corresponde al tratamiento de una
interrupción (no tiene ni necesita parámetros):
Para los PICs 16F877 hay 14 posibles directivas:
Prof. Luis Zurita Microcontroladores II
#INT_RTCC Desborde del TMR0 TOIF
#INT_RB Cambio en RB<4:7> RBIF
#INT_EXT Cambio en RB0 INTF
#INT_AD Fin de conversión A/D ADIF
#INT_TBE Fin de transmisión USART TXIF
#INT_RDA Dato recibido en USART RCIF
#INT_TIMER1 Desborde del TMR1 TMR1IF
#INT_TIMER2 Desborde del TMR2 TMR2IF
#INT_CCP1 Captura/Comparación en CCP1 CCP1IF
#INT_CCP2 Captura/Comparación en CCP2 CCP2IF
#INT_SSP Envío/Recepción de dato serie síncrono SSPIF
#INT_PSP Dato entrante en puerto esclavo paralelo PSPIF
#INT_BUSCOL Colisión de bus I2C BCLIF
#INT_EEPROM Fin de escritura EEPROM EEIF
INTERRUPCIONES EN LENGUAJE C
La directiva #INT_DEFAULT
Indica que la función que viene a
continuación será llamada si se dispara una
interrupción y ninguno de los flags está activo.
La directiva #INT_GLOBAL
Indica que la función que va a continuaciónIndica que la función que va a continuación
sustituye todas las acciones que inserta el
compilador al aceptarse una interrupción. Sólo se
ejecuta lo que vaya en dicha función.
GLOBAL equivale a GIE=PEIE=1 y debe activarse de
forma independiente. El resto activarán la máscara
correspondiente.
Prof. Luis Zurita Microcontroladores II
FUNCIONES PARA GESTIÓN DE
INTERRUPCIONES
enable_interrupts (nivel);
nivel es una constante definida en el 16F877.h y genera el
código necesario para activar las máscaras necesarias.
Etiquetas de nivel definidas para el 16F877:
GLOBAL INT_RTCC INT_RB
INT_EXT INT_AD INT_TBE
INT_RDA INT_TIMER1 INT_TIMER2INT_RDA INT_TIMER1 INT_TIMER2
INT_CCP1 INT_CCP2 INT_SSP
INT_PSP INT_BUSCOL INT_EEPROM
La máscara global (hace a GIE=1) debe activarse de
manera independiente. Las otras activan la máscara particular y
el PEIE si es necesario.
disable_interrupts(nivel);
Hace la acción contraria a la función anterior, poniendo a
0 las máscaras relacionadas con la interrupción indicada.
Prof. Luis Zurita Microcontroladores II
INTERRUPCIÓN EXTERIOR POR RB0
Es una interrupción clásica en la mayoría de
los PICs. Permite generar una interrupción por
cambio de nivel en la entrada RB0.
La directiva que se utiliza es #INT_EXT y se
debe acompañar de las siguientes funciones:
ext_int_edge(H_TO_L);ext_int_edge(H_TO_L);
La interrupción es activada por flanco de
bajada (antiva el flag INTF).
ext_int_edge(L_TO_H);
La interrupción es activada por flanco de
subida (activa el flag INTF).
Prof. Luis Zurita Microcontroladores II
EJEMPLO 1. INTERRUPCIÓN POR RB0/INT
#INT_EXT
ext_isr( ){
…..//aquí se colocan las sentencias que se
…..//desean ejecutar durante esta interrupción.
}
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 Microcontroladores II
EJEMPLO 2. Active dos leds de forma intermitente cada 1 segundo. Si
presiona RB0/INT, los leds se activan a razón de 250 ms de manera
intermitente hasta que se presione RA0 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#INT_EXT
void ext_interm( ){ //función de interrupción 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 Microcontroladores II
Continuación 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);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 Microcontroladores II
Micro2 tema 2
TIMER 0
• TMR0: Registro de 8 bits de lectura/escritura• 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 información mediante el bit “TOIF”
cuando el TMR0 se ha desbordado.
• TRISA (PUERTO A): Permite el ingreso de pulsos
cuando el TMR0 está configurado como contador por
RA4
Prof. Luis Zurita Microcontroladores II
REGISTRO OPTION (Dirección 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• bit 5, TOCS: Fuente de Reloj para TMR0
1: Pulsos introducidos a través 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
• bit 3, PSA: Bit de asignación del prescaler divisor de
frecuencia
1: El divisor de frecuencia se asigna al WDT
0: El divisor de frecuencia se asigna al TMR0
• bit 2-0, PS2:PSO: Rango con el que actúa el divisor de
frecuencia.
Prof. Luis Zurita Microcontroladores II
¿QUÉ ES EL PRESCALER?
• 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 señal de menor
frecuencia a la salida, que será la señal de reloj de entrada al
registro TMR0.
• “Ralentiza” señales de entrada demasiado rápidas para nuestros
propósitos.
• Nota: Para evitar un RESET no deseado del sistema, es necesario
ejecutar una secuencia de instrucciones específicas cuando seejecutar una secuencia de instrucciones específicas cuando se
cambia la asignación del prescaler del TMR0 al WDT. Esta secuencia
debe ser seguida, aún cuando el WDT esté inactivo
¿CÓMO CUENTA EL TMR0?
El TMR0 cuenta exclusivamente de forma
ascendente, nunca descendente.
00H
FFH
00H
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
(28 – N10)
Prof. Luis Zurita Microcontroladores II
CÁLCULOS CON EL TMR0
• 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 expresión:
Temporización= 4 * TOSC * Valor Real TMR0 * Rango del
divisor de Frecuencia
Valor Real TMR0 = (28 – N10) = (256 – N10)Valor Real TMR0 = (2 – 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.
Solución: Sea XT = Frecuencia = 4 MHz, T = 0.25 μs.
Temporización= 4*0.25 μs* (256 – 100) * 32 = 4.992 ms.
Prof. Luis Zurita Microcontroladores II
OTROS EJEMPLOS
• Se desea saber: ¿Qué valor debemos cargar en el TMR0, si deseamos
obtener una temporización de 10,24 ms, utilizando un preescaler de 128
y un cristal XT?
Solución:
(256 – N10) = = = 80
(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.
RgodivisorT
iónTemporizac
OSC 4 12825.04
24,10
 s
ms

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.
Solución: Sea Fosc= 10 MHz, T = 100 ns
(256 – N10) = =
N10 = 256 - (3750/RgoDivisor)
RgodivisorT
iónTemporizac
OSC 4 RgoDivisorns
ms
1004
5.1
Prof. Luis Zurita Microcontroladores II
Démosle valores al Rango del divisor, hasta obtener un valor que se
acerque lo más 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…
CONTINUACIÓN EJEMPLO ANTERIOR
Etc…
A manera de práctica, realice usted, el cálculo de la Temporización, para
cada uno de los valores que se consiguieron en los cálculos 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 que si debe cumplirse es que
sea cualquiera que sean los valores que se tomen para los cálculos, estos
deben de estar cercanos a la respuesta que se espera del temporizador
que esté diseñando.
Prof. Luis Zurita Microcontroladores II
TIMER0 EN LENGUAJE C
La función para configurar el TIMER0 es:
setup_timer_0 (modo);
Donde modo está definido en el fichero de cabecera y afecta
a los bits 5:0 del OPTION_REG:
setup_timer_0 (modo); OPTION_REG (81h)
RTCC_INTERNAL 00000000
RTCC_EXT_L_TO_H 00100000
RTCC_EXT_H_TO_L 00110000
RTCC_DIV_1 00001000RTCC_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
Los distintos modos se pueden agrupar mediante el
empleo del símbolo |. 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: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 Microcontroladores II
Ejemplo 3. Generar una señal cuadrada de 1 kHz
utilizando la interrupción del TIMER0
• Para generar una señal cuadrada de 1 kHz con un duty cycle
del 50 %, se necesita un período de 0,5 ms en nivel alto y 0,5
ms en nivel bajo.
• Paso 1. Cálculos: Aplicando las fórmulas del TIMER0:
Solución:
(256 – N10) = = = 62,5
RgodivisorT
iónTemporizac
4 825.04
5,0
 s
ms

(256 – N ) = = = 62,5
(256 – N10) = 62,5 y despejando N10 = (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,
generándonos la temporización de 0,5 ms. Estos cálculos se
cumplen fielmente en lenguaje ensamblador, sin embargo en
lenguaje C, al generarse códigos 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.
RgodivisorTOSC 4 825.04  s
Prof. Luis Zurita Microcontroladores II
Ejemplo 3. Generar una señal cuadrada de 1 kHz
utilizando la interrupción del TIMER0
#INCLUDE <16F877.h>
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY(CLOCK=4000000)
#USE fast_io(B)
#INT_RTCC
RTCC_isr(){
output_toggle(PIN_B7);
set_timer0(198);}
NOTA: El compilador se encarga
al entrar en la interrupción de
inhabilitar las interrupciones y
output_toggle(PIN_B7);
set_timer0(198);}
void main(){
set_tris_B(0x00);
output_low(PIN_B7);
setup_timer_0(RTCC_DIV_8);
set_timer0(198);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while (TRUE){
}
}
inhabilitar las interrupciones y
al salir de borrar los flags, por lo
que no es necesario hacerlo por
programa
Prof. Luis Zurita Microcontroladores II
Micro2 tema 2
TIMER 1
Características básicas:
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,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 Microcontroladores II
TIMER 1
7. Al desbordase (FFFFh -> 0000h) produce la interrupción
TMR1:
• El bit de interrupción del timer1 es TMR1IF
[Registro PIR1(0)].
• Puede deshabilitarse mediante TMR1IE
[Registro PIE1(0)].[Registro PIE1(0)].
8. La frecuencia de oscilación máx. es 200kHz. No se apaga
durante SLEEP.
9. Monitorea tiempo entre transiciones de una señal en pin de
entrada.
10. Controla con precisión el tiempo de transición de pin de
salida.
11. Sirve para contar eventos externos y generar interrupciones
cuando ha ocurrido un número deseado.
Prof. Luis Zurita Microcontroladores II
DIAGRAMA DE BLOQUE TIMER 1
Prof. Luis Zurita Microcontroladores II
REGISTROS ASOCIADOS AL TIMER 1
• 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 InterrupcionesINTCON = Control de Interrupciones
• PIE1 = Control de Interrupciones de Periféricos
• PIR1 = Señalizadores de Interrupciones
• TRISC = Registro de configuración PortC
• PORTC= Registro de 8 bits.
Prof. Luis Zurita Microcontroladores II
T1CON
• Bit 7-6: No implementados: Se lee como “0”
• Bit 5-4: TlCKPS1:T1CKPS0: bit de selección del preescaler de la señal 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 habilitación 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 oscilador0 = Deshabilita el oscilador
Nota: El oscilador y la resistencia se desconectan para reducir el consumo
• Bit 2: #TlSYNC: bit de control de sincronización de la señal 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 condición se ignora. El TIMER1 utiliza el reloj interno cuando TMRICS=0
• Bit 1 TMR1CS: bit de selección de la fuente de reloj del TIMER1
1 = Reloj externo por el pin RC0/T1OSO/T1CK1 (flanco ascendente)
0 = Reloj interno (FOSC/4)
• Bit 0: TMR1ON: TIMER1 activo. Hace entrar o no en funcionamiento el TIMER1.
1 = Habilita el TIMER1
0 = Deshabilita el TIMER1Prof. Luis Zurita Microcontroladores II
CÁLCULOS PARA EL TIMER 1
 Temporización= 4 * TOSC * (Valor Real TMR1)* Rango
del predivisor.
 Valor Real TMR1= (65536 – (TMR1H:TMR1L))
 (TMR1H:TMR1L) = Valor a cargar en el TIMER1 (TMR1H:TMR1L) = Valor a cargar en el TIMER1
Ejercicio:
¿Cuál es el máximo valor de temporización que se
puede alcanzar con el TIMER 1?
Prof. Luis Zurita Microcontroladores II
• Realice un programa para que se genere una interrupción
cada 0,5 segundos, utilizando un XT.
RSI
Deshabilitar GIE
INICIO
Configurar TIMER 1
Limpiar señalizador
Habilitar GIE
RETFIE
Cargar TIMER 1
Habilitar TIMER 1
SLEEP
FIN
Prof. Luis Zurita Microcontroladores II
TIMER1 EN LENGUAJE C
La función para configurar el TIMER0 es:
setup_timer_1 (modo);
Donde modo está definido en el fichero de cabecera y afecta
a los bits 5:0 del T1CON:
setup_timer_1 (modo); T1CON (10h)
T1_DISABLED 00000000
T1_INTERNAL 10000101
T1_EXTERNAL 10000111T1_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
T1_DIV_BY_8 00110000
Prof. Luis Zurita Microcontroladores II
TIMER1 EN LENGUAJE C
Los distintos modos se pueden agrupar mediante el
empleo del símbolo |. 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: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 Microcontroladores II
Ejemplo 4. Generar una interrupción cada un segundo
utilizando el TIMER1
• 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. Cálculos: Aplicando las fórmulas del TIMER1:
Solución: Nota: este término debe ser
menor o igual a 65536. Es por ello
(65536 – N16) = = = 62500
(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, generándonos
la temporización de 0,5 s.
RgodivisorT
iónTemporizac
OSC 4 825.04
5,0
 s
s

menor o igual a 65536. Es por ello
que se utilizó el predivisor de 8.
Prof. Luis Zurita Microcontroladores II
EJEMPLO 4. Generar una interrupción 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);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);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while (TRUE){
}
} Prof. Luis Zurita Microcontroladores II
Micro2 tema 2
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.
while (cont<2)
{ //para contar dos tiempos de 0,5 s.
set_timer1 (3036);
while (get_timer1()>=3036);
cont++;}
}
void main(){
set_tris_B(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
while (1){
temp1s();} //llama a función de temporización
} Prof. Luis Zurita Microcontroladores II
TIMER 2
Características básicas:
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 softwarepor software
5. Sólo 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:
– Si los valores de TMR2 y PR2 se igualan, TMR2 pasa a cero.
8. Maneja el período de una señal PWM
Prof. Luis Zurita Microcontroladores II
TIMER 2
9. Al igualarse TMR2 y PR2 se produce la interrupción
TMR2:
1. El bit de interrupción del timer2 es TMR2IF
(Registro PIR1(1)).
2. Hay un post-divisor a la salida del comparador.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.
11. TMR2 no se limpia al escribir en T2CON.
Prof. Luis Zurita Microcontroladores II
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• INTCON = Control de Interrupciones
• PIE1 = Control de Interrupciones de Periféricos
• PIR1 = Señalizadores de Interrupciones
Prof. Luis Zurita Microcontroladores II
DIAGRAMA DE BLOQUE DEL TIMER 2
Prof. Luis Zurita Microcontroladores II
T2CON
• Bit 7: No implementado: Se lee como 0
• Bit 6-3:TOUTPS3:TOUTPS0: bit de selección del rango del divisor del
– Postescaler para el TIMER2:
0 0 0 0 Divisor del postescaler 1:1
0 0 0 1 Divisor del postescaler 1:2
0 0 1 0 Divisor del postescaler 1:3
0 0 1 1 Divisor del postescaler 1:4
0 1 0 0 Divisor del postescaler 1:5
0 1 0 1 Divisor del postescaler 1:6
0 1 1 0 Divisor del postescaler 1:7
0 1 1 1 Divisor del postescaler 1:8
1 0 0 0 Divisor del postescaler 1:91 0 0 0 Divisor del postescaler 1:9
1 0 0 1 Divisor del postescaler 1:10
1 0 1 0 Divisor del postescaler 1:11
1 0 1 1 Divisor del postescaler 1:12
1 1 0 0 Divisor del postescaler 1:13
1 1 0 1 Divisor del postescaler 1:14
1 1 1 0 Divisor del postescaler 1:15
1 1 1 1 Divisor del postescaler 1:16
• Bit 2: TMR2ON: bit de activación del TIMER2
1 = habilita el funcionamiento del TIMER2
0 = Inhibe el funcionamiento del TIMER2
• Bit 1-0:T2CKPS1:T2CKPS0 Selección del rango de divisor del Preescaler del TIMER 2
0 0 Divisor del Preescaler 1:1
0 1 Divisor del Preescaler 1:4
1 X Divisor del Preescaler 1:16
Prof. Luis Zurita Microcontroladores II
CÁLCULOS TIMER2
 Temporización= 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 = D’200’. Cargue el TMR2 con
00H
Prof. Luis Zurita Microcontroladores II
TIMER2 EN LENGUAJE C
La configuración del TIMER2 en el compilador de
C se realiza con la función:
setup_timer_2(modo , periodo , postcaler);
donde:donde:
período 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 Microcontroladores II
TIMER2 EN LENGUAJE C
setup_timer_2(modo , periodo , postcaler); T2CON(12h)
T2_DISABLED 00000000
T2_DIV_BY_1 00000100
T2_DIV_BY_4 00000101
T2_DIV_BY_16 00000110
Para escribir un valor en el registro:
set_timer2(valor);
valor : es un entero de 8 bits.
Para leer el valor actual del registro:
valor= get_timer2( );
valor: entero de 8 bits.
T2_DIV_BY_16 00000110
Prof. Luis Zurita Microcontroladores II
Ejemplo 5. Generar una señal de 1 kHz
utilizando interrupción con el TIMER2
Para una señal de 1 kHz se necesitan dos
semiperíodos de 0,5 ms, se utilizará un XT, un predivisor
de 4 y un postcaler de 1:
Temporización= 4 * TOSC * Valor PR2 * Rango del prescaler
Timer2 * Rango del postcaler Timer2Timer2 * 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 hasta 11, o por tanteo.
Prof. Luis Zurita Microcontroladores II
#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);}set_timer2(11);}
void main(){
set_tris_B(0x00);
output_low(PIN_B0);
setup_timer_2(T2_DIV_BY_4 , 124 , 1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while (TRUE){
}
}
Prof. Luis Zurita Microcontroladores II

Más contenido relacionado

PDF
EJERCICIOS TEMA 1. MICROCONTROLADORES II EN C
PDF
Guía de ejercicios resueltos y propuestos tema 4
PPTX
TIMERS&TEMPORIZADORES EN "C"
PDF
programacion con microcontrolador pic 16f84
PDF
Tabla de Dualidad Transformada Z, Transformada de LaPlace y Discreta.
PDF
Libro simulacion mikroc
PDF
Micro2 tema 1
PDF
MICROCONTROLADORES II EN C. TEMA 3
EJERCICIOS TEMA 1. MICROCONTROLADORES II EN C
Guía de ejercicios resueltos y propuestos tema 4
TIMERS&TEMPORIZADORES EN "C"
programacion con microcontrolador pic 16f84
Tabla de Dualidad Transformada Z, Transformada de LaPlace y Discreta.
Libro simulacion mikroc
Micro2 tema 1
MICROCONTROLADORES II EN C. TEMA 3

La actualidad más candente (20)

PPTX
01 T1 2021 Sistemas Embebidos.pptx
PDF
Guía rápida tmr0 e interrupciones
PPTX
Transformada de fourier
PPT
Diagramas de Tiempo.pptpara electronica aplicada
PDF
Control digital: Teoría y practica parte 1
PPTX
Sección 2.6: Sistemas descritos mediante ecuaciones en diferencias
PPTX
Teoria moderna de control
PDF
PPTX
redes de compensación en cascada
DOC
Ejemplos De Timer E Interrupcion
PDF
Lcd monitor repair
PDF
Generar retardos-para-pic-en-mplab
DOCX
5to laboratorio
PDF
Guía rápida tmr0 e interrupciones
PDF
Conversión GRAFCET a ladder el mejor método.
PDF
Microcontroladores Programacion en BASIC - Carlos A. Reyes 3ra edicion
PDF
Realimentacion del estado
PPTX
Flip flops (ff)
PDF
C++ para microcontroladores y aplicación práctica
PDF
Módulo Timer 1 del PIC16F887
01 T1 2021 Sistemas Embebidos.pptx
Guía rápida tmr0 e interrupciones
Transformada de fourier
Diagramas de Tiempo.pptpara electronica aplicada
Control digital: Teoría y practica parte 1
Sección 2.6: Sistemas descritos mediante ecuaciones en diferencias
Teoria moderna de control
redes de compensación en cascada
Ejemplos De Timer E Interrupcion
Lcd monitor repair
Generar retardos-para-pic-en-mplab
5to laboratorio
Guía rápida tmr0 e interrupciones
Conversión GRAFCET a ladder el mejor método.
Microcontroladores Programacion en BASIC - Carlos A. Reyes 3ra edicion
Realimentacion del estado
Flip flops (ff)
C++ para microcontroladores y aplicación práctica
Módulo Timer 1 del PIC16F887
Publicidad

Similar a Micro2 tema 2 (20)

PPTX
MICROCONTROLADORES II EN C. TEMA 2
PDF
4. interrupciones y temporizadores
PDF
5.Interrupciones_tp_para_educacion_investigacion.pdf
DOC
Interrupciones
PPT
Clase - Interrupciones
PDF
interrupciones, temporizadores, microcontroladores
PDF
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
PPT
Curso Micro Tema 5
PPTX
Arquitectura interna micro
PPT
Introduccion_a_los_Microcontroladores_v2.ppt
PPT
Introduccion a los_microcontroladores_v2
PPTX
arquitectura de un microcontrolador
PDF
Programando pi cs_ccs_08
PDF
Interrupciones y Temporizadores pucesi
PDF
Interrupciones
DOC
G UÍ A R E G I S T R O S P I C16 F873
PDF
El microcontrolador PIC16F877
PPTX
17 Interrupciones
PDF
Micro2 tema 3
PDF
Arquitectura Microcontrolador PIC16F887
MICROCONTROLADORES II EN C. TEMA 2
4. interrupciones y temporizadores
5.Interrupciones_tp_para_educacion_investigacion.pdf
Interrupciones
Clase - Interrupciones
interrupciones, temporizadores, microcontroladores
Microcontroladores: Módulos del micro PIC16F877 con temporizadores e interrup...
Curso Micro Tema 5
Arquitectura interna micro
Introduccion_a_los_Microcontroladores_v2.ppt
Introduccion a los_microcontroladores_v2
arquitectura de un microcontrolador
Programando pi cs_ccs_08
Interrupciones y Temporizadores pucesi
Interrupciones
G UÍ A R E G I S T R O S P I C16 F873
El microcontrolador PIC16F877
17 Interrupciones
Micro2 tema 3
Arquitectura Microcontrolador PIC16F887
Publicidad

Más de Luis Zurita (20)

PDF
TALLER NORMAS APA
PDF
PROTOCOLO MODBUS
PDF
Guía rápidalcd y teclado
PDF
Pevmicroi ieo
PDF
Pevmicroii13 2
PDF
Pevmicro1 t2 13
PDF
Pev electronica
PDF
Grupos micro2 13
PDF
Pevmicro1 t2 13
PDF
Micro2 tema 5
PDF
Micro2 tema 4
PDF
Manejo de perifericos para microcontroladore
PDF
Pevmicroii13 2
PDF
Notas def electronica
PDF
Notas proyecto3 iyc
PDF
Notas definitivas iyc2013
PDF
Proyecto 2 electronica
PDF
Acumuladas electronica
PDF
Pevmicro2013
PDF
Proyecto2 notas iyc2013
TALLER NORMAS APA
PROTOCOLO MODBUS
Guía rápidalcd y teclado
Pevmicroi ieo
Pevmicroii13 2
Pevmicro1 t2 13
Pev electronica
Grupos micro2 13
Pevmicro1 t2 13
Micro2 tema 5
Micro2 tema 4
Manejo de perifericos para microcontroladore
Pevmicroii13 2
Notas def electronica
Notas proyecto3 iyc
Notas definitivas iyc2013
Proyecto 2 electronica
Acumuladas electronica
Pevmicro2013
Proyecto2 notas iyc2013

Último (20)

PDF
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
PDF
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
PDF
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
PDF
5°-UNIDAD 5 - 2025.pdf aprendizaje 5tooo
DOCX
2 GRADO UNIDAD 5 - 2025.docx para primaria
PDF
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
PDF
Punto Critico - Brian Tracy Ccesa007.pdf
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
PDF
1. Intrdoduccion y criterios de seleccion de Farm 2024.pdf
PDF
TOMO II - LITERATURA.pd plusenmas ultras
PDF
Metodologías Activas con herramientas IAG
PDF
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PDF
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
PDF
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
PDF
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
PDF
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
PDF
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
5°-UNIDAD 5 - 2025.pdf aprendizaje 5tooo
2 GRADO UNIDAD 5 - 2025.docx para primaria
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
Punto Critico - Brian Tracy Ccesa007.pdf
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
1. Intrdoduccion y criterios de seleccion de Farm 2024.pdf
TOMO II - LITERATURA.pd plusenmas ultras
Metodologías Activas con herramientas IAG
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula

Micro2 tema 2

  • 1. MICROCONTROLADORES II INTERRUPCIONES YINTERRUPCIONES Y TEMPORIZADORES TEMA 2 PROF. LUIS ZURITA
  • 2. (PIC16F84) CAUSAS DE INTERRUPCIÓN 1. Activación del pin RB0/INT 2. Desbordamiento del TMR0 3. Cambio de estado de una de los 4 pines de más peso (RB7:RB4) del puerto B 4. Finalización de la escritura en la EEPROM de datos REGISTRO INTCONREGISTRO INTCON Prof. Luis Zurita Microcontroladores II
  • 3. INTERRUCCIONES PIC16F87X CLÁSICAS PIC16F84 NUEVAS GIE PEIE TOIE INTE RBIE TOIF INTF RBIF PIE1 PIR1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE PIE1 PIE2 --- 0 --- EEIE BCLIE -- -- CCP2IE PIR1 PIR2 Prof. Luis Zurita Microcontroladores II
  • 4. 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 CCP1IE TMR2IE TMR1IE Bit 7 Bit 0 REGISTRO PIE1 bit 7: PSPIE: bit de habilitación de interrupción por lectura / escritura en el Puerto Paralelo Esclavo. Para los modelos de 40 pines. 1 = Habilita la interrupción por lectura/escritura en el PSP 0= inhabilita la interrupción por lectura/escritura en el PSP0= inhabilita la interrupción por lectura/escritura en el PSP bit 6: ADIF: bit de habilitación de interrupción por finalización de la conversión A/D. 1 = Habilita la interrupción del convertidor A/D 0 = Inhabilita la interrupción del convertidor A/D bit 5: RCIE: bit de habilitación de interrupción en recepción por el USART, cuando se llena el buffer. 1 = Habilita interrupción por recepción en el USART 0 = Inhabilita interrupción por recepción en el USART Prof. Luis Zurita Microcontroladores II
  • 5. REGISTRO PIE1 bit 4: TXIE: bit de interrupción al transmitir por el USART, cuando se vacía el buffer. 1 = Habilita la interrupción de transmisión por el USART 0 = Inhabilita la interrupción de transmisión por el USART bit 3: SSPIE: bit de habilitación de interrupción por el Puerto Serie Síncrono (SSP) 1= Habilita la interrupción del SSP 0= Inhabilita la interrupción del SSP bit 2: CCP1IE: bit de habilitación de interrupción del módulo CCPI cuando sebit 2: CCP1IE: bit de habilitación de interrupción del módulo CCPI cuando se produce una captura o una comparación. 1= Habilita la interrupción del CCPI 0= Inhabilita la interrupción del CCPI bit 1: TMR2IE: bit de habilitación de interrupción por desbordamiento de TMR2 que está emparejado con el registro PR2 (92h) 1= Habilita la interrupción por desbordamiento de TMR2 emparejado a PR2 0= Inhabilita la interrupción de TMR2 emparejado a PR2 bit 0: TMR1IE: bit de habilitación de interrupción por desbordamiento del TMRI 1= Habilita la interrupción por desbordamiento de TMR1 0= Inhabilita la interrupción por desbordamiento de TMR1 Prof. Luis Zurita Microcontroladores II
  • 6. REGISTRO PIE2 U 0 R/W 0 U 0 R/W 0 R/W 0 U 0 U 0 R/W --- 0 --- EEIE BCLIE -- -- CCP2IE Bit 7 Bit 0 bit 7: No implementado: se lee como “0’ bit 6 Reservado, Mantiene este bits a cero bit 5: No implementado: se lee como “0” bit 4: EEIE: Habilita la interrupción por escritura en la EEPROM de datos 1= Habilita la interrupción por escritura de la EEPROM de datos1= Habilita la interrupción por escritura de la EEPROM de datos 0 =Deshabilita la interrupción por escritura en la EEPROM de datos bit 3: BCLIE: Habilita la interrupción por colisión en el bus SSP cuando dos o más maestros tratan de transferir al mismo tiempo. 1 = Habilita la interrupción por colisión de bus SSP 0 = Deshabilita la interrupción por colisión en el bus SSP. bit 2-1 No implementados, se leen como “0” bit 0: CCP2IE: Habilita la interrupción del modulo CCP2 1 = habilita la interrupción de CCP2 0 = inhabilita la interrupción de CCP2 Prof. Luis Zurita Microcontroladores II
  • 7. PC<12:0> Nivel 1 de la Pila Nivel 2 de la Pila ……………… Nivel 8 de la Pila CALL, RETURN RETFIE, RETLW Vector de Reset 0000h 13 Vector de Reset ……………… Vector de Interrupción 0000h 0004h 0005h Página 0 Página 1 Página 2 Página 3 07FFh 0800h 0FFFh 1000h 17FFh 1FFh
  • 8. INTERRUPCIONES EN LENGUAJE C Ventajas de usar las directivas de interrupciones El compilador genera el código necesario para saltar a la función que va tras esta directiva en el momento de la interrupción. También genera el código para salvar al principio y restituir al final el contexto (salvar y restaurar el entorno), y borrará el flag que se activó con la interrupción. El programador debe seguir encargándoseEl programador debe seguir encargándose únicamente de habilitar las interrupciones y establecer las sentencias que se ejecutarán en cada función de las interrupciones deseadas a ejecutarse. Las directivas #INT_xxxx Indican que la función que aparece a continuación corresponde al tratamiento de una interrupción (no tiene ni necesita parámetros): Para los PICs 16F877 hay 14 posibles directivas: Prof. Luis Zurita Microcontroladores II
  • 9. #INT_RTCC Desborde del TMR0 TOIF #INT_RB Cambio en RB<4:7> RBIF #INT_EXT Cambio en RB0 INTF #INT_AD Fin de conversión A/D ADIF #INT_TBE Fin de transmisión USART TXIF #INT_RDA Dato recibido en USART RCIF #INT_TIMER1 Desborde del TMR1 TMR1IF #INT_TIMER2 Desborde del TMR2 TMR2IF #INT_CCP1 Captura/Comparación en CCP1 CCP1IF #INT_CCP2 Captura/Comparación en CCP2 CCP2IF #INT_SSP Envío/Recepción de dato serie síncrono SSPIF #INT_PSP Dato entrante en puerto esclavo paralelo PSPIF #INT_BUSCOL Colisión de bus I2C BCLIF #INT_EEPROM Fin de escritura EEPROM EEIF
  • 10. INTERRUPCIONES EN LENGUAJE C La directiva #INT_DEFAULT Indica que la función que viene a continuación será llamada si se dispara una interrupción y ninguno de los flags está activo. La directiva #INT_GLOBAL Indica que la función que va a continuaciónIndica que la función que va a continuación sustituye todas las acciones que inserta el compilador al aceptarse una interrupción. Sólo se ejecuta lo que vaya en dicha función. GLOBAL equivale a GIE=PEIE=1 y debe activarse de forma independiente. El resto activarán la máscara correspondiente. Prof. Luis Zurita Microcontroladores II
  • 11. FUNCIONES PARA GESTIÓN DE INTERRUPCIONES enable_interrupts (nivel); nivel es una constante definida en el 16F877.h y genera el código necesario para activar las máscaras necesarias. Etiquetas de nivel definidas para el 16F877: GLOBAL INT_RTCC INT_RB INT_EXT INT_AD INT_TBE INT_RDA INT_TIMER1 INT_TIMER2INT_RDA INT_TIMER1 INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP INT_PSP INT_BUSCOL INT_EEPROM La máscara global (hace a GIE=1) debe activarse de manera independiente. Las otras activan la máscara particular y el PEIE si es necesario. disable_interrupts(nivel); Hace la acción contraria a la función anterior, poniendo a 0 las máscaras relacionadas con la interrupción indicada. Prof. Luis Zurita Microcontroladores II
  • 12. INTERRUPCIÓN EXTERIOR POR RB0 Es una interrupción clásica en la mayoría de los PICs. Permite generar una interrupción por cambio de nivel en la entrada RB0. La directiva que se utiliza es #INT_EXT y se debe acompañar de las siguientes funciones: ext_int_edge(H_TO_L);ext_int_edge(H_TO_L); La interrupción es activada por flanco de bajada (antiva el flag INTF). ext_int_edge(L_TO_H); La interrupción es activada por flanco de subida (activa el flag INTF). Prof. Luis Zurita Microcontroladores II
  • 13. EJEMPLO 1. INTERRUPCIÓN POR RB0/INT #INT_EXT ext_isr( ){ …..//aquí se colocan las sentencias que se …..//desean ejecutar durante esta interrupción. } 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 Microcontroladores II
  • 14. EJEMPLO 2. Active dos leds de forma intermitente cada 1 segundo. Si presiona RB0/INT, los leds se activan a razón de 250 ms de manera intermitente hasta que se presione RA0 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#INT_EXT void ext_interm( ){ //función de interrupción 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 Microcontroladores II
  • 15. Continuación 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);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 Microcontroladores II
  • 17. TIMER 0 • TMR0: Registro de 8 bits de lectura/escritura• 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 información mediante el bit “TOIF” cuando el TMR0 se ha desbordado. • TRISA (PUERTO A): Permite el ingreso de pulsos cuando el TMR0 está configurado como contador por RA4 Prof. Luis Zurita Microcontroladores II
  • 18. REGISTRO OPTION (Dirección 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• bit 5, TOCS: Fuente de Reloj para TMR0 1: Pulsos introducidos a través 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 • bit 3, PSA: Bit de asignación del prescaler divisor de frecuencia 1: El divisor de frecuencia se asigna al WDT 0: El divisor de frecuencia se asigna al TMR0 • bit 2-0, PS2:PSO: Rango con el que actúa el divisor de frecuencia. Prof. Luis Zurita Microcontroladores II
  • 19. ¿QUÉ ES EL PRESCALER? • 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 señal de menor frecuencia a la salida, que será la señal de reloj de entrada al registro TMR0. • “Ralentiza” señales de entrada demasiado rápidas para nuestros propósitos. • Nota: Para evitar un RESET no deseado del sistema, es necesario ejecutar una secuencia de instrucciones específicas cuando seejecutar una secuencia de instrucciones específicas cuando se cambia la asignación del prescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDT esté inactivo
  • 20. ¿CÓMO CUENTA EL TMR0? El TMR0 cuenta exclusivamente de forma ascendente, nunca descendente. 00H FFH 00H 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 (28 – N10) Prof. Luis Zurita Microcontroladores II
  • 21. CÁLCULOS CON EL TMR0 • 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 expresión: Temporización= 4 * TOSC * Valor Real TMR0 * Rango del divisor de Frecuencia Valor Real TMR0 = (28 – N10) = (256 – N10)Valor Real TMR0 = (2 – 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. Solución: Sea XT = Frecuencia = 4 MHz, T = 0.25 μs. Temporización= 4*0.25 μs* (256 – 100) * 32 = 4.992 ms. Prof. Luis Zurita Microcontroladores II
  • 22. OTROS EJEMPLOS • Se desea saber: ¿Qué valor debemos cargar en el TMR0, si deseamos obtener una temporización de 10,24 ms, utilizando un preescaler de 128 y un cristal XT? Solución: (256 – N10) = = = 80 (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. RgodivisorT iónTemporizac OSC 4 12825.04 24,10  s ms  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. Solución: Sea Fosc= 10 MHz, T = 100 ns (256 – N10) = = N10 = 256 - (3750/RgoDivisor) RgodivisorT iónTemporizac OSC 4 RgoDivisorns ms 1004 5.1 Prof. Luis Zurita Microcontroladores II
  • 23. Démosle valores al Rango del divisor, hasta obtener un valor que se acerque lo más 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… CONTINUACIÓN EJEMPLO ANTERIOR Etc… A manera de práctica, realice usted, el cálculo de la Temporización, para cada uno de los valores que se consiguieron en los cálculos 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 que si debe cumplirse es que sea cualquiera que sean los valores que se tomen para los cálculos, estos deben de estar cercanos a la respuesta que se espera del temporizador que esté diseñando. Prof. Luis Zurita Microcontroladores II
  • 24. TIMER0 EN LENGUAJE C La función para configurar el TIMER0 es: setup_timer_0 (modo); Donde modo está definido en el fichero de cabecera y afecta a los bits 5:0 del OPTION_REG: setup_timer_0 (modo); OPTION_REG (81h) RTCC_INTERNAL 00000000 RTCC_EXT_L_TO_H 00100000 RTCC_EXT_H_TO_L 00110000 RTCC_DIV_1 00001000RTCC_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
  • 25. TIMER0 EN LENGUAJE C Los distintos modos se pueden agrupar mediante el empleo del símbolo |. 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: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 Microcontroladores II
  • 26. Ejemplo 3. Generar una señal cuadrada de 1 kHz utilizando la interrupción del TIMER0 • Para generar una señal cuadrada de 1 kHz con un duty cycle del 50 %, se necesita un período de 0,5 ms en nivel alto y 0,5 ms en nivel bajo. • Paso 1. Cálculos: Aplicando las fórmulas del TIMER0: Solución: (256 – N10) = = = 62,5 RgodivisorT iónTemporizac 4 825.04 5,0  s ms  (256 – N ) = = = 62,5 (256 – N10) = 62,5 y despejando N10 = (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, generándonos la temporización de 0,5 ms. Estos cálculos se cumplen fielmente en lenguaje ensamblador, sin embargo en lenguaje C, al generarse códigos 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. RgodivisorTOSC 4 825.04  s Prof. Luis Zurita Microcontroladores II
  • 27. Ejemplo 3. Generar una señal cuadrada de 1 kHz utilizando la interrupción del TIMER0 #INCLUDE <16F877.h> #FUSES XT,NOWDT,NOPROTECT,NOLVP #USE DELAY(CLOCK=4000000) #USE fast_io(B) #INT_RTCC RTCC_isr(){ output_toggle(PIN_B7); set_timer0(198);} NOTA: El compilador se encarga al entrar en la interrupción de inhabilitar las interrupciones y output_toggle(PIN_B7); set_timer0(198);} void main(){ set_tris_B(0x00); output_low(PIN_B7); setup_timer_0(RTCC_DIV_8); set_timer0(198); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); while (TRUE){ } } inhabilitar las interrupciones y al salir de borrar los flags, por lo que no es necesario hacerlo por programa Prof. Luis Zurita Microcontroladores II
  • 29. TIMER 1 Características básicas: 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,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 Microcontroladores II
  • 30. TIMER 1 7. Al desbordase (FFFFh -> 0000h) produce la interrupción TMR1: • El bit de interrupción del timer1 es TMR1IF [Registro PIR1(0)]. • Puede deshabilitarse mediante TMR1IE [Registro PIE1(0)].[Registro PIE1(0)]. 8. La frecuencia de oscilación máx. es 200kHz. No se apaga durante SLEEP. 9. Monitorea tiempo entre transiciones de una señal en pin de entrada. 10. Controla con precisión el tiempo de transición de pin de salida. 11. Sirve para contar eventos externos y generar interrupciones cuando ha ocurrido un número deseado. Prof. Luis Zurita Microcontroladores II
  • 31. DIAGRAMA DE BLOQUE TIMER 1 Prof. Luis Zurita Microcontroladores II
  • 32. REGISTROS ASOCIADOS AL TIMER 1 • 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 InterrupcionesINTCON = Control de Interrupciones • PIE1 = Control de Interrupciones de Periféricos • PIR1 = Señalizadores de Interrupciones • TRISC = Registro de configuración PortC • PORTC= Registro de 8 bits. Prof. Luis Zurita Microcontroladores II
  • 33. T1CON • Bit 7-6: No implementados: Se lee como “0” • Bit 5-4: TlCKPS1:T1CKPS0: bit de selección del preescaler de la señal 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 habilitación 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 oscilador0 = Deshabilita el oscilador Nota: El oscilador y la resistencia se desconectan para reducir el consumo • Bit 2: #TlSYNC: bit de control de sincronización de la señal 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 condición se ignora. El TIMER1 utiliza el reloj interno cuando TMRICS=0 • Bit 1 TMR1CS: bit de selección de la fuente de reloj del TIMER1 1 = Reloj externo por el pin RC0/T1OSO/T1CK1 (flanco ascendente) 0 = Reloj interno (FOSC/4) • Bit 0: TMR1ON: TIMER1 activo. Hace entrar o no en funcionamiento el TIMER1. 1 = Habilita el TIMER1 0 = Deshabilita el TIMER1Prof. Luis Zurita Microcontroladores II
  • 34. CÁLCULOS PARA EL TIMER 1  Temporización= 4 * TOSC * (Valor Real TMR1)* Rango del predivisor.  Valor Real TMR1= (65536 – (TMR1H:TMR1L))  (TMR1H:TMR1L) = Valor a cargar en el TIMER1 (TMR1H:TMR1L) = Valor a cargar en el TIMER1 Ejercicio: ¿Cuál es el máximo valor de temporización que se puede alcanzar con el TIMER 1? Prof. Luis Zurita Microcontroladores II
  • 35. • Realice un programa para que se genere una interrupción cada 0,5 segundos, utilizando un XT. RSI Deshabilitar GIE INICIO Configurar TIMER 1 Limpiar señalizador Habilitar GIE RETFIE Cargar TIMER 1 Habilitar TIMER 1 SLEEP FIN Prof. Luis Zurita Microcontroladores II
  • 36. TIMER1 EN LENGUAJE C La función para configurar el TIMER0 es: setup_timer_1 (modo); Donde modo está definido en el fichero de cabecera y afecta a los bits 5:0 del T1CON: setup_timer_1 (modo); T1CON (10h) T1_DISABLED 00000000 T1_INTERNAL 10000101 T1_EXTERNAL 10000111T1_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 T1_DIV_BY_8 00110000 Prof. Luis Zurita Microcontroladores II
  • 37. TIMER1 EN LENGUAJE C Los distintos modos se pueden agrupar mediante el empleo del símbolo |. 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: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 Microcontroladores II
  • 38. Ejemplo 4. Generar una interrupción cada un segundo utilizando el TIMER1 • 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. Cálculos: Aplicando las fórmulas del TIMER1: Solución: Nota: este término debe ser menor o igual a 65536. Es por ello (65536 – N16) = = = 62500 (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, generándonos la temporización de 0,5 s. RgodivisorT iónTemporizac OSC 4 825.04 5,0  s s  menor o igual a 65536. Es por ello que se utilizó el predivisor de 8. Prof. Luis Zurita Microcontroladores II
  • 39. EJEMPLO 4. Generar una interrupción 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);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); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while (TRUE){ } } Prof. Luis Zurita Microcontroladores II
  • 41. 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. while (cont<2) { //para contar dos tiempos de 0,5 s. set_timer1 (3036); while (get_timer1()>=3036); cont++;} } void main(){ set_tris_B(0x00); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); while (1){ temp1s();} //llama a función de temporización } Prof. Luis Zurita Microcontroladores II
  • 42. TIMER 2 Características básicas: 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 softwarepor software 5. Sólo 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: – Si los valores de TMR2 y PR2 se igualan, TMR2 pasa a cero. 8. Maneja el período de una señal PWM Prof. Luis Zurita Microcontroladores II
  • 43. TIMER 2 9. Al igualarse TMR2 y PR2 se produce la interrupción TMR2: 1. El bit de interrupción del timer2 es TMR2IF (Registro PIR1(1)). 2. Hay un post-divisor a la salida del comparador.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. 11. TMR2 no se limpia al escribir en T2CON. Prof. Luis Zurita Microcontroladores II
  • 44. 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• INTCON = Control de Interrupciones • PIE1 = Control de Interrupciones de Periféricos • PIR1 = Señalizadores de Interrupciones Prof. Luis Zurita Microcontroladores II
  • 45. DIAGRAMA DE BLOQUE DEL TIMER 2 Prof. Luis Zurita Microcontroladores II
  • 46. T2CON • Bit 7: No implementado: Se lee como 0 • Bit 6-3:TOUTPS3:TOUTPS0: bit de selección del rango del divisor del – Postescaler para el TIMER2: 0 0 0 0 Divisor del postescaler 1:1 0 0 0 1 Divisor del postescaler 1:2 0 0 1 0 Divisor del postescaler 1:3 0 0 1 1 Divisor del postescaler 1:4 0 1 0 0 Divisor del postescaler 1:5 0 1 0 1 Divisor del postescaler 1:6 0 1 1 0 Divisor del postescaler 1:7 0 1 1 1 Divisor del postescaler 1:8 1 0 0 0 Divisor del postescaler 1:91 0 0 0 Divisor del postescaler 1:9 1 0 0 1 Divisor del postescaler 1:10 1 0 1 0 Divisor del postescaler 1:11 1 0 1 1 Divisor del postescaler 1:12 1 1 0 0 Divisor del postescaler 1:13 1 1 0 1 Divisor del postescaler 1:14 1 1 1 0 Divisor del postescaler 1:15 1 1 1 1 Divisor del postescaler 1:16 • Bit 2: TMR2ON: bit de activación del TIMER2 1 = habilita el funcionamiento del TIMER2 0 = Inhibe el funcionamiento del TIMER2 • Bit 1-0:T2CKPS1:T2CKPS0 Selección del rango de divisor del Preescaler del TIMER 2 0 0 Divisor del Preescaler 1:1 0 1 Divisor del Preescaler 1:4 1 X Divisor del Preescaler 1:16 Prof. Luis Zurita Microcontroladores II
  • 47. CÁLCULOS TIMER2  Temporización= 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 = D’200’. Cargue el TMR2 con 00H Prof. Luis Zurita Microcontroladores II
  • 48. TIMER2 EN LENGUAJE C La configuración del TIMER2 en el compilador de C se realiza con la función: setup_timer_2(modo , periodo , postcaler); donde:donde: período 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 Microcontroladores II
  • 49. TIMER2 EN LENGUAJE C setup_timer_2(modo , periodo , postcaler); T2CON(12h) T2_DISABLED 00000000 T2_DIV_BY_1 00000100 T2_DIV_BY_4 00000101 T2_DIV_BY_16 00000110 Para escribir un valor en el registro: set_timer2(valor); valor : es un entero de 8 bits. Para leer el valor actual del registro: valor= get_timer2( ); valor: entero de 8 bits. T2_DIV_BY_16 00000110 Prof. Luis Zurita Microcontroladores II
  • 50. Ejemplo 5. Generar una señal de 1 kHz utilizando interrupción con el TIMER2 Para una señal de 1 kHz se necesitan dos semiperíodos de 0,5 ms, se utilizará un XT, un predivisor de 4 y un postcaler de 1: Temporización= 4 * TOSC * Valor PR2 * Rango del prescaler Timer2 * Rango del postcaler Timer2Timer2 * 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 hasta 11, o por tanteo. Prof. Luis Zurita Microcontroladores II
  • 51. #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);}set_timer2(11);} void main(){ set_tris_B(0x00); output_low(PIN_B0); setup_timer_2(T2_DIV_BY_4 , 124 , 1); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); while (TRUE){ } } Prof. Luis Zurita Microcontroladores II