Autor Tema: como fijar el tiempo  (Leído 1595 veces)

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

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
como fijar el tiempo
« en: 08 de Octubre de 2008, 00:49:14 »
hola a todos los colaboradores hace algunas semanas estuve haciendo muchas pregunats sobre el el 16f88 bueno ahora estoy con 16f873 es bastante facil no tengo problemas casi pero creo que se me han agotado las ideas
miren estoy con mi control de horno el usuario ingresa la temperatura a la que quiere q estes el horno a la vez pone un tiempo cuanto tiempo quiere q este activo el horno pero e ahi mi problema en mi programa una de las lineas dice que cuando la temperatura del sensor sea menor que el del usuario se encienda el horno cuando estos dos son = se apaga el horno eso es lo que hago de  tal manera que se pone algo constante ahora se me ocurrio poner un contador para el tiempo con algunos delay pero bueno en la simulacion no me aparece como quiero es mas se queda encerrado ahi y no sale despues del supuesto tiempo pedido aqui les dejo mi programita ojala lo puedan analizar y  me den una idea de como se puede hacer la cuestion del tiempo
el programa esta en source boost c aqui veo que no lo utilizan pero la base es el c asi que quiza me puedan brindar una ayuda muchas gracias salu2 a todos

#include "control.h"
#include "lcd.h"
#include "adc.h"

unsigned char inicio=2;
unsigned long pot1=0;unsigned long med1=0;unsigned long tiempo=0;
unsigned long pot2=0;unsigned long med2=0;
unsigned long lm35=0;unsigned long sensor=0;
unsigned long temp1=0;   //para apagado en el while
unsigned long temp2=0;   //auxiliar
unsigned long retra=0;  //retrazo
unsigned long count=0;  //contador

void main()
{   
   init();
   
   lcd_send_cmd(LINE1);
   lcd_printf("  Bienvenido a la   ");
   delay_ms(100);
      
   lcd_send_cmd(LINE2);
   lcd_printf(" Feria Tecnologica ");
   delay_ms(100);
      
   lcd_send_cmd(LINE1);
   lcd_printf("                  ");
      
   lcd_send_cmd(LINE2);
   lcd_printf("                  ");
   
   while(1)
   {//inicio de control=>LCD
      
      pot1 =adc_measure(1);         //Potenciometro para tiempo
      med1=(pot1 * 5000)/1023;      //colocamos el tiempo en volt(usuario)
      tiempo=(3 * med1)/125;         //tiempo en minutos
      lcd_send_cmd(LINE2);
      lcd_printf("time=");
      lcd_print_dec(tiempo);
      lcd_printf("min  ");
      
   
      pot2 =adc_measure(0);         //Potenciometro para ingresar la temperatura
      med2=(pot2 * 500)/1023;         //colocamos la temperatura (usuario)
      lcd_send_cmd(LINE1);
      lcd_printf("temp=");
      lcd_print_dec(med2);
      lcd_printf("ºc");
      
      lm35=adc_measure(3);
      sensor=(lm35 * 500)/1023;
      lcd_send_cmd(LINE2);
      lcd_printf("             s=");
      lcd_print_dec(sensor);
      lcd_printf("ºc");
      
      //paso para el encendido del control
      
      if(porta.4==1)inicio=0;
      while(inicio<2)   //si se da el pulso de inicio
      {
         portc.1=1;   //se prende el moc
         delay_ms(50);
         lm35=adc_measure(3);
         sensor=(lm35 * 500)/1023;
         lcd_send_cmd(LINE2);
         lcd_printf("             s=");
         lcd_print_dec(sensor);
         lcd_printf("ºc");
         if(sensor==med2)
         llamada();
      }
   }
}

