Pana Khasistos, el set porta. debe ser de antemano un error de ellos o lo usaban en su proyecto para otra cosa borralo por favor, el factor fuga mas o menos sabes que es una variable para ajustar de acuerdo a tu reloj el grado de error, acuerdate que cuando escribes en el tmr0 o tmr1 en este caso lo haces se pierden 2 ciclos de reloj antes de que vuelva a operar(ya que cada incremento se lleva 1 ciclo de reloj),
Veo mas detalles en el ejemplo de lester:
segun el programa original el prreescaler esta para 1:1 no puede ser si PSA esta a cero esto nos da un preescaler 1:2 segun el ds, si tu pones a 1 el PSA te va a dar exactamente la mitad de la frecuencia.
Dejame seguirlo revizando,
Pana Nocturno66 Gracias por el apoyo, solo tratamos de recavar informacion util, asi que si hay errores, se iran corrigiendo al avanzar el aprendizaje
analizando el proceso:
inicia el tmr0=7(255-7=248 no cuenta realmente hasta 255)
cuando el tmr0 llega a 255 se interrumpe:
tmr0=TMR0+7 (lo que tenga el tmr0 puedes ser 4, 5,6 ,7 etc nuevamente mas 7)
la variable postcont de tmr0 es decrementada en 1(499)
y reviza si llego a cero, como no llego limpia la bandera de int ,restaura fsry status y vuelve,pero retorna a int por que esta tmr0=255 y asi succesivamente hasta que decremente la variable postcont del tmr0 a 0
interrupcion es a 1:2 y NO como dice Les a 1:1, Que pasa cuando entra a la interrupcion? solo vuelve a cargar la variable de conteo hasta 500 apaga el tmr1 lo guarda en la variable con la que se imprime lo enciende y activa la bandera para impresion.
Aunque el verdadero orden deberia ser este para optimizar tiempo:
T1CON.0 = 0
TMR0_POSTCOUNT1 = 500
CONTEO = TMR1
Clear TMR1
BANDERA = 1
T1CON.0 = 1
No es mucho la diferencia podria ser 1 cuando mucho 2 pulsos que se escapen
2° analisis:
Como pueden ver tiene como que una formula y etc,etc,etc. todo el proceso lo podemos reducir en SETEAR un temporizador omo se debe, ya que las indicaciones del programa original, casi no tienen nada que ver con lo que hace(me refiero alos puntos importantes, todos sabemos para que son los registros y por que se ponen en cero o en 1)
Un ejemplo antes de continuar:
Si queremos que una interrupcion TMR0 de 8 bits(255 max) se ejecute en determinado tiempo, seguimos los pasos clasicos
cada cuanto tiempo? ... digamos por ejemplo 50 ms
con esta info. sabemos que 50 ms son 50000us, y eso pa que?
bueno el micro trabaja en us no en m y algun dia en nsegundos
.
bueno pensemos por ahora(solo por ahora) que queremos usar un pic con reloj externo a 4Mhz(despues de toda la explicacion lo podran hacer a cualquier reloj)
ok!! esto quiere decir que cada instruccion nos tomara 1us (4Mhz/4= ciclo de reloj o instruccion) entendido esto, solo nos queda una cosa por hacer, ya que vamos a usar el TMR0 como TEMPORIZADOR, entonces debemos ajustar los preescalers del TMR0 , que es un preescaler(podriamos decir sencilamente un divisor de frecuencia de cada ciclo de reloj)
ahora si de lleno: Si queremos que nuestro TMR0 pare cada 50 ms(aprox) = 50000Us y ponemos o mejor dicho configuramos el preescaler a 1:256, esto quiere decir que 50000/256 = aprox 195.3125 <---- este es seguible en el TMR0 pero no es el que queremos, nosotros necesitamos el valor contraparte, es decir, como usamos TMR0 entonces solo lee hasta 255, luego entonces la contraparte es:
255-195.3125 =59.6875 <--- un valor tambien seguible via tMr0, lo podemos redondear a 60
Este valor es con el que debe de empezar nuestro TMR0 con prescaler 1:256 para que pare APROX a 50 ms , (espero que hayan entendido ahora el como y por que se configura el preescaler)
Entendido Este ejemplo creo que lo que explicare acontinuacion ya no es necesario, pero lo hare:
Como ven en el programa, el TMR0 empieza en 7 <-- y esto quien les dijo o ke??? ahora ya lo saben.
Si el programa va a parar 4 veces por segundo(cada 250ms osease cada 250000Us) entonces como ajustar el pree y el valor de inicio de mi TMR0???
250000/2=125000 <-------- ta! esto esta muy grande para seguirlo en mi pequeño Tmr0 de solo 8 bits(255) pero si hacemos un pequeño artificio no sera tanto:
lo podemos dividir por un numero que nos de unvalor razonable en el TMR0 no? CLARO!! , en el caso del programa si dividimos 125000/500=250 <----- perfecto es exacto y seguible por el tmr0, ahh deberas que necesito su contra parte: 255-250=5
Ahora sabemos que debe empezar en 5, pero hay un detalle que no habiamos percibido, cada ves que ESCRIBIMOS en el TMR(o cualquier TMR por favor lean el DS) este proceso inhibe dos ciclos de instruccion , excatamente 2 valores que no se contaran(esto puede crearnos un error grande) entonces tenemos que agregarlo de cajon en la escritura del TMR --->Tmr0=5+2=7
Ahora si tenemos el valor justo que arregla(en un 50%) el rror que se vaya generando como el problema de contar , ahora si nuestro TMR0 esperara 250ms e imprimira el valor guardado en conteo.
como ven la interrupcion sucedera 500 veces antes de que imprima un valor
Espero les sirva de algo la info, aunque me siguen viniendo muchas dudas aun.
Salu2 panas!