Hi , I'm inexperienced about microcontrollers and i'm having a problem with switch debouncing on MSP430G2553/Launchpad...
First , my "project' is : 2 LEDS + 1 BUZZER + 3 Push Buttons connected to MSP430 , Every time a switch is pressed , buzzer should ''beep''. When key 1 is pressed , LED 1 turns ON , when key 2 is pressed, LED 2 turns ON , and key 3 turns off /reset all the LEDs .
This is my code at this moment :
#include <msp430g2553.h>
#define LED1 BIT3 //LED1 on P1.3 , LED2 on P1.4 , KEY1 on P2.0 , KEY2 on P2.1 , KEY3 on P2.2 , BUZZER on P1.5
#define LED2 BIT4
#define BUZZER BIT5
#define BOTAO_1 BIT0
#define BOTAO_2 BIT1
#define BOTAO_3 BIT2
volatile unsigned int botao = 5;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //desativa WDT
P1SEL = 0x00;
P2SEL &= ~(BOTAO_1+BOTAO_2+BOTAO_3);
P1SEL2 = 0x00;
P2SEL2 &= ~(BOTAO_1+BOTAO_2+BOTAO_3);
P1DIR |= LED1 + LED2 + BUZZER;
P2DIR &= ~(BOTAO_1 + BOTAO_2 + BOTAO_3); //ENTRADAS
P2REN |= BOTAO_1 + BOTAO_2 + BOTAO_3; //PULL'S
P2OUT &= ~(BOTAO_1 + BOTAO_2 + BOTAO_3); //PULL DOWN
P2IE |= BOTAO_1 + BOTAO_2 + BOTAO_3; //ativa interrupçoes
P2IES &= ~(BOTAO_1 + BOTAO_2 + BOTAO_3); // BORDA SUBIDA
P2IFG &= ~(BOTAO_1 + BOTAO_2 + BOTAO_3); //LIMPA FLAGS
P1OUT &= ~(LED1+LED2); //limpa porta
BCSCTL3|= XCAP_3;
for(;;)
{
_BIS_SR(LPM3_bits + GIE); // entra no modo de descanso ate ocorrer interrupção pelas portas
switch (botao) {
case 1:
P1OUT |= LED1;
break;
case 2:
P1OUT |= LED2;
break;
case 3:
P1OUT&= ~(LED1+LED2);
break;
}
}
}
#pragma vector=PORT2_VECTOR //interrupçao caso algum botao seja pressionado
__interrupt void Port_2(void)
{
if(BOTAO_1 & P2IFG ) //checa de onde veio a interrupção
botao=1;
if(BOTAO_2 & P2IFG )
botao=2;
if(BOTAO_3 & P2IFG )
botao=3; //DEBOUNCING:
P2IE &= ~(BOTAO_1+BOTAO_2+BOTAO_3); //desativa interrupçao pela porta
P2IFG = 0x00; //limpa flag
WDTCTL = WDT_ADLY_250;
IFG1 &= ~WDTIFG;
IE1 |= WDTIE;
//BEEP:
volatile int i = 3000;
P1OUT |= BUZZER; //liga buzzer
do{ i--; }while(i!=0); //delay para bip
P1OUT &= ~BUZZER; //desliga buzzer
_bic_SR_register_on_exit(LPM3_bits);
}
#pragma vector=WDT_VECTOR
__interrupt void WDT(void)
{
IE1 &= ~WDTIE; //desliga interrupçao por wdt
IFG1 &= ~WDTIFG; //limpa flag
WDTCTL = WDTPW + WDTHOLD; //stop wdt
P2IE |= (BOTAO_1+BOTAO_2+BOTAO_3); //religa interrupçao nas portas //DEBOUNCING FINISHED
}
//////////////////////////////
This is debouncing is not working well ... When i press one key , sometimes more than 1 beep happens ... !
Can everyone help me with that ?
Thanks