Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

20/06/2011 #1


Cronometro activado por Sensor Optico con pic16f877a
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){     
   };
   
}
21/06/2011 #2


Arreglado
cido39 dijo: Ver Mensaje
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
30/06/2011 #3


circuito
Adjunto circuito del cronometro, en donde esta el boton se supone que va el sensor
Imágenes Adjuntas
Tipo de Archivo: bmp circuitcro.bmp (88,8 KB (Kilobytes), 136 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.