TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Dsas en 10 de Enero de 2012, 23:31:18
-
Hola!
Estoy tratando de hacer algo simple pero no logro tener lecturas similares.
Quiero capturar el tiempo que esta en alto y en bajo un tren de pulsos para después procesarlos. Pero al tomar dos capturas del mismo tren son diferentes, incluso se saltea algunos cambios de alto a bajo y viceversa.
Probé cambiar la velocidad del cristal, sacarlo del proteus y hacerlo en la realidad pero sigue igual.
Alguien me sugiere algo?
#include <12f675.h>
#fuses HS, NOWDT, NOMCLR, PUT, BROWNOUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1)
int16 t;
int i;
#int_EXT
EXT_isr()
{
int1 k;
disable_interrupts(INT_EXT);
do{
k=input(PIN_A2);
switch(k){
case 1:
{
set_timer1(0);
WHILE (INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
break ;
}
case 0:
{
set_timer1(0);
WHILE (!INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
break ;
}
} while(i<10);
enable_interrupts(INT_EXT);
}
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{ }
}
También probé cambiar el switch por dos if pero es peor, algunos cambios de estado los toma como "0" incluso cambie el segundo if por un else pero tampoco.
#int_EXT
EXT_isr()
{
int1 k;
disable_interrupts(INT_EXT);
do{
k=input(PIN_A2);
if (k==1)
{
set_timer1(0);
WHILE (INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
}
if (k==0)
{
set_timer1(0);
WHILE (!INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
}
i++;
}while(i<10);
enable_interrupts(INT_EXT);
}
Ah, me olvidaba, en lugar de los printf va una rutina que guarda el valor en un array.
Alguien tiene alguna solución?
Gracias.
-
Hola Dsas, tu metodo no es el optimo para medir un pulso, estas realizando muchas operaciones dentro de tu interrupcion.
checa este link del amigo redpic para que te des una idea:
http://www.todopic.com.ar/foros/index.php?topic=14427.0 (http://www.todopic.com.ar/foros/index.php?topic=14427.0)
-
lo mas sencillo es:
main() {
var=0;
while(1) {
printf(...,count);
}
}
EXT_isr() {
if (!var) {
set_timer1(0);
var=1;
} else {
count=get_timer1();
var=0;
}
}
-
Lo verdaderamente correcto es utilizar el método 6 del hilo recomendado por rivale. Es simple, efectivo y preciso. Además utiliza los recursos hardware del microcontrolador y si pagaste por ese hardware, entonces ¿por qué no utilizarlo?
Es decir utilia TIMER1+CCP, con eso los problemas resueltos y el código será nada. El PIC se encarga de medir el tiempo entre un frente y otro y lo pone en un registro para que lo leas desde la interrupción del CCP. Es lo mejor y correcto.
Saludos
Reinier
-
Gracias por las respuestas,
El código de RedPic es para un pulso solo, ¿Como lo puedo modificar para un tren de pulsos?
Gracias MerLiNz por el código, pero pasa lo mismo que con el Código de RedPic para un pulso anda bien, pero cuando quiero usarlo para un tren de pulsos tengo lecturas inconstantes ¿que modificación le puedo hacer?
Estoy totalmente desorientado :S
-
Es codigo en efecto te lee un pulso a la vez, pero como esta implementado con interrupciones en cuanto llegue otro pulso lo vuelve a leer, lo que harias es ir leyendo en secuencia los pulsos y los puedes ir guardando en un vector
-
de que frecuencia estamos hablando?
-
máximo 40 khz.