Autor Tema: Necesito ayuda con los tiempos del timer o counter  (Leído 3101 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Gonzalo_Uru

  • PIC10
  • *
  • Mensajes: 9
Necesito ayuda con los tiempos del timer o counter
« en: 21 de Enero de 2006, 17:54:00 »
Necesito que alguien me explique como funciona el timer o el counter

yo por ej. tengo un oscilador de 8 Mhz. yo se que la Frecuencia de Oscilacion es 8Mhz. y la frecuencia Interna es de 1/4 o sea 2Mhz. bien yo utilizo
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);

eso me da que un ciclo del timer demora 16384 micro-segundos, hasta aqui creo que bien, si yo tengo una frecuencia en un pin de 1 segundo entonces el get_rtcc() me tiene que dar 1.000.000 / 16.384 = 61 o sea que se cumplieron 61 ciclos del timer en 1 segundo, para sacar conclusiones esto esta bien o estoy equivocado.

Ahora yo se que un ciclo timer es el pasaje de 0 a 255 y si eso demora 16.384, entonces si yo divido 16.384 / 255 y esto lo multiplico por 1000 me da el valor 16 cuyo valor restado de los 255 me da donde empieza el set_rtcc(239) para que cada ciclo sea 1 mili-segundo, esto es cierto o falso.

Desde ya estoy muy agradecido de que me ensenen esto.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #1 en: 21 de Enero de 2006, 19:48:00 »
Hola Gonzalo_Uru, empecemos por lo siguiente, si seteamos el prescaler en 256, y la interrupción del TMR se genera con el paso de 255-0 de este, y teniendo un cuarzo de 8 MHz nos quedaría lo siguiente:

(Prescaler) x (TMR0) = (Ciclos para la interrupción)
256 x 256 = 65536

(Cuarzo) / 4 = (Frecuencia interna del PIC)
8000000 / 4 = 2000000

1 / (Frec. intrerna) = (Periodo de cada ciclo interno)
1 / 2000000 = 0.5 useg

(Ciclos C/Interupcion) * (Periodo C/Ciclo) = (micro-segundos por cada interrupción)
65536 * 0.5 = 32768 useg


Bueno asta aquí tenias ese error, la cuanta a ti te daba 16384 cuando en realidad seria 32768.
----------------------------------------------------------------------------------------------------------------------------------------------------
Si quieres que cada ciclo dure 1 mseg nos queda lo siguiente:

(Frec. Interna) / (Cantidad mseg en 1 seg) = (Ciclos del clock interno para 1 mseg)
2000000 / 1000 = 2000

(Ciclo del C/Interno en 1 mseg) / (Prescaler) = (Cuanta del TMR)
2000 / 256 = 7.8125


Como vemos el numero no té queda entero, por lo tanto si lo redondeamos seria:

  = (Prescaler) * (Valor en TMT0) = (Cicos C/Interrupcion) / (Frec. Interna) = (Periodo C/Interrupcion)
7 = 256 * 7 = 1792 / 2000000 = 0.896 mseg

   = (Prescaler) * (Valor en TMT0) = (Cicos C/Interrupcion) / (Frec. Interna) = (Periodo C/Interrupcion)
8 = 256 * 8 = 2048 / 2000000 = 1.024 mseg


De lo anterior vemos que en TMR0 con el prescaler en 256 conseguimos los valores de 7 y 8  sin la precisión deseada.
Ahora si hacemos lo siguiente:

(Frec. Interna) / (mseg en 1 seg) = (Ciclos del clock interno para 1 mseg)
2000000 / 1000 = 2000

(Ciclo del C/Interno en 1 mseg) / (Valor Max. en TMR0) = (Cuentas totales del TMR0 en 1 mseg)
2000 / 256 = 7.8125


Si seleccionamos el prescaler en 8 que es el valor más próximo superior a 7.8125 nos queda lo siguiente:

(Frec. Interna) / (mseg en 1 seg) = (Ciclos del clock interno para 1 mseg)
2000000 / 1000 = 2000

(mseg en 1 seg) / (Prescaler) = (Cuanta del TMR)
2000 / 8 = 250


Vemos de esta forma que él numero que debería contar el TMR0 seria 250 que es un numero entero, si hacemos el calculo del periodo entre cada interrupción seria

      = (Prescaler) * (Valor en TMT0) = (Ciclos C/Interno en 1 mseg) / (Frec. Interna) = (Periodo C/Interrupcion)
250 = 8 * 250 = 2000 / 2000000 = 1 mseg


Entonces seteando en prescaler del TMR0 en 8 y haciendo que este cuente 250 pulsos entre cada reseteo conseguiremos 1 mseg exactos con un cuarzo de 8 MHz y una frecuencia interna de 2 MHZ.

Espero haberte aclarado el tema de los cálculos de los tiempos con el TMR0, si no llegas a entender algo dímelo que lo vuelvo a explicar.

Suerte.

Atte. CARLOS


La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Gonzalo_Uru

  • PIC10
  • *
  • Mensajes: 9
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #2 en: 22 de Enero de 2006, 20:03:00 »
Gracias Carlos por contestarme, bueno tenes razon en la primera parte ya que yo puse mal la cifra y los 16384 que puse corresponden a un prescaler de 128 asi, que a mi me da igual los 32768, tengo una planilla en excel la cual me lo calcula y la formula que utilizo la saque de algun comentario de este foro,


