Autor Tema: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --  (Leído 4604 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #15 en: 16 de Marzo de 2015, 09:55:10 »
Entonces el problema esta resuelto?

Resp.- No, la Falla persiste. Cuando mantengo oprimido el Pulsador, el tiempo supera los 30 Segundos programados. Al liberar el Pulsador, el Pin RB0 debería pasar inmediatamente el Estado Lógico "0" y no lo hace, espera aproximadamente 20 Segundos y luego adquiere el Estado "0".
Lo que yo quisiera, es que en el bendito PIC, RB0 pase a "0", apenas libere el Pulsador, ya que así está Programado el PIC, sin embargo, por razones que desconozco, NO LO HACE.
He probado con SIETE Circuitos Integrados diferentes, todos ellos con el mismo número: PIC16F628 y TODOS presentan la misma Falla.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #16 en: 16 de Marzo de 2015, 11:50:20 »
Tal vez diga una burrada, ya que no se nada del lenguaje c. Pero me parece que el error está en la línea if(input(PIN_A0)) ¿Donde indicas la espera de un 1 lógico?

Resp. Muchas Gracias al Amigo Leon Pic por su Respuesta. En realidad, cuando se utilizan la Sentencias "if-else" , las Sintaxis equivalentes son:

1.- if(input(Pin_A0))

2.- if(input(Pin_A0)==1)

De ambas maneras se pueden escribir y el Resultado siempre será el mismo, de hecho, al Compilar, NO se genera NINGÚN ERROR. Muchas Gracias por su Respuesta.

Gracias.

PD: En otro foro, donde publicaste la duda, te han dado una ayuda que veo que aquí nadie te la dio. HJ te sugiere que la falta de configurar las entradas como digitales, puede ser el problema.
Saludos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #17 en: 16 de Marzo de 2015, 12:28:28 »
Tal vez diga una burrada, ya que no se nada del lenguaje c. Pero me parece que el error está en la línea if(input(PIN_A0)) ¿Donde indicas la espera de un 1 lógico?

Resp. Muchas Gracias al Amigo Leon Pic por su Respuesta. En realidad, cuando se utilizan la Sentencias "if-else" , las Sintaxis equivalentes son:

1.- if(input(Pin_A0))

2.- if(input(Pin_A0)==1)

De ambas maneras se pueden escribir y el Resultado siempre será el mismo, de hecho, al Compilar, NO se genera NINGÚN ERROR. Muchas Gracias por su Respuesta.

Gracias.

PD: En otro foro, donde publicaste la duda, te han dado una ayuda que veo que aquí nadie te la dio. HJ te sugiere que la falta de configurar las entradas como digitales, puede ser el problema.
Saludos.


Resp.- Gracias al Amigo Leon Pic por su Comentario. Ciertamente, le respondía al Amigo HJ en el otro Foro. Las Entradas, ciertamente están debidamente Configuradas. Gracias.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #18 en: 16 de Marzo de 2015, 12:39:24 »
Ok veo lo siguiente, a ver si por alli van los tiros  :D
Cuando el switch esta abierto el pin_b0 esta en cero.
Luego al presionar el switch se entra a una rutina de retardo donde se espera 30 segundos y luego se activa el pin_b0, hasta alli deberia funcionar todo bien  :mrgreen:

Despues si dejas de presionar el switch el pin_b0 no se desactivara de inmediato, porque?
porque si en el momento en que tu dejes de presionar el switch el programa esta en la rutina de retardo de 30 segundos el programa no revisara el estado del switch hasta que termine de ejecutar la rutina de retardo, la duracion de esta dependera del momento en que liberastes el switch.
Otra cocita que se me paso decirte, si el switch estando abierto inicialmente lo presionas y sueltas, el led encendera luego de 30 segundos, pero como el tiempo que durara encendido estan corto que posible no lo veas por lo que te recomiendo colocar luego de on(pin_b0), un retardo de digamos 200 ms. y veras como parpadea el led.

Revisa eso y nos comentas si es asi.
Con respecto a la configuracion de las entradas como digitales eso el ccs lo hace de forma automatica por lo que no se requiere configurar el registro CMCON   ;-)

Y problema resuelto!  :D

Saludos
« Última modificación: 16 de Marzo de 2015, 12:50:28 por RALF2 »

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #19 en: 16 de Marzo de 2015, 13:09:39 »
Ok veo lo siguiente, a ver si por alli van los tiros  :D
Cuando el switch esta abierto el pin_b0 esta en cero.
Luego al presionar el switch se entra a una rutina de retardo donde se espera 30 segundos y luego se activa el pin_b0, hasta alli deberia funcionar todo bien  :mrgreen:

Despues si dejas de presionar el switch el pin_b0 no se desactivara de inmediato, porque?
porque si en el momento en que tu dejes de presionar el switch el programa esta en la rutina de retardo de 30 segundos el programa no revisara el estado del switch hasta que termine de ejecutar la rutina de retardo, la duracion de esta dependera del momento en que liberastes el switch.
Otra cocita que se me paso decirte, si el switch estando abierto inicialmente lo presionas y sueltas, el led encendera luego de 30 segundos, pero como el tiempo que durara encendido estan corto que posible no lo veas por lo que te recomiendo colocar luego de on(pin_b0), un retardo de digamos 200 ms. y veras como parpadea el led.

Revisa eso y nos comentas si es asi.

Con respecto a la configuracion de las entradas como digitales eso el ccs lo hace de forma automatica por lo que no se requiere configurar el registro CMCON   ;-)

Y problema resuelto!  :D

Saludos


Resp.- Gracias Nuevamente por Responder. Efectivamente, el Pulsador lo mantengo oprimido hasta que se cumpla la Rutina de Retardo y active el LED conectado en RB0. Eso lo ejecuta bien. ¿Qué sucede cuando procedo a liberar el Pulsador, una vez hecho lo anterior?, pues como dije en otra ocasión, el Puerto se mantiene activo, el LED continúa Encendido, y luego de 20 Seg. aproximadamente, el LED se apaga. Eso NO debería ocurrir. Lo idóneo sería que una vez culminada la Rutina de Retardo y el LED proceda a encenderse, al momento de liberar el Pulsador, el LED debería Apagarse inmediatamente; pero no lo hace. En su defecto, espera aproximadamente 20 Seg. y luego se apaga y así permanece hasta tanto se repita el procedimiento.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #20 en: 16 de Marzo de 2015, 13:26:04 »
A ok pero el programa que realizastes no hace eso  :?
Hay qyue modificarlo dejame revisarlo y te lo pongo a funcionar como deseas mientras ve tu tambien pensando en la solucion  :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #21 en: 16 de Marzo de 2015, 13:49:34 »
De todas formas vas a tener que agregar unos if() luego del delay, o directamente usar las interrupciones.
O si no para que no vuelva a entrar a la condicion, deberias de agregarle un if si el pin_b0 esta en 1, si esta en uno
Me explico con el ejemplo:


Citar
Void Main()                           // Programa Principal.
{                                          // Inicio del Programa Principal.
   Port_B_Pullups(0xFF);         // Activación de Resistores Pullups
     
   While(true)                         // Activa un Ciclo Infinito.
      {                                    // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))              // Si RA0 está en "1".
            {                              // entonces...
            Off(Pin_B0);              // El Pin RB0 entrega siempre un "0".
            }
      else                                // De lo Contrario...     
            {
            if (!input_state(pin_b0))   // CREO QUE ASI SE LEE UNA SALIDA, NO USO CCS
                {
                On(Pin_B0); 
                Delay_ms(500);     // Espera 30 Segundos
                Off(Pin_B0);  // y activa el Pin RB0.
                Delay_ms(500);
                }
            }
      }                                   // Fin del Ciclo Infinito
}     


De esa forma solo entraria nuevamente al delay si la salida esta en 0 y mantenes presionado el boton, tampoco se apagaria hasta que no lo soltes.
Aun te faltaria resolver, eso que podes presionar 1 segundo para que entre en la demora y leugo presionar empezar a mantener presionado 25 segundos despues y funcionaria de la misma forma.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #22 en: 16 de Marzo de 2015, 13:51:58 »
Prueba a ver si te gusta este.  :D

Citar
#Include <16F628.h>                     // Incluye la Librería del PIC a Utilizar.
#Fuses NOWDT, NOBROWNOUT       // Fusibles: Palabras de Configuración
#Fuses NOLVP, PROTECT                // Fusibles: Palabras de Configuración
#Use Delay(internal= 4000000)            // Frecuencia del Oscilador en el Circuito
#Use Standard_IO(A)                     // Para Optimizar el Código
#Use Standard_IO(B)                     // Para Optimizar el Código
#Define On        Output_High          // Para abreviar escritura
#Define Off       Output_Low           // Para abreviar escritura

/////////////////////////////////////////////////////////////////////////////////////////

Void Main()                           // Programa Principal.
{                                          // Inicio del Programa Principal.
   //Port_B_Pullups(0xFF);         // Activación de Resistores Pullups
   int1 flag= 0; 
   While(true)                         // Activa un Ciclo Infinito.
      {                                    // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))              // Si RA0 está en "1".
            {                              // entonces...
            Off(Pin_B0);              // El Pin RB0 entrega siempre un "0".
            flag= 0;
            }
      else                                // De lo Contrario...     
            {
            if(!flag)
               Delay_ms(30000);     // Espera 30 Segundos
            On(Pin_B0);
            flag= 1;
            }
      }                                   // Fin del Ciclo Infinito
}                                         // Final del Programa

