Micro2 tema 2

51
MICROCONTROLADORES II INTERRUPCIONES Y INTERRUPCIONES Y TEMPORIZADORES TEMA 2 PROF. LUIS ZURITA

Transcript of Micro2 tema 2

Page 1: Micro2 tema 2

MICROCONTROLADORES IIINTERRUPCIONES YINTERRUPCIONES YTEMPORIZADORES

TEMA 2

PROF. LUIS ZURITA

Page 2: Micro2 tema 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

Page 3: Micro2 tema 2

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

Page 4: Micro2 tema 2

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 enel Puerto Paralelo Esclavo. Para los modelos de 40 pines.

1 = Habilita la interrupción por lectura/escritura en el PSP0= 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 laconversión A/D.

1 = Habilita la interrupción del convertidor A/D0 = Inhabilita la interrupción del convertidor A/D

bit 5: RCIE: bit de habilitación de interrupción en recepción por elUSART, cuando se llena el buffer.

1 = Habilita interrupción por recepción en el USART0 = Inhabilita interrupción por recepción en el USART

Prof. Luis Zurita Microcontroladores II

Page 5: Micro2 tema 2

REGISTRO PIE1

bit 4: TXIE: bit de interrupción al transmitir por el USART, cuando se vacía elbuffer.

1 = Habilita la interrupción de transmisión por el USART0 = 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 SSP0= 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 seproduce una captura o una comparación.

1= Habilita la interrupción del CCPI0= Inhabilita la interrupción del CCPI

bit 1: TMR2IE: bit de habilitación de interrupción por desbordamiento deTMR2 que está emparejado con el registro PR2 (92h)

1= Habilita la interrupción por desbordamiento de TMR2 emparejado aPR2

0= Inhabilita la interrupción de TMR2 emparejado a PR2bit 0: TMR1IE: bit de habilitación de interrupción por desbordamiento delTMRI

1= Habilita la interrupción por desbordamiento de TMR10= Inhabilita la interrupción por desbordamiento de TMR1

Prof. Luis Zurita Microcontroladores II

Page 6: Micro2 tema 2

REGISTRO PIE2

U 0 R/W 0 U 0 R/W 0 R/W 0 U 0 U 0 R/W--- 0 --- EEIE BCLIE -- -- CCP2IEBit 7 Bit 0

bit 7: No implementado: se lee como “0’bit 6 Reservado, Mantiene este bits a cerobit 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 datos0 =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ásmaestros tratan de transferir al mismo tiempo.

1 = Habilita la interrupción por colisión de bus SSP0 = 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 CCP20 = inhabilita la interrupción de CCP2

Prof. Luis Zurita Microcontroladores II

Page 7: Micro2 tema 2

PC<12:0>

Nivel 1 de la Pila

Nivel 2 de la Pila

………………

Nivel 8 de la Pila

CALL, RETURNRETFIE, RETLW

Vector de Reset 0000h

13

Vector de Reset

………………

Vector de Interrupción

0000h

0004h0005h

Página 0

Página 1

Página 2

Página 3

07FFh0800h

0FFFh1000h

17FFh1FFh

Page 8: Micro2 tema 2

INTERRUPCIONES EN LENGUAJE C

Ventajas de usar las directivas de interrupcionesEl compilador genera el código necesario para

saltar a la función que va tras esta directiva en elmomento de la interrupción.

También genera el código para salvar al principioy restituir al final el contexto (salvar y restaurar elentorno), y borrará el flag que se activó con lainterrupción.

El programador debe seguir encargándoseEl programador debe seguir encargándoseúnicamente de habilitar las interrupciones y establecerlas sentencias que se ejecutarán en cada función de lasinterrupciones deseadas a ejecutarse.

Las directivas #INT_xxxxIndican que la función que aparece a

continuación corresponde al tratamiento de unainterrupción (no tiene ni necesita parámetros):

Para los PICs 16F877 hay 14 posibles directivas:

Prof. Luis Zurita Microcontroladores II

