Hola Eduardo2. Comienzo contestándote para la segunda respuesta
Por otro lado... ¿Para que usás el timer en modo bloqueante?
Para eso hacé un retardo con un bucle for. No es lo mismo que el timer, pero del modo en que lo estás usando da igual. Incluso podés hacer variable el T_off.
El tema es este, el codigo que puse es un breve programa para ver porque el flag no se pone en alto cuando desborda el timer.
Yo en realidad estoy implementando otro programa que genera una secuencia de pulsos bipolares, con ancho de pulso, tiempo muerto, y frecuencia variable. todos los tiempos esos lo genero con el TIMER1, la idea es que un usuario pueda modificar esto a gusto, por lo que debería modificar la carga del registro cada vez que quiera variar uno de estos paramentos.
Por eso que queiro cargar al registro con una variable y no con un valor fijo. La idea que cuando se produzca una interrupción (ejemplo con un pulsador), cambie el valor de esa variable y luego modifique el valor registro TMR1.
Ahora eso es en el programa principal, lo que sucedía era esto: Cuando yo carga de manera fija el registro TMR1 para los diferentes paramentros, o con el primer metodo de inicializar una variable fuera del "void main (Void)" todo andaba bien, el timer desbordaba y el flag se ponia en uno, todo muy lindo, podía ver la secuencia de pulsos bipolares en Proteus. Luego cuando modificaba una variable ya el flag del timer nunca se ponía en uno aunque este desbordara!!!, lo que digo que sucede con el segundo programa cuando digo que no sale del bucle "do while".
Es raro, yo copypego ese código y sale lo mas bien del bucle. Tal vez convendría comprobar que esté en 1 al entrar.
Te muestro imagen 1, sin modificar la variable
imagen 2, modificando la variable
No me doy cuenta que xq pasa esto, yo tengo entendio que ese flag siempre se pone en uno cuando desborda el timer, es como automático, pareciera que algo lo bloquea. Yo vi la simulación haciendo un debugger con el VSM de proteus, es mas lo estoy corriendo en "tiempo real" con proteus mientras voy linea por linea moviendome en MPLABX. Veo como se van modificando los registros tanto en Proteus y Mplab x, y es exactamente lo mismo, no es que en Mplabx si se pone en alto, pero en proteus no. Estoy utilizando la herrmienta Proteus VSM viewer.
A mi tampoco, hacer ese cálculo repetidamente no tiene sentido y te suma 6uS al Toff. Mejor cargá directamente la cuenta de TMR1
Exacto, alguna idea de como hacer lo que quiero sin utilizar una formula asi?. Ejemplo, que venga un flaco, ponga con un teclado, quiero 200us, joya temporiza 200us, pero luego ponga 50us y temporice 50us. Como que me veo obligado a utilizar una variable que modifique el registro según la formula para temporizar el valor adecuado.
No querés usar PWM, OK ¿Pero por qué tampoco interrupciones?
Voy a usar interrupciones, pero no del modulo Timer...No es necesario según la esencialidad del programa. Para lo unico que voy a usar las interrupciones es para modificar el registro TMR1, ejemplo con un pulsador, conectado al puerto B.
Hola KILLERJC, el problema en principio no es de optimizacion, puse esa cuenta como para salir del paso y ver por que carajo no se pone en alto el flag. Obviamente comprobé que el registro luego de esa cuenta tenga e valor que yo pretendo. En principio no importa que tome mas o menos ciclos en hacerla.
En principio no es importante que tome varios ciclos en cargar el registro, quiero que se ponga el Flag en uno para hacer lo que yo quiero.
Luego si, voy a intentar optimizar eso lo mejor posible