Autor Tema: Captura de timer1 bastante variables  (Leído 1877 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Dsas

  • PIC10
  • *
  • Mensajes: 6
Captura de timer1 bastante variables
« 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?

Código: [Seleccionar]
#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.


Código: [Seleccionar]
#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.
« Última modificación: 10 de Enero de 2012, 23:34:59 por Dsas »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Captura de timer1 bastante variables
« Respuesta #1 en: 11 de Enero de 2012, 00:48:27 »
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
"Nada es imposible, no si puedes imaginarlo"

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Captura de timer1 bastante variables
« Respuesta #2 en: 11 de Enero de 2012, 00:59:28 »
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;
}
}

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Captura de timer1 bastante variables
« Respuesta #3 en: 11 de Enero de 2012, 12:15:59 »
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

Desconectado Dsas

  • PIC10
  • *
  • Mensajes: 6
Re: Captura de timer1 bastante variables
« Respuesta #4 en: 12 de Enero de 2012, 20:59:51 »
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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Captura de timer1 bastante variables
« Respuesta #5 en: 12 de Enero de 2012, 21:01:41 »
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
"Nada es imposible, no si puedes imaginarlo"

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Captura de timer1 bastante variables
« Respuesta #6 en: 12 de Enero de 2012, 21:42:17 »
de que frecuencia estamos hablando?

Desconectado Dsas

  • PIC10
  • *
  • Mensajes: 6
Re: Captura de timer1 bastante variables
« Respuesta #7 en: 12 de Enero de 2012, 21:53:02 »
máximo 40 khz.