MSP430 led parpadeante

1

Comencé a usar el Launchpad de MSP430 y cuando estaba examinando el código para parpadear un led, encontré algo extraño. El código es este y es un ejemplo listo:

#include  <msp430g2553.h>

 unsigned int i = 0;                         

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 

  P1DIR |= 0x01;                            

  for (;;)                                  
  {

    P1OUT ^= 0x01;                         

    for(i=0; i< 20000; i++);               

  }
}

Al principio, debe inicializar P1DIR para configurar el pin en el que el led está conectado a la salida. Busqué mucho y en todas partes se dice que el registro específico es solo para establecer la dirección. Entonces borré una parte del código y el resto fue este:

#include  <msp430g2553.h>

 unsigned int i = 0;                         

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 

  P1DIR |= 0x01;                            

  for (;;)                                  
  {            

  }
}

Aquí está la parte impar. ¡El led está encendido! ¿No debería estar apagado? ¿La línea de código con P1OUT no le dirá a MSP si el led está encendido o apagado? Con solo P1DIR no debería pasar nada. ¿Qué estoy haciendo mal?

    
pregunta Adam

2 respuestas

2

Puedes descargar el código que escribí en:

archivo ZIP que contiene un tutorial de LED para MSP430

Cubre todo, desde solo encender un LED, hasta hacer que disminuya (a la vista) de manera uniforme y aumente su intensidad (lo que requiere una progresión geométrica para lograrlo).

Mientras tanto, lo que no se dio cuenta es el valor de encendido para P1OUT. Pruebe dos declaraciones diferentes ANTES de su declaración for(;;) :

P1OUT &= ~0x01;

y

P1OUT |= 0x01;

Y aplique uno u otro de los anteriores con su último ejemplo de código (el que tiene el código eliminado). Verá dos comportamientos diferentes. No estoy seguro ya que no lo he investigado últimamente, pero sospecho que los valores de P1OUT son "aleatorios" en el reinicio de encendido. En cualquier caso, es importante y debe asegurarse de que los valores de P1OUT sean "conocidos" antes de iniciar su código.

En el caso de su primer ejemplo de código que hace parpadear el LED, el valor inicial no importó, ya que el bucle XORs el valor una y otra vez. Nunca notaría si comenzó como ACTIVADO o DESACTIVADO, porque está alternando todo el tiempo.

    
respondido por el jonk
-1

P1DIR configura la salida o entrada del pin del puerto de dirección (DIR).               1 es salida, 0 es entrada.

P1OUT ^= 0x01;    //P1OUT register holds the status of the LED.
                  // 1 is ON, 0 is OFF

Utilice la instrucción P1OUT antes del bucle for

Cambie su for(;;) a esto para que vea las luces LED:

for(i=0; i < 50000; i++);     // Delay between Green LED toggles.
    
respondido por el user39460

Lea otras preguntas en las etiquetas