29
GUÍA RÁPIDA TIMER 0 E INTERRUPCIONES PROF. LUIS ZURITA Microcontroladores I

Timer 0 interrupciones pic16f887

  • Upload
    miguel

  • View
    58

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Timer 0 interrupciones pic16f887

GUÍA RÁPIDATIMER 0 E

INTERRUPCIONESINTERRUPCIONES

PROF. LUIS ZURITA

Microcontroladores I

Page 2: Timer 0 interrupciones pic16f887

REGISTROS ASOCIADOS ALTEMPORIZADOR TMR0

TMR0: Registro de 8 bits de lectura/escritura• TMR0: Registro de 8 bits de lectura/escritura• OPTION_REG: Configura al TMR0 para que trabaje

como temporizador ó contador y asigna el valor alprescaler

• INTCON: Da información mediante el bit “TOIF”cuando el TMR0 se ha desbordado.

• TRISA (PUERTO A): Permite el ingreso de pulsoscuando el TMR0 está configurado como contador porRA4/TOCKI

Prof. Luis ZuritaMicrocontroladores I

Page 3: Timer 0 interrupciones pic16f887

REGISTRO TMR0

• Es el corazón del módulo Timer0. Puede ser leído oescrito en cualquier momento. El TMR0 seincrementará automáticamente por cada ciclo deinstrucción y contará desde 0 (00H) hasta 255 (FFH)(Contador de 8 bits).

• Ejemplo. Escribir 100 en el TMR0=

movlw .100

movwf TMR0

• Leer el valor del TMR0 y mostrarlo en el Puerto B=

movf TMR0,0

movwf PORTB

Prof. Luis ZuritaMicrocontroladores I

Page 4: Timer 0 interrupciones pic16f887

¿CÓMO CUENTA EL TMR0?

El TMR0 cuenta exclusivamente deforma ascendente, nuncadescendente.

00H

FFH00H

¿Quién incrementa al TMR0?Cada instrucción que se ejecuta en unprograma se encarga de

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

00H

FFH

Valor cargadoEn el TMR0

00H

(28 – N10)

Prof. Luis Zurita

Cada instrucción que se ejecuta en unprograma se encarga deincrementarlo

Microcontroladores I

Page 5: Timer 0 interrupciones pic16f887

¿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 señal de menor frecuencia a la salida, que será la señal de relojde entrada al registro TMR0.

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

• También existe un postescaler, asociado al perro guardián WDT (Watch DogTimer) del microcontrolador, pero en este caso recibe el nombre de postcaler yaque se usa a la salida del WDT, no pudiendo estar asignado a la vez al Timer0 o alWDT. El preescaler es transparente para el programador, no se puede leer niescribir 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 unasecuencia de instrucciones específicas cuando se cambia la asignación delprescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDTprescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDTesté inactivo.

Prof. Luis ZuritaMicrocontroladores I

Page 6: Timer 0 interrupciones pic16f887

CÁLCULOS CON EL TMR0

• Cuando se carga en el registro TMR0 un valor XX, éste contará:(256 – XX) impulsos y el tiempo que tarda en hacerlo viene dadopor la expresión:

Temporización= 4*TOSC*ValorRealTMR0*ValorPreescaler

TOSC = período de oscilación = 1 / FOSC

FOSC = viene dado por el cristal de cuarzo o resonadorque se esté utilizando. Los típicos son=que se esté utilizando. Los típicos son= XT = 4 MHz

HS= 20 MHz

Valor Real TMR0 = (28 – N10) = (256 – N10)

N10= Valor a cargar en el TMR0

ValorPreescaler = puede tomar uno de estos valores= 2 , 4, 8, 16, 32, 64, 128, 256

Prof. Luis ZuritaMicrocontroladores I

Page 7: Timer 0 interrupciones pic16f887

CÁLCULOS CON EL TMR0

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.

Se desea saber: ¿Qué valor debemos cargar en el TMR0, sideseamos obtener una temporización de 10,24 ms, utilizandodeseamos obtener una temporización de 10,24 ms, utilizandoun preescaler de 128 y un cristal XT?

Solución:

(256 – N10) = = = 80

(256 – N10) = 80, despejando N10 = (256 – 80) = 176, el valor quedebemos cargar en el TMR0 es 176, para que éste cuente desde 176hasta 256.

Prof. Luis Zurita

calerValorpreesT

iónTemporizac

OSC 4 1282504

24,10

ns

ms

Microcontroladores I

Page 8: Timer 0 interrupciones pic16f887