Page 9: Micro2 tema 2

#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

Page 10: Micro2 tema 2

INTERRUPCIONES EN LENGUAJE C

La directiva #INT_DEFAULTIndica que la función que viene a

continuación será llamada si se dispara unainterrupción y ninguno de los flags está activo.

La directiva #INT_GLOBALIndica que la función que va a continuaciónIndica que la función que va a continuación

sustituye todas las acciones que inserta elcompilador al aceptarse una interrupción. Sólo seejecuta lo que vaya en dicha función.GLOBAL equivale a GIE=PEIE=1 y debe activarse deforma independiente. El resto activarán la máscaracorrespondiente.

Prof. Luis Zurita Microcontroladores II

Page 11: Micro2 tema 2

FUNCIONES PARA GESTIÓN DEINTERRUPCIONES

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_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 demanera independiente. Las otras activan la máscara particular yel 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

Page 12: Micro2 tema 2

INTERRUPCIÓN EXTERIOR POR RB0Es una interrupción clásica en la mayoría de

los PICs. Permite generar una interrupción porcambio de nivel en la entrada RB0.

La directiva que se utiliza es #INT_EXT y sedebe 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

Page 13: Micro2 tema 2

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

Page 14: Micro2 tema 2

EJEMPLO 2. Active dos leds de forma intermitente cada 1 segundo. Sipresiona RB0/INT, los leds se activan a razón de 250 ms de maneraintermitente hasta que se presione RA0 para volver a su estadonormal.

#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_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);

}}Prof. Luis Zurita Microcontroladores II

Page 15: Micro2 tema 2

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

Page 16: Micro2 tema 2
Page 17: 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 porRA4

Prof. Luis Zurita Microcontroladores II

Page 18: Micro2 tema 2

REGISTRO OPTION (Dirección 81H)

• bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita elbit1: Desactivadas0: Activadas

• bit 6, INTEDG: Flanco activo para el control deinterrupciones1: Con flanco Ascendente0: Con flanco Descendente

• bit 5, TOCS: Fuente de Reloj para TMR0• bit 5, TOCS: Fuente de Reloj para TMR01: Pulsos introducidos a través de RA4/T0CK1

(Contador)0: Pulsos de reloj interno Fosc/4 (Temporizador)

• bit 4, TOSE: Tipo de flanco en TOCK11: Incremento de TMR0 cada flanco descendente0: Incremento de TMR0 cada flanco ascendente

• bit 3, PSA: Bit de asignación del prescaler divisor defrecuencia1: El divisor de frecuencia se asigna al WDT0: El divisor de frecuencia se asigna al TMR0

• bit 2-0, PS2:PSO: Rango con el que actúa el divisor defrecuencia.

Prof. Luis Zurita Microcontroladores II

Page 19: Micro2 tema 2

¿QUÉ ES EL PRESCALER?

• Divide la frecuencia de reloj de entrada del Timer0, entre valorespredefinidos, como se ve en la tabla asociada al registro OPTION,1:32, 1: 64, 1:256, etc., genera una nueva señal de menorfrecuencia a la salida, que será la señal de reloj de entrada alregistro TMR0.

• “Ralentiza” señales de entrada demasiado rápidas para nuestrospropósitos.

• Nota: Para evitar un RESET no deseado del sistema, es necesarioejecutar una secuencia de instrucciones específicas cuando seejecutar una secuencia de instrucciones específicas cuando secambia la asignación del prescaler del TMR0 al WDT. Esta secuenciadebe ser seguida, aún cuando el WDT esté inactivo

Page 20: Micro2 tema 2

¿CÓMO CUENTA EL TMR0?

El TMR0 cuenta exclusivamente de formaascendente, nunca descendente.

00H

FFH00H

Si el TMR0 se carga con un valor,éste comenzará a contar desde elvalor cargado hasta que se desborda(cuando pasa a 00H)

00H

FFH

Valor cargadoEn el TMR0

00H

(28 – N10)

Prof. Luis Zurita Microcontroladores II

