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:
- LED1 pisca enquanto LED2 está desligado
- O LED2 pisca enquanto o LED1 está desligado
- LED1 e LED2 piscam simultaneamente
- 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
electrical-engineering
computer-engineering
user6866732
fonte
fonte
Respostas:
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:
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.
fonte