Autor Tema: elección del preescaler ?  (Leído 3168 veces)

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
elección del preescaler ?
« en: 05 de Enero de 2021, 09:31:49 »
cordial saludo, por alguna razón me siempre me ha sido difícil entender la configuración del TMR0, pues he visto un montón de métodos los cuales me confunden aun mas.
A continuación dejo un ejemplo que busca seleccionar el mejor preescaler que se acerque a la temporizacion requerida.

Puntualmente necesito saber de donde salen los 400 nanosegundos, gracias de antemano. 
Código: C
  1. 5. Ejemplos prácticos
  2. Ejemplo 1: Elegir Vtmr0 para generar un retraso de 1.5 ms usando un cristal del 10 Mhz.
  3. Vtmr0 = 2n
  4.  – ((Retrasotmr0 * Fint) / prescaler)
  5. Vtmr0 = 256((1.5 ms * (10 Mhz / 4)) / prescaler)
  6. Vtmr0 = 256(3750 / prescaler)
  7. Sólo resta dar valores al prescaler hasta obtener un valor adecuado, por ejemplo:
  8. si prescaler = 256, Vtmr0 = 242 (redondeado) Ö Retraso = 400 ns * 256 * (256-242) = 1,4336 ms
  9. si prescaler = 128, Vtmr0 = 227 (redondeado) Ö Retraso = 400 ns * 128 * (256-227) = 1,4848 ms
  10. si prescaler = 64, Vtmr0 = 197 (redondeado) Ö Retraso = 400 ns * 64 * (256-197) = 1,5104 ms
  11. si prescaler = 32, Vtmr0 = 139 (redondeado) Ö Retraso = 400 ns * 32 * (256-139) = 1,4976 ms
  12. etc.
  13. Estos valores deben entenderse como una guía y pueden ser aumentados o disminuidos
  14. sin mas que variar al valor contenido de TMR0, para obtener mayor o menor retraso.
  15. Así podemos escoger prescaler = 64 y Vtmr0 = 197, dándonos un exceso de 0,01 ms.
Si algo parece complicado... es por que esta mal explicado.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:elección del preescaler ?
« Respuesta #1 en: 05 de Enero de 2021, 10:01:51 »
Los 400 ns son la inversa de la frecuencia de entrada al timer0 FOSC/4 que en este caso al ser un cristal de 10 Mhz la entrada al timer seria 2,5 Mhz el cual tiene un periodo de 400 ns.

 Saludos.

 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:elección del preescaler ?
« Respuesta #2 en: 05 de Enero de 2021, 11:02:02 »
Como dijo remi.

El timer es un simple contador de pulsos. Y si lo queremos usar como timer contamos los pulsos de reloj que sabemos exactamente cuanto tiempo tienen.

Los PIC de 8bits dividen la frecuencia de entrada por 4, sino me equivoco los PICs de 16bits lo hacen por 2, y eso es lo que le llega a los modulos (nucleo,timers,etc)

Eso te deja con que puedas calcular el periodo o la frecuencia de la siguiente forma

Fcy = Fosc/4
Tcy = 4*Tosc = 4/Fosc    (Es decir el periodo del oscilador multiplicado por 4)

Para 10Mhz, el periodo seria 100ns, pero eso es del oscilador, multiplicándolo por 4 te quedan 400ns que serian lo que llegan a los modulos.

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

Si usas un preescaler 1:1 entonces el timer va a sumar 1 cada 1 pulso de entrada, es decir cada 400ns
Si usas un preescaler 16:1 entonces el timer va a sumar 1 cada 16 pulsos de entrada, es decir 16*400ns = 6.4us
Asi funciona el Preescaler

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

Ahora la generacion de la interrupcion, el timer es de un contador de 8 bits, por lo tanto el maximo valor a contar es de 255, luego pasa a 0, y es ahi cuando se activa la interrupcion, por eso mismo se usa el 256, como es ascendente, necesitamos saber desde donde debe comenzar, por eso hacemos la resta. Para saber el retardo final..

En fin un ejemplo final

Quiero una demora de 1ms con un cristal de 20Mhz
- Con un cristal de 20Mhz tengo un periodo de 50ns  (1/20Mhz)
- Lo multiplico por 4 - Me deja con 200ns el Tcy
- Uso un preescaler de 64:1 eso me deja con una cuenta cada 64*200ns = 12.8us
- Entonces aumenta 1 cada 12.8us, entonces para 1ms necesito contar 1ms/12.8us = 78.125  redondeado es 78 cuentas
- Calculo el valor a cargar en el timer que es 256-78 = 178

En tu programa luego lo unico a configurar seria el preescaler y cargar esos 178.


Y esos serian los pasos...
Por supuesto, si usas un preescaler mas pequeño a veces los valores que tenes son mas grandes que 255, y esto no significa que NO puedas hacerlo, si se puede, pero con varias cargas del timer, en ves de una sola.
« Última modificación: 05 de Enero de 2021, 13:46:42 por KILLERJC »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:elección del preescaler ?
« Respuesta #3 en: 05 de Enero de 2021, 12:47:23 »
cordial saludo, gracias por las respuestas, por favor podrían darme un ejemplo practico,,
Código: C
  1. Fcy = Fosc/4
  2. Tcy = 4*Tosc = 4/Fosc    (Es decir el periodo del oscilador multiplicado por 4)
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:elección del preescaler ?
« Respuesta #4 en: 05 de Enero de 2021, 13:40:00 »
cordial saludo, gracias por las respuestas, por favor podrían darme un ejemplo practico,,

