Autor Tema: Ayuda con input();  (Leído 2066 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Ayuda con input();
« en: 03 de Diciembre de 2015, 02:47:21 »
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).

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////////
//                                                                   
//                                                  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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con input();
« Respuesta #1 en: 03 de Diciembre de 2015, 04:21:27 »
Primero verificaria que valores tiene la entrada del PIC, que realmente tenga 5V o 0V y no intermedios.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re:Ayuda con input();
« Respuesta #2 en: 03 de Diciembre de 2015, 15:34:00 »
y no hay un retardo antirebote prudencial al leer el pin A1?

yo acostumbro a inicializar todos los puertos empezando en main, así utilice input()

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Re:Ayuda con input();
« Respuesta #3 en: 05 de Diciembre de 2015, 19:43:12 »
Primero verificaria que valores tiene la entrada del PIC, que realmente tenga 5V o 0V y no intermedios.
Tengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque, cuando le conecto directo los 5v me acciona el sistema, no se por que se aloca cuando conecto un cable que no tiene nadamas conectado, solo es el puro cable.


y no hay un retardo antirebote prudencial al leer el pin A1?

yo acostumbro a inicializar todos los puertos empezando en main, así utilice input()



Disculpa palitroquez, el retardo antirebote se hace poniendo un delay? o como hago el retardo antirebote, he cambiado el pin A1 a C1 pero cuando conecto el switch de nivel de liquido me se me aloca, una pata del switch lo tengo conectado a 5v y la otra pata del switch lo tengo conectado al pin C1, se supone que cuando no hay liquido el flotador del switch esta abajo y por lo tanto esta abierto el switch, cuando sube el nivel del liquido el flotador se va arriba y se cierra el switch por lo que tendria que conducir los 5v a la pata conectada al pin C1

este es el switch de nivel de liquido

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Ayuda con input();
« Respuesta #4 en: 05 de Diciembre de 2015, 20:48:12 »
Citar
Tengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque, 

Como bien te ha dicho killer, no puedes poner un intermedio, debes polarizar el pin.
Al ponerle un "simple cable" le estas poniendo una antena, y estas variando la tensión, lo suficiente como para que cambie de estado lógico 0a1 y viceversa.

Citar
Disculpa palitroquez, el retardo antirebote se hace poniendo un delay?

Respuesta corta, si, con un delay, respuesta larga, no debes usar delay hazlo con timers y una variable.

Un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Re:Ayuda con input();
« Respuesta #5 en: 05 de Diciembre de 2015, 20:54:20 »
Citar
Tengo otro problema, cambie el pin A1 al pin C1, cuando no hay ningun cable en la entrada c1 si me marca el mensaje de rellene su tanque, pero cuando conecto un cable (el cable no esta conectado a nada, solo es el puro cable) se aloca mi sistema, mi relevador se acciona y desacciona cada segundo, cuando desconecto el cable me marca de nuevo rellene el tanque, 

Como bien te ha dicho killer, no puedes poner un intermedio, debes polarizar el pin.
Al ponerle un "simple cable" le estas poniendo una antena, y estas variando la tensión, lo suficiente como para que cambie de estado lógico 0a1 y viceversa.

Citar
Disculpa palitroquez, el retardo antirebote se hace poniendo un delay?



Respuesta corta, si, con un delay, respuesta larga, no debes usar delay hazlo con timers y una variable.

Un saludo.
Disculpa, como podria hacerle para polarizar mi pin, ya le puse un delay pero lo unico que hace es que me varia mas lento, no se si pueda hacerlo con programacion o deba de ser poniendo un cable a tierra en la misma linea del pin en la protoboard, igual no se si sea mala idea haber cambiado al pin C1 ya que declare el puerto C como #use standard_io(c)
de antemano gracias amigo

Este es mi circuito
« Última modificación: 05 de Diciembre de 2015, 21:01:50 por zokter »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re:Ayuda con input();
« Respuesta #6 en: 05 de Diciembre de 2015, 21:12:44 »
un ejemplo de retardo antirebotes por softwares

Código: C
  1. if(!input(PIN_ENTRADA_DIGITAL)){
  2.     delay_ms(15);
  3.      if(!input(PIN_ENTRADA_DIGITAL)){
  4.          ....
  5.          ....

pero tendrás que probarlo (en físico), y dependiendo tendrás que ajustarle el tiempo o la cantidad de validaciones
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Re:Ayuda con input();
« Respuesta #7 en: 05 de Diciembre de 2015, 21:15:05 »
Me respondo a mi mismo, hizo lo que  juaperser1 y killer me dijeron, polarice el pin, le agregue una resistencia de 330ohms y quedo perfecto, ya me marca bien los valores de encendido y apagado, muchas gracias amigos, saludos

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Re:Ayuda con input();
« Respuesta #8 en: 05 de Diciembre de 2015, 21:17:14 »
un ejemplo de retardo antirebotes por softwares

Código: C
  1. if(!input(PIN_ENTRADA_DIGITAL)){
  2.     delay_ms(15);
  3.      if(!input(PIN_ENTRADA_DIGITAL)){
  4.          ....
  5.          ....

pero tendrás que probarlo (en físico), y dependiendo tendrás que ajustarle el tiempo o la cantidad de validaciones

Gracias por tu ayuda amigo, ya esta funcionando todo al 100, le agregue el retardo tambien, quedo al 100, luego subire el proyecto terminado, no es la gran cosa pero a alguien le servirá, saludos

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Ayuda con input();
« Respuesta #9 en: 05 de Diciembre de 2015, 21:59:34 »
Citar
le agregue una resistencia de 330ohms

Para polarizaciones utiliza una resistencia de 10K mejor. Por lo menos de 4K7 para arriba.


Un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw


 

anything