Cronometro activado por Sensor Optico con pic16f877a

#1
Hola, pues me encontre un programa de un cronometro que me arroja el tiempo en milisegundos y le hice algunas modificaciones para lo que ocupo pero me atore un poco
debo de convertir ese tiempo en L/M (litros x minuto) entonces le agregue una variable float para hacer la operacion, pero no se como hacer la operacion con el tiempo en milisegundos para que me aparezca en el lcd

aqui les pongo el codigo a ver si me pueden ayudar

las lineas que yo agregue son

float lporm=0.0;

y en #int_ext

lporm =/*con 50 ml*/ (0.05/(1000*milisegundos))/60.0 ; y
printf(lcd_putc, "\n%f L/M", lporm);

y las mismas en #int_RB

y si me aparece en el LCD pero solo me aparece 0.00 L/M siempre

A ver si me pueden ayudar, Gracias

Código:
int numdesbordamientos=0;


#int_ext
void int_ext_(){
   
   if(contando){
      timer1 = get_timer1();
      setup_timer_1(T1_DISABLED);
      milisegundos =/*65.536*/ 524.288*numdesbordamientos + (8*timer1)/1000.0  ;
      lporm =/*con 50 ml*/ (0.05/(1000*milisegundos))/60.0 ;
      // milisegundos = 8.0*milisegundos;
      printf(lcd_putc, "\f%f ms", milisegundos);
      //printf(lcd_putc , "\f%Lu", timer1);
      printf(lcd_putc, "\n%f L/M", lporm);
      //printf(lcd_putc, "\n %d", numdesbordamientos);
      
      contando = 0;
      
   }
   
   
   else
   {
      setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
      set_timer1(0);
      numdesbordamientos = 0;
      contando = 1;
      
      printf(lcd_putc, "\fCalculando...");
   }

}





#int_TIMER1
void int_timer1_ (){
   numdesbordamientos++;//=1.0;   //Se desbordo una vez mas.
   
      
   
   if(numdesbordamientos > 20){
      printf(lcd_putc, "\fTime Out!");
      setup_timer_1(T1_DISABLED);
   }     
   
      
}


#int_RB
void int_rb_(){
   
   clear_interrupt(int_rb); 
   disable_interrupts(GLOBAL);

   if(contando){
      timer1 = get_timer1();
      setup_timer_1(T1_DISABLED);
      milisegundos =/*65.536*/ 524.288*numdesbordamientos + (8*timer1)/1000.0  ;
      lporm =/*con 50 ml*/ (0.05/(1000*milisegundos))/60.0 ;
     // milisegundos = 8.0*milisegundos;
      printf(lcd_putc, "\f%f ms", milisegundos);
      //printf(lcd_putc , "\f%Lu", timer1);
      printf(lcd_putc, "\n%f L/M", lporm);
      //printf(lcd_putc, "\n %d", numdesbordamientos);
      
      contando = 0;
      
   }
   
   
   else
   {
      setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
      set_timer1(0);
      numdesbordamientos = 0;
      contando = 1;
      
      printf(lcd_putc, "\fCalculando...");
   }

}



void main()
{

   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  
   
   
   set_tris_b(11111111);
   // TODO: USER CODE!!
   
   
   port_b_pullups(true);
   
   lcd_init();
   
   
   printf(lcd_putc, "Bienvenido!");
   
   
   
   //enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   while(1){     
   };
   
}
 
#2
Hola, pues me encontre un programa de un cronometro que me arroja el tiempo en milisegundos y le hice algunas modificaciones para lo que ocupo pero me atore un poco
debo de convertir ese tiempo en L/M (litros x minuto) entonces le agregue una variable float para hacer la operacion, pero no se como hacer la operacion con el tiempo en milisegundos para que me aparezca en el lcd

aqui les pongo el codigo a ver si me pueden ayudar

las lineas que yo agregue son

float lporm=0.0;

y en #int_ext

lporm =/*con 50 ml*/ (0.05/(1000*milisegundos))/60.0 ; y
printf(lcd_putc, "\n%f L/M", lporm);

y las mismas en #int_RB

y si me aparece en el LCD pero solo me aparece 0.00 L/M siempre

A ver si me pueden ayudar, Gracias

Código:
int numdesbordamientos=0;


#int_ext
void int_ext_(){
   
   if(contando){
      timer1 = get_timer1();
      setup_timer_1(T1_DISABLED);
      milisegundos =/*65.536*/ 524.288*numdesbordamientos + (8*timer1)/1000.0  ;
      lporm =/*con 50 ml*/ 0.05/(milisegundos/1000)/60) ;
      // milisegundos = 8.0*milisegundos;
      printf(lcd_putc, "\f%f ms", milisegundos);
      //printf(lcd_putc , "\f%Lu", timer1);
      printf(lcd_putc, "\n%f L/M", lporm);
      //printf(lcd_putc, "\n %d", numdesbordamientos);
      
      contando = 0;
      
   }
   
   
   else
   {
      setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
      set_timer1(0);
      numdesbordamientos = 0;
      contando = 1;
      
      printf(lcd_putc, "\fCalculando...");
   }

}





#int_TIMER1
void int_timer1_ (){
   numdesbordamientos++;//=1.0;   //Se desbordo una vez mas.
   
      
   
   if(numdesbordamientos > 20){
      printf(lcd_putc, "\fTime Out!");
      setup_timer_1(T1_DISABLED);
   }     
   
      
}


#int_RB
void int_rb_(){
   
   clear_interrupt(int_rb); 
   disable_interrupts(GLOBAL);

   if(contando){
      timer1 = get_timer1();
      setup_timer_1(T1_DISABLED);
      milisegundos =/*65.536*/ 524.288*numdesbordamientos + (8*timer1)/1000.0  ;
      lporm =/*con 50 ml*/ 0.05/((milisegundos/1000)/60) ;
     // milisegundos = 8.0*milisegundos;
      printf(lcd_putc, "\f%f ms", milisegundos);
      //printf(lcd_putc , "\f%Lu", timer1);
      printf(lcd_putc, "\n%f L/M", lporm);
      //printf(lcd_putc, "\n %d", numdesbordamientos);
      
      contando = 0;
      
   }
   
   
   else
   {
      setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
      set_timer1(0);
      numdesbordamientos = 0;
      contando = 1;
      
      printf(lcd_putc, "\fCalculando...");
   }

}



void main()
{

   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  
   
   
   set_tris_b(11111111);
   // TODO: USER CODE!!
   
   
   port_b_pullups(true);

   delay_ms(500);
   
   lcd_init();
   
   
   printf(lcd_putc, "Bienvenido!");
   
   
   
   //enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   while(1){     
   };
   
}
Tenia la formula mal, era

lporm =/*con 50 ml*/ 0.05/((milisegundos/1000)/60) ;

y no me queria encender el lcd y nadamas le puse un delay de 500ms antes de inicializar y se arreglo el problema

asi que muchas gracias, empece con la ley del minimo esfuerzo este tema y lo pude resolver al final jeje

pongo el codigo corregido por si a alguien le sirve y luego pongo el esquematico porque estoy teniendo problemas con mi pc
 

Temas similares

Arriba