Te lo di en mi post anterior...

Citar
En fin un ejemplo final

Quiero una demora de 1ms con un cristal de 20Mhz
- Con un cristal de 20Mhz tengo un periodo de 50ns  (1/20Mhz)
- Lo multiplico por 4 - Me deja con 200ns el Tcy
- Uso un preescaler de 64:1 eso me deja con una cuenta cada 64*200ns = 12.8us
- Entonces aumenta 1 cada 12.8us, entonces para 1ms necesito contar 1ms/12.8us = 78.125  redondeado es 78 cuentas
- Calculo el valor a cargar en el timer que es 256-78 = 178



otro mas pasos parecidos

Quiero una demora de 60ms con un cristal de 4Mhz
- Con un cristal de 4Mhz tengo un periodo de 1us  (1/4Mhz)
- Lo multiplico por 4 - Me deja con 4us el Tcy
- Esta vez vamos a tratar de conseguir el menor preescaler posible. lo averiguo de la siguiente forma.
Con 4us necesito (60ms/4us) 15.000 cuentas esto se pasa mucho de los 255 que puedo cargar entonces podemos hacer un simple calculo.
Al dividir 15.000/256 = 58.59375
El valor obtenido es el MINIMO para que no supere los 255, entonces Usamos el preescaler inmmediato superior que es el de 64 , o puedo usar el de 128, y 256.
- Uso un preescaler de 64:1 eso me deja con una cuenta cada 64*4us = 256us
- Entonces aumenta 1 cada 256us, entonces para 60ms necesito contar 60ms/256us = 234.375... Redondeado es 234
- Calculo el valor a cargar en el timer que es 256-234 = 22
« Última modificación: 05 de Enero de 2021, 14:12:49 por KILLERJC »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:elección del preescaler ?
« Respuesta #5 en: 05 de Enero de 2021, 13:57:16 »
haaaa,,, ya perfecto.
Disculpa tenia un error de apreciación y al tratarlo de hacer con otro ejemplo no me daba pero ya,, resuelta la duda.
muy amables, Gracias..
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:elección del preescaler ?
« Respuesta #6 en: 05 de Enero de 2021, 14:07:36 »
Es que me confundi y me olvide multiplicarlo por 4 :P
En el primero
« Última modificación: 05 de Enero de 2021, 14:12:22 por KILLERJC »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:elección del preescaler ?
« Respuesta #7 en: 05 de Enero de 2021, 14:52:31 »
excelente,me han aclarado muchas dudas,,
para terminar solo me queda esta, de donde sale el 64?
Código: C
  1. Supongamos que configuramos el prescaler para una división de 1:32 y una frecuencia de oscilación Fosc = 4 Mhz.
  2. La frecuencia Fpresc que obtenemos será:
  3. Fpresc = Fint / 32 = (Fosc / 4) / 64 = 15625 Hz
  4. Si almacenamos en el TMR0 el valor 131, se alcanzará el cero después de 256- 131=125 incrementos de TMR0, por lo que obtenemos una frecuencia de paso por cero del TMR0 de:
  5. Ftmr0 = Fpresc / Vtmr0 = 15625 Hz / 125 = 125 Hz
  6. Es decir, cada segundo el TMR0 pasa por cero 125 veces generando una interrupción por desbordamiento cada vez. El siguiente paso es almacenar en el registro auxiliar un valor tal que, decrementando este una vez por cada paso por cero del registro TMR0, el registro auxiliar pase por cero cuando ha transcurrido 1 segundo. Ftmr0 / Vaux = 1 seg Ö Vaux = 125 Hz / 1 seg = 125
No se si alguien conozca algún tutorial que explique el tema "como si estuviera en primero" lo digo porque en ecuaciones a veces aparecen los cálculos en, nanos y los mezclan con milisegundos y microsegundos y esto, al menos a mi, me desconcierta y obviamente con un "0" de mas o de menos no dará el calculo.
saludos..
« Última modificación: 05 de Enero de 2021, 14:55:16 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:elección del preescaler ?
« Respuesta #8 en: 05 de Enero de 2021, 17:24:43 »
Eso es un error ahi...

No se que le llamara Fpresc, pero parece que es la frencuencia luego del preescaler, y correctametne es (4Mhz/4)/32

Los demas calculos asumen un preescaler de 64.

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

Tu problema es con las unidades..
Pasa todo a us

Si tenes ms, multiplicalo por 1.000 y tenes us.
Si tenes ns, dividilo por 1.000 y tenes us.
Si tenes segundos, y queres us, multiplicalo por 1.000.000

Ejemplos:

2ms = 2000us
3s = 3.000.000us
400ns = 0.4us

En mi caso uso la notacion cientifica para calcularlos.
En la calculadora cientifica tenes un boton que dice Exp  o x10^x , o directamente E

Entonces ms, es exponente -3,
us, es exponente -6
ns es exponenete -9

Si por ejemplo queres dividir 2ms / 4us

En la calculadora pones
2E-3 / 4E-6

Y obtenes el resultado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:elección del preescaler ?
« Respuesta #9 en: 05 de Enero de 2021, 21:17:22 »
"fantástico", todo se torna mucho mas claro,, gracias a todos por su tiempo y compartir sus conocimientos.

Lo casual de este ultimo ejemplo, uno tratando de aprender y precisamente se encuentra con un error para confundirse mas. :undecided:
saludos.
Si algo parece complicado... es por que esta mal explicado.