MSP430 - Semáforo - Linguagem C

2

Estou negociando um código C aqui que é executado no MSP430 LaunchPad. O que eu preciso fazer aqui é modificar o programa, para que, ao pressionar o botão, o micro passe por 4 modos diferentes:

  1. LED1 pisca enquanto LED2 está desligado
  2. O LED2 pisca enquanto o LED1 está desligado
  3. LED1 e LED2 piscam simultaneamente
  4. LED1 e LED2 piscam alternativamente

Não entendo aqui o que posso fazer para que o LED pisque simultaneamente e alternadamente. O LED1 pisca e o LED2 se apaga se SW2 estiver ALTO e vice-versa. Como os outros dois funcionam?

Aqui embaixo está o que foi feito até agora:

#include <msp430.h> 
#include "msp430g2553.h"
int sw2=0;

int main(void) 
{
    WDTCTL = WDTPW | WDTHOLD;      //stop watchdog timer

    P1DIR  = 0x00;         //port 1 all inputs
    P1DIR |= (BIT0 | BIT6);        //set P1.0 and P1.6 as outputs (LED1, LED2)
    P1REN |= BIT3;         //activate resister on P1.3
    P1OUT |= BIT3;         //make it pull up because SW2 is active low

    for(;;)
    { sw2 = P1IN;          //read values from P1
      sw2 &= BIT3;         //mask out only BIT3 where SW2 is connected
      if (sw2 == BIT3)               
         {             //if SW2 is high
            P1OUT &= ~BIT6;    //turn LED2 off 
            P1OUT ^= BIT0;     //toggle LED1
          __    delay_cycles(50000);   //delay 50,000 micro seconds
         }
      else             
         {             //else (SW2 is low) 
            P1OUT &= ~BIT0;    //turn LED1 off
            P1OUT ^= BIT6;     //toggle LED2
            __delay_cycles(200000);   //delay 200,000 micro seconds
         }
     }
// end of infinite loop
}
//end of main
user6866732
fonte
No título você tem semáforo. Não vejo o Semáforo referenciado em nenhum outro lugar da pergunta. Dê uma olhada no Início rápido do SYS / BIOS para MSP430
Mahendra Gunawardena

Respostas:

1

Só posso ver que você programou a opção para "se alto - faça uma coisa, se baixo - faça outra coisa". Você precisa incluir um contador para a opção (e devolução). depois 4 instruções if, uma para cada modo pelo qual você está alternando.

Código pseudo-ish:

int sw2 = 0;
int counter = 0;
flipbit = 0;

Int main(void) {

   (whatever ports/bits you need to set up here)

   If (sw2 == 1) {                    //if the switch is depressed..
      delay_cycles(200,000);          //Wait 200ms (lazy debounce) as long as you click a button quicker than 200ms no worries
      counter == counter + 1;         //increment the counter
   }
   if (counter == 1) {
      P1OUT ^= BIT0;                  //turn led1 on
      __delay_cycles(200000);         //wait 200ms
      P1OUT ^= BIT0;                  //turn led1 off
      __delay_cycles(200000);         //wait 200ms
   }
   if (counter == 2) {
      P1OUT ^= BIT6;                  //turn led2 on
      __delay_cycles(200000);         //wait 200ms
      P1OUT ^= BIT6;                  //turn led2 off
      __delay_cycles(200000);         //wait 200ms
   }
   if (counter == 3) {
      P1OUT &= ~BIT0;                 //turn led 1 on
      P1OUT ^= BIT6;                  //turn led 2 on
      delay_cycles(200,000);          //wait 200ms
      P1OUT &= ~BIT0;                 //turn led 1 off
      P1OUT ^= BIT6;                  //turn led 2 off
      delay_cycles(200,000);          //wait 200ms
   }
   if (counter == 4) {                //now it gets exciting...
      if (flipbit == 0) {             //this statement lets us run a statement once per loop
         P1OUT &= ~BIT0;              //turn led1 on
         flipbit == flipbit + 1       //make flipbit = 1 so it doesn't run again this cycle
         }
      P1OUT &= ~BIT0;                 //turn led 1 off
      P1OUT ^= BIT6;                  //turn led 2 on
      delay_cycles(200,000);          //wait 200ms
      P1OUT &= ~BIT0;                 //turn led 1 on
      P1OUT ^= BIT6;                  //turn led 2 off
      delay_cycles(200,000);          //wait 200ms
   }
   if (counter == 5) {                //you clicked the button again, to return to the first mode
      P1OUT &= ~BIT0;                 //turn led1 back off, ready to start the cycle again
      flipbit = 0;
      counter = 1;                     //set counter to 1, so it starts on first mode
   }

Como você está 'alternando' os bits em vez de defini-los definitivamente como 1 ou 0, assegurei-me de acompanhar o estado em que eles estão, fazendo-os fazer um ciclo completo dentro de cada instrução, ou seja, ativando-os e VOLTANDO antes que possa seguir em frente.

Esse 'flipbit' existe para compensar o padrão ativando o led1 primeiro, para que possamos usar o mesmo padrão do modo 3, e o quinto passo do contador é desligar o led e redefinir o flipbit para 0.

Existem algumas maneiras de implementar isso. Este foi o mais fácil que pude pensar que era "legível".

EDITAR:

Apenas procurei e o '__delay_cycles' é realmente semelhante ao arduino, ao passo que interromperá a execução do código. Isso não é ótimo, pois o pressionamento de seu botão passa despercebido em grande parte do programa. Existem duas maneiras de fazer isso: use uma interrupção para o switch ou use um timer em vez de atraso. Este link mostra como.

CraigC
fonte