void llamada(void)
{
   while(count<=tiempo)//contador para el tiempo que se quiere activo el horno
   {

      if(sensor<med2)//si la tem es menor de la que se va ah controlar
      {
         portc.1=1;
         delay_ms(50);
         lm35=adc_measure(3);
         sensor=(lm35 * 500)/1023;
         lcd_send_cmd(LINE2);
         lcd_printf("             s=");
         lcd_print_dec(sensor);
         lcd_printf("ºc");
      }
      
      
      if(sensor==med2)//si la temp es =
      {
         portc.1=0;
         lm35=adc_measure(3);
         sensor=(lm35 * 500)/1023;
         lcd_send_cmd(LINE2);
         lcd_printf("             s=");
         lcd_print_dec(sensor);
         lcd_printf("ºc");
      }
      
      
      if(sensor>med2)//si es mayor
      {
         portc.1=0;
         portc.1=1;
         portc.1=0;
         lm35=adc_measure(3);
         sensor=(lm35 * 500)/1023;
         lcd_send_cmd(LINE2);
         lcd_printf("             s=");
         lcd_print_dec(sensor);
         lcd_printf("ºc");
      }
      
   }
      delay_ms(1);
      count=count+1;
      delay_ms(1);
      inicio=3;
}
void interrupt(void)
{

}

void init(void)
{
   adcon1=00000100b;
   trisa=00011011b;
   trisb=00000000b;
   trisc=00000000b;
   porta=0;
   portb=0;
   portc=0;
   lcd_init();
   adc_init();
}
Enrique Contreras R.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: como fijar el tiempo
« Respuesta #1 en: 08 de Octubre de 2008, 14:19:02 »
Hola.

Segun veo en tu codigo ajustas el tiempo en milisegundos???? Yo creo que la mejor forma de llevar la cuenta del tiempo sea por medio de un timer

Saludos
El papel lo aguanta todo

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Re: como fijar el tiempo
« Respuesta #2 en: 09 de Octubre de 2008, 05:33:31 »
si mlo lo hago en milisegundos para efectos de simulacion en el contador iria en realidad en segundos para obtener minutos es decir iria asi
      delay_s(29);
      count=count+1;
      delay_s(30);
      inicio=3;
coloco esos valores porque asumo que en todo el while se consumira un segundo o aproximadamente 1 segundo....
con tu recomendacion habia pensado lo mismo pero bueno no recurdo bien lo del timer pero se que se usa un valor de prescaler pero no se si estoy quivocado pero habria forma de fijar el tiempo por el usuario de esa forma si me pudieras dar una nocion te lo agradeceria voy a tratar de hacer algo y lo mando para ver  que me aconsejas gracias por la ayuda salu2
Enrique Contreras R.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: como fijar el tiempo
« Respuesta #3 en: 09 de Octubre de 2008, 10:58:36 »
Hola.

Para calcular el tiempo que tarda en desbordarse un timer, se deben tener en cuenta varios parametros, entre ellos: el cristal, la resolucion del timer, el valor del prescaler.

Supongamos que vamos a usar el timer0 y que nuestro sistema esta en configuracion XT (cristal de 4MHz), tenemos entonces ticks de maquina de 1uS. El timer0 lo vamos a usar a 8 bits, por lo que se desbordara a 256uS con un prescaler de 1.

Código: [Seleccionar]
setup_timer_0(RTCC_8_BIT | RTCC_DIV_1 | RTCC_INTERNAL);
Pero si queremos que se demore mas, aumentamos el valor del prescaler del timer, el cual tiene las siguientes opciones: 1,2,4,8,16,32,64,128,256.

Si escogieramos un prescaler de 4, el timer se desbordaria cada 256uS x 4 = 1,024mS.

Luego de configurar el timer, es importante fijar la funcion de interrupcion, en tu programa, luego de haber adquirido el dato del tiempo, se habilitaria la interrupcion con algun pulsador de Inicio y el timer se encargaria de hacer la cuenta del tiempo, mientras tu puedes hacer cualquier otra cosa en el programa principal (esa es la gran ventaja de las interrupciones)

Saludos

El papel lo aguanta todo