# Duda con prescaler



## shakaran (Abr 13, 2006)

Tengo la siguiente duda sobre el prescaler:

¿Cuál es el valor que tendria que poner en el prescaler si quiero obtener una interrupcion del 

TMR0 cada XX segundos?

En mi caso la frecuencia de oscilacion es de 4Mhz y uso un PIC16F84. Y lo que he intentado es 

con el prescaler a 32 (100 en binario) y configurando el TMRO con 6 (256-6), para que me de una 

frecuencia en el TMRO de 125 Hz, y memorizando en un registro de 8 bits el valor 125 de tal 

modo que, decrementando este registro en 1 por cada paso por cero de TMR0, se obtenga una 

frecuencia de pasos por cero del registro igual a:
125/125 = 1Hz (1 segundo).

Luego para xx segundos hacer un bucle, y teniendo en cuenta que hay que bajar el TOIF por cada 

paso.

Alguna otra idea, o otro valor de prescaler? Gracias


----------



## Ferny (Abr 15, 2006)

Hay una forma que creo que es algo más simple y es reescribiendo el valor del contador del timer0. Te voy a hablar de memoria ya que ahora mismo no recuerdo muy bien cómo funcionaba exactamente...

Lo primero, si la frecuencia del cristal es de 4 MHz, tengo entendido que la frecuencia de instrucción del micro es de 1 MHz, asi que parto de esta base.

Después, suponiendo que haces un prescaler a 32, creo que eso significaba que el contador del timer cuenta 1 cada 32 ciclos de instrucción, es decir para contar 65536 veces para las que tiene capacidad (son 2 bytes) se tiraría 65536 * 32 = 2097152 ciclos de instrucción. Como tú sólo quieres contar 1000000 ciclos de instrucción, entonces: 1000000 / 32 = 31250

Por tanto tienes que contar 31250 veces con el Timer0. ¿Cómo hacerlo? Fácil: al meterte en la interrupción del Timer0 (supongo que lo haces mediante interrupción), reescribes el valor del contador del Timer0. ¿Y qué valor poner? Pues como tienes que contar 31250 veces, haces 65536 - 31250 = 34286 = 0x85EE. Ese es el valor que deberías escribir en el Timer0.

Así el Timer0 se inicializa a 34286 y empieza a contar a partir de ahí cada 16 ciclos de instrucción, cuando llega a 0xFFFF y después a 0x0000 te genera la interrupción, haces lo que quieras en ella y reinicias el valor para que vuelva a empezar a contar.

Un saludo

PD: también podrías hacerlo con el prescaler a 16 (cuenta cada 1048576) ciclos, entonces el valor del Timer0 debes inicializarlo con: 65536 - (1000000 / 16) = 3036 = 0x0BDC


----------



## shakaran (Abr 15, 2006)

El problema es que creo que en el PIC16F84, en TMR0, no podria introducir mas de 255 (por que desborda por arriba), en tal caso meter 34286 = 0x85EE, no podria porque solo podria llegar a 0xFF.


----------



## Ferny (Abr 16, 2006)

Cierto, tienes razón en que el timer0 de ese micro es de sólo 1 byte... Mira a ver si tiene algún registro de 2 byte, entonces podrías hacerlo como te dije, si no pues tendrás que hacerlo con un contador que se incremente en cada interrupción...


----------



## shakaran (Abr 16, 2006)

Es que creo que no es necesario buscar uno de 2 bytes, porque se podria hacer con ese mismo registro. Te pongo la formula, para que veas que se pueden llegar a los 125 Hz.

FTMR0= (Fosc/4)/( (256-Valor)*prescaler))=(4•106/4)/( (256-6)*32))=125 Hz

Saludos


----------



## Ehecatl (Abr 25, 2006)

