TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: huichoman en 13 de Enero de 2012, 23:02:49
-
Hola, quisiera saber si mis cálculos y código son correctos
Para cristal de 20mhz, preescaler de 256 a 8 bits
FOSC=1/20 = 0.05
timer0 = 256-176 = 80 (seteado en 176 a timer0)
Interrupcion = 0.05*4*80*256 = 4.096 ms
1 segundo -> 1000/4.096 =244.14
Entonces 1 segundo = 244 * 4.096 =999.424 ms
Para configurar el timer
setup_timer_0(RTCC_DIV_256 | RTCC_8_BIT);
set_timer0(176);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
Para contar los segundos
#INT_RTCC
clock_isr() {
++ticks;
if(ticks==244)
{
++seg;
ticks=0;
}
}
Gracias por la ayuda, consejos y sugerencias.
-
la frecuencia de un pic de 8bits es fosc/4, osea 20mhz=5mhz o MIPS
prescaler /256=19531,25Hz
1/19531,25=51,2us cada incremento
si lo pones cada 97 seria casi 5ms osea setearlo a 159
1segundo = 200*5ms
Tambien ojo que el timer0 es distinto a los demas timers, leete el datasheet ya que tiene algunos retardos al setearlo y tal.
-
Hole MerLinz, según lo que he investigado en el foro, FOSC = (1/Frecuencia del cristal) *4)
Entonces si uso un cristal de 20 mhz, quedaría FOSC = (1/20)*4 que es lo mismo que 4/20 = 0.2
El timero 0 configurado a 8 bits contaría hasta 256 entonces quedaría Incremento = 0.2 * 256 = 51.2
Y si le colocamos un preescaler de 256 al final quedaría Incremento = 51.2*256 = 13 107.2 us = 13.1072 ms
Si le damos nombres a las variables:
FC = Frecuencia del cristal
BT= Bits del timer (8 bits = 256)
PRE = Preescaler
ST = Set del timer
En mi caso
FC = 20 (cristal de 20 mhz)
BT = 256
PRE= 256
ST= 176
Entonces Incremento del timer = (4/20)*(256-176)(256) = 4096 us = 4.096 ms
1 segundo = 1000 ms entonces 1000/4.096 = 244.1
Entonces 1 segundo = 244 incrementos del timer porque 244*4.096ms = 999.4 ms
Espero que alguien que sepa muy bien del tema pueda ayudarnos a aclarar si esto está bien.
Saludos
-
si, las matematicas tiene muchos caminos eso esta claro :mrgreen: pero intenta poner que significa cada cosa (us,hz,mhz,ms....) porque sino a veces confunde xD
unicamente te decia poner 5ms porque es un valor mas exacto (sin decimales) ademas de tener mas tiempo entre interrupcion e interrupcion.
-
Como hacemos para setearlo a 0.5 segundos o 1 segundos con un cristal de 20 MHz y el timer1 ??
Actualmente tengo funcionando con un cristal de 4 MHz y cargandole 3036 me desborda a los 0.5
segundos, pero ahora necesito ponerle un cristal de 20 MHz y no se como hacer para contar los
segundos, ya que deberia hacer interrupciones cada 100 ms y es muy impratico que el micro entre
en la interrupcion cada tan poco tiempo, es al vicio desde mi punto de vista.
Saludos y gracias
-
Te doy algunos datos para que pruebes ;-)
4mhz -> 3036 -> 0,5mseg
20mhz -> 12500 -> 0,5mseg
Supongo que 3036 es el valor que cargas en el timer de 16bits.
Con mismo prescaler y dejando la configuración actual del timer, con el cristal de 20mhz el tiempo de interrupción tendría que ser 5 veces mas corto.
-
En realidad puse mal el título del tema porque lo que estoy utilizando es el timer1, con un pre escaler de 8, cargandole el 3036 desborda el mismo al cabo de los 0,5 seg.
Quiero seguir utilizando el mismo timer pero con una frecuencia de 20 MHz, lo cual es la duda que tengo actualmente de como hacerlo.
Gracias por tu respuesta