Time = (256 * 4) / 8.000.000 = 1.024 / 8.000.000 = 0.000128 s =
128 (microsegundos) a una prescala de 1, a 256 = 32768 us

Lamento mi error, ahora mi duda es si para el tmr0 el pic utiliza la frecuencia interna, o la frecuencia del oscilador, porque si fuera los 8.000.000 entonces seria

8.000.000 Mhz. = 32768 us por ciclo
2.000.000 Mhz. = 32768 /4 = 8192 us por ciclo

ahora para saber donde comenzar yo hago esta cuenta.

32768 - 256
1000   -  x = 8
o sea que si a los 256 le resto los 8 me queda 248 y es donde debe de empezar el set_rtcc(248) para que cada ciclo sea de 1000 ms.

Esto esta bien o mal, siempre y cuando el tmr0 use el Fosc (Frecuencia Oscilador) pero si usa el Fint (Frecuencia Interna) seria:

8192 - 256
1000 - x= 31
256-31=225 donde debe de empezar el set_rtcc(225)

Carlos mi pregunta es, si esto es verdadero o falso.

y desde ya muchisimas gracias por la explicacion.              // Arreglado //

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #3 en: 22 de Enero de 2006, 20:55:00 »
Hola Gonzalo_Uru, no hay nada que perdonar, todos estamos para aprender y tratar de enseñar.

El TMR0 en el caso de usar el oscilador interno no usa la frecuencia del cuarzo, usa la frecuencia del CLK interno que es (para tu caso) 2 MHz ya que tu cuarzo es de 8 MHz.

Por otro lado te comento que yo personalmente no conozco de la programación en C.

Por lo que veo tienes una gran confusión en el tema de TMR0.

Como ya te explique en el post anterior nunca tendrás un periodo entre interrupciones de exactamente 1 mseg con un prescaler de 256

-----------------------------------------------------------------------------------------------------------------------------------------

En esta cuenta que realizas realmente no sé de donde sacas los datos:

Time = (256 * 4) / 8.000.000 = 1.024 / 6.000.000 = 0.000128 s =
128 (microsegundos) a una prescala de 1, a 256 = 32768 us

(256 * 4) / 8.000.000 no es igual que 1.024 / 6.000.000 para empezar.

Los pasos correctos para sacar ese periodo están en el post anterior.

-----------------------------------------------------------------------------------------------------------------------------------------

Con respecto a esta cuenta:

32768 - 256
1000 - x = 8 (esto no es un numero entero es 7.8125)
o sea que si a los 256 le resto los 8 me queda 248 y es donde debe de empezar el set_rtcc(248) para que cada ciclo sea de 1000 ms.

El calculo esta bien pero te vuelvo a repetir (al no tener un 8 exacto si no 7.8125) que con el prescaler en 256 nunca tendrás un periodo de 1 mseg ya que con set_rtcc(248) y el prescaler en 256 tendrás un periodo de 1.024 mseg

Por que en ves de usar el prescaler en 256 no lo usas en 8 y seteas set_rtcc(6) de esta forma si tendrás 1 mseg.

Suerte, te recomiendo que estudies los pasos que seguí en el post anterior, si no comprendes algo házmelo saber.

Atte. CARLOS





La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Gonzalo_Uru

  • PIC10
  • *
  • Mensajes: 9
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #4 en: 22 de Enero de 2006, 22:12:00 »
Gracias Carlos, si lo mejor es ponerlo a un prescaler que de exacto para que no haya errores, y muchas gracias por la explicacion del tmr que lo tenia algo confundido, bueno hasta la proxima.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #5 en: 22 de Enero de 2006, 22:22:00 »
Hola Gonzalo_Uru, bueno espero te haya sido de ayuda, ya sabes que si tienes dudas no tienes mas que postear tús preguntas.

Suerte y asta la proxima

Atte. CARLOS
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Gonzalo_Uru

  • PIC10
  • *
  • Mensajes: 9
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #6 en: 23 de Enero de 2006, 09:39:00 »
Hola, se que estoy rompiendo mucho con esto, pero sacame de una duda, el calculo que hiciste fue para la Frecuencia Interna, ahora si fuera para la Frecuencia del Oscilador cambio los 2.000.000 por los 8.000.000

Gracias.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #7 en: 23 de Enero de 2006, 14:57:00 »
Hola Gonzalo_Uru, las preguntas si son por un buen motivo no molestan, puedes preguntar las veces que quieras o las que sean necesarias, OK. Mientras estén a mi alcance te las responderé, si no lo están seguro habrá alguien que lo haga.

Yo use la frecuencia interna de 2 MHz ya que tu tienes un cristal de 8 MHz, pero en el lugar de los 2000000 Hz puedes colocar el dato que quieras, siempre y cuando tenga sentido.

Yo personalmente no conozco que internamente un PIC tenga acceso directo a la frecuencia del cristal, por lo que se solo se tiene acceso a la frecuencia de este dividido 4, ahora si tú quieres reemplazar 2000000 Hz por 8000000 Hz no hay problema, pero los cálculos que te e dado son para la frecuencia interna y no la del cristal.

Suerte.

Atte. CARLOS
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Gonzalo_Uru

  • PIC10
  • *
  • Mensajes: 9
RE: Necesito ayuda con los tiempos del timer o counter
« Respuesta #8 en: 24 de Enero de 2006, 08:50:00 »
Ok, muchas gracias, solo era para saber.


 

anything