#include <16F628A.h>
#use standard_io(b)
#fuses NOWDT,INTRC,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#byte PORTA=0x05
void main()
{ set_tris_a(0xFF);
set_tris_b(0xF0);
output_bit(PIN_B0,0x01);
while(true)
{ if(!bit_test(PORTA,0))
{ delay_ms(100);//ESPERO SUELTA
if(bit_test(PORTA,0))
output_bit(PIN_B0,!PIN_B0);}}
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
}Espero me puedan decir porque.
#include <16F628A.h>
#use standard_io(b)
#fuses NOWDT,INTRC,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#byte PORTA=0x05
void main(){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0xFF);
set_tris_b(0xF0);
output_bit(PIN_B0,0x01);
while(true){
if(bit_test(PORTA,0)){ //Si presionas el boton conectado a RA0
delay_ms(10); //ESPERO SUELTA
output_bit(PIN_B0,1); //RB0 sera igual a 1
}
else{ //De lo contrario
delay_ms(10); //ESPERO SUELTA
output_bit(PIN_B0,0); //RB0 sera igual a 0
}
}
}#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#byte PORTB=0x06
void main()
{
int1 anterior =true;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0xF0);
// Asumiendo que el cátodo esté conectado al negativo y el ánodo al
// pin B0 a través de una resistencia...
output_low(PIN_B0); // LED apagado
while(true)
{
// Asumiendo que la tecla en RA0 tiene una resistencia pullup....
if( !input(PIN_A0))
{
if(anterior)
{
if (!bit_test(PORTB,0)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
anterior = false;
}
}
else
anterior = true;
}
}void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0xF0);
// Asumiendo que el cátodo esté conectado al negativo y el ánodo al
// pin B0 a través de una resistencia...
output_low(PIN_B0); // LED apagado
while(true)
{
// Asumiendo que la tecla en RA0 tiene una resistencia pullup....
while( !input(PIN_A0)); //Esperar hasta que se presione RA0.
if (!bit_test(PORTB,0)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
}
}
Otra forma de resolver ese problema es esperando hasta que la tecla sea presionada, para ello lo puedes hacer de dos formas, mediante una tecnia a la que llamamos polling, o mediante interrupciones.
La tecnica polling es similar a la que muestra bmb y sería de la siguiente manera.Código: [Seleccionar]void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0xF0);
// Asumiendo que el cátodo esté conectado al negativo y el ánodo al
// pin B0 a través de una resistencia...
output_low(PIN_B0); // LED apagado
while(true)
{
// Asumiendo que la tecla en RA0 tiene una resistencia pullup....
while( !input(PIN_A0)); //Esperar hasta que se presione RA0.
if (!bit_test(PORTB,0)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
}
}
Otra forma de resolver ese problema es esperando hasta que la tecla sea presionada, para ello lo puedes hacer de dos formas, mediante una tecnia a la que llamamos polling, o mediante interrupciones.Este programa funciona, lo que pasa es que no elimina el rebote y a veces falla.Es por esa razon es que yo ponia un delay para eliminar el rebote.
La tecnica polling es similar a la que muestra bmb y sería de la siguiente manera.Código: [Seleccionar]void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0xF0);
// Asumiendo que el cátodo esté conectado al negativo y el ánodo al
// pin B0 a través de una resistencia...
output_low(PIN_B0); // LED apagado
while(true)
{
// Asumiendo que la tecla en RA0 tiene una resistencia pullup....
while( !input(PIN_A0)); //Esperar hasta que se presione RA0.
if (!bit_test(PORTB,0)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
}
}
...Este programa funciona, lo que pasa es que no elimina el rebote y a veces falla.Es por esa razon es que yo ponia un delay para eliminar el rebote.
Este programa funciona, lo que pasa es que no elimina el rebote y a veces falla.Es por esa razon es que yo ponia un delay para eliminar el rebote.
Hola bigluis. Asi como dices, el LED va a estar encendiendo y apagando constantemente. Aunque (me imagino que por olvido) no le pusiste los corchetes {} al segundo while y si cambiaras la instrucción while( !input(PIN_A0)); por while( input(PIN_A0));, de todos modos mientras el pulsador esté presionado va a cambiar constantemente el estado del LED. De ahí que se use una bandera para evitar esto.
output_low(PIN_B0); // LED apagado
while(true)
{
// Asumiendo que la tecla en RA0 tiene una resistencia pullup....
while(input(PIN_A0)); //Esperar hasta que se presione RA0.
if (!bit_test(PORTB,0)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
delay_ms(10); //Retardo para eliminar Rebotes.
while(!input(PIN_A0)); //Esperar hasta que se suelte RA0.
}
}
Yo no uso el proteus, lo armo en proto, este es el esquematico...Este programa funciona, lo que pasa es que no elimina el rebote y a veces falla.Es por esa razon es que yo ponia un delay para eliminar el rebote.
Hola soymoe. Me alcanzaste a preocupar, monté el circuito en Proteus y como había dicho en el post anterior, el LED prende y apaga constantemente. Podrías subir tu esquemático para ver el por que a ti si te funciona? Te adjunto una simulación en Proteus con los dos códigos fuentes y los compilados para que hagas las pruebas.
Saludos!
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#byte PORTB=0x06
void main()
{
int1 presiono =false;
int1 solto =false;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x0F);
set_tris_b(0xF0);
// Asumiendo que el cátodo esté conectado al negativo y el ánodo al
// pin B0 a través de una resistencia...
output_low(PIN_B0); // LED apagado
while(true)
{presiono =false;
solto =false;
while(input(PIN_A0)&(!presiono));//Esperar hasta que se presione RA0.
{delay_ms(100);}
presiono=true;
while(!input(PIN_A0));//Esperar hasta que se suelte RA0.
{delay_ms(100);}
solto=true;
if (!bit_test(PORTB,0)&(presiono)&(solto)) // Si el LED está apagado
output_high(PIN_B0); // Enciende el LED
else
output_low(PIN_B0); // Si no, lo apaga
}}Quizas no sea lo mas elegante pero funciona. Se los dejo para lo que les interese.
Hola AngelGris, creo que tu programa difiere al de bigluis en algo bien importante y es en la forma de esperar a que se pulse el botón en A0. En tu programa tienes: if (RA0 == 0) que básicamente es de la misma forma en que yo lo tengo en el mio: if( !input(PIN_A0));. Bigluis lo hace asi: while(input(PIN_A0)); en su código. Como bien sabes, si el programa se encuentra un if(), simplemente revisa si su condición es verdadera o falsa; bien sea que encuentre que la condición es verdadera o falsa, cumple con las instrucciones asociadas y el programa sigue corriendo normalmente. Mientras que si el programa se encuentra con una instrucción while(), se va a detener en ella y no va a ejecutar ninguna otra instrucción hasta que su condición sea verdadera y salga del ciclo while. Mi punto es que si al programa se le adicionaran más intrucciones y más adelante tuviese que estar revisando por ejemplo, la condicón de otras entradas diferentes a A0, no lo podría hacer ya que el programa se detendría en el primer ciclo while() que encontrase.
Hasta aqui, está muy bien tu código incluso mejor ya que al mio le falta insertarle un atirrebotes. En el código de ejemplo que pongo en el post #4 utilizo una bandera para evitar que vuelva a entrar a la instrucción de revisión del estado de A0, en caso de dejar presionada la tecla. Con esta bandera simplemente se pasa por alto la instrucción y el programa sigue corriendo normalmente en caso de que tuviese que cumplir con otras tareas. Tanto en tu programa, como en el de bigluis, hacen esto con una instrucción while() mientras se suelta el botón con las consecuencias que ya mencioné. En este último caso se que podría tratarse tan solo de algunos 'milisegundos' mientras se suelta el pulsador, pero en una aplicación con muchas funciones y cierto grado de complejidad unos 'milisegundos' pueden llegar ser una 'eternidad' y hacer que el programa no funcione apropiadamente.
Saludos!
Cuando comencé con el CCS, compré un libro que se llama:
PICmicro MCU C
An Introduction to Programming the Microchip PIC in CCS C
By Nigel Gardner.