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