你(们)好 我有一个MSP430G2553,我正在使用它开发一个系统,从四个选项中选择一个,使用LED指示当前可选的选项,并使用一个按钮进行选择。 我配置代码的方式,它按预期工作,接近当时的80 %。 我的问题是,鉴于示波器上的轨迹显示观察到的按钮弹跳比软件反跳时间短,有人能看到我如何对其进行错误编码吗?
在代码中,我在连续模式下使用Timer1_A1在4个LED之间循环,并有延迟。 在 重新启用按钮引脚上的中断之前,我使用了一个软件去抖(来自bennthomsen.wordpress.com/engineering-toolbox/ti-msp430-launchpad/using-the-switches/),它使用看门狗计时器设置来创建一个32毫秒的延迟(WDT_MDLY_32)。 将中断设置为在低到高转换时触发,并向上拉引脚,以便按钮在释放时触发中断。 我在这个线路板电路上只观察到少于200 us的弹跳时间,所以要么我没有正确设置按钮,要么我没有正确实施看门狗软件延迟。
感谢您提供的任何帮助!
尼克
#include <MSP430.h>
#define LED1 BIT4
#define LED2 BIT5
#define LED3
BIT1
#define PB1 BIt2
volatile int timeroverflow =0;
volatile int ButtonPressed =0;
void OffturnLeds(void);
/*
main.c
*/
int main(void){
Int selectingLED = 1;
Int ledPostit = 0;
Int myLeds[4]={LED1,LED2,LED3,LED4};
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
//将端口设置为i/o
P1SEL = 0;
P1SEL2 = 0;
P1DIR ||(LED1 + LED2);
P1OUT =~(LED1 + LED2);//关闭P2SEL
= 0;
P2SEL2 = 0;
P2DIR ||(LED3 + LED4);
P2OUT =~(LED3 + LED4);//关闭这些功能
//首先打开此LED
P1OUT = LED1;
//设置按钮
P2DIR &=~PB1;//设置为输入引脚
P2REN |= PB1;//启用上/下拉电阻器
P2OUT |= PB1;//选择上拉
P2IES &=~PB1;//启用中断以在上升边缘触发
P2IFG &=~PB1;//清除中断标志
P2IE |= PB1;//在此引脚上启用中断
/*
MC_2连续向上,ID_3输入除以8,tassel_2 SMCLK,启用中断
*/
TA1CTL = MC_2 + tassel_2 + ID_3 + TAIE;
__enable_interrupt ();
for (;)
{
int lpbPressed = pushButtonPressed;
IF (lpbPressed == 1)
{
IF (选择LED == 1)
{
//禁用计时器中断
TA1CTL &=~TAIE;
选择LED =0;
其他{
//启用计时器中断并返回显示LED
TA1CTL |= TAIE;
选择LED = 1;
//turnOffLeds();
}
pushButtonPressed = 0;
//启用按钮中断
P2IE |= PB1;
}
IF (时间溢出== 1)
{
时间溢出=0;
//关闭所有LED
TurnOffLeds();
如果(ledPostit < 2)//检查端口1
{
P1OUT |= myLeds[ledPost];
}else {//必须为port2
P2OUT |= myLeds[ledPosit];
}
IF (ledPostit > 2)
{
ledPostit = 0;
其他{
ledPostit = ledPostit + 1;
}
}
}返回
0;
}
作废TurnOffLeds(void){
P1OUT &=~(LED1 + LED2);
P2OUT &=~(LED3 + LED4);
}
#pragma vector = port2_vector
__interrupt void port2_isr (void)
{
P2IFG &=~PB1;//清除标志
P2IE &=~PB1;//禁用中断
/*
WDTCTL = WDT_MDLY_32;//启动并设置分退退弹的WD计时器
IFG1 &=~WDTIFG;//清除标志
IE1 |= W技工 经;//启用WDT中断
*/
pushButtonPressed =1;
}
#pragma vector = WDT_vector
__interrupt void WDT_ISR(void)
{
IE1 &=~WTIE;//禁用WDT
IFG1 &=~WDTIFG;//清除标志
WDTCTL = WDTPW | WDTHOLD;//停止WD
//启用按钮中断
P2IE |= PB1;
}
#pragma vector = Timer1_A1_vector
__interrupt void Timer1_A1_ISR (void)
{
静态内部计时器计数器=0;
开关(TA1IV){
情况10://OVERFLOW TA1IFG
{
IF (时间计数器== 3)
{
时间溢出= 1;
计时器计数器=0;
其他{
timerCounter = timerCounter + 1;
}
中断;
}
默认:
//抱歉
中断;
}
}