Esto es lo que escribí hace tiempo sobre este tema, es lo mismo que nos cuenta el amigo Cryn pero de otra forma:
Los Cristales y El Tiempo. Cálculo de tiempos según el Cristal oscilador que usamos
En la sección El Rincón del C dedicábamos un artículo al uso de la Interrupción RTCC, en el que mostrábamos una tabla de tiempos que tardaba el TIMER0 en dar una vuelta de manivela completa, que dependía del Preescaler seleccionado. Está tabla de tiempos adjuntaba como nota que el Cristal oscilador utilizado era de 4 Mhz.
Sin embargo soy capaz de imaginar a cualquiera de vosotros, amables Picmaníacos, con los ojos cerrados metiendo la mano en vuestro saco de cristales. Sacando uno al azar. La probabilidad de que dicho cristal sea de 4 Mhz es calculable. Es directamente proporcional al numero de cristales de 4 Mhz que haya en vuestro saco e inversamente proporcional al número de otros tipos de cristales que tengáis en tan heterogénea mezcla. Una pequeña locura.
¿Que hacemos, entonces, si vais a utilizar un cristal cuyo valor este alejado, o muy alejado, de nuestros 4 Mhz de referencia? Pues fácil y sencillo como juego de chiquillo: Calculamos el Tiempo de RTCC en función del Cristal que vamos a usar, o sea el tema de este artículo.
La primera fórmula que vamos a ver nos da el Tiempo que tarda RTCC en dispararse, sin Preescaler, comenzando TIMER0 en 00h y terminando en FFh, o sea desbordamiento completo:
Time = (256 * 4) / FOSC (1)
donde Time es el tiempo en segundos (S) que tarda RTCC en saltar y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)
Ejemplo:
Si uso un cristal de 6 Mhz nuestra fórmula la escribiríamos:
Time = (256 * 4) / 6.000.000 = 1.024 / 6.000.000 = 1.706666e-4 = 0.000171 s = 171 μS (microsegundos)
Si a este tiempo le aplicamos el máximo Preescaler posible que es el 1:256, nuestra interrupción saltaría cada:
Time = 0.000171 * 256 = 0,043776 S = 43,776 mS (milisegundos)
Sin embargo es posible, yo diría mas que posible es muy probable, que no os sea útil tener que esperar a toda una interrupción RTCC, de 00h a FFh, sino que necesitéis periodos de tiempo mucho mas concretos. Veamos entonces qué se puede hacer para obtener sucesivas RTCC's cada periodos definidos de tiempo fijado por nosotros.
Decíamos que RTCC salta cada vez que TIMER0 pasa de FFh a 00h, a esto le llamamos desbordamiento de TIMER0. Con la intención de calcular tiempos concretos para este desbordamiento de TIMER0 la técnica que vamos a utilizar es escribir en el contador TIMER0 el valor a partir del cuál queremos que empiece a contar antes de llegar a FFh y pase de nuevo a 00h, que es quien produce el desbordamiento. Cada vez que salte RTCC y dentro de la rutina de tratamiento de esta interrupción volvemos a escribir el valor inicial del contador para iniciar siempre la cuenta de TIMER0 con nuestro valor deseado.
Si en lugar de empezar a contar desde 00h empezamos a contar siempre desde 80h (128 en decimal), exactamente a la mitad del recorrido de TIMER0, entonces nuestra RTCC saltará el doble de veces o lo que es lo mismo habremos dividido su tiempo de desbordamiento por 2, o análogamente habremos multiplicado por 2 su frecuencia, o ... ¡Yá cállate!.
Haciéndole una pequeña transformación a nuestra primera fórmula (1) podemos calcular qué valor hay que escribir en TIMER0 para obtener un tiempo deseado de desbordamiento de RTCC:
MiTIMER0 = 256 - (Time / (4/FOSC) ) (2)
donde MiTIMER0 es el valor a escribir en el Contador TIMER0, Time es el tiempo en segundos (S) que deseamos conseguir para RTCC y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)
Ejemplo:
Si deseo un desbordamiento de TIMER0, una RTCC, cada 100 microsegundos, con un cristal de 6 Mhz calcularíamos:
MiTIMER0 = 256 - (0.000100 / (4/6.000.000)) = 106
Luego cargando TIMER0 con 106 (6Ah ) obtendríamos una RTCC cada 100 microsegundos o 0.1 milisegundos o ...
Y con esto casi hemos acabado con el tema de los tiempos y los cristales. Solo que hay una pregunta que yo mismo me he hecho y que tras profundas deliberaciones, estudios, búsquedas y tostado de pestañas yo mi me conmigo me he respondido. Deseo compartir dicha respuesta con ustedes, amables Picmaníacos:
Pregunta: ¿Por qué 256? ¿Por que 4? ¿Qué relación tienen con FOSC?
Respuesta: La respuesta no está en el viento, sino en el interior de nuestro PIC, de cómo funciona.
Me explico: Nuestro PIC, como Jesucristo, no es de este mundo. No participa de nuestro continuo espacio-tiempo, sino que vive cuánticamente dando saltitos, pasando de un estado a otro bajo la estricta batuta del Dios Cristal que es quien le interpreta el son al que debe bailar.
FOSC es la velocidad de la batuta. Salta ... salta ... salta .... le dice al PIC, una vez cada 0,00000025 segundos (0.25μs) con un cristal de 4 Mhz, una vez cada 0,00000005 segundos (0.05μs) con un cristal de 20 Mhz. Es lo que se conoce como el Ciclo de Reloj.
Pero nuestro PIC necesita 4 de estos ciclos para ejecutar un sola instrucción, como por ejemplo incrementar en 1 el valor del contador de TIMER0. Es lo que se conoce como Ciclo de Instrucción.
Como nuestro TIMER0 corre raudo y veloz desde 00h hasta FFh, o sea desde 0 hasta 255, o sea que cuenta 256 veces, necesita por lo tanto 256 ciclos de instrucción para dar una vuelta completa o lo que es lo mismo 256 * 4 ciclos de reloj FOSC.
Con un cristal de 4 Mhz, que da un pulso cada 25μs, TIMER0 necesita 256 * 4 * 0.25 μs para dar su vuelta lo que significan 256 μs por vuelta y como el mínimo Preescaler que podemos usar es 1:2 entonces tenemos que la máxima velocidad que puede alcanzar RTCC con un Cristal de 4 Mhz es de 1 vuelta completa cada 512 μs. (Lo que es absolutamente compatible con la tabla de tiempos del artículo dedicado al uso de la Interrupción RTCC y que dio pie al presente artículo)
Bello. Sencillo a la par que elegante. Me gusta.