• Elegir el TMR0, para generar un retraso de 50 ms utilizando unoscilador de 4 MHz.Solución: Sea Fosc= 4 MHz, T = 0.25 μs.

(256 – N10) = =

N10 = 256 - (50000/Valorpreescaler), supongamos que elegimosPreescaler 32, entonces tendremos=N10 = 256 - (50000/32) = 256 – 1562,5 = - 1306,5. Si da unnúmero negativo, no es válido, por lo que debemos subir el valordel preescaler hasta que la resta sea positiva.

calerValorpreesT

iónTemporizac

OSC 4 calerValorpreesns

ms

2504

50

del preescaler hasta que la resta sea positiva.Para un preescaler de 64, tendremos =

N10 = 256 - (50000/64) = 256 – 781,25= - 525,25. Como esnegativo, subimos el preescaler nuevamente.

Para un preescaler de 128, tendremos =N10 = 256 - (50000/128) = 256 – 390,625= - 134,625. Como esnegativo, subimos el preescaler nuevamente.

Para un preescaler de 64, tendremos =N10 = 256 - (50000/256) = 256 – 195,3125= 60,69. Como espositivo tomaremos este preescaler.

Prof. Luis ZuritaMicrocontroladores I

Page 9: Timer 0 interrupciones pic16f887

Entonces se debe cargar 60,69, aproximado a 61 en el TMR0para que tarde en desbordarse=

Temporización= 4*TOSC*ValorRealTMR0*ValorPreescaler,sustituyendo

Temporización= 4 * 250 ns * (256 – 61 ) * 256 = 49.92 ms ≈ 50 ms

• Para algunas temporizaciones el valor del preescaler puedevariar, siempre y cuando la resta [Valor Real TMR0 = (28 – N10) =(256 – N10) ] sea positiva, por lo que puede darse cuenta de queno hay un solo resultado para los ejercicios. Sin embargo, lo quesi debe cumplirse es que sea cualquiera que sean los valores quese tomen para los cálculos, estos deben de estar cercanos a lasi debe cumplirse es que sea cualquiera que sean los valores quese tomen para los cálculos, estos deben de estar cercanos a larespuesta que se espera del temporizador que esté diseñando,comprobando los resultados.

• Ejemplo. Diga ¿cuánto es la máxima temporización que se puedehallar con el TMR0? Asuma que se está trabajando con un XT.

Solución: Tomamos el máximo factor de escala de división todoslos estados que puede contar el TMR0:

– Temporización= 4*0.25 μs*(256 )*256 = 65.536 ms.

– Este es el máximo valor que podemos conseguir del TMR0.

Prof. Luis ZuritaMicrocontroladores I

Page 10: Timer 0 interrupciones pic16f887

• ¿Cómo hacemos entonces para conseguir valores superiores aéste, tales como 0,5 s; 1 s; 2 s; entre otros?

– Esto se puede arreglar si tenemos un contador de mayornúmero de bits. La solución está en extender el Timer0 conun registro (auxiliar) controlado por software.

– Dicho registro (auxiliar) contará el número de interrupcionespor desbordamiento que genera el Timer0, de forma de queéste pase por cero, cuando haya pasado el tiempo queestamos calculando.

Prof. Luis ZuritaMicrocontroladores I

Page 11: Timer 0 interrupciones pic16f887

USO DE REGISTRO AUXILIAR

Pasos:1. Escoger un valor para el prescaler.

Un posible criterio es calcular todas las frecuencias de prescaler quepodemos obtener con cada divisor posible. Las frecuencias sin decimalesson interesantes al poder encontrar múltiplos de ellas a la salida delTMR0 con mayor facilidad. En general, la elección del valor del prescaleres empírica: depende del problema, la experiencia y sobre todo de lapráctica.

2. Determinar el valor del Registro Auxiliar, a partir del valor dado porel TMR0.Normalmente viene dado por un múltiplo de la frecuencia, asociada alNormalmente viene dado por un múltiplo de la frecuencia, asociada altiempo calculado. Con un ejemplo entenderemos mejor lo que se deseaplantear:

Ejemplo: Determine los valores del TMR0 y del Registro Auxiliar paraconseguir una temporización de 1 segundo. Utilice un oscilador XT.

Solución: XT= Frecuencia = 4 MHz ; Tosc= 250 ns• Paso 1. Como no se nos ha impuesto que prescaler utilizar ni que

temporización, podemos aleatoria mente escogerlas, como en el ejemplo6. Evaluando cualquiera, cuya temporización del TMR0 se basó en 5 ms,escojamos el prescaler 128 y sustituyamos los valores en la ecuaciónprincipal:– Temporización= 4*250 ns*(256 - 217)*128 = 4.992 ms

