Conmutador como momentáneo con rebote

0

He estado tratando de hacer lo siguiente: Cuando un interruptor de palanca se gira hacia abajo, la imagen que estoy usando (16F1503) envía un pulso y enciende un led, cuando se levanta, envía el mismo pulso y apaga el led. Me las arreglé para improvisar un código y funciona muy bien. El problema es que necesito administrar otro interruptor que hace exactamente lo mismo, pero envía un pulso a un puerto diferente y enciende / apaga un led diferente. ¿Cualquier sugerencia? Estoy teniendo problemas, principalmente al deshacer múltiples interruptores.

Aquí está el código que estoy usando:

void main() 
{
uint8_t db_cnt;
PORTA=0;
PORTC=0;
ADCON0=0;
TRISA=0b001000;
TRISC=0b010000;


for(;;)
{
                //Wait for button press, debounce by counting:
                for (db_cnt=0; db_cnt <= 10; db_cnt++)
                {
                    __delay_ms(1);      //Sample every 1ms
                    if (TOGGLELEFT==0)  //If toggle off (RA3 low)
                        db_cnt=0;       //Restart count
                }                       //Until button on for 10 successive reads

                PORTA=0b100000;         //Turn OFF toggle LED, turn ON transistor
                __delay_ms(10);
                PORTA=0b000000;         //Turn OFF transistor

                //Wait for button release, debounce by counting:
                for (db_cnt=0; db_cnt <=10; db_cnt++)
                {
                    __delay_ms(1);      //Sample every 1ms
                    if (TOGGLELEFT==1)         //If toggle on (RA3 high)
                        db_cnt=0;       //Restart count 
                }                       //Until button off for 10 successive reads

                PORTA=0b110000;         //Turn ON toggle LED and transistor
                __delay_ms(10);
                PORTA=0b010000;         //Turn OFF transistor 
}
}
    
pregunta Mssc

1 respuesta

1

Su principal problema al expandir esto de un interruptor y un LED a dos es que necesita realizar un seguimiento del estado de cada par por separado pero al mismo tiempo. Así que usaría dos máquinas estatales y dos contadores. Algo como esto:

state1 = 0;
state2 = 0;

while (1)
{
    switch(state1)
    {
       case 0:
           if (TOGGLELEFT==1)
               state1 = 1;      // go debounce next
               counter1 = 0;
           break;
       case 1:
           if (TOGGLELEFT==1)
               counter1++;
           else
               state1 = 0;      // start over
           if (counter1 > 10)   // after 10 ms,
           {
              PORTA=0b100000;   // turn OFF toggle LED, turn ON transistor
              state1 = 2;
           }
           break;
       case 2:
           counter1++;
           if (counter1 > 10)    // after 10 ms
           {
              PORTA=0b000000;    // turn OFF transistor
              state1 = 3;
           }
           break;
       case 3:
           if (TOGGLELEFT==0)
               state1 = 5;       // go debounce next
               counter1 = 0;
           break;
       case 3:
           if (TOGGLELEFT==0)
               counter1++;
           else
               state1 = 3;       // start over
           if (counter1 > 10)    // after 10 ms
           {
              PORTA=0b110000;    // turn ON toggle LED and transistor
              counter1 = 0;
              state1 = 5;
            }
           break;
       case 5:
           counter1++;
           if (counter1 > 10)     // after 10 ms,
           {
              PORTA=0b010000;    // turn OFF transistor
              state1 = 0;
           }
           break;
     }

     switch (state2)
     {
         // repeat with another switch statement for TOGGLERIGHT using state2 and counter2 etc.
     }

     __delay_ms(1);
}

So you can see how this allows you to keep track of both switches and LED's essentially in parallel.

Dejé los temporizadores de rebote igual que los tuyos (10 ms), pero sugiero que sean considerablemente más largos, digamos 50 ms.

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas