Amigos tengo un problema, se supone que mi programa cuando haya 5v en el pin A1 permitira accionar una bomba de agua, cuando no haya voltaje no podra activar la bomba de agua...En teoria eso deberia de hacer, el codigo que hice en proteus funciona bien pero cuando lo echo a andar en mi pic se vuelve loco, alterna los valores de A1 de 1 a 0 repetidamente, lo que hace que mi relevador se vuelva loco, no se si estoy activando bien mi entrada de A1 o que es lo que me esta fallando...
PD: (algunas anotaciones de mi programa estan desfasadas o mal explicadas por que le anexe mas codigo y no las he acomodado).
////////////////////////////////////////////////////////////////////////////////////
//
// 26/noviembre/15
//
//
// Programa: Sistema de riego automatico
// Version: 1.0
//
// Dispositivo: PIC 18DF4550 Compilador: CCS vs3.249
// Entorno IDE: MPLAB IDE v7.31 Simulador: Proteus 8.1 sp1
//
// Notas: Este programa mide la humedad de la tierra en una maseta y la
// compara con unos parametros prestablecidos en su memoria, si
// es menor a la minima enciende una bomba que suministra agua a
// la tierra de la maseta hasta llegar al maximo prestablecido
// para el mejor desarrollo de la planta.
//
//
//
//////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h> //incluir la libreria del pic 18f4550
#device adc=10 //Configuracion del convertidor a/d de 10 bits
#use delay(clock=4M) //velocidad del reloj interno a 4MHz
#fuses XT,NOWDT //Activacion de fuses
#define D0 enable ///////////////////////////////////////////////////
#define D1 rs //
#define D2 rw // Declararacion de los pines
#define D4 D4 // que se usaran para controlar
#define D5 D5 // la LCD
#define D6 D6 //
#define D7 D7 ///////////////////////////////////////////////////
#include <lcd4202.c> // LLamado a la libreria que controla las funciones del LCD
#include <KBD1.c> // LLamado a la libreria que controla al teclado 4x4
#define in_port pin_A1
#use standard_io(c) // Configurando el puerto C
void main() //
{
int16 q; // variable de 16bits que almacena el valor del ADC del higrometro
float T; // variable de tipo flotante que guarda el valor de una operacion de "q"
int humedad; // variable que guarda el valor de humedad del 0% al 100%
char k; // variable de tipo cadena utilizada para saber que tecla se oprimio en el teclado
int hmin; // Variable de humedad minima
int hmax; // variable de humedad maxima
int val;
val=0;
setup_adc_ports(AN0);//condigura el pin de entrada del ADC en este caso el pin A0
setup_adc(ADC_CLOCK_INTERNAL); //configura el reloj interno del ADC
lcd_init(); //inicializa la LCD
kbd_init(); //inicializa el teclado
port_b_pullups(TRUE);//activa las resistencias internas del puerto b
menu: //etiqueta de nombre menu que servira para regresar con la instruccion goto a este punto
printf(lcd_putc,"\f Tipo de planta:"); //imprime en la LCD la oracion "tipo de planta"
k=0; //valor de k a cero
while(K==0) //bucle que se repite siempre que k sea igual a cero
{
k=kbd_getc(); // k sera igual a la tecla introducida en el teclado
switch (k) // sentencia switch que depende del valor de k
{
case '1': ////////////////////////////////////
hmin=60; //
hmax=80; //
break; //
case '2': // Casos dependiendo de la
hmin=45; // tecla que se introduzca en
hmax=80; // el teclado
break; // Se definen los valores de
case '3': // humedad minima y maxima
hmin=20; //
hmax=30; //
break; ////////////////////////////////////
}
}
principal: //Etiqueta de nombre 'principal'
while(true) //Bucle infinito
{
k=kbd_getc(); //k sera igual al valor tecleado
set_adc_channel(0); //lectura del canal cero
delay_us(20); // retardo
q=read_adc(); //de le asigna el valor a q de lo leido en el canal cero del ADC
q=1023-q; // seinvierte el valor de q
T=(5.0*q)/1024; //Operacion matematica que le asigna el valor a T
humedad=(100*T)/5; //conversion a porcentaje
humedad=1.43*humedad; //correccion del valor de porcentaje de la humedad
delay_us(10);
lcd_gotoxy(1,1); // se posiciona en la linea uno y columna uno de la LCD
printf(lcd_putc, "Humedad = %3d%% ", humedad); // Da salida a la oracion y al valor de la variable humedad en forma de porciento
lcd_gotoxy(1,3); // se posiciona en la linea 1 y columna tres de la LCD
printf(lcd_putc,"H.Min:%2d%%H.Max:%2d%%",hmin,hmax ); // Da salida a la oracion y al valor de las variables de humedad minima y maxima seleccionada en un principio
val= input(pin_A1);
lcd_gotoxy(1,4);
printf(lcd_putc,"tanque %u",val );
k=kbd_getc(); //k sera igual al valor tecleado
if (k=='A'){ //sentecia condicional de comparacion del valor de k
goto menu; //si k es igual a la letra 'A' se posiciona en la etiqueta 'menu'
}
if(humedad <= hmin) ////////////////////////////////////////////
{ // Si el valor de humedad es menor o igual al
if(!input(PIN_A1)){
lcd_gotoxy(1,2); // valor de hmin entonces da salida en la fila tres
printf(lcd_putc,"Rellene tanque ");
output_low(pin_c0);
}
else if (input(PIN_A1)){
lcd_gotoxy(1,2); // valor de hmin entonces da salida en la fila tres
printf(lcd_putc,"bomba on "); // la oracion bomba on, que significa que se prendera la bomba
output_high(pin_c0); // y manda la señal al pinC0 de ponerse en nivel alto
}
} ////////////////////////////////////////////
else if(humedad >= hmax ) //////////////////////////////////////////
{ // Si el valor de humedad es mayor o igual al maximo
lcd_gotoxy(1,2); // entonces se imprimira 'bomba off' en la lcd
printf (lcd_putc,"bomba off "); // y el pinc0 quedara en nivel bajo, por lo que se
output_low(pin_c0); // apagara la bomba
} //////////////////////////////////////////
}
} //fin del programa