¿Por qué la gente usa (1 PA0) cuando configura el puerto?

6

En AVR Tutorials veo con frecuencia:

DDRA |= (1 << PA0);
PORTA |= (1 << PA0);

utilizado en lugar de:

DDRA |= PA0;
PORTA |= PA0;

¿Cuál es el propósito de esto?

    
pregunta bodokaiser

4 respuestas

16

PA0 se definirá como 0 por lo que la siguiente línea:

DDRA |= (1 << PA0);

Es igual a desplazar 1 izquierda por cero bits, dejando un OR con el valor 1 para establecer el primer bit. Considerando que la siguiente línea:

 DDRA |= PA0;

Está haciendo un OR con cero, por lo que no cambiará los registros en absoluto.

    
respondido por el PeterJ
7

¿Por qué hacen esto? Probablemente porque todos los demás a quienes pidieron ayuda o de quienes aprendieron lo hicieron de esa manera. Y porque los estándares definidos están extrañamente hechos.

Si se desplaza un número, generalmente un número decimal, se moverá ese valor por tantas posiciones binarias. 1 << PA0 cambiará 1 por PA0 a la izquierda. Como PA0 es 0, no hay cambio. Pero dado 1 << 6 1 se convertirá en 0b1000000. Dado 13 << 6 , cambiará 13, en binario que es 0b1101, más de 6 para convertirse en 0b1101000000 o 832.

Ahora, necesitamos ver cómo se definen PA0 - PA7. Estos se suelen definir en el encabezado específico de su microcontrolador específico, incluido a través de io.h o portpins.h

#define     PA7   7
#define     PA6   6
~
#define     PA1   1
#define     PA0   0

Se definen como su posición numérica, en decimal!

No se pueden asignar directamente, como bits, porque no son bits únicos.

Si tuviera que hacer PORTA |= PA7; asumiendo que PORTA es 0b00000000 (todo apagado), obtendrá:

  

PORTA = PORTA | PA7; o PORTA = 0 | 7; o PORTA = 0 | 0b111

¿Ves el problema? Acabas de activar PA0, PA1, PA2, en lugar de PA7.

Pero PORTA |= (1 << PA7); funciona como esperas.

  

PORTA = PORTA | (1 << PA7); o PORTA = 0 | (1 << 7); o PORTA = 0 | 0b10000000;

La manera más inteligente

El otro, mejor microcontrolador, el MSP430, tiene una definición estándar de bits como:

#define BIT0                (0x0001)
#define BIT1                (0x0002)
~
#define BIT6                (0x0040)
#define BIT7                (0x0080)

Estos se definen como su posición binaria, en hexadecimal. BIT0 es 0b0001, no como PA0, que es 0. BIT7 es 0b10000000, no como PA7, que es 0b111.

Por lo tanto, las asignaciones directas como P1OUT |= BIT7; funcionarán igual que P1OUT |= (1 << 7); .

    
respondido por el Passerby
3

Su pregunta ya ha sido respondida, pero quiero presentar una alternativa que fue demasiado para un comentario. Una de las primeras cosas que hago cuando comienzo un proyecto incrustado es definir mi conjunto de bits y borrar macros.

#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))

Usando las macros, su código se convierte en:

bitset(DDRA,0);
bitset(PORTA,0);

El resultado final es una instrucción de conjunto de bits en ensamblaje.

    
respondido por el Matt Young
0

Eche un vistazo aquí: enlace

Esas macros se utilizan al configurar bits particulares en un registro. Por ejemplo: si PORTA tiene 8 bits de ancho, entonces PA0 es el bit más bajo, PA7 es el más alto. Para configurar PA0 en 1, tiene que escribir ("o-escribir") 0x01 en el registro. Si desea establecer PA2, entonces necesita un valor que en binario tenga uno en el lugar correcto, para PA2 que será 0x04.

La gente no quiere recordar qué bit tiene una posición particular (ya que otros registros pueden tener diferentes nombres de bits, por ejemplo, CS12, CS10, ADSC, etc.), por lo que Usa nombres más abstractos. En lugar de escribir: PORTA = 0x04, escribe PORTA = _BV (PA2) e instantáneamente sabes que girará el pin PA2 alto.

    
respondido por el filo

Lea otras preguntas en las etiquetas

Comentarios Recientes

Los servlets tienen direcciones de interfaz de red entrantes muy similares (de cualquier otra clase de protocolo). El valor de una "respuesta" particular proviene de una clase base: o clase de datos, tipo de recurso compartido / clase o tipo de grupo. En todos los casos para: 8000 o: 9050 hay propiedades de número de puerto que representan el caso de uso específico que le interesa Para subredes, contiene direcciones de capa de puerto más puertos de ego. Para los sockets de salida tiene el formato de encabezado de... Lees verder