Manejo de un gran número de entradas en el microcontrolador PIC

2

Estoy conectando MCU PIC32 con 24 entradas y UART. Cuando llega alguna entrada, estos datos se transfieren a la PC a través de uart. Estoy usando múltiples si la condición como

if(input1==high)
{
  putsUART("input 1 ON\n");
}
if(input2==high)
{
  putsUART("input 2 ON\n");
}

Lo que hace esta condición si se está produciendo es cada vez que se recibe una entrada, sigue imprimiendo los datos como

input 1 ON
input 1 ON
input 1 ON

y continúa. Quiero que se muestre una sola vez. Por ejemplo, si apliqué input1, input 1 ON debería imprimirse una vez y si quita la entrada input 1 OFF debería mostrarse una vez. No sé cómo puedo ejecutar esto si la condición solo una vez. Por favor ayuda. Gracias.!

CÓDIGO (solo para 3 entradas):

 int main()
 {
  TRISAbits.TRISA6 = 1;
  TRISAbits.TRISA7 = 1;
  TRISGbits.TRISG13 = 1;
  while(1)
  {
   if(PORTAbits.RA6 == 0)         //INPUT 1
  {
   putsUART2("Input: 1 ON\n");
   Delayms(1000);
  }
  if(PORTAbits.RA7 == 0)          //INPUT 2
   {
   putsUART2("Input: 2 ON\n");
   Delayms(1000);
  }
  if(PORTAbits.RG13 == 0)          //INPUT 3
  {
   putsUART2("Input: 3 ON\n");
   Delayms(1000);
  }
 }
}
    
pregunta Aircraft

1 respuesta

5

Debe recordar el estado de cada entrada y solo debe enviarse a la UART si cambia.

Algo como esto, solo para una entrada para que tengas la idea:

// NB - put these lines outside your loop
uint8_t uLastRA6State = 0;                // last known state of RA6
uint8_t uLastRA7State = 0;                // last known state of RA7
// ... etc. 
// use one variable for each input, or if memory is tight, you could
// alternatively use one byte per 8 pins, but this more "wasteful"
// version is easier to understand the principle

while (1)
{
    // ...

    // NB - put this code inside your loop
    if (PORTAbits.RA6 != uLastRA6State)
    {
        // save current state
        uLastRA6State = uLastRA6State ? 0 : 1;

        // output change
        if (uLastRA6State)
            putsUART2("Input: 1 ON\n");
        else
            putsUART2("Input: 1 OFF\n");
    }

    // ... do the same for other inputs, e.g.
    if (PORTAbits.RA7 != uLastRA7State)
    {
        // ... similar to above, for RA7
    }
}
    
respondido por el Roger Rowland

Lea otras preguntas en las etiquetas