TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Carabobo1 en 15 de Marzo de 2015, 22:32:44

Título: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: Carabobo1 en 15 de Marzo de 2015, 22:32:44
 8) Saludos a Todos los Amigos (as) del Foro TODOPIC, esperando que se encuentren Muy Bien.

 Una vez más, acudo a Ustedes en referencia a un problema que se me está presentando con un Programa realizado en Lenguaje "C", empleando Compilador CCS Versión 5.07. y Microcontrolador PIC16F628.
 
 El Código de la Programación es el siguiente:

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

#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=4MHz)            // 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
    
   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...      
            {
            Delay_ms(30000);     // Espera 30 Segundos
            On(Pin_B0);              // y activa el Pin RB0.
            }
      }                                   // Fin del Ciclo Infinito
}                                         // Final del Programa

  El Problema consiste en que cuando dejo Oprimido el Pulsador conectado en el Pin RA0, el cual está configurado como entrada (Ver Esquema en Archivo Adjunto), el tiempo transcurrido para activar al Pin RB0 que está configurado como Salida, por lo general es mayor a 30 Segundos, por lo que el PIC no respeta lo establecido en la Programación.
  
  Una vez activado el Pin RB0, al liberar el Pulsador, (según lo establecido en la Programación) dicho terminal debería retornar inmediatamente al Estado Lógico "0", pero no lo hace, en su defecto, espera casi 30 Segundos para llegar a dicho estado.
  
  No comprendo el por qué de este comportamiento en el Microcontrolador. Agradecería la Mayor Colaboración posible.
  

  Quisiera Agradecer a TODOS (AS) por sus valiosos Aportes en este Foro, los cuales me han sido verdaderamente Muy Útiles en esta área tan especial de la Electrónica. Saludos y Mucho éxito para TODOS (AS).  ((:-))
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: KILLERJC en 15 de Marzo de 2015, 22:52:36
No creo que sea el problema pero:

#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito

Esta mal... segun el manual de CCS no existe ninguna opcion asi.
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf (Pag 185)
Y es:

#Use delay(clock=4000000)            // Frecuencia del Oscilador en el Circuito

Acepta Mhz y si queres poner el tipo, es type=int (con esto no hace falta poner la frecuencia segun el manual)
Y lo del delay_ms() va de 0 a 65535 asi que esta en rango.

Deberia dar algo aproximado a los 30seg. Si quisieras un tiempo mas exacto entonces mejor una interrupcion y un cristal de 32k
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Leon Pic en 15 de Marzo de 2015, 22:54:39
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?
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: MGLSOFT en 15 de Marzo de 2015, 23:05:12
En realidad debes poner el negado de input, porque cuando presionas el pulsador se pone a masa, no a 5 V.

Código: C
  1. if(!input(Pin_A0))              // Si RA0 está en "0".
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 en 15 de Marzo de 2015, 23:07:48
No creo que sea el problema pero:

#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito

Esta mal... segun el manual de CCS no existe ninguna opcion asi.
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf (Pag 185)
Y es:

#Use delay(clock=4000000)            // Frecuencia del Oscilador en el Circuito

Acepta Mhz y si queres poner el tipo, es type=int (con esto no hace falta poner la frecuencia segun el manual)
Y lo del delay_ms() va de 0 a 65535 asi que esta en rango.

Deberia dar algo aproximado a los 30seg. Si quisieras un tiempo mas exacto entonces mejor una interrupcion y un cristal de 32k



Resp.- Muchas Gracias al Amigo KILLERJC por su Respuesta. El Código fue elaborado usando el Asistente para la Creación de Proyectos del Compilador CCS Vers. 5.007, es por ello que se aprecia la Sentencia: #Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito la cual fue colocada automáticamente por el Compilador.
No quisiera usar un Oscilador Externo, por algo los PIC's traen esa opción de Oscilador Interno, la cual quisiera Aprovechar. Una vez más, Muchas Gracias por haber Respondido.  :)
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 en 15 de Marzo de 2015, 23:13:39
Coloca en los fuses: INTRC_IO, para que operes con el oscilador interno.

Saludos
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 en 15 de Marzo de 2015, 23:16:59
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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 en 15 de Marzo de 2015, 23:26:36
Coloca en los fuses: INTRC_IO, para que operes con el oscilador interno.

