Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/04/2014 #1


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??
04/04/2014 #2

Avatar de papirrin

si es correcto 8.448 ms si es de 8 bits el tmr0 y hace un tick cada 128uS


puedes usar el pic timer calculator. o pic calculator
http://www.todopic.com.ar/foros/index.php?topic=19454.0
04/04/2014 #3


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"
04/04/2014 #4

Avatar de papirrin

no entendi

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
04/04/2014 #5

Avatar de ByAxel

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).

marconikov dijo: Ver Mensaje
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.
04/04/2014 #6


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

---------- Actualizado después de 6 minutos ----------

ya entiendo axel, es decir que el caso que estoy presentando seria valido si el prescaler es 1
04/04/2014 #7

Avatar de papirrin

XD creo que no es viable tomar como referencia de tiempo el proteus XD

no lo he intentado pero no me da buena espina.
04/04/2014 #8


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??
04/04/2014 #9

Avatar de papirrin

pues es lo mismo que te digo...

cada 128 instrucciones de 1us cada una son 128uS =1 tick
04/04/2014 #10


si compañero es que no habia entendido anteriormente
tengo es la duda ahora de lo que te dije de la simulacion
04/04/2014 #11

Avatar de ByAxel

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.
04/04/2014 #12

Avatar de luis1234567890

bueno podrías usar el mplab ide para una depuración paso a paso ,hay ya te sales de dudas
04/04/2014 #14

Avatar de luis1234567890

claramente en la simulación el timer esta como temporizador y no como contador el bit 5 TOCS de option_reg esta a 0 deberia ser 1 para que sea contador externo
04/04/2014 #15

Avatar de papirrin

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
04/04/2014 #16


luis1234567890 dijo: Ver Mensaje
claramente en la simulación el timer esta como temporizador y no como contador el bit 5 TOCS de option_reg esta a 0 deberia ser 1 para que sea contador externo
disculpa compañero eso afecta de alguna manera lo del problema del tiempo en que se incrementa el tmr0 ?


pd: haha no compañero no es un dimmer
04/04/2014 #17

Avatar de Daniel Meza

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
05/04/2014 #18


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?
05/04/2014 #19

Avatar de papirrin

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.


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
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (32,5 KB (Kilobytes), 34 visitas)
05/04/2014 #20

Avatar de luis1234567890

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
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.