Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Interrupciones y Temporizaciones (12 de 15)  

.: Diagrama de flujo para el Control de Interrupciones

Como verás la ISR o rutina de servicio de interrupciones es muy pero muy corta, ya que sólo se limita a limpiar las banderas de interrupción y regresar el control al flujo del programa, pero veamos... son dos las fuentes de interrupción, una externa debido a una señal enviada por RB0 que activa la bandera INTF para sacar al micro del modo SLEEP y así iniciar con el flujo del programa, la otra es interna y debido al desbordamiento del registro TMR0 que activa la bandera T0IF, la cual se limpia y luego regresa a la temporización de los 50 segundos (ya que de allí es que vino) para cargar TMR0 nuevamente, siempre que el registro Reg1 no haya llegado a cero.

Diagrama de Interrupciones

Te preguntarás ahora... con que finalidad utilicé interrupciones?, si lo único que hago es limpiar las banderas cuando estas se producen?.

Bueno, no me cuestiones todavía, como dije antes... la mayor parte del tiempo el portón permanecerá cerrado, por lo cual se lo pone en modo de bajo consumo (con la instrucción SLEEP), y se lo saca de ese estado con una interrupción por RB0.

La interrupción por TMR0 es por darle la mayor exactitud posible a los 50 segundos, y a demás por aplicar algo de lo que vimos en este tutorial.

De todos modos lo hice YO...!!!, que tanto...!!!

.: Diagrama de flujo - Temporización de 50 segundos

Antes que nada voy a aclarar una cosa... En esta rutina voy a pasar un nuevo valor para el registro INTCON habilitando GIE y T0IE y a la vez deshabilitando la interrupción por RB0, ya que lo único que haré ahora será esperar a que se cumplan los 50 segundos...

Diagrama de flujo de la temporización de los 50 segundos

Sencillo no...??? bueno, si tuviéramos que hacer los cálculos para obtener los 50... lo haríamos aplicando la ecuación que vimos anteriormente, o sea...

Temporización = (255-TMR0) * Divisor de Frecuencia

Aquí... el divisor de frecuencia es 256 ya que hemos configurado en el registro OPTION los valores 111 para PS2, PS1 y PS0 (el prescaler), por otro lado, la diferencia 255-TMR0 es 39, ya que TMR0 = 216, Teniendo todos estos datos, ya podemos obtener la temporización, la cual vale...

9984 us = 39 * 256

Aproximadamente un milisegundo, pero este se repite 100 veces debido a Reg2, razón por la cual obtenemos prácticamente un segundo, y como lo que buscamos es obtener un retardo de 50 segundos pues simplemente usamos un registro más (ya que el anterior no nos alcanza) y repetimos toda esa rutina 50 veces (y es lo que se debería cargar en Reg1), te preguntarás porque entonces cargué 45...???, la respuesta es muy simple, la cantidad de saltos en toda esta rutina consumen demasiados ciclos de instrucción y al probar este retardo se me atrasaba casi 7 segundos, pues es eso justamente sólo hice un pequeño ajuste.

Bien, veamos como sería el cálculo si cargaría Reg1 con 50...

Temporización = Reg1 * Reg2 * 39 * 256
49.920.000 useg. =   50   *  100  * 39 * 256     

Que bueno no...!!!

La otra rutina de retardo es prácticamente lo mismo sólo que el tiempo que consume es de aproximadamente 189.000 useg. es decir casi la quinta parte de un segundo, y como ya lo analizamos anteriormente pues... no la incluiré...

Se viene lo mejor... el código en vivo...!!!



R-Luis...



<-- Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
Tabla de Referencias


    
--| |--