Saludos

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #23 en: 16 de Marzo de 2015, 14:23:35 »
Prueba a ver si te gusta este.  :D

Citar

//////////////////////////////////////////////////////////////////////////////////////////////////
#Include <16F628.h>                     // Incluye la Librería del PIC a Utilizar             //
#Fuses NOWDT, NOBROWNOUT       // Fusibles: Palabras de Configuración            //
#Fuses NOLVP, PROTECT                // Fusibles: Palabras de Configuración            //
#Use Delay(internal= 4000000)       // Frecuencia del Oscilador en el Circuito        //
#Use Standard_IO(A)                     // Para Optimizar el Código                           //
#Use Standard_IO(B)                     // Para Optimizar el Código                           //
#Define On        Output_High          // Para abreviar escritura                              //
#Define Off       Output_Low            // Para abreviar escritura                             //
                                                                                                                      //
////////////////////////////////////////////////////////////////////////////////////////////////

Void Main()                              // Programa Principal.
{                                             // Inicio del Programa Principal.
   int1 flag= 0;  
   While(true)                            // Activa un Ciclo Infinito.
      {                                       // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))                 // Si RA0 está en "1".
            {                                 // entonces...
            Off(Pin_B0);                 // El Pin RB0 entrega siempre un "0".
            flag= 0;
            }
      else                                   // De lo Contrario...    
            {
            if(!flag)
               Delay_ms(30000);     // Espera 30 Segundos
            On(Pin_B0);
            flag= 1;
            }
      }                                       // Fin del Ciclo Infinito
}                                             // Final del Programa

Saludos

Resp.- MUCHAS GRACIAS al Amigo RALF2. Ahora si está Funcionando PERFECTAMENTE BIEN!. Todavía no Comprendo cómo se generó esa Falla. Voy a revisar Bien el Código que me acabas de Suministrar. MUCHAS GRACIAS A TODOS POR SU VALIOSA COLABORACIÓN. Un Abrazo!...  ((:-)) :-/

- Finalmente Amigo RALF2, desearía que Por Favor, en lo que estés desocupado, me puedas explicar el por qué el Programa Inicial No Funcionaba bien. Todavía no logro entender el por qué No Funcionaba con dicha Programación. Muchas Gracias... :mrgreen:
« Última modificación: 16 de Marzo de 2015, 18:43:08 por Carabobo1 »

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Funcionando Bien.
« Respuesta #24 en: 16 de Marzo de 2015, 15:01:35 »
.
« Última modificación: 16 de Marzo de 2015, 18:27:04 por Carabobo1 »

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Funcionando Bien.
« Respuesta #25 en: 16 de Marzo de 2015, 18:22:02 »
.
« Última modificación: 16 de Marzo de 2015, 18:25:12 por Carabobo1 »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
« Respuesta #26 en: 16 de Marzo de 2015, 18:30:50 »
No funciona por lo que te comente anteriormente, si mantienes presionado el switch luego de 30 segundos el led enciende, luego cuando el programa pregunte por el estado del switch y vea que aun esta presionado volvera a entrar la rutina de retardo, luego si en ese momento dejas de presionar el switch el programa no se enterara hasta que termine de ejecutar la rutina de retardo vuelva a mandar a prender el pin_b0 y luego posteriormente es que preguntara por el estado del switch que al verlo abierto mandara a apagar finalmente el pin_b0.   :mrgreen:

Saludos

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
« Respuesta #27 en: 16 de Marzo de 2015, 18:46:21 »
No funciona por lo que te comente anteriormente, si mantienes presionado el switch luego de 30 segundos el led enciende, luego cuando el programa pregunte por el estado del switch y vea que aun esta presionado volvera a entrar la rutina de retardo, luego si en ese momento dejas de presionar el switch el programa no se enterara hasta que termine de ejecutar la rutina de retardo vuelva a mandar a prender el pin_b0 y luego posteriormente es que preguntara por el estado del switch que al verlo abierto mandara a apagar finalmente el pin_b0.   :mrgreen:

Saludos

Resp.- Tienes Razón, no había pensado en eso; lo que pasa es que no suelo Programar PIC's con Frecuencia y no tengo mucha habilidad en la Programación. Muchas Gracias Nuevamente Compañero... estamos en contacto.  ((:-))

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
« Respuesta #28 en: 16 de Marzo de 2015, 20:22:45 »
Mi pregunta es... por que crear una variable para leer un bit de un puerto ?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
« Respuesta #29 en: 16 de Marzo de 2015, 20:49:36 »
Haces un flag (lo que hizo Ralf) o haces una rutina debounce.
para aplicaciones sencillas es mejor un flag.
Si ese flag no esta el programa lee muchas veces el bit del cambio, de esta forma lo lee y ya no puede volver a hacerlo...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.