Prof. Luis ZuritaMicrocontroladores I

Page 12: Timer 0 interrupciones pic16f887

CONTINUACIÓN DEL EJEMPLO ANTERIOR

• Paso 2. ¿Qué valor debe de tener el registro auxiliar?a) Al tiempo de 4.992 ms, se asocia una frecuencia del TMR0 de =

= 200.3 Hz, redondeando, tomamos este múltiplo:

200, Así, tendremos entonces que si multiplicamos 200*4.992ms = 0.998 s, que es un valor bastante cercano a 1 segundo.

b) La misma operación pero interpretada de una forma más sencilla

ms992.4

1

b) La misma operación pero interpretada de una forma más sencillaes determinar cuantas veces necesitamos al tiempo calculadopara lograr un segundo:

La que usted entienda mejor es válida.Nuestro registro auxiliar debe ser de 200!!!Recuerde de que éste registro auxiliar no debe superar 255.Si supera este valor, se debe adicionar un nuevo registroauxiliar

32.200992.4

1

ms

segundo

Prof. Luis ZuritaMicrocontroladores I

Page 13: Timer 0 interrupciones pic16f887

CONFIGURACIÓN DEL TMR0

• Para que opere como temporizador, el bit TOCS (delregistro OPTION_REG) debe ser cero (0), el bitPSA= 0 y deben ser cargados los bits PS2 a PS0,según sea el preescaler a utilizar para lograr nuestratemporización.

• Para que opere como contador, se usa una entrada de• Para que opere como contador, se usa una entrada dereloj externo en el TMR0 y se deben de cumplirciertos requisitos para que el reloj externo pueda sersincronizado con el reloj interno (TOSC). Ademásexiste un retardo en el incremento real del TMR0,después de la sincronización. El bit TOCS= 1. Se debeseleccionar el tipo de flanco que producirá elincremento del TMR0 ( TOSE = 1 ó 0).

Prof. Luis ZuritaMicrocontroladores I

Page 14: Timer 0 interrupciones pic16f887

