Si las interrupciones te cuestan trabajo, la forma mas obvia es hacer tu propia rutina de tiempo.
Para ello tenemos que decir como funcionan las rutinas que Niple llama: Temporizadores, tiempos por ciclos.
Las rutina de espera por ciclos, funcionan haciendo Nop para consumir tiempo del microprocesador, y calculando de esta forma, cuanto tiempo ha pasado, esto se saca a partir de una formula matemática, donde tiene que ver la velocidad del Cristal de Reloj que estas usando.
Ahora imagina que en lugar de Nop, tienes un pequeño código para ver si la señal ha cambiado o no. De esta forma podrías esperar hasta que la señal cambie y calcular el tiempo esperado al mismo tiempo. Para esto tienes que usar un poco de matemáticas, pero es muy factible hacerlo.
Por otro lado, los tiempos por interrupciones por Timers son más fáciles de hacer. La interrupción se ejecuta cada vez que pasa X cantidad de tiempo, desafortunadamente no se puede poner un segundo de tiempo en un Timer (por lo menos no en la serie 16F8XX), así que lo que tendremos que hacer es contar cuantas veces se ejecuta la interrupción hasta que lleguemos a un segundo.
Para calcular el tiempo, puedes usar una herramienta que viene con Niple que se llama Calculo del tiempo por TMR0. Esta herramienta la encuentras en el menú Herramientas. Ahi pones 1 Segundos y veras que arroja el siguiente dato (Para cristal de 4Mhz), Preescalado 64, Incremento de TMR0 125, Bucle1 de 125.
Ahora para codificar esto, serán los siguientes pasos:
1.- Selecciona Temporizadores, TMR's Internos y luego TMR0, Config. TMR0
En el cuadro de configuración pondremos, Predivisor 64, Origen de la señal de Reloj: Señal de Reloj Interna
2.- Luego usamos Interrupciones, Activar/Desactivar y en el cuadro de opciones escojemos:
Habilitador general d Interrupciones: Activado
Interrupción por temporizador TMR0: Activado
3.- Luego usamos: Interrupciones, Insertar Interrupción, por TMR0
4.- Ahora cambiemos a Modo experto, como la herramienta nos dijo que era 125 y la interrupción se activa cuando llega a 255, lo que haremos sera a 255 restarle 125 y esto nos da 130, así que asigneremos el valor 130 a la variable TMR0 dentro de nuestra interrupcion.
5.- Cambiemos a Modo normal, e Incrementos una variable (por ejemplo ciclo1) + 1
6.- Si esta variable llego a 125 entonces que active un Bit, o otra variable (por ejemplo el bit PasoSegundo) y termine la interrupción, si la respuesta es NO, que también termine.
7.- En nuestro programa principal, para activar el conteo de nuestra Interrupcion pondremos los siguientes valores: ciclo1=0, PasoSegundo=0 y usando el modo experto, TMR0 = 130
8.- Cuando queramos saber si ya paso un segundo, preguntamos PasoSegundo vale 1 ? entonces si es verdadero, habra pasado un segundo.
Como Nota, en esta explicación existe un pequeño error, por que cuando se entra a la interrupción se paran las interrupciones, entonces el tiempo en que haces el calculo del paso de segundo, tiene que ser descontado a la formula original, pero es tan pequeño que es prácticamente despreciable. Si necesitas mucha precisión en la cuenta del segundo, debes calcular el tiempo del código dentro del TMR0 para des contarlo de la espera.
Intentalo es fácil y si te atora pregunta de nuevo.
Espero haberte ayudado. Saludos!
-
Mike79