6 votos

Acceso a un pin de E/S individual en el MSP430

Estoy portando un software de Microchip PIC (usando el compilador HI-Tech C) a TI MSP430, y en el código existente acceden a los pines directamente con algo como

RA1 = 1;

¿Existe una forma similar de hacer esto con el MSP430, o tengo que escribir en todo el registro de entrada/salida cada vez? Si no es posible, ¿alguien ha encontrado un buen equivalente? Estoy usando Code Composer Studio v5.3 y el compilador que viene con él.

0 votos

MSPWare de TI tiene funciones de ayuda para controlar el GPIO (aunque no para todas las subfamilias de MSP430).

2 votos

[Nota del moderador: Este comentario ha llegado a este hilo como resultado de una fusión]. ¿Qué tiene de malo el capítulo 8 del manual de la familia? Tal vez debería proporcionar una pregunta de ejemplo de una "manipulación" muy específica que le gustaría entender cómo hacer. Eso podría ayudar mucho a evitar que te obliguemos a escribir y reproducir un capítulo entero.

1voto

Epsilon Puntos 496

También quería cambiar el puerto en unidades de bits, así que escribí un código de ejemplo.
Me alegro de que te sirva de referencia.

El código de ejemplo es para el MSP430FR6989.
Vuelva a escribir la dirección si es necesario.
La dirección se puede encontrar en la hoja de datos de cada dispositivo.

typedef unsigned char   \_BYTE;

union \_BITFIELD {
  \_BYTE   BYTE;
  struct {
    \_BYTE B7  :1;
    \_BYTE B6  :1;
    \_BYTE B5  :1;
    \_BYTE B4  :1;
    \_BYTE B3  :1;
    \_BYTE B2  :1;
    \_BYTE B1  :1;
    \_BYTE B0  :1;
  }       BIT;
};

union un\_gpio {                                         /\* union GPIO   \*/
                unsigned char BYTE;                     /\*  Byte Access \*/
                struct {                                /\*  Bit  Access \*/
                       unsigned char B0 :1;             
                       unsigned char B1 :1;             
                       unsigned char B2 :1;             
                       unsigned char B3 :1;             
                       unsigned char B4 :1;             
                       unsigned char B5 :1;             
                       unsigned char B6 :1;             
                       unsigned char B7 :1;             
                       }      BIT;                      
                };

// This is MSP430FR6989 address.
#define GPIO1      (\*(volatile union un\_gpio    \*)0x202)  /\* IO    Address\*/
#define GPIO2      (\*(volatile union un\_gpio    \*)0x203)  /\* IO    Address\*/
#define GPIO3      (\*(volatile union un\_gpio    \*)0x222)  /\* IO    Address\*/
#define GPIO4      (\*(volatile union un\_gpio    \*)0x223)  /\* IO    Address\*/

/\*\*
 \* main.c
 \*/
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;

    //P1SEL &= (~BIT0);           // Set P1.0 SEL for GPIO
    P1DIR |= BIT0;              // Set P1.0 as Output
    P1OUT = 0xFF;

    while(1)
    {
        //GPIO1.BYTE = 0x01;
        GPIO1.BIT.B0 = 1;
        //GPIO1.BIT.B1 = 1;
        //GPIO1.BIT.B2 = 1;
        //GPIO1.BIT.B3 = 1;
        //GPIO1.BIT.B4 = 1;
        //GPIO1.BIT.B5 = 1;
        //GPIO1.BIT.B6 = 1;
        //GPIO1.BIT.B7 = 1;
        //P1OUT = 0x01;

        \_\_delay\_cycles(800000);

        //GPIO1.BYTE = 0x00;
        GPIO1.BIT.B0 = 0;
        //GPIO1.BIT.B1 = 0;
        //GPIO1.BIT.B2 = 0;
        //GPIO1.BIT.B3 = 0;
        //GPIO1.BIT.B4 = 0;
        //GPIO1.BIT.B5 = 0;
        //GPIO1.BIT.B6 = 0;
        //GPIO1.BIT.B7 = 0;
        //P1OUT = 0x00;

        \_\_delay\_cycles(800000);
    }

    return 0;
}

0voto

Brian Drummond Puntos 27798

El MSP430 puede establecer o borrar bits individuales mediante las instrucciones BIS o BIC (BIt Set).

Así que ciertamente esperaría P2OUT.BIT1 = 1; para trabajar en C (al menos en mspgcc; el código Ada equivalente lo hace)

procedure Blinky is
    LED : Boolean renames p1out_bits(0);
begin
    -- Initialise registers etc simplified out
    loop
        LED := True;
        Delay_MS(200);
        LED := False;
        Delay_MS(800);
    end loop;
end Blinky;

0 votos

El uso de operaciones de bits debería compilar lo mismo cuando sea apropiado, incluso si esa sintaxis no está definida.

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