Hola, viendo la problemática que enfrentan para la programación del micro y la obtención de tiempos exactos en segundos, me voy a permitir relatarles mi experiencia y como he resuelto dicha problemática.
Dado que tanto el TMR0 como el prescaler finalmente son divisores binarios, ¿por qué no aprovechar esa situación y ocupar mejor un cristal cuya frecuencia sea igual a una potencia de 2?
Dos frecuencias que son muy comerciales para ello son 32.768 kHz y 4.194304MHz. La primera es igual a 2^15 y la segunda 2^22.
La mas cercana a los 4 MHz que están usando actualmente es la segunda.
El PIC hace de por si una división por 4 (2^2), el TMR0, la hace en 2^8, nos quedarían sólo 2^12 pulsos de reloj para completar un segundo, de modo que si el prescaler lo programamos al máximo 2^8, sólo habría que poner un contador que en cada interrupción del desbordamiento del TMR0 se decremente desde 16 (decimal). Al llegar a cero significará que ha transcurrido un segundo.
De este modo no hay necesidad de manipular datos del TMR0.


----------



## nerea185 (May 20, 2008)

Hola, soy nueva en esto de los Pic y era pa ver si me podriais ayudar un poco. estoy haciendo un organo musical y tengo q meter los tonos de las notas en el pic16f874. las frecuencias ya las tengo. como seria la instruccion que mete la fecuencia de la nota LA (440hz) al pic?os agradeceria mucho que me ayudaseis graciasss.

saludos


----------



## lolo2n3055 (May 10, 2013)

Segun la hoja de caracteristicas la entrada del prescaler U664B solo aguanta hasta 10mV.
1º ¿Es cierto eso?
2º Si es cierto. aguantara este circuito:

el voltaje pico del oscilador local de un receptor FM con TDA7000
Porque me supongo que si esta alimentado a 5v  (el TDA7000 ) el voltaje pico a pico sera de 5V ¿no? 

https://www.forosdeelectronica.com/attachment.php?attachmentid=91713&d=1367620394


----------



## miguelus (May 11, 2013)

lolo2n3055 dijo:


> Segun la hoja de caracteristicas la entrada del prescaler U664B solo aguanta hasta 10mV.
> 1º ¿Es cierto eso?
> 2º Si es cierto. aguantara este circuito:
> Ver el archivo adjunto 92040
> ...



Buenos días lolo2n3055.

Lo de los 10mV se refiere a nivel *mínimo* de entrada requerido para que el prescaler pueda dividir (Viene en el Data Sheet)

En cuanto al nivel de señal generado por el Oscilador del TDA7000 no tienes porqué preocuparte, si utilizas el esquema de la "Miniatura abjunta", verás que en la entrada hay un Atenuador de tres dB´s compuesto por las Resistencias R1, R2 y R3, a continuación hay limitador de señal compuesto por los Diodos D1 y D2.

Al Prescaler no le pasará nada.

Solo hay un "pero"...

Si nos fijamos en la "Miniatura abjunta" vemos que lo primero que hay en la entrada del "Prescaler es una Resistencia de 270Ω, esto puede ser un problema ya que, dependiendo dónde conectemos el Prescaler, podemos derivar tensión DC haciendo que el Oscilador no funcione.

Para evitar esto solo tendremos que poner en serie con la entrada del Prescaler un Condensador de 100pF (o menos), de esta forma bloqueamos las tensiones DC que pudiera haber en el circuito donde lo conectamos.

Sal U2


----------



## lolo2n3055 (May 11, 2013)

Vale entonces esos 10 mV es la sensibilidad mínima, ok.
¿El voltaje máximo que soporta en la entrada es el Vs, es decir 6V?
Respecto a los diodos FAST SI ¿ me podría valer el 1N4148?
Es cierto, el condensador de entrada no aparece en el esquema, gracias por recordarmelo.

Respecto al limitador de tensión con los diodos, ¿como funciona? es decir si por lo que sea le entran 9V pico
 ¿como lo limita?
 ¿puede ser por lo de los 0.3V necesarios para su polarización en directo?
 Si es así, metas el voltaje que metas al final solo le entra al CI 0.3 V pico

Como ves mi temor es que se destruya el CI por meterle mas voltaje del debido.
Gracias por la ayuda.


----------