REGISTRO OPTION_REG (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

PS2 PS1 PSO

• 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

• bitS 2,1,0, PS2,PS1,PSO: Rango con el que actúa eldivisor de frecuencia o preescaler usado en los cálculos

Prof. Luis ZuritaMicrocontroladores I

Page 15: Timer 0 interrupciones pic16f887

EJEMPLOS DE CONFIGURACIÓN

• Configure al PIC16F84 para que el temporizador TMR0, trabaje con lospulsos provenientes de un reloj externo, y el mismo cambie en el flancode bajada de cada dos pulsos externos:

• Configure al PIC16F84 para que el TMR0, trabaje con el reloj interno y lafrecuencia del mismo sea dividida por 32:frecuencia del mismo sea dividida por 32:

Prof. Luis Zurita

¿Y los demás bits? = No importa lo que se cargue, si no se vana trabajar con ellos

¿Cómo lo cargo al OPTION_REG?

En el primer caso:

movlw b’xx11x001’

movwf OPTION_REG

En el segundo caso:

movlw b’xx0x0100’

movwf OPTION_REG

Microcontroladores I

Page 16: Timer 0 interrupciones pic16f887

DE LOS CÁLCULOS A LA PROGRAMACIÓN

• Normalmente, se va a trabajar con el TMR0, para programarlocon un tiempo en particular para que se desborde y produzca unainterrupción.

• Esto hará que se entre a una subrutina de interrupción que seestudiará en las siguientes diapositivas, lo que permitirá ejecutarun programa principal, y cada cierto tiempo (cálculos), va aejecutar una subrutina, regresando nuevamente al programaprincipal, desde donde se produjo la interrupción.

• Para esto=• Para esto=

1. Se deben hacer los cálculos.

2. Se debe configurar el registro OPTION_REG, con el TMR0como temporizador y asignar el valor del prescaler que se hautilizado en los cálculos.

3. Programar lo que se desea realizar durante la rutina deinterrupción por desborde del TMR0 y antes de salir de estarutina, cargar el valor del TMR0 para que vuelva a tener lamisma temporización.

Prof. Luis ZuritaMicrocontroladores I

Page 17: Timer 0 interrupciones pic16f887

Para que se produzca una interrupción cada 50 ms, se hacen los cálculos=Temporización= 4 * 250 ns * (256 – 61 ) * 256 = 49.92 ms ≈ 50 ms

¿Y qué valor se carga en el TMR0?

¿Qué valor se carga en el Prescaler?

Prof. Luis ZuritaMicrocontroladores I

Page 18: Timer 0 interrupciones pic16f887

INTERRUPCIONES• “Las interrupciones son desviaciones del flujo de control del programa

originadas asíncronamente, por diversos sucesos que no se hallan bajo lasupervisión de las instrucciones. Dichos sucesos pueden ser externos alsistema, como la generación de un flanco o nivel activo en una patilla delmicrocontrolador, o bien, internos, como el desbordamiento de uncontador. Su comportamiento es similar al de la instrucción “call” dellamado a subrutina. Se detiene la ejecución del programa en curso, sesalva la dirección actual del contador de programa (PC) en la pila (STACK)y se carga el PC con una dirección, que en el caso de una interrupción esuna dirección reservada de la memoria de código, llamada vector deinterrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2da Edición.

• En el PIC 16F84, este vector de interrupción está ubicado en la posición04H, en donde comenzará la rutina de servicio de la interrupción. Ejemplo:org 00H ; Vector de origen del programagoto INICIO ; salto a la rutina de programa principalorg 04H ; Vector de interrupcióngoto INTERR; salto a la rutina de interrupción.

• La idea de colocar una instrucción de salto incondicional, es la de trasladarel flujo del programa a la zona de memoria de código que contiene a larutina de interrupción.

Prof. Luis ZuritaMicrocontroladores I

Page 19: Timer 0 interrupciones pic16f887

DIAGRAMA DE FLUJO DURANTE UNA INTERRUPCIÓN

Programa normal

Instrucción 1

Instrucción 2

Instrucción 3

Rutina de Servicio de Interrupción

Instrucción 1

Instrucción 2

Prof. Luis Zurita

Instrucción 24

Instrucción 25

Instrucción N

Fin de programa

RETFIE

Nota: Una Rutina de Serviciode Interrupción puede serigual de extensa e inclusomás que el mismo programaprincipal.

Microcontroladores I

Page 20: Timer 0 interrupciones pic16f887

DIAGRAMA DEFLUJO RSIFLUJO RSI

Prof. Luis ZuritaMicrocontroladores I

Page 21: Timer 0 interrupciones pic16f887

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• Este registro se encuentra ubicado en la posición 0BH del banco

0 de los registros de funciones especiales (SFR). A continuaciónse describirán cada uno de sus bits:

Prof. Luis ZuritaMicrocontroladores I

Page 22: Timer 0 interrupciones pic16f887

• GIE: (Global Interrupt Enable), Permiso Global de Interrupciones

1: Habilita todas las interrupciones, cuyos bits de permiso individualestambién las permitan

0: Deshabilita todas las interrupciones

• EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción por fin deescritura en la EEPROM

1: Habilita la interrupción cuando termina la escritura de la EEPROM dedatos

INTCON

1: Habilita la interrupción cuando termina la escritura de la EEPROM dedatos

0: Deshabilita esta interrupción

• TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupciónpor desborde del TMR0

1: Habilita una interrupción por desborde del TMR0

0: Deshabilita esta interrupción

• INTE: (Interrupt Enable RB0/INT), Permiso de interrupción poractivación del pin RB0/INT

1: Habilita la interrupción al activarse RB0/INT

0: Deshabilita esta interrupción

Prof. Luis ZuritaMicrocontroladores I

Page 23: Timer 0 interrupciones pic16f887

INTCON

• RBIE: (RB Port Change Interrupt Enable), Permiso de interrupción porcambio de estado en RB7:RB4

1: Habilita esta interrupción

0: Deshabilita esta interrupción

• TOIF: (TMR0 Overflow Interrupt Flag), Señalizador de desborde delTMR0

1: Ha ocurrido un desborde del TMR01: Ha ocurrido un desborde del TMR0

0: No se ha desbordado el TMR0

• INTF: (RB0/INT Interrupt Flag), Señalizador de activación del pinRB0/INT

1: Se ha activado RB0/INT

0: No se ha activado RB0/INT

• RBIF: (RB Port Change Interrupt Flag), Señalizador de cambio de estadoen RB7:RB4

1: Pasa a 1 cuando cambia el estado de alguna de estas 4 líneas

0: No ha cambiado el estado de RB7: RB4

Prof. Luis ZuritaMicrocontroladores I

Page 24: Timer 0 interrupciones pic16f887

• Habilite la interrupción por desborde del TMR0=

movlw b’10100000’

movwf INTCONmovwf INTCON

• Habilite la interrupción por cambio de nivel en RB0/INT

movlw b’10010000’

movwf INTCON

• Habilite las interrupciones por desborde del TMR0 ycambio de nivel en RB0/INT

movlw b’10110000’

movwf INTCON

Prof. Luis ZuritaMicrocontroladores I

Page 25: Timer 0 interrupciones pic16f887

¿Cómo determinar la causa de unainterrupción?

• Si se han activado dos o más causas de interrupción, comodesborde del TMR0 y cambio de nivel en RB0/INT, cuandoalguna de éstas ocurren, ellas van a la misma rutina deinterrupción.

• Ahora ¿cómo saber cuál es la causa?, mediante el testeo delos señalizadores o flags, recordando que se pondrán a nivellos señalizadores o flags, recordando que se pondrán a nivelalto (1), cuando se haya activado la correspondiente.

• Por lo tanto, con unas simples preguntas dentro de la rutinade servicio de interrupción, se determinará la causante:

Prof. Luis ZuritaMicrocontroladores I

Page 26: Timer 0 interrupciones pic16f887

Ejemplo. Realicemos un programacompleto que contenga variasinterrupciones. Si la causa ha sido laactivación del pin RB0, se debemostrar un dos en binario en elpuerto A, si ha sido un cambio denivel en RB4:RB7, se debe mostrarel uno en binario en el puerto A y sise ha desbordado el TMR0, se debemostrar el cuatro en binario en elpuerto A.

¿RB0/INT?¿INTF=1?

¿RB4:RB7?¿RBIF=1?puerto A.

Programa Principal RSI

¿TMR0?¿TOIF=1?

Prof. Luis ZuritaMicrocontroladores I

Page 27: Timer 0 interrupciones pic16f887

SALVANDO EL ENTORNO

Salvar el entorno, se refiere a mantener el valor exacto quetienen los registros de trabajo STATUS y W, y cualquier otro deimportancia, incluyendo los puertos que controlan a losactuadores, que no vaya a ser modificado dentro de la subrutinade servicio de interrupción.

Para salvar el entorno cuando ocurre una interrupción serecomienda seguir los siguientes pasos:– Salvar a w y a STATUS.– Almacenar a w en un registro general llamado W_TEMP– Almacenar a STATUS en un registro general llamado– Almacenar a STATUS en un registro general llamado

STATUS_TEMP– Almacenar cualquier PortX que maneje actuadores– Se ejecuta la rutina de interrupción (queda expresada para

efectos del ejemplo siguiente)– Restauramos a PortX– Restauramos a STATUS– Restauramos a w

NOTA: Los registros generales W_TEMP, STATUS_TEMP, y el depuertos deben ser declarados al inicio del programa, para nogenerar errores.

Prof. Luis ZuritaMicrocontroladores I

Page 28: Timer 0 interrupciones pic16f887

SALVANDO EL ENTORNO

; **** Rutina para salvar el entorno ****PUSH movwf W_TEMP ; Salvamos w a este registro temporal

movf STATUS,0 ;movwf STATUS_TEMP ; Salvamos STATUS en STATUS_TEMPmovf PORTB,0movwf CopiaPORTB ; Salvamos a PORTB

RUT_INT

; Asuma que desea salvar el PORTB, durante una interrupción=

RUT_INT;Aquí estará la rutina de servicio de interrupción;

POP movf CopiaPORTB,0 ; Restauramos el PORTB a su valor antes demovwf PORTB ; haber entrado a la rutina de interrupciónmovf STATUS_TEMP,0 ; Movemos w al registro STATUS,

; retornando elmovwf STATUS ; valor originalmovf W_TEMP,0 ; W_TEMP lo trasladamos a w

; retornando el valor original que tenía antes; de entrar a la rutina de interrupción.

Microcontroladores I Prof. Luis Zurita

Page 29: Timer 0 interrupciones pic16f887

¿CUANDO UTILIZAR UNAINTERRUPCIÓN?

Una interrupción es muy importante cuando deseamos realizaruna tarea que no dependa de una exploración constante del programasobre la misma.

También cuando deseamos que nuestro programa responda deforma inmediata y automática a determinados eventos.

Ejemplo del uso de Interrupción:

• En los sistemas de control, cuando se necesita un pulsador de paradade emergencia (PARE RB0/INT).de emergencia (PARE RB0/INT).

• En el manejo de teclados, se recomienda su uso, ya que se puedemeter al microcontrolador en un estado de reposo, ahorrando energíay esperando a que se pulse una tecla para iniciar una rutina deservicio (CLAVE).

• Cuando deseamos que el programa haga una tarea cada cierto tiempo,independientemente de lo que se encuentre haciendo en el programaprincipal. (DESBORDE DEL TMR0).

Prof. Luis ZuritaMicrocontroladores I