te falta añadir el código antirebote
#Include <16F628.h> // Incluye la Librería del PIC a Utilizar.mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.
#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
}
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.mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.
#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
}
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.
Entonces el problema esta resuelto?
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.
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.
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
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
}
#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
Prueba a ver si te gusta este. :DCitar
//////////////////////////////////////////////////////////////////////////////////////////////////
#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:
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