El MSP430 técnicamente no tiene control de pin individual. En su lugar, tienes que controlar todo el registro a la vez. P1OUT es el nombre del registro, no el pin.
Para activar, digamos, P1.0 y P1.6 (ambos están en el registro P1OUT), primero tendría que establecerlos en salida ( P1DIR = 0b01000001; //or 0x41
) y luego establecer el valor del registro (%código%). Observe que el valor que está asignando al puerto es de 8 bits, que corresponde a los 8 pines conectados al registro P1OUT.
Si desea, por ejemplo, alternar solo uno de los pines sin cambiar el resto del puerto, puede establecer el valor manualmente o siempre puede usar operaciones bitwise, como P1OUT = 0b01000001; /or 0x41
. Esto alterna el bit 0 sin afectar a ninguno de los otros pines. Además del OR exclusivo ( P1OUT ^= 0b00000001;
), tiene AND a nivel de bit ( ^
), OR a modo de bit ( &
), etc. Los usa para cambiar los pines individuales sin cambiar el valor del puerto completo. Si busca en el archivo de encabezado, también puede encontrar definiciones, tales como:
#define BIT0 (0x0001)
#define BIT1 (0x0002)
#define BIT2 (0x0004)
Por lo tanto, puede decir |
para alternar el bit 0.
Si desea tener la ilusión de que está controlando un pin a la vez, puede usar las siguientes funciones:
#include <stdint.h>
typedef enum {
LED_GREEN = BIT6,
LED_RED = BIT0
} PIN_Def;
static inline void set_pin(uint8_t volatile * const port, PIN_Def pin) {
*port |= pin;
}
static inline void clear_pin(uint8_t volatile * const port, PIN_Def pin) {
*port &= ~pin;
}
static inline uint8_t test_pin(uint8_t volatile * const port, PIN_Def pin) {
return *port & pin;
}
static inline void toggle_pin(uint8_t volatile * const port, PIN_Def pin) {
*port ^= pin;
}
Luego, para alternar BIT0, todo lo que deberías hacer es llamar a lo siguiente desde dentro de P1OUT ^= BIT0;
:
toggle_pin(P1OUT, LED_RED);
Puede usar las funciones para configurar, borrar, verificar y alternar estados de pines.
Fuente: Forums TI