4 votos

¿Qué pasa con este código MSP430?

Estoy utilizando el MSP-EXP430F5438 placa de evaluación, que tiene pulsadores conectados a P2.6 y P2.7 y LEDs conectados a P1.0 y P1.1.

Quiero hacer que P2.6 encienda los LEDs y P2.7 los reinicie. Para ello, escribí el siguiente código:

#include  "msp430x54x.h"

int main(void)
{
          WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
          P1DIR |= BIT0 + BIT1;                 // Set P1.0 and P1.1 to output direction
          P2DIR = 0x00;                         // Set the P2 to input direction

          P1OUT = 0x00; // Blank all LEDs

          while(1)
         {
            if(P2IN & 0x40) // When P2.6 is pushed
              P1OUT = 0x03;
            if(P2IN & 0x80) // When P2.7 is pushed
              P1OUT = 0x00;
            __delay_cycles(100000);
         }
}

Pero no funciona correctamente; a veces funciona de forma errática (los LEDs se encienden cuando se pulsa P2.6 pero no se apagan cuando se pulsa P2.7), a veces no funciona en absoluto.

¿Alguna idea?

12voto

AnonJr Puntos 111

No hay pullups en P2.6 y P2.7.

enter image description here

El MSP tiene pullup / pulldowns internos, pero tienes que configurarlos tú mismo.

Así que como parte de su inicialización, añada esto

P2REN |= (1<<6) | (1<<7);  // turn on pullups
P2OUT |= (1<<6) | (1<<7);  // set them to pull up

Entonces las entradas no flotarán aleatoriamente cuando los interruptores no estén presionados.

2voto

letronje Puntos 128

Tu código sondea los pines del interruptor pero luego se retrasa. Si el interruptor es presionado y liberado durante el tiempo de retardo, no será visto.

Prueba a eliminar el retardo, o a utilizar interrupciones para captar los bordes en los pines del interruptor.

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