¿Cómo podemos leer dos entradas digitales simultáneamente desde ATxMega128?

6

Soy nuevo aquí ..

Tengo dos sensores IR que dan salida digital (0 cuando hay algo delante y 1 cuando no hay).

Estoy usando un ATxMEGA128 para ejecutar motores que usan estos sensores pero no puedo leerlos simultáneamente.

La forma en que estoy leyendo 1 pin es:

if(PORTD.IN & (1<<3))

esto funciona perfectamente bien, pero no sé cómo aceptar dos entradas, por ejemplo, si mis dos sensores están en el bit 1 y el bit 3.

¿Alguien puede decirme la sintaxis?

    
pregunta Ron

3 respuestas

10

La respuesta de Hassan no es del todo precisa. Si realmente desea leer ambas entradas al mismo tiempo , puede hacerlo siempre que ambas residan en el mismo puerto.

uint8_t sample = PORTD.IN;
uint8_t bit3   = (sample >> 3) & 1;
uint8_t bit7   = (sample >> 7) & 1;

Ahora puede estar seguro de que bit3 y bit7 son de la misma muestra de tiempo. Si usa PORTD.IN en varios lugares, todas son lecturas distintas de los pines. Lea el PORT.IN en una variable temporal y base sus decisiones en esa muestra.

    
respondido por el vicatcu
2

Enmascararía los bits que deseaba del puerto y probaría las posibles combinaciones en una declaración de caso:

SensorMask    : constant unsigned_8 := 16#88#;
Right_Blocked : constant unsigned_8 := 16#80#;
Left_Blocked  : constant unsigned_8 := 16#08#;
...
case PORTD.IN and SensorMask is
   when SensorMask    => reverse;  
   when Right_Blocked => goLeft;
   when Left_Blocked  => goRight;
   when others        => -- carry on
end case;

En C y, presumiblemente, el propio dialecto de Arduino se llama una declaración de conmutación y funciona de forma ligeramente diferente, pero es la forma habitual de probar varios bits a la vez.

    
respondido por el Brian Drummond
0

Nunca programé un arduino ... pero si portd.in es un registro de 8 bits que comienza desde el bit 0 al bit 7, aquí está su código:

//    Im assuming bit-0 is the least significant bit.. ie:   "((PORTD.IN) & 0x01)"

if (   ((PORTD.IN >> 3) & 0x01) && ((PORTD.IN >> 1) & 0x01)   ) {
     // printf("both bit-3 and bit-1 are TRUE");
}
if (   (PORTD.IN >> 7) & 0x01   ) {
     // printf("bit-7 is TRUE");
}

if (   PORTD.IN & 0x01   ) {
     // printf("bit-0 is TRUE");
}
    
respondido por el hassan789

Lea otras preguntas en las etiquetas