TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Lord_Duran en 21 de Octubre de 2010, 09:20:44
-
Saludos.
Tengo problemas en la implementacion de un proyecto, la cuestion es que la temperatura que me muestra en la LCD es variable, no se mantiene constante, en algunos momentos muestra 14 grados, luego muestra 24, luego 30, luego baja a 28 grados y así, creo que se desborda la temperatura, pero no entiendo por qué, tambien estoy leyendo valores de humedad, osea, esos estan siendo simulados por potenciometros, con variaciones de voltaje entre 0 y 5 V que llegan al ADC, y esos valores me es mostrado de forma correcta en el LCD y con ello puedo manejar una bomba de agua (rango entre 75 y 77 % de humedad), cuando baja a 75% o menor, pues se activa una bomba. El punto es que la humedad no se desborada, por que se desborda la temperatura???
otro porblema que tengo, es que en la implementacion tampoco funciona la comunicacion serial (TX del pic a la PC)
bueno, aqui dejo el programa que manejo en CCS, espero contar con mucha ayuda y solucionar el problema, ya que estoy contra la pared en cuanto a tiempo se refiere.
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(D)
#use fast_io(e)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B2
#define LCD_E PIN_B3
#include <flex_lcd204.C>
#bit Fin_C1 = 7.4 // ES EL SENSOR DE ARRIBA
#bit Fin_C2 = 7.5 // ES EL SENSOR DE ABAJO
#define enter input(pin_b1)
//#bit enter = 6.1
#bit arriba = 8.6
#bit abajo = 8.7
#define nivel1 input(pin_e0)
#define nivel2 input(pin_e1)
#zero_ram
float TempA=20.0,TempB=28.0,TempM=25.0,HumA=75.0,HumB=77.0;
int puntero = 0;
int bandera,ban2=0;
void sube(void);
void baja(void);
void para(void);
void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);
void main()
{
short control, control1, controlh; // VARIABLES DE CONTROL
int16 hum1, hum2, hum3, temp1, temp2;
float tempt1, tempt2, humt1, humt2, humt3, humS, tempS, RH;
set_tris_c(0xB0);
set_tris_d(0xC0);
set_tris_e(3);
output_low(pin_e2);
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
control = 0;
control1 = 0;
controlh = 0;
while(true)
{
set_adc_channel(0); //CANAL 0
delay_us(20);
temp1 = (read_adc() * 100);
set_adc_channel(1); //CANAL 1
delay_us(20);
temp2 = (read_adc() *100);
delay_ms(300);
tempt1 = temp1 * 0.0049;
tempt2 = temp2 * 0.0049;
tempS = (tempt1 + tempt2) / 2.0; //TEMPERATURA A MANEJAR
// LECTURA DE HUMEDAD
set_adc_channel(2); //CANAL 2
delay_us(20);
hum1 = read_adc();
set_adc_channel(3); //CANAL 3
delay_us(20);
hum2 = read_adc();
set_adc_channel(4); //CANAL 4
delay_us(20);
hum3 = read_adc();
humt1 = hum1 * 0.0049;
humt2 = hum2 * 0.0049;
humt3 = hum3 * 0.0049;
humS = (humt1 + humt2 + humt3) / 3;
RH = (humS - 0.958) / 0.0307; // HUMEDAD HA MANEJAR
//*********** RUTINA DE CONTROL DE TEMPERATURA ****************
if (tempS >= TempB)
{
if (Fin_C1 == 0 && Fin_C2 == 1)
{
control = 0;
}
if (control == 0)
{
output_high(PIN_C1);
sube();
if (Fin_C1 == 1)
{
para();
output_low(PIN_C1);
}
}
}
if (tempS <= TempA)
{
if (Fin_C1 == 1 && Fin_C2 == 0)
{
control = 1;
}
if (control == 1)
{
output_high(PIN_C3);
baja();
if(Fin_C2 == 1)
{
para();
output_low(PIN_C3);
ban2=1;
}
}
if(ban2==1){
output_high(PIN_C2); //AIRE CALIENTE
control1 = 1;
ban2=0;
}
}
if (control1 == 1)
{
if (tempS <= TempM)
{
output_high(PIN_C2); //AIRE CALIENTE
} else
{
output_low(PIN_C2); //APAGA AIRE CALIENTE
control1 = 0;
}
}
//************ FIN RUTINA CONTROL TEMPERATURA *****************
//******* RUTINA CONTROL DE HUMEDAD ****************
if (RH >= HumB)
{
output_low(PIN_C0);
}
if (RH <= HumA)
{
output_high(PIN_C0);
controlh = 1;
}
if (controlh == 1)
{
if (RH <= HumB)
{
output_high(PIN_C0);
}else
{
output_low(PIN_C0);
controlh = 0;
}
}
//*********** FIN RUTINA CONTROL HUMEDAD **************
printf(lcd_putc, "\f TEMPERATURA \n %01.2f %cC\n HUMEDAD \n %01.2f %c",tempS,0xDF,RH,0x25);
printf("ADC = %4ld Temperatura = %01.2f C\r\n",tempt1,tempS);
printf("ADC = %4ld humedad = %01.2f RH\r\n", hum3,RH);
delay_ms(100);
if(enter==1){
lcd_putc("\f");
lcd_gotoxy(1,2);
lcd_putc(" SELECCIONE ");
lcd_gotoxy(1,3);
lcd_putc(" PLANTACION ");
delay_ms(2000);
//lcd_putc("\f");
testeo();
}
if(nivel1==1 && nivel2==1){
output_low(pin_e2);}
else {if(nivel1==0 && nivel2==0)
output_high(pin_e2);}
}
}
void sube(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_low(PIN_D0); // IN1
output_low(PIN_D2); // IN3
output_high(PIN_D1); // IN2
output_high(PIN_D3); // IN4
}
void baja(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_high(PIN_D0); // IN1
output_high(PIN_D2); // IN3
output_low(PIN_D1); // IN2
output_low(PIN_D3); // IN4
}
void para(void)
{
output_high(PIN_D4); // EN1
output_high(PIN_D5); // EN2
output_low(PIN_D0); // IN1
output_low(PIN_D2); // IN3
output_low(PIN_D1); // IN2
output_low(PIN_D3); // IN4
}
void testeo()
{
puntero = 1;
vDibujaPuntero(puntero);
bandera = 1;
while (bandera == 1)
{
if (abajo == 1)
{
delay_ms(300);
puntero++;
if (puntero == 5)
{
puntero = 1;
}
vDibujaPuntero(puntero);
}
if (arriba == 1)
{
delay_ms(300);
puntero--;
if (puntero == 0)
{
puntero = 4;
}
vDibujaPuntero(puntero);
}
if (enter == 1)
{
OpcionSelect(puntero);
bandera = 0;
}
}
}
void vDibujaPuntero (int puntero)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("1 CLAVEL");
lcd_gotoxy(3,2);
lcd_putc("2 ROSAS");
lcd_gotoxy(3,3);
lcd_putc("3 PLANTACION 3");
lcd_gotoxy(3,4);
lcd_putc("4 PLANTACION 4");
lcd_gotoxy(1,puntero);
lcd_putc("->");
}
void OpcionSelect(int puntero)
{
switch(puntero)
{
case 1:lcd_putc("\fCLAVEL");
TempA=20.0;
TempB=28.0;
TempM=25.0;
HumA=75.0;
HumB=77.0;
break;
case 2:lcd_putc("\fROSAS");
TempA=22.0;
TempB=30.0;
TempM=26.0;
HumA=75.0;
HumB=85.0;
break;
case 3:lcd_putc("\fPLANTACION 3");
TempA=10.0;
TempB=30.0;
TempM=23.0;
HumA=74.0;
HumB=89.0;
break;
case 4:lcd_putc("\fPLANTACION 4");
TempA=15.0;
TempB=30.0;
TempM=23.0;
HumA=74.0;
HumB=85.0;
break;
}
printf(lcd_putc,"\nTA=%2.2f TB=%2.2f\nHA=%2.2f HB=%2.2f",TempA,TempB,HumA,HumB);
printf("Valores %2.2f %2.2f %2.2f %2.2f %2.2f\r",TempA,TempB,TempM,HumA,HumB);
//printf("Valores %2.2f %2.2f %2.2f %2.2f\r\n",TempA,TempB,HumA,HumB);
delay_ms(3000);
}
En la simulacion da 100 puntos, no hay ninguna falla, la TX y todo lo demás funciona perfecto.
Muchas gracias
-
Saludos
Muchas gracias por las "respuestas" :lol: :lol: :lol:
pero ya solucine el problema
gracias
-
¿Y cómo lo solucionaste?
-
Saludos
Muchas gracias por las "respuestas" :lol: :lol: :lol:
pero ya solucine el problema
gracias
Otro usuario que erróneamente cree que debemos saber todo y contestarle todo.
Se dan respuestas cuando se puede y cuando se sabe, si no las hay es porque no se puede ayudarte.