Timer

  • View
    470

  • Download
    6

Embed Size (px)

Text of Timer

MICROCONTROLADORES INTERRUPCIONES Y TEMPORIZADORES

CAUSAS DE INTERRUPCIN1. 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

PIE1PSPIE ADIE RCIE TXIE SSPIE CCP1IE

PIR1TMR2IE TMR1IE

PIE2--0 --EEIE BCLIE --

PIR2-CCP2IE

REGISTRO PIE1R/W-0PSPIE Bit 7

R/W-0ADIE

R/W-0RCIE

R/W-0TXIE

R/W-0SSPIE

R/W-0CCP1IE

R/W-0

R/W-0Bit 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 PIE1bit 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 PIE2U --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 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 CVentajas 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 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 CLa 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 INTERRUPCIONESenable_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 #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) impulso