Accediendo al pin de E / S individual en MSP430

5

Im portando algún 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;

¿Hay 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, ¿a alguien se le ocurrió un buen equivalente? Estoy usando Code Composer Studio v5.3 y el compilador que viene con eso.

    
pregunta Dean

6 respuestas

2

En el MSP430, el acceso a los pines individuales se escribe comúnmente usando define y operadores de modo inteligente :

P2OUT &= ~BIT1;    /* Pin P2.1 = 0 */
P2OUT |= BIT1;     /* Pin P2.1 = 1 */
P2OUT ^= BIT1;     /* Toggle Pin P2.1 */

Asegúrese de incluir el archivo de encabezado adecuado para su chip específico que contiene el puerto y el pin ( BIT# ) definido.

    
respondido por el embedded.kyle
2

El tablero de discusión de TI tuvo un discusión informativa Sobre lo mismo.

En resumen, esto se define por el encabezado genérico msp430.h utilizado en CCS (que está vinculado al chip objetivo específico msp430xxxx.h en la compilación). No tiene soporte para asignaciones de estilo PxOUT.BITy .

io430.h de IAR tiene soporte para eso, pero el consenso es que msp430.h es el mejor encabezado (ya que los encabezados de msp430xxxx.h son escritos por los empleados de TI, io430.h es escrito por los empleados de IAR)

PxOUT |= BITy style es la mejor manera de establecer un solo bit. PxOUT &= ~BITy style es la mejor forma de borrar un solo bit.

    
respondido por el Passerby
1

Los mismos TI lo hacen así en uno de sus ejemplos para los compiladores de Code Composer Studio (CCS) e IAR:

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  P1DIR |= 0x01;                        // Set P1.0 to output direction

  for (;;)
  {
    volatile unsigned int i;

    P1OUT ^= 0x01;                      // Toggle P1.0 using exclusive-OR

    i = 50000;                          // Delay
    do (i--);
    while (i != 0);
  }
}
    
respondido por el Leon Heller
1

El siguiente código es una solución para el acceso de pin individual usando Code Composer (con un pequeño retoque puede ser portado en cualquier compilador). El ejemplo es una versión modificada del ejemplo básico de Code Composer. Parpadea el LED. En este ejemplo, en lugar de escribir el LED de declaración habitual = 1 para encender el LED, escribirá LED (HI).

//***************************************************************************
//
// MSP432 main.c template - P1.0 port toggle
//
//***************************************************************************

#include "msp.h"

#define LO             0x00
#define HI             0x01

#define BIT_0           0x01
#define BIT_1           0x02
#define BIT_2           0x04
#define BIT_3           0x08
#define BIT_4           0x10
#define BIT_5           0x20
#define BIT_6           0x40
#define BIT_7           0x80

#define LED_BIT          BIT_0

#define LED_PORT         P1OUT

#define LED(x) (x==HI)?(LED_PORT |= LED_BIT):(LED_PORT &= ~LED_BIT)

void main(void)
{
volatile uint32_t i;

WDTCTL = WDTPW | WDTHOLD;           // Stop watchdog timer

// The following code toggles P1.0 port
P1DIR |= BIT0;                      // Configure P1.0 as output

while(1)
{

     //blink LED1
                LED(HI);
                _delay_cycles(100000);
                LED(LO);
                _delay_cycles(100000);
}
}
    
respondido por el Vlad
1

[nota del moderador: Este comentario ha llegado a este hilo como resultado de una combinación.]

[nota del autor: la pregunta original donde publiqué esta respuesta decía que no se pudo encontrar ningún ejemplo de código]

Erm está bien, me tomó alrededor de 30 segundos encontrar esto:

sitio web de TI para MSP430F2274

Herramientas y software para MSP430F2274

Código de ejemplo para MSP430F22x4

Y finalmente hay una carpeta llamada C y en la que se encuentran algunos archivos llamados msp430x22x4_p1_0x.c que contienen ejemplos de código sobre cómo usar el puerto 1 en C. Incluso hay un archivo readme para decirle qué archivo se usa para que.

Y para que esta respuesta no sea completamente inútil:

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= BIT0;                            // Set P1.0 to output direction

  while (1)                                 
  {
    if ((BIT2 & P1IN) == BIT2)
    {
      P1OUT |= BIT0;                        // if P1.2 set, set P1.0
    }
    else
    {
      P1OUT &= ~(BIT0);                       // else reset
    }
  }
}

(Basado en msp430x22x4_p1_01.c por A. Dannenberg / W. Goh, la declaración de copyright completa es demasiado grande para esta respuesta, pero está contenida en el archivo de Ejemplo de Código vinculado)

    
respondido por el Arsenal
0

El MSP430 puede configurar o borrar bits individuales a través de las instrucciones BIS o BIC (conjunto BIt).

Por lo tanto, espero que P2OUT.BIT1 = 1; funcione en C (al menos en mspgcc; el código Ada equivalente sí 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; 
    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas