Página de inicio Mi Correo






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


--- Novedades ---



    
  » Microcontroladores » Interrupciones y Temporizaciones (8 de 15)  

.: Simulando interrupciones y temporizaciones con TMR0 en MPLAB

Antes de simular hay que crear un nuevo proyecto, así que eso es lo que haremos, abres MPLAB y si por las dudas te pregunta que si deseas abrir el proyecto anterior seleccionas No luego te vas a...

Project --> New project...

y creamos tmr.pjt le das a Ok y en la ventana Edit project seleccionas tmr[.hex] y luego a Node Properties allí tildas INHX8M y HEX, confirmamos y nuevamente en Edit project, te vas a Add Node y escribes tmr.asm para ligarlo al proyecto, finalmente le das a aceptar y luego Ok, bien, ya creamos el proyecto, pero nos falta tmr.asm, así que ve a File --> New y ya tienes Untitled1, que mas...???, ah sí... guárdalo como tmr.asm, listo señores, ahora sí...!!!

Vamos al código, lo copias, lo pegas y luego...

Project --> Build All

Perfecto...!!!

Abriremos dos ventanas que son para chequear el funcionamiento de la temporización y la interrupción, para ello ve a ...

Windows --> Special Function Register
Windows --> Stopwatch...


Resetea el micro y dale a los zapatitos hasta quedar en la siguiente imagen, es decir en la etiqueta Nada.

preparando la simulación

A abrir bien los ojitos que haremos un par de observaciones, primero lo primero...

En Special Function Register

Configuración de puertos, el puerto A no me interesa por que no lo utilizo así que ahí queda, con sus 5 Bit's como entrada (TRISA=00011111), El puerto B está todo como salida (TRISB=00000000), y hemos configurado OPTION_REG como estaba planeado para TMR0 incluso puedes ver el prescaler (los 3 primeros Bit's=111), en el registro INTCON está habilitado GIE y T0IE, finalmente hemos cargado TMR0 con 216.

En Stopwatch:

Es la primera vez que abrimos esta ventana, y como verás en Cycles, tenemos 12, es decir que hemos ejecutado 12 ciclos de instrucción y estos han consumido 12 microsegundos lo cual puedes ver en Time, la frecuencia de procesador utilizada es de 4 Mhz. y está tildado Clear On Reset, esto último significa que cuando resetees el micro Stopwatch limpiará todo y lo pondrá a cero, pero como lo que queremos es ver si realmente nuestro programa consume los 10 milisegundos hasta que se desborde TMR0, pues limpiaremos todo a mano, así que dale a Zero, y entonces Cycles=0 y Time=0.

Analicemos un poco lo que tiene que ocurrir a partir de ahora, primero que nada, decirte que aquí comienza la temporización de los 10 milisegundo y terminará cuando se produzca la interrupción y salta a ORG 0x04 y como este último es sólo un vector de interrupción pondremos un Breack Point en la siguiente línea es decir en...

BTFSS   PORTB,0

entonces ve a esa dirección y click con el botón derecho, seleccionas Breack Point(s) y esta línea se pintará de rojo, lo que hicimos recién es poner un punto de ruptura de tal modo que cuando corramos el programa, comenzará la temporización y cuando se produzca la interrupción, habrán transcurrido los 10 milisegundo y el programa quedará enclavado en BTFSS   PORTB,0. Si me seguiste y estás bien hasta aquí, daremos el último paso de la simulación...

Vamos... que esto es mas fácil que cebar mate :o))

Haz click en el semáforo verde de la barra de herramientas o bien, ve a Debug --> Run --> Run, y que sea lo que Dios diga...!!!

Por suerte se clavó donde debía, eso significa que estás así...

La temporización se queda en el BrackPoint

A observar nuevamente para saber si todo está en su lugar...

Lo primero que se me ocurre es ver si realmente pasaron los 10 ms

ufaaaaa...!!! me pasé con 242 microsegundos, supongo que debe ser por los decimales, aquellos que aparecieron en los cálculos, pero bueno estamos ahí no crees...???

Sigamos observando... como es lógico el TMR0 se desbordó y está en puros ceros, el registro OPTION_REG no se altera en absoluto y como todavía no encendí el led, PORTB también está en ceros, un último detalle, en el registro INTCON, GIE=0 (interrupciones deshabilitadas), y T0IF=1 (la bandera esta activa)

Te parece si salteamos el Breack Point para dejar que el programa siga corriendo y ver que pasa luego...???

Bien, entonces coloca el cursor donde pusimos el Breack Point y haz click con el botón derecho y luego selecciona Run To Here eso hará que el programa continúe, y entonces quedarás nuevamente en el punto de ruptura, así...

Como notarás, pasó lo mismo que hace un momento, sólo que esta vez PORTB tiene encendido el LED o lo que es lo mismo RB0=1 y en Stopwatch, Time=20,50, eso significa que llevamos 2 temporizaciones de 10 ms, yo diría que vamos bien, eso me agrada, si haces Run To Here nuevamente, Time se incrementará en 10 ms más y quedará en 30,75 y lo mejor de todo es que el LED se apagará, es decir RB0=0.

Oye...!!!, nos merecemos un aplauso no crees...???, después de tanto despelote con fórmulas, interrupciones y todo eso, estamos listos para temporizar.

En resumidas cuentas... el lío de ecuaciones anterior, si trabajas con un XT de 4 Mhz, se resume en...

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

Esta es la ecuación que utilizaré en todas las temporizaciones ya que siempre trabajo con un cristal de 4 Mhz.

Te imaginas que pasaría si utilizara un registro auxiliar y le cargara el valor 0x64 (100 en decimal) para luego decrementarlo cada vez que se desborda el TMR0...???

Muy sencillo, como el TMR0 se desbordará 100 veces tendrás...

Temporización = 100 * 39 * 256

998400

Siiii...!!!, prácticamente 1000000 de microsegundos, o sea 1 segundo

Teóricamente esto debería cumplirse, pero por una u otra razón, en la realidad no es tan así, y no queda otra que ajustar las cosas a mano.

OK., hasta aquí llegamos...!!!, por cierto y para aquellos que no se convencen con simple teoría, lean...

Les enseñaré un pequeño truco que cierta vez aprendí observando una lámpara de neón, creo que como profesor de ciencias, ser observador, tiene sus ventajas  ;oP

Arma el circuito como siempre lo hacemos, y colócale una resistencia de 220R y un LED en RB0, luego grabas el programa en el PIC, lo montas en el circuito y como dije anteriormente, el LED permanecerá encendido, pero si lo mueves de un lado a otro, verás como parpadea ese LED, debes ser un buen observador, yo lo acabo de hacer, y funciona de diez.

Bueno, que puedo decir, creo que fue suficiente por hoy...



R-Luis...

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


    
--| |--