Timer
Timer
Timer
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
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
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.
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 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
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.
Si el TMR0 se carga con un valor, ste comenzar a contar desde el valor cargado hasta que se desborda (cuando pasa a 00H)
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
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.
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
Realice un programa para que se genere una interrupcin cada 0,5 segundos, utilizando un XT.
INICIO RSI
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
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.
(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, 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){ } }
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.
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.
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
#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){ } }