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.

2voto

Morris Maynard Puntos 49

En el MSP430, el acceso a los pines individuales se suele escribir utilizando define y operadores bitácora :

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 cabecera adecuado para su chip específico que contiene el puerto y el pin ( BIT# ) define.

0 votos

Ok, parece que por cada vez que veo algo como RA1 = 1; Voy a tener que ajustar el registro de salida cada vez.

0 votos

@Dean Más o menos. Las definiciones sólo facilitan la lectura. De vez en cuando veo código en línea usando P2OUT.BIT1 = 1; pero no sé si eso funciona o no. En mi experiencia con el MSP430, siempre he utilizado las operaciones a nivel de bits para acceder a los pines individuales. Parece la forma más común de hacer las cosas.

2 votos

Si utiliza CCS, debería bastar con incluir msp430.h el compilador detectará automáticamente en qué micro se encuentra.

2voto

Passerby Puntos 28913

El tablero de discusión de TI tenía un debate informativo sobre lo mismo.

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

El io430.h de IAR tiene soporte para eso, pero el consenso es que msp430.h es la mejor cabecera (ya que el msp430xxxx.h Las cabeceras están escritas por empleados de TI, io430.h está escrito por empleados de IAR)

PxOUT |= BITy es la mejor manera de fijar un solo bit. PxOUT &= ~BITy es la mejor manera de limpiar un solo bit.

3 votos

Un detalle: PxOUT &= ~BITy despeja un poco. PxOUT |= BITy se pone un poco.

2voto

Micah Smith Puntos 141

El siguiente código es una solución para el acceso individual a los pines utilizando Code Composer (con un pequeño ajuste 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 la declaración habitual LED=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);
}
}

1voto

Mark Biek Puntos 41769

La propia TI lo hace así en uno de sus ejemplos para los compiladores 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);
  }
}

1voto

Stefan Arentz Puntos 151

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

[Nota del autor: la pregunta original en la que publiqué esta respuesta decía que no se podía encontrar ningún ejemplo de código].

Erm ok, me tomó alrededor de 30 segundos para encontrar esto:

Sitio web de TI para el MSP430F2274

Herramientas y software para el MSP430F2274

Código de ejemplo para MSP430F22x4

Y finalmente hay una carpeta llamada C y en ella se encuentran unos archivos llamados msp430x22x4_p1_0x.c que contienen ejemplos de código sobre cómo utilizar el Puerto 1 en C. Hay incluso un "readme" para indicarle qué archivo se utiliza para qué.

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 gran medida en msp430x22x4_p1_01.c por A. Dannenberg / W. Goh, la declaración de derechos de autor completa es demasiado grande para esta respuesta, pero está contenida en el archivo de ejemplo de código vinculado)

0 votos

Para ser completo (como ejemplo) creo que necesitas citar también las macros (donde entra en juego la 'magia' del mapa de memoria), así que algunos fragmentos del fichero de cabecera. No estoy seguro de si vale la pena el esfuerzo a través de ...

0 votos

@SeanHoulihane Bueno, sí, podría *(uint16_t*)(0x1234U) = 0x20U pero nah el compilador tendrá los archivos de cabecera, por lo que el código debe ser algo como esto.

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