Processing math: 100%

6 votos

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

Soy nuevo aquí...

Tengo dos sensores infrarrojos que dan salida digital (0 cuando hay algo delante de él) y 1 cuando no hay.

Estoy usando un ATxMEGA128 para ejecutar los motores con estos sensores pero no puedo leerlos al mismo tiempo.

Lo estoy leyendo 1 pin es:

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

Esto funciona perfectamente bien pero no sé cómo aceptar dos entradas, para ejemplo si mis dos sensores se encuentran en bit 1 y bit 3?

¿Alguien por favor me puede decir la sintaxis?

10voto

JW. Puntos 145

Respuesta de Hassan no es absolutamente exacta. Si realmente quieres leer ambas entradas al mismo tiempo, puede hacerlo siempre y cuando residan en el mismo puerto.

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

Ahora puede ser asegurada que bit3 y bit7 son de la misma muestra de tiempo. Si utilizas PORTD. En varios lugares, son todas distintas lecturas de los pernos. Leer el puerto. IN en una variable temporal y basar sus decisiones en esa muestra.

2voto

Brian Drummond Puntos 27798

Máscara de bits que quería del puerto y prueba de las posibles combinaciones en una instrucción case:

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 probablemente el dialecto de Arduino se llama una sentencia switch y funciona de manera ligeramente diferente, pero es la manera habitual de pruebas de varios bits a la vez.

0voto

Christi Puntos 174

Nunca programé un arduino... pero si portd.in es un registro de 8 bits a partir de bit 0 a bit-7 aquí es el 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");
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X