¿Qué está mal con este código MSP430?

4

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

Quiero hacer que P2.6 active los LED y P2.7 los reinicie. Para hacer eso, 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 LED se encienden cuando se presiona P2.6 pero no se apagan cuando se presiona P2.7), a veces no funciona en absoluto.

¿Alguna idea?

    
pregunta Renan

2 respuestas

12

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

El MSP tiene un pullup interno / desplegable, pero usted debe configurarlo usted mismo.

Entonces, como parte de su inicialización, agregue 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 no se presionan los interruptores.

    
respondido por el markrages
4

Su código sondea los pines del interruptor pero luego se retrasa. Si se presiona y suelta el interruptor durante el tiempo de demora, no se verá.

Intente eliminar la demora o utilice interrupciones para capturar los bordes en los pines del interruptor.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas