Manejo de una gran cantidad de entradas en el microcontrolador PIC

Estoy interconectando PIC32 MCU 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 condiciones if como

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

Lo que está haciendo esta condición es que cada vez que llega una entrada, sigue imprimiendo los datos como

input 1 ON
input 1 ON
input 1 ON

y sigue Quiero que se muestre solo una vez. Por ejemplo, si apliqué input1, input 1 ONdebería imprimirse una vez y si eliminé, la entrada input 1 OFFdebería mostrarse una vez. No sé cómo puedo ejecutar esto si la condición es 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);
  }
 }
}
Debe recordar el estado de cada entrada y solo enviar la salida al UART si cambia.
He editado mi pregunta. ¿Puede decirme cómo puedo recordar el estado de entrada?
No sé exactamente por qué su enfoque es el que es, pero ¿por qué no empaquetaría sus 24 entradas en 3 bytes, y cuando cualquiera de ellos cambia, o solo periódicamente, envía los tres bytes a la computadora?
@ScottSeidman se ve genial. Puede dar un ejemplo.!

Respuestas (1)

Debe recordar el estado de cada entrada y solo enviar la salida al 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
    }
}
gracias por darme esta idea. Pero sigue mostrando valores continuos.
@CZAbhinav Bueno, el código anterior nunca debería generar ON u OFF consecutivos. ¿ Estás diciendo que lo está haciendo? ¿Sus entradas están cambiando demasiado rápido para su búfer UART?
sí lo está haciendo. y acabo de descubrir que no he aplicado ninguna entrada, pero aún muestra la entrada 1 ENCENDIDA
Es posible que necesite resistencias pull-up en sus pines para mantener las entradas en un nivel estable/predeterminado. Si una entrada no está conectada a nada, puede ser aleatoriamente 0 o 1..
Estoy trabajando en el kit de inicio PIC32, así que creo que no necesito ningún pull ups. Las entradas ya son estables.!
@CZAbhinav Si observa detenidamente el código que le di, puede ver que no es posible obtener informes de ENCENDIDO o APAGADO consecutivos. ¿Estás seguro de que seguiste este patrón exactamente y para cada entrada? He agregado comentarios para asegurarme de que colocas el código en el lugar correcto.
La salida exacta de @RogerRowland cuando aplico la entrada es Entrada 1: ENCENDIDA Entrada 1: Apagada y luego estas dos líneas continúan.
@CZAbhinav ¿Cómo proporciona la información? ¿Ha configurado correctamente el registro TRIS para ese pin? Si la entrada proviene de un botón o interruptor físico, es posible que lo vea rebotando.
Las entradas son básicamente 3.1v provenientes de un circuito y sí, configuré los registros TRIS correctamente. he editado mi código
@CZAbhinav No especifica el dispositivo exacto, pero asegúrese de que el pin de entrada no sea una entrada analógica (algunos lo son, de forma predeterminada).
@RogerRowland Sin saber el nivel de quien esté leyendo esta respuesta, creo que probablemente debería dejar en claro que necesita almacenar el estado de cada entrada con una variable separada. Probablemente ayudaría a esta comprensión si tuviera un nombre más significativo para "uInput1", como "last_RA6".
@Tut Ok, buena idea, he editado mi respuesta.
Dependiendo de qué tan bien optimice su compilador, puede ser más eficiente de usar uLastRA6State ^= 1.