Page 21: Micro2 tema 2

CÁLCULOS CON EL TMR0

• Cuando se carga en el registro TMR0 un valor XXH, él mismocontará: (FFH – XXH) impulsos y el tiempo que tarda enhacerlo viene dado por la expresión:

Temporización= 4 * TOSC * Valor Real TMR0 * Rango deldivisor 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 prescalerseleccionado de 1:32 y un oscilador XT. Determine el tiempoen 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

Page 22: Micro2 tema 2

OTROS EJEMPLOS

• Se desea saber: ¿Qué valor debemos cargar en el TMR0, si deseamosobtener una temporización de 10,24 ms, utilizando un preescaler de 128y un cristal XT?

Solución:

(256 – N10) = = = 80

(256 – N10) = 80, despejando N10 = (256 – 80) = 176, el valor que debemoscargar 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 osciladorde 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

Page 23: Micro2 tema 2

Démosle valores al Rango del divisor, hasta obtener un valor que seacerque 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, paracada uno de los valores que se consiguieron en los cálculos anteriores.Escoja uno y justifique. Particularmente parece que el que tiene el rangode divisor de 64, es el mejor.

• Nota: En este ejercicio resuelto, usted puede darse cuenta de que no hayun solo resultado para los ejercicios, pero lo que si debe cumplirse es quesea cualquiera que sean los valores que se tomen para los cálculos, estosdeben de estar cercanos a la respuesta que se espera del temporizadorque esté diseñando.

Prof. Luis Zurita Microcontroladores II

Page 24: Micro2 tema 2

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

Page 25: Micro2 tema 2

TIMER0 EN LENGUAJE C

Los distintos modos se pueden agrupar mediante elempleo del símbolo |. Ejemplo:setup_timer_0 (RTCC_DIV_2 | RTCC_EXT_L_TO_H);

El compilador C suministre una serie de funcionespara leer o escribir en el TIMER0. Para escribir un valor en elregistro: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

Page 26: Micro2 tema 2

Ejemplo 3. Generar una señal cuadrada de 1 kHzutilizando la interrupción del TIMER0

• Para generar una señal cuadrada de 1 kHz con un duty cycledel 50 %, se necesita un período de 0,5 ms en nivel alto y 0,5ms en nivel bajo.

• Paso 1. Cálculos: Aplicando las fórmulas del TIMER0:Solución:

(256 – N10) = = = 62,5RgodivisorT

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 es194, para que éste cuente desde 194 hasta 256,generándonos la temporización de 0,5 ms. Estos cálculos secumplen fielmente en lenguaje ensamblador, sin embargo enlenguaje C, al generarse códigos adicionales, se realiza unajuste de los valores hasta en 4 unidades por encima de loque se calculó, por lo tanto el valor a cargar definitivo en elTIMER0 es 198.

RgodivisorTOSC 4 825.04 s

Prof. Luis Zurita Microcontroladores II

Page 27: Micro2 tema 2

Ejemplo 3. Generar una señal cuadrada de 1 kHzutilizando 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);}

NOTA: El compilador se encargaal entrar en la interrupción deinhabilitar 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 yal salir de borrar los flags, por loque no es necesario hacerlo porprograma

Prof. Luis Zurita Microcontroladores II

Page 28: Micro2 tema 2
Page 29: Micro2 tema 2

TIMER 1

Características básicas:

1. Es de 16 bits.

2. Puede actuar como temporizador o como contadorbit (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 lospines T1OSI (entrada) y T1OSO (salida).

Prof. Luis Zurita Microcontroladores II

Page 30: Micro2 tema 2

TIMER 1

7. Al desbordase (FFFFh -> 0000h) produce la interrupciónTMR1:

• 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 apagadurante SLEEP.

9. Monitorea tiempo entre transiciones de una señal en pin deentrada.

10. Controla con precisión el tiempo de transición de pin desalida.

11. Sirve para contar eventos externos y generar interrupcionescuando ha ocurrido un número deseado.

Prof. Luis Zurita Microcontroladores II

Page 31: Micro2 tema 2

DIAGRAMA DE BLOQUE TIMER 1

Prof. Luis Zurita Microcontroladores II

Page 32: Micro2 tema 2

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

Page 33: Micro2 tema 2

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 osciladorexterno, hay que poner este bit a 1. El TMR1 puede trabajar a una frecuencia totalmenteindependiente de la del sistema.

1 = Habilita el oscilador0 = 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 = 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

Prof. Luis Zurita Microcontroladores II

Page 34: Micro2 tema 2

CÁLCULOS PARA EL TIMER 1

Temporización= 4 * TOSC * (Valor Real TMR1)* Rangodel 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 sepuede alcanzar con el TIMER 1?

Prof. Luis Zurita Microcontroladores II

Page 35: Micro2 tema 2

• Realice un programa para que se genere una interrupcióncada 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

FINProf. Luis Zurita Microcontroladores II

Page 36: Micro2 tema 2

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

Page 37: Micro2 tema 2

TIMER1 EN LENGUAJE C

Los distintos modos se pueden agrupar mediante elempleo del símbolo |. Ejemplo:setup_timer_1 (T1_INTERNAL | T1_DIV_BY_2);

El compilador C suministre una serie de funcionespara leer o escribir en el TIMER1. Para escribir un valor en elregistro: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

Page 38: Micro2 tema 2

Ejemplo 4. Generar una interrupción cada un segundoutilizando el TIMER1

• Para generar un retardo de 1 segundo, se deben generar dosveces 0,5 segundos, motivado a que directamente el TIMER1no puede alcanzarlo.

• Paso 1. Cálculos: Aplicando las fórmulas del TIMER1:

Solución: Nota: este término debe sermenor 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ándonosla temporización de 0,5 s.

RgodivisorT

iónTemporizac

OSC 4 825.04

5,0

s

s

menor o igual a 65536. Es por elloque se utilizó el predivisor de 8.

Prof. Luis Zurita Microcontroladores II

Page 39: Micro2 tema 2

EJEMPLO 4. Generar una interrupción cada unsegundo 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);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

Page 40: Micro2 tema 2
Page 41: 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

Page 42: Micro2 tema 2

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

Prof. Luis Zurita Microcontroladores II

Page 43: Micro2 tema 2

TIMER 2

9. Al igualarse TMR2 y PR2 se produce la interrupciónTMR2:

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

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

Page 44: Micro2 tema 2

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

Page 45: Micro2 tema 2

DIAGRAMA DE BLOQUE DEL TIMER 2

Prof. Luis Zurita Microcontroladores II

Page 46: Micro2 tema 2

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

Prof. Luis Zurita Microcontroladores II

Page 47: Micro2 tema 2

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 seutiliza un XT, con un prescaler = 4 y un postcaler = 10,considerando que PR2 = D’200’. Cargue el TMR2 con00H

Prof. Luis Zurita Microcontroladores II

Page 48: Micro2 tema 2

TIMER2 EN LENGUAJE C

La configuración del TIMER2 en el compilador deC 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 secarga en el registro PR2.

postcaler es el valor del postcaler (1 a 16). Afecta a losbits 6:3 del registro T2CON

modo afecta a los bits 2:0 del registro T2CON.

Prof. Luis Zurita Microcontroladores II

Page 49: Micro2 tema 2

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

Page 50: Micro2 tema 2

Ejemplo 5. Generar una señal de 1 kHzutilizando interrupción con el TIMER2

Para una señal de 1 kHz se necesitan dossemiperíodos de 0,5 ms, se utilizará un XT, un predivisorde 4 y un postcaler de 1:Temporización= 4 * TOSC * Valor PR2 * Rango del prescalerTimer2 * Rango del postcaler Timer2Timer2 * 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 Creduciendo su valor hasta 11, o por tanteo.

Prof. Luis Zurita Microcontroladores II

Page 51: Micro2 tema 2

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