Autor Tema: Problema con los timer (en un sensor rpm)  (Leído 1628 veces)

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

Desconectado najarciyo

  • PIC10
  • *
  • Mensajes: 7
Problema con los timer (en un sensor rpm)
« en: 17 de Abril de 2008, 19:40:33 »
Hola buenas noches a todos.

He titulado asi el post, aunque realmente no se si el problema viene de los timer o bien de un fallo de operacion entre binario e integer. Me explico mejor.
Estoy realizando un sensor de RPM para un coche de competicion, el cual me lee los pulsos enviados por un sensor de efecto Hall (usando Timer0) y por otro lado la escala de tiempo usando Timer1. Pongo un trocito de codigo para ayudar a mi explicacion: (me salto los includes, configuraciones y cualquier parte de codigo donde no pueda haber error  :-)) Ah! utilizo PIC18F248 y compilador C18

void main()
{
   int rpm, cont1;
                float cont2;
   T0CON= 0b11101000; //configuring TIMER0 for pulse count
   T1CON= 0b00111001; //configuring TIMER1 for time count
   //Test for the leds
   PORTAbits.RA4=1;
   PORTB=LED8; //LED8 lo tengo definido como 0b11111111 para que active todos los leds conectados al puerto b
   PORTC=LED8;
   Delay10KTCYx(0); //delay to watch if the leds are working properly
   PORTB=0;
   PORTC=0;  // Turn off the leds
   cont1=0;
   cont2=0;
   while (1)

{
   if (INTCONbits.TMR0IF==1) //si salta la interrupcion por TImer0, es decir, si tengo 256 pulsos contados..
   {
      cont1=cont1+256;
      INTCONbits.TMR0IF=0;
   }
   
   if (PIR1bits.TMR1IF==1) // si salta la interrupcion del timer1, 2^16 ciclos de maquina
   {
         
      rpm=(TMR0L + cont1)/0.02;  //Aqui creo que esta el error. 0,02 es el tiempo que tarda en desbordarse timer 1 a 20 Mhz k trabajo   
                   rpm=rpm *60; //solo pasar de rev/s a rev/min
      cont1=0;

      PIR1bits.TMR1IF=0;
   
   }
Y aqui ya vendria mi interpretacion de resultados encendiendo los leds que hagan falta (a modo de cuentarrevoluciones tipo F1)
Pues bien, al simularlo con proteus, le pongo un generador de pulsos el cual le voy variando la frecuencia para simular distintos estados de rpm. El error creo que lo tengo donde esta marcado, y es que cuando me salta una interrupcion de tiempo miro a ver los pulsos que tengo en cont1 (multiplos de 256, claro) y, que no se si esta bien, le sumo TMR0L que es donde se guardan los pulsos del timer0 (en binario 8 bits). Se que quizas el tiempo de muestreo tan bajo (0,02 s) no deja que pase ni siquiera una revolucion, pero e probado con frecuencias muy grandes (revoluciones altas) e incluso incrementendo el tiempo de muestreo, y nada, siempre se me enciende un led (que equivale a revoluciones entre 0 y 800). Puede ser que incluso haya calculado mal el tiempo que tarda en desbordarse el timer1 de 16 bits a 20 mhz, pero creo que esta bien (utilizo preescaler). Espero que si alguien tiene un ratito i se puede mirar esto i me pueda echar una mano, por my encantado  :-/

Muchas gracias por todo!

David

Desconectado najarciyo

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con los timer (en un sensor rpm)
« Respuesta #1 en: 19 de Abril de 2008, 08:13:47 »
Por mas vueltas que le doy no soi capaz de encontrar el fallo... creo que es tema de que cojo el TMR0L (registro del timer0) para conocer su valor, pero éste esta en binario, existe alguna rutina o funcion que me permita coger este valor en binario i saber lo que representa en integer? se que podria acerlo calculandolo, pero no se como coger una posicion del byte para poder separarlo en bits.

Siento volver a preguntar, pero estoy desesperado, nunca me habia trabado tanto (y menos seguro k es una tonteria).
Gracias!

Desconectado najarciyo

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con los timer (en un sensor rpm)
« Respuesta #2 en: 20 de Abril de 2008, 09:19:42 »
 :-/ Al fin lo solucioneee! ahora me falta un pokito de precision, pero esto ya es otro tema jeje.
Si alguien esta interesado en el codigo que me lo diga y se lo mando.



 

anything