6 votos

¿Por qué usan las personas (1 << PA0) al puerto?

En AVR tutoriales veo a menudo:

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

utiliza en vez de:

DDRA |= PA0;
PORTA |= PA0;

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

16voto

xilun Puntos 261

PA0será definida como 0 así que la siguiente línea:

DDRA |= (1 << PA0);

Equivale a cambio 1 izquierda por cero bits, dejando un OR con el valor 1 para establecer el primer bit. Mientras que la siguiente línea:

 DDRA |= PA0;

Realiza un OR con cero así que no va a cambiar en todos los registros.

8voto

Passerby Puntos 28913

¿Por qué hacen esto? Probablemente porque todos los demás lo que ellos piden ayuda o aprendido de la hicimos de esa manera. Y debido a que el estándar define son extrañamente hecho.

Cambio por un número, normalmente un número decimal, se moverá ese valor por el que muchos binario posiciones. 1 << PA0 turno 1 PA0 a la izquierda. Desde PA0 es 0, no hay ningún cambio. Pero dado 1 << 6 1 será 0b1000000. Dado13 << 6, que se desplazará 13 en binario, que es 0b1101, por 6 a convertirse en 0b1101000000 o 832.

Ahora, tenemos que ver qué PA0 - PA7 se define como. Estos suelen ser definidos en el encabezado específico para su microcontrolador, incluido a través de io.h o portpins.h

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

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

Ellos no pueden ser asignados directamente, como bits, porque no son solo los bits.

Si usted fuera a hacer PORTA |= PA7; suponiendo que PORTA es 0b00000000 (todos fuera), se obtiene:

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

Ver el problema? Usted acaba de encender PA0, PA1, PA2, en lugar de PA7.

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

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


La forma más Inteligente

El otro, mejor microcontrolador, el MSP430, tiene un estándar de definir 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.

Para las asignaciones directas como P1OUT |= BIT7; funciona de la misma como P1OUT |= (1 << 7); lo haría.

3voto

AndroidUser Puntos 26

Su pregunta ya ha sido contestada, pero quiero presentar una alternativa que era un poco mucho para un comentario. Una de las primeras cosas que hago cuando comienzo un proyecto integrado es definir mi conjunto de bits y eliminar macros.

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

Mediante las macros, el código se convierte en:

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

El resultado final se encuentra un poco instrucción en conjunto.

0voto

filo Puntos 1

Echa un vistazo aquí: http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_use_bv

Las macros se utilizan cuando la configuración particular de bits en un registro. Por ejemplo: si PORTA es de 8 bits de ancho, PA0 es el bit más bajo, PA7 es el más alto. Para establecer PA0 a 1 escribir ("o-escritura") 0x01 para el registro. Si desea establecer PA2, entonces usted necesita un valor en binario tendrá un uno en el lugar correcto, para PA2 que será 0x04.

La gente no quiere recordar que poco tiene una posición particular (como en otros registros pueden tener diferentes bits de nombres, por ejemplo. CS12, CS10, ADSC etc.) así que el uso más abstractos nombres. En lugar de escribir: PORTA = 0x04 que tipo de PORTA = _BV(PA2) y al instante sé que va a activar el pin PA2 alta.

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