Timer 0 interrupciones pic16f887

GUÍA RÁPIDA TIMER 0 E INTERRUPCIONES PROF. LUIS ZURITA Microcontroladores I REGISTROS ASOCIADOS AL TEMPORIZADOR TMR0

Views 199 Downloads 0 File size 337KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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

Microcontroladores I

REGISTROS ASOCIADOS AL TEMPORIZADOR TMR0

• TMR0: Registro de 8 bits de lectura/escritura • OPTION_REG: 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/TOCKI Microcontroladores I

Prof. Luis Zurita

REGISTRO TMR0 • Es el corazón del módulo Timer0. Puede ser leído o escrito en cualquier momento. El TMR0 se incrementará automáticamente por cada ciclo de instrucció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 Microcontroladores I

Prof. Luis Zurita

¿CÓMO CUENTA EL TMR0? El TMR0 cuenta exclusivamente de forma ascendente, nunca descendente. ¿Quién incrementa al TMR0? Cada instrucción que se ejecuta en un programa se encarga de incrementarlo

00H FFH

00H (28 – N10) 00H FFH

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

Valor cargado En el TMR0 00H

Microcontroladores I

Prof. Luis Zurita

¿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 reloj de 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 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 específicas cuando se cambia la asignación del prescaler del TMR0 al WDT. Esta secuencia debe ser seguida, aún cuando el WDT esté inactivo.

Microcontroladores I

Prof. Luis Zurita

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 dado por 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 resonador 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

Microcontroladores I

Prof. Luis Zurita

CÁLCULOS CON EL TMR0 Sea un valor a cargar en el TMR0 de 100, un prescaler seleccionado de 1:32 y un oscilador XT. Determine el tiempo en 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, si deseamos obtener una temporización de 10,24 ms, utilizando un preescaler de 128 y un cristal XT? Solución: (256 – N10) =

Temporizac ión = 4  TOSC  Valorprees caler

10,24ms 4  250ns 128

= 80

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

Microcontroladores I

Prof. Luis Zurita



Elegir el TMR0, para generar un retraso de 50 ms utilizando un oscilador de 4 MHz. Solución: Sea Fosc= 4 MHz, T = 0.25 μs. (256 – N10) =

Temporización 50ms = 4  TOSC  Valorpreescaler 4  250ns Valorpreescaler

N10 = 256 - (50000/Valorpreescaler), supongamos que elegimos Preescaler 32, entonces tendremos= N10 = 256 - (50000/32) = 256 – 1562,5 = - 1306,5. Si da un número negativo, no es válido, por lo que debemos subir el valor del preescaler hasta que la resta sea positiva. Para un preescaler de 64, tendremos = N10 = 256 - (50000/64) = 256 – 781,25= - 525,25. Como es negativo, subimos el preescaler nuevamente. Para un preescaler de 128, tendremos = N10 = 256 - (50000/128) = 256 – 390,625= - 134,625. Como es negativo, subimos el preescaler nuevamente. Para un preescaler de 64, tendremos = N10 = 256 - (50000/256) = 256 – 195,3125= 60,69. Como es positivo tomaremos este preescaler.

Microcontroladores I

Prof. Luis Zurita

Entonces se debe cargar 60,69, aproximado a 61 en el TMR0 para 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 puede variar, siempre y cuando la resta [Valor Real TMR0 = (28 – N10) = (256 – N10) ] sea positiva, por lo que puede darse cuenta de que no hay un solo resultado para los ejercicios. Sin embargo, lo que si debe cumplirse es que sea cualquiera que sean los valores que se tomen para los cálculos, estos deben de estar cercanos a la respuesta que se espera del temporizador que esté diseñando, comprobando los resultados. • Ejemplo. Diga ¿cuánto es la máxima temporización que se puede hallar con el TMR0? Asuma que se está trabajando con un XT. Solución: Tomamos el máximo factor de escala de división todos los 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. Microcontroladores I

Prof. Luis Zurita

• ¿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 mayor número de bits. La solución está en extender el Timer0 con un registro (auxiliar) controlado por software. – Dicho registro (auxiliar) contará el número de interrupciones por desbordamiento que genera el Timer0, de forma de que éste pase por cero, cuando haya pasado el tiempo que estamos calculando.

Microcontroladores I

Prof. Luis Zurita

USO DE REGISTRO AUXILIAR Pasos: 1. Escoger un valor para el prescaler. Un posible criterio es calcular todas las frecuencias de prescaler que podemos obtener con cada divisor posible. Las frecuencias sin decimales son interesantes al poder encontrar múltiplos de ellas a la salida del TMR0 con mayor facilidad. En general, la elección del valor del prescaler es empírica: depende del problema, la experiencia y sobre todo de la práctica. 2. Determinar el valor del Registro Auxiliar, a partir del valor dado por el TMR0. Normalmente viene dado por un múltiplo de la frecuencia, asociada al tiempo calculado. Con un ejemplo entenderemos mejor lo que se desea plantear: Ejemplo: Determine los valores del TMR0 y del Registro Auxiliar para conseguir 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 ejemplo 6. Evaluando cualquiera, cuya temporización del TMR0 se basó en 5 ms, escojamos el prescaler 128 y sustituyamos los valores en la ecuación principal: – Temporización= 4*250 ns*(256 - 217)*128 = 4.992 ms

Microcontroladores I

Prof. Luis Zurita

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 = 1 = 200.3 Hz, redondeando, tomamos este múltiplo: 4.992 ms

200, Así, tendremos entonces que si multiplicamos 200*4.992 ms = 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 es determinar cuantas veces necesitamos al tiempo calculado para lograr un segundo:

1segundo  200.32 4.992 ms

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 registro auxiliar Microcontroladores I

Prof. Luis Zurita

CONFIGURACIÓN DEL TMR0 • Para que opere como temporizador, el bit TOCS (del registro OPTION_REG) debe ser cero (0), el bit PSA= 0 y deben ser cargados los bits PS2 a PS0, según sea el preescaler a utilizar para lograr nuestra temporización. • Para que opere como contador, se usa una entrada de reloj externo en el TMR0 y se deben de cumplir ciertos requisitos para que el reloj externo pueda ser sincronizado con el reloj interno (TOSC). Además existe un retardo en el incremento real del TMR0, después de la sincronización. El bit TOCS= 1. Se debe seleccionar el tipo de flanco que producirá el incremento del TMR0 ( TOSE = 1 ó 0). Microcontroladores I

Prof. Luis Zurita

REGISTRO OPTION_REG (Dirección 81H)







• •



bit 7, RPBU : Resistencia Pull-up, Puerto B, habilita el bit 1: Desactivadas 0: Activadas PS2 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 través 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 asignación del prescaler divisor de frecuencia 1: El divisor de frecuencia se asigna al WDT 0: El divisor de frecuencia se asigna al TMR0 bitS 2,1,0, PS2,PS1,PSO: Rango con el que actúa el divisor de frecuencia o preescaler usado en los cálculos

Microcontroladores I

PS1 PSO

Prof. Luis Zurita

EJEMPLOS DE CONFIGURACIÓN •

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

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

¿Cómo lo cargo al OPTION_REG? En el primer caso:

En el segundo caso:

movlw

b’xx11x001’

movlw

b’xx0x0100’

movwf

OPTION_REG

movwf

OPTION_REG

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

Microcontroladores I

Prof. Luis Zurita

DE LOS CÁLCULOS A LA PROGRAMACIÓN • Normalmente, se va a trabajar con el TMR0, para programarlo con un tiempo en particular para que se desborde y produzca una interrupción. • Esto hará que se entre a una subrutina de interrupción que se estudiará en las siguientes diapositivas, lo que permitirá ejecutar un programa principal, y cada cierto tiempo (cálculos), va a ejecutar una subrutina, regresando nuevamente al programa principal, desde donde se produjo la interrupción. • Para esto= 1. Se deben hacer los cálculos. 2. Se debe configurar el registro OPTION_REG, con el TMR0 como temporizador y asignar el valor del prescaler que se ha utilizado en los cálculos. 3. Programar lo que se desea realizar durante la rutina de interrupción por desborde del TMR0 y antes de salir de esta rutina, cargar el valor del TMR0 para que vuelva a tener la misma temporización. Microcontroladores I

Prof. Luis Zurita

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 ¿Qué valor se carga en el Prescaler?

¿Y qué valor se carga en el TMR0?

Microcontroladores I

Prof. Luis Zurita

INTERRUPCIONES •

“Las interrupciones son desviaciones del flujo de control del programa originadas asíncronamente, por diversos sucesos que no se hallan bajo la supervisión de las instrucciones. Dichos sucesos pueden ser externos al sistema, como la generación de un flanco o nivel activo en una patilla del microcontrolador, o bien, internos, como el desbordamiento de un contador. Su comportamiento es similar al de la instrucción “call” de llamado a subrutina. Se detiene la ejecución del programa en curso, se salva 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 es una dirección reservada de la memoria de código, llamada vector de interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2da Edición.



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



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

Microcontroladores I

Prof. Luis Zurita

DIAGRAMA DE FLUJO DURANTE UNA INTERRUPCIÓN Programa normal Instrucción 1

Rutina de Servicio de Interrupción

Instrucción 2

Instrucción 1

Instrucción 3

Instrucción 2





… … Instrucción 24

… … RETFIE

Instrucción 25 … … Instrucción N Fin de programa Microcontroladores I

Nota: Una Rutina de Servicio de Interrupción puede ser igual de extensa e incluso más que el mismo programa principal. Prof. Luis Zurita

DIAGRAMA DE FLUJO RSI

Microcontroladores I

Prof. Luis Zurita

CAUSAS DE INTERRUPCIÓN 1. 2. 3. 4.

Activación del pin RB0/INT Desbordamiento del TMR0 Cambio de estado de una de los 4 pines de más peso (RB7:RB4) del puerto B Finalización de la escritura en la EEPROM de datos

REGISTRO INTCON • Este registro se encuentra ubicado en la posición 0BH del banco 0 de los registros de funciones especiales (SFR). A continuación se describirán cada uno de sus bits:

Microcontroladores I

Prof. Luis Zurita

INTCON •







GIE: (Global Interrupt Enable), Permiso Global de Interrupciones 1: Habilita todas las interrupciones, cuyos bits de permiso individuales también las permitan 0: Deshabilita todas las interrupciones EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción por fin de escritura en la EEPROM 1: Habilita la interrupción cuando termina la escritura de la EEPROM de datos 0: Deshabilita esta interrupción TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupción por 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 por activación del pin RB0/INT 1: Habilita la interrupción al activarse RB0/INT 0: Deshabilita esta interrupción

Microcontroladores I

Prof. Luis Zurita

INTCON •







RBIE: (RB Port Change Interrupt Enable), Permiso de interrupción por cambio de estado en RB7:RB4 1: Habilita esta interrupción 0: Deshabilita esta interrupción TOIF: (TMR0 Overflow Interrupt Flag), Señalizador de desborde del TMR0 1: Ha ocurrido un desborde del TMR0 0: No se ha desbordado el TMR0 INTF: (RB0/INT Interrupt Flag), Señalizador de activación del pin RB0/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 estado en 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

Microcontroladores I

Prof. Luis Zurita

• Habilite la interrupción por desborde del TMR0= movlw b’10100000’ movwf INTCON • Habilite la interrupción por cambio de nivel en RB0/INT movlw b’10010000’ movwf INTCON • Habilite las interrupciones por desborde del TMR0 y cambio de nivel en RB0/INT movlw b’10110000’ movwf INTCON Microcontroladores I

Prof. Luis Zurita

¿Cómo determinar la causa de una interrupción? • Si se han activado dos o más causas de interrupción, como desborde del TMR0 y cambio de nivel en RB0/INT, cuando alguna de éstas ocurren, ellas van a la misma rutina de interrupción. • Ahora ¿cómo saber cuál es la causa?, mediante el testeo de los señalizadores o flags, recordando que se pondrán a nivel alto (1), cuando se haya activado la correspondiente. • Por lo tanto, con unas simples preguntas dentro de la rutina de servicio de interrupción, se determinará la causante:

Microcontroladores I

Prof. Luis Zurita

Ejemplo. Realicemos un programa completo que contenga varias interrupciones. Si la causa ha sido la activación del pin RB0, se debe mostrar un dos en binario en el puerto A, si ha sido un cambio de nivel en RB4:RB7, se debe mostrar el uno en binario en el puerto A y si se ha desbordado el TMR0, se debe mostrar el cuatro en binario en el puerto A.

¿RB0/INT? ¿INTF=1?

¿RB4:RB7? ¿RBIF=1?

¿TMR0? ¿TOIF=1?

Programa Principal Microcontroladores I

RSI

Prof. Luis Zurita

SALVANDO EL ENTORNO Salvar el entorno, se refiere a mantener el valor exacto que tienen los registros de trabajo STATUS y W, y cualquier otro de importancia, incluyendo los puertos que controlan a los actuadores, que no vaya a ser modificado dentro de la subrutina de servicio de interrupción. Para salvar el entorno cuando ocurre una interrupción se recomienda 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 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 de puertos deben ser declarados al inicio del programa, para no generar errores. Microcontroladores I

Prof. Luis Zurita

SALVANDO EL ENTORNO ; Asuma que desea salvar el PORTB, durante una interrupción= ; **** 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_TEMP movf PORTB,0 movwf CopiaPORTB ; Salvamos a PORTB RUT_INT ;Aquí estará la rutina de servicio de interrupción ; POP movf CopiaPORTB,0 ; Restauramos el PORTB a su valor antes de movwf PORTB ; haber entrado a la rutina de interrupción movf STATUS_TEMP,0 ; Movemos w al registro STATUS, ; retornando el movwf STATUS ; valor original movf 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

¿CUANDO UTILIZAR UNA INTERRUPCIÓN? Una interrupción es muy importante cuando deseamos realizar una tarea que no dependa de una exploración constante del programa sobre la misma. También cuando deseamos que nuestro programa responda de forma inmediata y automática a determinados eventos. Ejemplo del uso de Interrupción: • En los sistemas de control, cuando se necesita un pulsador de parada de emergencia (PARE RB0/INT). • En el manejo de teclados, se recomienda su uso, ya que se puede meter al microcontrolador en un estado de reposo, ahorrando energía y esperando a que se pulse una tecla para iniciar una rutina de servicio (CLAVE). • Cuando deseamos que el programa haga una tarea cada cierto tiempo, independientemente de lo que se encuentre haciendo en el programa principal. (DESBORDE DEL TMR0).

Microcontroladores I

Prof. Luis Zurita