Duda sobre tiempo del TMR0

Como lo dice el título es una duda que me surgio y me gustaria aclararla, como todos saben el tiempo del tmr0 depende de la siguiente ecuación:

Int = 4 * (1/Fosc)*(256 - Valor TMR0)*Preescaler

donde el Fosc es la frecuencia del cristal y el preescaler depende de la configuración
ahora si por ejemplo cargo mi tmr0 con 190 el preescaler es el del WDT (128) y cristal es de 4Mhz entonces eso quiere decir que en 8,5 ms va ocurrir una interrupcion ajustando el TOCS = 0??
 
debe ser que no estoy viendo algo bien entonces.. te cuento que estoy analizando una simulacion en la que una vez que configuro el TOCS = 0 el timer0 empieza a contar segun pasan las instrucciones, me explico

tmr0 = 190
.
.
12 TOCS = 0, tmr0=190
13 instruccion tmr0=191
14 instruccion tmr0=192
15
.
.
y como cada ciclo de instrucción dura creo que 0,4us si mal no recuerdo entonces la interrupcion no seria dentro de 255 - 190 = 65 ---> 65*4us = "260 us"
 
no entendi :oops:

pero no, con esos datos desbordaria la interrupcion cada 8.5ms y cada tick o pulso es cada 128uS

es la misma formula pero sin tomar la precarga. segun creo recordar.

tick = 4 * (1/Fosc)*Preescaler
 
Hola.
A 4Mhz un ciclo de instrucción es de 1us.
El T0CS... me parece pero que lo usas como interruptor?... no, solo sirve para seleccionar la fuente de señal que por defecto tambien es (0).

tmr0 = 190
.
.
12 TOCS = 0, tmr0=190
13 instruccion tmr0=191
14 instruccion tmr0=192
15
.
.
y como cada ciclo de instrucción dura creo que 0,4us si mal no recuerdo entonces la interrupcion no seria dentro de 255 - 190 = 65 ---> 65*4us = "260 us"

Si pero te falta incluir el prescaler... que hace? si el prescaler es 4, entonces espera 4 ciclos de instrucción para recien incrementar el TMR0.
 
haha ahora soy yo el que no entendi..
esto es lo que esta pasando hago correr la simulacion en proteus en el modo debugger paso a paso, cuando cargo el tmr0 con el valor 190, y el TOCS = 0 puedo ver abajo de la simulacion el tiempo transcurrido en "ms", mi duda surge porque estoy contando el tiempo desde el momento en que empieza aumentar el tmr0 (desde que tocs=0) y el intervalor de tiempo es el siguiente:

inicio desde que empieza incrementarse tmr0 (TOCS=0): 20,023 ms
desborde de tmr0 es decir se interrumpe: 20,088 ms

el tiempo que transcurrio fueron.. 0,065 ms



ya entiendo axel, es decir que el caso que estoy presentando seria valido si el prescaler es 1
 
Última edición:
en serio ? es la unica referencia de tiempo que veo,
por cierto revise el OPTION_REG y esta configurado asi 1111111 es decir que el preescaler es el del WDT a 128, que según axel deberia esperar 128 instrucciones para incrementarse en 1 el tmr0, entonces no se porque la simulacion del proteus lo incrementa en 1 por cada instruccion, es posible que este pasando algo por alto??
 
El mínimo prescaler para el TMR0 es 2... para que el conteo sea por cada ciclo de instrucción es necesario desactivar el prescaler... ver flag PSA en OPTION_REG.
Al menos para los PICs 16F que conozco, de todas formas revisa la hoja de datos...

Para revisar aprox. el tiempo de desborde puedes poner un toggle (pin a 0, luego pin a 1) en un pin del PIC y capturar los pulsos ya sea con el osciloscópio o la herramienta gráfica digital.
 
Última edición:
:unsure: estas haciendo un dimmer, con potenciometro? para que quieres un pic? o para que quieres saber lo estas preguntando?

si no es un dimmer hacer caso omiso de mis preguntas...XD XD
 
Como ya te mencionó el amigo ByAxel hay un error en la asignación del preescaler, lo tienes para el WDT y no para el TMR0 (revisa bit PSA del OPTION_REG) es por eso que el divisor no actúa y te da un tiempo menor al esperado. Saludos
 
Bit TMR0 WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128
estoy un poco confundido.. segun lei el PSA indica que tipo de preescaler voy a usar, si estoy usando el el del WDT el valor del preescaler no seria segun los de la tabla? habiendo configurado previamente los otros bits?
 
si estoy usando el el del WDT el valor del preescaler no seria segun los de la tabla?
no, si se lo asignas al wdt el timer0 se queda sin preecaler, por decirlo asi, si pones 1 en el bit PSA el preecaler es usado por el WDT, y si es 0 es usado por el timer0. tienes que ponerlo en 0.
Dibujo.JPG

si es usado por el timer 0 la tabla del preescaler es:
000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256
 
Última edición:
deberías ver bien el registro option_reg ,debes configurarlo con este valor si quieres que cuenta cada 1us

option_reg=0b00001000 //asignado al watchog timer prescaler :1

Te dejo una imagen para que veas que hace cada bit del registro option_reg
 

Adjuntos

  • reg_option.jpg
    reg_option.jpg
    47 KB · Visitas: 9
  • 2.jpg
    2.jpg
    32.2 KB · Visitas: 9
  • 3.jpg
    3.jpg
    44 KB · Visitas: 8
Atrás
Arriba