TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: leotronik en 30 de Diciembre de 2012, 15:32:16

Título: Problema con retardo en CCS COMPILER
Publicado por: leotronik en 30 de Diciembre de 2012, 15:32:16
Buenas Tardes Colegas del Foro...

Mi problema es que necesito generar un retardo de un determinado tiempo dentro de un ciclo while(true)  el cual al llegar a una temperatura determinada me encienda un led durante un tiempo y después lo apague.
Mi codigo es el siguiente:

#include <16f877.h>
#device adc=10 //Usa resolución de 10 bits.
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#include <lcd.c> //libreria q maneja la lcd 2x16
#use standard_io (D)

FLOAT T1,P1,P9,;//VARIABLES PARA LA LECTURA DE TEMPERATURA
INT16 Q1;//VARIABLE PARA LECTURA DEL ADC

 setup_adc (adc_clock_INTERNAL);
 setup_adc_ports (RA0_RA1_RA3_ANALOG);

MAIN ()
{
 lcd_init(); //Inicia LCD
  WHILE (TRUE)
   {

 
 set_adc_channel (0); //Elige canal a medir RA0
 delay_ms (100);
 Q1=read_adc (); //Hace conversión AD
 P1=(5.0*(Q1)) / 1024.0;

 setup_adc (adc_off);  //Apaga ADC

 T1=(P1*(100));



lcd_gotoxy(0,2);
lcd_putc(" ");
PRINTF(LCD_PUTC,"V1=%01.2f V2=%01.2f",P1,P9);
delay_ms (1);
lcd_gotoxy(0,1);
lcd_putc(" ");
PRINTF(LCD_PUTC,"T1=%01.0fß T2=%01.0fß",T1);
delay_ms (1);
 

 //Aquí esta mi duda es posible hacer esto para que el led se encienda por un tiempo de 2 segundos y se apague pero que no quede intermitente solo que encienda por un tiempo y se apague totalmente?
   if(T1>=35)
     {   
      OUTPUT_HIGH(PIN_D3);
       delay_ms(2000)
       OUTPUT_low(PIN_D3);
     } 


//
   }

}
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: Suky en 30 de Diciembre de 2012, 16:22:01
Y porque no? El problema esta en que es lo único que hará, pasado ese tiempo recién vuelve a testear la temperatura. Luego, si apagas el ADC, la segunda conversión no la puedes realizar, entonces para que lo apagas?


Saludos!
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: leotronik en 30 de Diciembre de 2012, 18:27:56
Muchas Gracias por responder Suky..

Mira cometí un error en la linea  "setup_adc (adc_off);  //Apaga ADC" esa no va, porque la idea es que el programa siempre realiza la conversión y se pregunte por la condición que se encuentra dentro del if
El asunto es que cuando el sensor de temperatura llegue a la temperatura deseada se prenda un led durante un tiempo determinado, de 2 segundos podria ser, no se si esto sea posible ya que la condición esta dentro de un ciclo repetitivo while o si tendre que realizar un proceso aparte.

Espero haberme hecho entender muchas gracias por la ayuda.
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: parametro51 en 30 de Diciembre de 2012, 20:46:43
Yo lo que haría para que solo se encendiera una vez el led sería activar un bit una sola vez si la temperatura es superior o igual a los 35º, poniendo ese bit como condición del if y desactivando dicho bit si la temperatura es inferior a 35.... de este modo cada vez que la temperatura supere los 35 grados te prende el led y no se vuelve a prender hasta que no baje de los 35....algo así:

int banderas;
#bit bit = banderas.0;
bit =0;
// Todo lo anterior fuera del bucle while

 if(T1>=35 && !bit)
     {   
      OUTPUT_HIGH(PIN_D3);
       delay_ms(2000)
       OUTPUT_low(PIN_D3);
       bit=1;
     }
else if (T1<35)
     {
       bit=0;
     }

Se nota que no soy experto y tendré algunos errores pero solo es una idea.

Suerte con tu proyecto
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: ppyote en 30 de Diciembre de 2012, 21:00:50
Muchas Gracias por responder Suky..

Mira cometí un error en la linea  "setup_adc (adc_off);  //Apaga ADC" esa no va, porque la idea es que el programa siempre realiza la conversión y se pregunte por la condición que se encuentra dentro del if
El asunto es que cuando el sensor de temperatura llegue a la temperatura deseada se prenda un led durante un tiempo determinado, de 2 segundos podria ser, no se si esto sea posible ya que la condición esta dentro de un ciclo repetitivo while o si tendre que realizar un proceso aparte.

Espero haberme hecho entender muchas gracias por la ayuda.

lo que quieres hacer es cuando el sensor alcance la temepratura encienda el led durante 2 segundos.... cierto?
y despues? que es lo que deseas seguir haciendo? lo mismo? que siga comprobando el valor de la entrada ADC y que avise que si pasa de esa temperatura vuelva a prender el led?
si eso es asi.... ya lo tienes... solo quita lo de setup_adc (adc_off)
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: bmb en 30 de Diciembre de 2012, 22:07:26
Hola leotronic, entiendo que lo que quieres es más o menos lo que te sugiere parametro51. Puedes abreviar un poco el programa iniciando la variable tipo bit que en CCS se puede directamente así:

Código: [Seleccionar]
int1 bit=false;

// Lo anterior fuera del bucle while

 if(T1>=35 && !bit)
     {   
        OUTPUT_HIGH(PIN_D3);
        delay_ms(2000)
        OUTPUT_low(PIN_D3);
        bit=true;
     }
else if (T1<35)
     {
        bit=false;
     }

Saludos!
Título: Re: Problema con retardo en CCS COMPILER
Publicado por: leotronik en 31 de Diciembre de 2012, 15:53:03
Muy buenas tardes Colegas..

Les tengo muy buenas noticias me ha funcionado lo que quería muchas gracias por sus aportes realmente son muy valiosos para resolver cualquier inquietud.

Muchas y muchas gracias.