Cómo verificar 4 entradas y configurar el indicador en el microcontrolador

0

Tengo un PIC MCU y tengo 4 pines de entrada. Necesito verificar el estado de las entradas y establecer el valor de la bandera. Al igual que si la entrada 1 está activa, entonces el valor de la bandera debe ser 1, si la entrada 1 y la entrada 2 están activadas, la bandera es 2. Por entrada, la bandera 1,2,3 = 3. Para este tipo de lógica, pensé en usar varias condiciones "si no":

if(input1==high)
{
  flag = 1;
  if(input2==high)
  {
    flag=2;
    if(input3==high)
    {
    flag=3;
    if(input4==high)
    {
      flag=4;
     }
  }
 }
}

¿Hay alguna manera de que pueda omitir esto en caso contrario y puedo usar otra lógica c? Por favor ayuda.

    
pregunta S Andrew

5 respuestas

2

Consideraría usar una tabla preinicializada, como esta:

static uint8 table[] = { 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4 };

port_val = Read_Port() & 0xf;
flag = table[port_val];

Yo mismo soy más un hacker AVR, y no sé cuál sería el equivalente PIC de usar PROGMEM para poner la tabla en la ROM.

Y para 8 bits en lugar de 4:

uint8 port_val = Read_Port() & 0xff;
flag = table[port_val & 0xf];
if (flag == 4) flag += table[port_val >> 4];
    
respondido por el Mike Spivey
1

Supongo que estas 4 entradas son 4 bits más bajos del mismo puerto: Pin 0 a 3. Puedes cambiar los valores si los pines son diferentes.

Iría con algo como

port_val = Read_Port() & 0x0F;
switch(port_val)
{
  case 0x01: // Only input 1 is set
     flag = 1;
  break;

  case 0x03: // input 1 and 2 set
     flag = 2;
  break;

  case 0x07: // input 1,2 and 3 are set
     flag = 3;
   break;

  case 0x0F: //All 4 inputs are set
     flag = 4;
  break;
  default:
   //Optional
   flag = 0;
   break;
}
    
respondido por el Swanand
0
flag =0 ;
port_val = Read_port() & 0x0F;
for(i=0;i<4;i++)
{
   if(port_val & (0x01<<i))
   {
     flag++;
   }
   else
   {
      break;
   } 
}
    
respondido por el Sathyanarayanan G
0

Si realmente quieres hacerlo como un bucle, prueba esto:

uint8 port_val = Read_Port() & 0xf;
flag = 0;
while (port_val & 1) {
    flag++; port_val = port_val >> 1;
}

Pero yo usaría la tabla de búsqueda: es más rápido y probablemente más pequeño también.

    
respondido por el Mike Spivey
0

Puede hacer esto con una línea concisa de código C de la siguiente manera:

flag=x&1?x&2?x&4?x&8?4:3:2:1:0;   // set flag appropriately

Es muy importante agregar comentarios como lo hice anteriormente para indicar con precisión lo que hace la declaración. ;-)

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas