TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: PabloFiscella en 03 de Diciembre de 2003, 07:15:00
-
Hola a todos:
Ante la imposibilidad de conseguir el cristal 4,096Mhz en Argentina pensaba si existia alguna especie de reloj externo del cual se puedan sacar los datos sin tener que utilizar este cristal.
Saludos.
Pablo
-
Si la aplicacion es una temporizacion exacta, yo utilizo un cristal de 4 Mhz y ajuste finalmente el valor inicial del Tmr0 para aprovechar todas las instrucciones de la interrupcion que incrementan el timer antes de la recarga.
Lo optimice a full utilizando el contador de tiempo del mplab y poniendo un punto de parada en la instruccion de recarga del timer.
Probe con varios valores y consegui una temporizacion exacta de 1 mseg.
A partir de alli ya tienes todo OK.

Sino tienes los PIC de la gama media donde le pones un cristal que interrumpe sobre el timer2 y alli si lo haces exacto....
-
Hola:
Me podes decir que es lo que deberia cambiar para que sea exacto
#include <16F84A.h>
#use delay (clock=4000000)
#fuses XT,NOWDT
#define INTS_PER_SECOND 76 // (4000000/(4*256*256))
byte int_count; // Number of interrupts left before a second has
#int_rtcc // This function is called every time
clock_isr() { // the RTCC (timer0) overflows (255->0).
// For this program this is apx 76 times
if(--int_count==0) { // per second.
segundos1++;
int_count=INTS_PER_SECOND;
}
}
void main(void) {
int_count=INTS_PER_SECOND;
set_timer0(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
// set_tris_b(0x0);
for(;
{
//codigo
}
}
Gracias.
Pablo
-
A ver si esto te sirve, tuve que leer mas del C, para orientarme.
#include <16F84A.h>
#use delay (clock=4000000)
#fuses XT,NOWDT
#define INTS_PER_SECOND 250 // (4000000/(4*4*250))
byte int_count; // Number of interrupts left before a second has
#int_rtcc // This function is called every time
clock_isr() { // the RTCC (timer0) overflows (255->0).
// For this program this is apx 76 times
if(--int_count==0) { // per milisecond.
milisegundos++;
if(milisegundos==1000) { // per second.
segundos1++;
milisegundos==0
}
int_count=INTS_PER_SECOND;
}
}
void main(void) {
int_count=INTS_PER_SECOND;
set_timer0(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_4);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
// set_tris_b(0x0);
for(; {
//codigo
}
}
Probalo a ver que pasa.
Sugerencia:
Este tema en este subforo no tiene mucho que ver, pedile a los moderadores que lo muevan al de lenguaje C...
-
Este tema ya está en el subforo de C y tú contestaste en él querido MGLSOFT.
-
Pues muevan los mensajes, Pocher.
Muchos han escrito varios post en otros foros, eso no quita que contestemos.
Si te fijas como empieza el primer mensaje, veras que poco podia saber que derivaria en una contestacion en C, motivo que finalmente me decide a mover el tema.
No veo porque el reto, yo puedo moderar en otras listas, pero no en C.
De ultima muevan todos los mensajes, solamente.

-
En cuanto a lo que te comentaron sobre lo de buscar el cristal de 32,...Khz puedes conectarlo al timer1 y así conseguirás tener un barato RTC. Hay notas de aplicación en microchip. Así podrás trabajar con el cristal de 4MHz e irá más rápido tu aplicación. Ojo que el 16F84A no tiene timer1!!
Otra solución que se me ocurre es usar uno de esos micros que tienen oscilador interno, y calibrarlo para que te dé los 4,096MHz. No usé nunca el oscilador interno, pero si se pueden calibrar, supongo que se podría hacer esto. No sé, es una idea...
Saludos!
-
Por cierto, si quieres usar l opción del cristal de 32KHz, y no lo encuentras tampoco... te comento.
No se si ahí donde vives existen esas tiendas de todo a cien (conocidas así aquí en España). Pues bien, los relojes que venden ahí, los despertadores, esos que la maquinaria viene en una cajita negra (son todas iguales), trae un cristal de esos. Es el canutillo de metal. Estas maquinarias también las venden en tiendas de manualidades, ya que se usan cuando haces un reloj con punto de cruz
, o de escayola... Aunque ahí, supongo que te costará algo más caro.
Si tienes un reloj roto electrónico, pues ya tienes cristal... No hay que tirar nada
Saludos!!
-
Hola MGLSOFT
Probe el ejmplo que me pasaste pero tarda mucho en pasar un segundo.
Luego lo que hice es reducir la pregunta milisegundos == 1000 por milisegundos == 4 pero igualmente adelanda 1 seg por minuto.
Si podes miralo a ver si me estoy confundiendo en algo.
En cuanto a la respuesta de cucaracha voy a buscar el cristal de 32k y luego te comento.
Saludos a todos.
Pablo
#include <16F84A.h>
#use delay (clock=4000000)
#fuses XT,NOWDT
#define INTS_PER_SECOND 250 // (4000000/(4*4*250)) (4*Divisor*Interrupciones)
byte CONST Display2[] = {0b00100000,0b00100001,0b00100010,0b00100011,0b00100100,0b00100101,0b00100110,0b00100111,0b00101000,0b00101001};
byte segundos1; // A running seconds counter
byte int_count; // Number of interrupts left before a second has elapsed
byte milisegundos;
#int_rtcc // This function is called every time
clock_isr() { // the RTCC (timer0) overflows (255->0).
if(--int_count==0) { // per milisecond.
milisegundos++;
if(milisegundos==4) { // per second.
segundos1++;
milisegundos=0;
}
int_count=INTS_PER_SECOND;
}
}
void main(void) {
segundos1 = 0;
milisegundos = 0;
int_count=INTS_PER_SECOND;
set_timer0(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_4);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
// set_tris_b(0x0);
for(;
{
output_b(Display2[segundos1]);
delay_ms(3);
}
}
-
Estas seguro que el cristal que estas utilizando es de 4 MHZ ??

-
Si. Pueden ser los capacitores que esten mal. Son de 22.
El codigo esta bien?