MSP430 Pin Variables

1

Estoy intentando programar un MSP430FR5969 por primera vez. Ejecuté y modifiqué exitosamente un programa para hacer parpadear uno de los LEDs conectados a P1.0. La variable predefinida relevante es P1OUT.

El otro LED está conectado a P4.6 pero no sé qué variable corresponde a él. P4OUT no parece funcionar, y no estoy seguro de que sea la correcta porque hay varios pines: P4.4, P4.5, P4.6 y la variable P4OUT no parece diferenciarse entre ellos. p>

¿Qué es el esquema de denominación de variables? Más importante aún, ¿qué documento de referencia respondería preguntas similares?

    
pregunta necromancer

2 respuestas

1

el . significa un bit particular de una salida de múltiples bits. ¡P4 no es realmente un pin sino un banco de pines! :)

    P4DIR |= BIT6;  /* set P4.6 to output */
    P4OUT |= BIT6;  /* set P4.6 to 1 */
    P4OUT &= ~BIT6; /* set P4.6 to 0 */
    
respondido por el necromancer
0

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

    
respondido por el DerStrom8

Lea otras preguntas en las etiquetas