Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 51

MICROCONTROLADORES INTERRUPCIONES Y TEMPORIZADORES

CAUSAS DE INTERRUPCIN
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

INTERRUCCIONES PIC16F87X CLSICAS PIC16F84 NUEVAS

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF

PIE1
PSPIE ADIE RCIE TXIE SSPIE CCP1IE

PIR1
TMR2IE TMR1IE

PIE2
--0 --EEIE BCLIE --

PIR2
-CCP2IE

REGISTRO PIE1
R/W-0
PSPIE Bit 7

R/W-0
ADIE

R/W-0
RCIE

R/W-0
TXIE

R/W-0
SSPIE

R/W-0
CCP1IE

R/W-0

R/W-0
Bit 0

TMR2IE TMR1IE

bit 7: PSPIE: bit de habilitacin de interrupcin por lectura / escritura en el Puerto Paralelo Esclavo. Para los 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 = Habilita interrupcin por recepcin en el USART 0 = Inhabilita interrupcin por recepcin en el USART

REGISTRO PIE1
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 bit 0: TMR1IE: bit de habilitacin de interrupcin por desbordamiento del TMRI 1= Habilita la interrupcin por desbordamiento de TMR1 0= Inhabilita la interrupcin por desbordamiento de TMR1

REGISTRO PIE2
U --Bit 7 0 R/W 0 0U --0 R/W EEIE 0 R/W BCLIE 0U -0U -0 R/W CCP2IE 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 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 0 = inhabilita la interrupcin de CCP2

PC<12:0> CALL, RETURN RETFIE, RETLW Nivel 1 de la Pila 13

Nivel 2 de la Pila
Nivel 8 de la Pila Vector de Reset Vector de Interrupcin Pgina 0 Pgina 1 Pgina 2 Pgina 3 0004h 0005h 07FFh 0800h 0FFFh 1000h 17FFh 1FFh 0000h

INTERRUPCIONES EN LENGUAJE C
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 interrupciones deseadas a ejecutarse.

Las directivas #INT_xxxx Indican que la funcin que aparece a continuacin corresponde al tratamiento de una interrupcin (no tiene ni necesita parmetros): Para los PICs 16F877 hay 14 posibles directivas:

#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

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 Desborde del TMR2 Captura/Comparacin en CCP1 Captura/Comparacin en CCP2 Envio/Recepcin de dato serie sncrono Dato entrante en puerto esclavo paralelo Colisin de bus I2C Fin de escritura EEPROM

TOIF RBIF INTF ADIF TXIF RCIF TMR1IF TMR2IF CCP1IF CCP2IF SSPIF PSPIF BCLIF EEIF

INTERRUPCIONES EN LENGUAJE C
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.

FUNCIONES PARA GESTIN DE INTERRUPCIONES


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); Hace la accin contraria a la funcin anterior, poniendo a 0 las mscaras relacionadas con la interrupcin indicada.

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: 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).

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){ } }

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); } }

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);} }

TIMER 0

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 pulsos cuando el TMR0 est configurado como contador por RA4

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 bit 3, PSA: Bit de asignacin 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 acta el divisor de frecuencia.

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 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?


00H FFH

El TMR0 cuenta exclusivamente de forma ascendente, nunca descendente.

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

CLCULOS 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 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. Temporizacin= 4*0.25 s* (256 100) * 32 = 4.992 ms.

