38
UNIVERSIDAD TECNOLÓGICA DEL SURESTE DE VERACRUZ • DOCENTE: ING. JOSÉ VAZQUEZ DOMINGUEZ • ASIGNATURA: MICROCONTROLADORES • GRUPO: 503 • QUINTO CUATRIMESTRE • ALUMNO: ROJAS RUIZ DIEGO ARMANDO • CARRERA: TSU MECATRÓNICA • LUGAR Y FECHA: NANCHITAL, VERACRUZ A 11 DE FEBRERO DEL 2014

TIMERS&TEMPORIZADORES EN "C"

Embed Size (px)

DESCRIPTION

Una presentación acerca de los timers y de los temporizadores mediante el lenguaje C

Citation preview

Page 1: TIMERS&TEMPORIZADORES EN "C"

UNIVERSIDAD TECNOLÓGICA DEL SURESTE DE VERACRUZ

• DOCENTE: ING. JOSÉ VAZQUEZ DOMINGUEZ

• ASIGNATURA: MICROCONTROLADORES• GRUPO: 503• QUINTO CUATRIMESTRE• ALUMNO: ROJAS RUIZ DIEGO ARMANDO• CARRERA: TSU MECATRÓNICA• LUGAR Y FECHA: NANCHITAL, VERACRUZ A

11 DE FEBRERO DEL 2014

Page 2: TIMERS&TEMPORIZADORES EN "C"

MICROCONTROLADORESINTERRUPCIONES Y TEMPORIZADORES

TEMA 2

Page 3: TIMERS&TEMPORIZADORES EN "C"

INTERRUCCIONES PIC16F87X

CLÁSICAS PIC16F84 NUEVAS

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF

PSPIE

ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

PIE1

PIE2--- 0 --- EEIE BCLIE -- -- CCP2IE

PIR1

PIR2

Prof. Luis Zurita Microcontroladores II

Page 4: TIMERS&TEMPORIZADORES EN "C"

PC<12:0>

Nivel 1 de la Pila

Nivel 2 de la Pila

………………

Nivel 8 de la Pila

CALL, RETURNRETFIE, RETLW

Vector de Reset

………………

Vector de Interrupción

0000h

0004h0005h

Página 0

Página 1

Página 2

Página 3

07FFh0800h

0FFFh1000h

17FFh1FFh

13

Page 5: TIMERS&TEMPORIZADORES EN "C"

INTERRUPCIONES EN LENGUAJE CVentajas 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á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_xxxxIndican 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:

Page 6: TIMERS&TEMPORIZADORES EN "C"

#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 Envio/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

Page 7: TIMERS&TEMPORIZADORES EN "C"

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

Page 8: TIMERS&TEMPORIZADORES EN "C"

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_RBINT_EXT INT_AD INT_TBEINT_RDA INT_TIMER1 INT_TIMER2INT_CCP1 INT_CCP2 INT_SSPINT_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.

Page 9: TIMERS&TEMPORIZADORES EN "C"

INTERRUPCIÓN EXTERIOR POR RB0Es 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);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).

Page 10: TIMERS&TEMPORIZADORES EN "C"

EJEMPLO 1. INTERRUPCIÓN POR RB0/INT

#INT_EXText_isr( ){…..//aquí se colocan las sentencias que se …..//desean ejecutar durante esta interrupción.}void main ( ){

enable_interrupts(INT_EXT); //Activa INTEext_int_edge(H_TO_L); //Flanco de bajadaenable_interrupts(GLOBAL); //Habilita GIEwhile (TRUE){}

}

Page 11: TIMERS&TEMPORIZADORES EN "C"

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

}}

Page 12: TIMERS&TEMPORIZADORES EN "C"

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);while(TRUE){

output_high(PIN_D0);output_low(PIN_D1);delay_ms(1000);output_low(PIN_D0);output_high(PIN_D1);delay_ms(1000);}

}

Page 13: TIMERS&TEMPORIZADORES EN "C"
Page 14: TIMERS&TEMPORIZADORES EN "C"

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

Page 15: TIMERS&TEMPORIZADORES EN "C"

TIMER0 EN LENGUAJE CLa 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 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

Page 16: TIMERS&TEMPORIZADORES EN "C"

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:

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.

Page 17: TIMERS&TEMPORIZADORES EN "C"

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