Saludos
[/quote]


Saludos al Amigo RALF2.
Acabo de hacer lo que me indicaste y funciona exactamente igual. No hay cambios. Gracias por el Comentario.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: PalitroqueZ en 15 de Marzo de 2015, 23:28:36
te falta añadir el código antirebote
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: KILLERJC en 15 de Marzo de 2015, 23:35:22
te falta añadir el código antirebote

Con 30 segundos no creo que importe xD jeje
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 en 15 de Marzo de 2015, 23:44:45
Hola Amigo, Gracias por el Comentario. En realidad no creo que se trate de un Problema de Rebote Mecánico, ya que al liberar el Pulsador, la Entrada RA0 inmediatamente recibe un Nivel Lógico "Alto" y en consecuencia, la Salida RB0 debería conmutar inmediatamente al estado "Off" (Cero Lógico "0"). Pero no lo hace, RB0 se queda en estado Alto alrededor de 20 Seg. y luego pasa a Cero Lógico ("0"). Yo quisiera que conmutara inmediatamente a "0", pero no lo hace...
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 en 15 de Marzo de 2015, 23:48:33
Ok veamos lo siguiente.
Cuando presionas el boton a partir de ese momento empieza a transcurrir los 30 segundos mas o menos (por el rebote del contacto).
Pasados los 30 segundo el led enciende  :mrgreen:
revisa eso porque esa es la secuencia.

Lo otro para saber si el oscilador esta bien seteado puedes hacer lo siguiente:

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=4MHz)            // 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
    
   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...    
            {
            On(Pin_B0);  
            Delay_ms(500);     // Espera 30 Segundos
            Off(Pin_B0);  // y activa el Pin RB0.
            Delay_ms(500);
            }
      }                                   // Fin del Ciclo Infinito
}        
mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.

Saludos
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: KILLERJC en 15 de Marzo de 2015, 23:53:52
O... para que tener 2 condiciones ? xD

Código: C
  1. While(true)                        
  2.       {                                  
  3.       if(!input(Pin_A0))            
  4.             {
  5.             On(Pin_B0);  
  6.             Delay_ms(30000);
  7.  
  8.             }
  9.       Off(Pin_B0);
  10.       }
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 en 16 de Marzo de 2015, 00:01:19
Ok veamos lo siguiente.
Cuando presionas el boton a partir de ese momento empieza a transcurrir los 30 segundos mas o menos (por el rebote del contacto).
Pasados los 30 segundo el led enciende  :mrgreen:
revisa eso porque esa es la secuencia.

Lo otro para saber si el oscilador esta bien seteado puedes hacer lo siguiente:

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=4MHz)            // 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
    
   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...    
            {
            On(Pin_B0);  
            Delay_ms(500);     // Espera 30 Segundos
            Off(Pin_B0);  // y activa el Pin RB0.
            Delay_ms(500);
            }
      }                                   // Fin del Ciclo Infinito
}        
mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.

Saludos

Resp.-

Acabo de hacer la Prueba con la modificación del código que propones. Funciona Perfectamente bien, de hecho, ya anteriormente había hecho una prueba similar y funcionó Muy Bien.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 en 16 de Marzo de 2015, 07:45:02
Entonces el problema esta resuelto?
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Leon Pic 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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 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
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 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:
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: KILLERJC 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.
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: RALF2 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
Título: Re: Problema con la Sentencia Delay_ms(tiempo)
Publicado por: Carabobo1 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:
Título: Funcionando Bien.
Publicado por: Carabobo1 en 16 de Marzo de 2015, 15:01:35
.
Título: Funcionando Bien.
Publicado por: Carabobo1 en 16 de Marzo de 2015, 18:22:02
.
Título: Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: RALF2 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
Título: Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: Carabobo1 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.  ((:-))
Título: Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: KILLERJC en 16 de Marzo de 2015, 20:22:45
Mi pregunta es... por que crear una variable para leer un bit de un puerto ?
Título: Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: MGLSOFT 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...
Título: Re: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --
Publicado por: KILLERJC en 16 de Marzo de 2015, 20:58:30
uh.. no lo habia pensado..
Muy mla constumbre mia de hacer anntirebote por hw :/