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?
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?
¿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;
oPORTA = 0 | 7;
oPORTA = 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);
oPORTA = 0 | (1 << 7);
oPORTA = 0 | 0b10000000;
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.
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.
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 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.