(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.

RgodivisorT

iónTemporizac

OSC 4 825.04

5,0

s

ms

Page 18: TIMERS&TEMPORIZADORES EN "C"

Ejemplo 1. 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_RTCCRTCC_isr(){

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

}

NOTA: El compilador se encarga al entrar en la interrupción de inhabilitar las interrupciones y al salir de borrar los flags, por lo que no es necesario hacerlo por programa

Page 19: TIMERS&TEMPORIZADORES EN "C"
Page 20: TIMERS&TEMPORIZADORES EN "C"

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,

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

Page 21: TIMERS&TEMPORIZADORES EN "C"

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

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.

Page 22: TIMERS&TEMPORIZADORES EN "C"

DIAGRAMA DE BLOQUE TIMER 1

Page 23: TIMERS&TEMPORIZADORES EN "C"

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 Periféricos• PIR1 = Señalizadores de Interrupciones• TRISC = Registro de configuración PortC• PORTC= Registro de 8 bits.

Page 24: TIMERS&TEMPORIZADORES EN "C"

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:810 = valor del preescaler 1:401 = valor del preescaler 1:200 = 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 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 = 11= No sincroniza la entrada de reloj externa0 = Sincroniza la entrada de reloj externaCon TMR1CS = 0En 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 TIMER11 = 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 TIMER10 = Deshabilita el TIMER1

Page 25: TIMERS&TEMPORIZADORES EN "C"

TIMER1 EN LENGUAJE CLa 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_0 (modo); T1CON (10h)T1_DISABLED 00000000T1_INTERNAL 10000101T1_EXTERNAL 10000111T1_EXTERNAL_SYNC 10000011T1_CLK_OUT 00001000T1_DIV_BY_1 00000000T1_DIV_BY_2 00010000T1_DIV_BY_4 00100000T1_DIV_BY_8 00110000

Page 26: TIMERS&TEMPORIZADORES EN "C"

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:

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.

Page 27: TIMERS&TEMPORIZADORES EN "C"

EJEMPLO 2. 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_TIMER1temp1_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){}

}

Page 28: TIMERS&TEMPORIZADORES EN "C"
Page 29: TIMERS&TEMPORIZADORES EN "C"

TIMER 2Caracterí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 software5. 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

Page 30: TIMERS&TEMPORIZADORES EN "C"

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.

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.

Page 31: TIMERS&TEMPORIZADORES EN "C"

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 Periféricos• PIR1 = Señalizadores de Interrupciones

Page 32: TIMERS&TEMPORIZADORES EN "C"

DIAGRAMA DE BLOQUE DEL TIMER 2

Page 33: TIMERS&TEMPORIZADORES EN "C"

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:10 0 0 1 Divisor del postescaler 1:20 0 1 0 Divisor del postescaler 1:30 0 1 1 Divisor del postescaler 1:40 1 0 0 Divisor del postescaler 1:50 1 0 1 Divisor del postescaler 1:60 1 1 0 Divisor del postescaler 1:70 1 1 1 Divisor del postescaler 1:81 0 0 0 Divisor del postescaler 1:91 0 0 1 Divisor del postescaler 1:101 0 1 0 Divisor del postescaler 1:111 0 1 1 Divisor del postescaler 1:121 1 0 0 Divisor del postescaler 1:131 1 0 1 Divisor del postescaler 1:141 1 1 0 Divisor del postescaler 1:151 1 1 1 Divisor del postescaler 1:16

• Bit 2: TMR2ON: bit de activación del TIMER21 = habilita el funcionamiento del TIMER20 = Inhibe el funcionamiento del TIMER2

• Bit 1-0:T2CKPS1:T2CKPS0 Selección del rango de divisor del Preescaler del TIMER 20 0 Divisor del Preescaler 1:10 1 Divisor del Preescaler 1:41 X Divisor del Preescaler 1:16

Page 34: TIMERS&TEMPORIZADORES EN "C"

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

Page 35: TIMERS&TEMPORIZADORES EN "C"

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: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 T2CONmodo afecta a los bits 2:0 del registro T2CON.

Page 36: TIMERS&TEMPORIZADORES EN "C"

TIMER2 EN LENGUAJE C

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.

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

Page 37: TIMERS&TEMPORIZADORES EN "C"

Ejemplo 3. 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 Timer2

0,5 ms=(4/4000000)(4*1)*Valor PR2Valor PR2=125Sin embargo este valor se cumple en lenguaje

ensamblador, por lo que debe ajustarse para lenguaje C reduciendo su valor hasta 11, o por tanteo.

Page 38: TIMERS&TEMPORIZADORES EN "C"

#INCLUDE <16F877.h>#FUSES XT,NOWDT,NOPROTECT,NOLVP#USE DELAY(CLOCK=4000000)#USE fast_io(B)int1 cont=0;#INT_TIMER2void 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){}

}