TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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);
}
//
}
}
-
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!
-
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.
-
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
-
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)
-
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í:
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!
-
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.