El LED del programa PIC está apagado con el mismo botón pulsador

1

He escrito un pequeño programa PIC en mikroC para encender y apagar un led con el mismo botón. Al presionar el interruptor, se encenderá el led y si se presiona nuevamente el mismo interruptor, el led se apagará. Aquí está el programa que escribí

void main()
{
TRISB=0X00;
TRISC=OXFF;
PORTB=0X00;
PORTC=0XFF;

while(1)
{
if (portc.f3==0) /*checking if the switch is pressed*/
portb = ~portb; /*if the switch is pressed, the led will go off if it is already          on or  the  led will go on if the it is already off*/
portc = 0xff;  
}
}
}

otra versión del mismo programa que he escrito es

void main()
{
int flag=0;
TRISB=0X00;
TRISC=OXFF;
PORTB=0X00;
PORTC=0XFF;

while(1)
{
if (portc.f3==0 && flag==0) 
{
portb = 0xff; 
flag=1;
portc=0xff
}
if (portc.f3==0 && flag==1)
{
porb=0x00;
flag=0;
portc=0xff;


}
}
}

en ambos casos no funciona como se esperaba. Cuando presiono, enciende el led. encendido pero después de un tiempo se apaga solo (sin volver a presionar el interruptor).

por favor, ayúdame y hazme saber qué hay de malo con mis programas, si los hay.

    
pregunta user3243008

3 respuestas

2

Pruebe una resistencia de pull-up de 10k en el pin de entrada. Las entradas no conectadas pueden flotar indeseablemente.

simular este circuito : esquema creado usando CircuitLab

Intenta hacer rebotes en el software.

    
respondido por el RedGrittyBrick
2

Intentaría algo como esto para el bucle:

while(1)
{
    //Check to see whether the switch is pressed and flag is set.
    //Then, toggle the port and reset the flag.
    if (portc.f3==0 && flag==1)
    {
        portb = ~portb;
        flag = 0;
    }
    //Now, wait until the switch is released until the port can be toggled again.
    //This way, if you hold the button down, it will not keep toggling the port
    //repeatedly. It will only toggle it once, then wait for the button to be released.
    else if (portc.f3==1 && flag==1)
    {
        flag = 1;
    }
}

Además, como se mencionó anteriormente, una resistencia de pull-up es una necesidad, y el rebote de algún tipo es una buena idea. Cuando se presiona el interruptor, tenderá a cambiar entre alta y baja muy rápidamente unas pocas veces durante la transición. Puede solucionar este problema mediante software o hardware.

Esto parece una buena referencia de publicación de anuncios . En el software, puede ser tan simple como establecer un retraso en la rutina de sondeo. En hardware, el circuito de rebote RC es una solución elegante.

    
respondido por el Justin Trzeciak
1

utilizar:

delay_ms (500);

después de encender y apagar el led

    
respondido por el Rafael Ayala

Lea otras preguntas en las etiquetas