OTROS EJEMPLOS
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? Solucin: Temporizac in 10 ,24 ms 10) = (256 N = = 80

4 TOSC Rgodivisor

4 0.25 s 128

(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. Solucin: Sea Fosc= 10 MHz, T = 100 ns (256 N10) =
Temporizac in = 4 TOSC Rgodivisor

1.5ms 4 100 ns RgoDivisor

N10 = 256 - (3750/RgoDivisor)

CONTINUACIN EJEMPLO ANTERIOR


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 que si debe cumplirse es que sea cualquiera que sean los valores que se tomen para los clculos, estos deben de estar cercanos a la respuesta que se espera del temporizador que est diseando.

TIMER0 EN LENGUAJE C La funcin 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); RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L RTCC_DIV_1 RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 OPTION_REG (81h) 00000000 00100000 00110000 00001000 00000000 00000001 00000010 00000011 00000100

RTCC_DIV_64
RTCC_DIV_128 RTCC_DIV_256

00000101
00000110 00000111

TIMER0 EN LENGUAJE C
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.

Ejemplo 3. Generar una seal cuadrada de 1 kHz utilizando la interrupcin del TIMER0
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 10) = (256 N = = 62,5 4 TOSC Rgodivisor 4 0.25 s 8 (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, 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.

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

TIMER 1
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).

TIMER 1
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.

DIAGRAMA DE BLOQUE TIMER 1

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 Interrupciones PIE1 = Control de Interrupciones de Perifricos PIR1 = Sealizadores de Interrupciones TRISC = Registro de configuracin PortC PORTC= Registro de 8 bits.

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) Bit 0: TMR1ON: TIMER1 activo. Hace entrar o no en funcionamiento el TIMER1. 1 = Habilita el TIMER1 0 = Deshabilita el TIMER1

CLCULOS PARA EL TIMER 1


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?

Realice un programa para que se genere una interrupcin cada 0,5 segundos, utilizando un XT.
INICIO RSI

Configurar TIMER 1 Cargar TIMER 1 Habilitar TIMER 1 SLEEP


FIN

Deshabilitar GIE Limpiar sealizador

Habilitar GIE

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 bits 5:0 del T1CON: setup_timer_0 (modo); T1_DISABLED T1_INTERNAL T1_EXTERNAL T1CON (10h) 00000000 10000101 10000111

T1_EXTERNAL_SYNC T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8

10000011 00001000 00000000 00010000 00100000 00110000

TIMER1 EN LENGUAJE C
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.

Ejemplo 4. Generar una interrupcin 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. Clculos: Aplicando las frmulas del TIMER1: Nota: este trmino debe ser Solucin:
menor o igual a 65536. Es por ello que se utiliz el predivisor de 8.

(65536 N16) =

0,5s Temporizac in = 4 TOSC Rgodivisor 4 0.25 s 8

= 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, generndonos la temporizacin de 0,5 s.

#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); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while (TRUE){ } }

EJEMPLO 4. Generar una interrupcin cada un segundo utilizando el TIMER1

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); cont++;} } void main(){ set_tris_B(0x00); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); while (1){ temp1s();} //llama a funcin de temporizacin }

TIMER 2
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:
Si los valores de TMR2 y PR2 se igualan, TMR2 pasa a cero.

8. Maneja el perodo de una seal PWM

TIMER 2
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. 11. TMR2 no se limpia al escribir en T2CON.

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

DIAGRAMA DE BLOQUE DEL TIMER 2

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: 0000 Divisor del postescaler 1:1 0001 Divisor del postescaler 1:2 0010 Divisor del postescaler 1:3 0011 Divisor del postescaler 1:4 0100 Divisor del postescaler 1:5 0101 Divisor del postescaler 1:6 0110 Divisor del postescaler 1:7 0111 Divisor del postescaler 1:8 1000 Divisor del postescaler 1:9 1001 Divisor del postescaler 1:10 1010 Divisor del postescaler 1:11 1011 Divisor del postescaler 1:12 1100 Divisor del postescaler 1:13 1101 Divisor del postescaler 1:14 1110 Divisor del postescaler 1:15 1111 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 Bit 1-0:T2CKPS1:T2CKPS0 Seleccin 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

CLCULOS TIMER2
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

TIMER2 EN LENGUAJE C
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.

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:

valor= get_timer2( ); valor: entero de 16 bits.

Ejemplo 5. Generar una seal de 1 kHz utilizando interrupcin con el TIMER2


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 hasta 11, o por tanteo.

#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); setup_timer_2(T2_DIV_BY_4 , 124 , 1); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); while (TRUE){ } }

También podría gustarte