社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 430|回复: 5

[求助] 关于单片机程序case的问题

[复制链接]

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-2-15 09:37:46 | 显示全部楼层 |阅读模式
#include<msp430g2553.h>
//########################################################################
#define pwm_A_ON {P2DIR|=BIT1;P2DIR&=~(BIT2+BIT4);P2SEL|=BIT1;P2SEL&=~(BIT2+BIT4);}                                    //A+输出PWM信号
#define PWM_B_ON {P2DIR|=BIT2;P2DIR&=~(BIT1+BIT4);P2SEL|=BIT2;P2SEL&=~(BIT1+BIT4);}                                    //B+输出PWM信号
#define PWM_C_ON {P2DIR|=BIT4;P2DIR&=~(BIT1+BIT2);P2SEL|=BIT4;P2SEL&=~(BIT1+BIT2);}                                    //C+输出PWM信号
#define PWM_OFF {P2DIR&=~(BIT1+BIT2+BIT4);P2SEL&=~(BIT1+BIT2+BIT4);TA1CCR0=0;TA1CCR1=0;TA1CCR2=0}                    //关闭PWM输出

#define STEUER_A_H {PWM_A_ON}
#define STEUER_B_H {PWM_B_ON}
#define STEUER_C_H {PWM_C_ON}

#define STEUER_A_L {P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT0;P2OUT&=~(BIT3+BIT5);}                                  //打开NA-场效应
#define STEUER_B_L P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT3;P2OUT&=~(BIT0+BIT5);}                                  //打开NB-场效应管
#define STEUER_C_L {P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT5;P2OUT&=~(BIT0+BIT3);}                                  //打开NA-场效应管
#define STEUER_OFF {P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);PWM_OFF;}
#define FETS_OFF {P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);P2OUT&=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5);}

#define HIGH_A_EIN {P2DIR|=BIT1;P2OUT|=BIT1;}
#define HIGH_B_EIN {P2DIR|=BIT2;P2OUT|=BIT2;}
#define HIGH_C_EIN {P2DIR|=BIT4;P2OUT|=BIT4;}

#define LOW_A_EIN {P2DIR|=BIT0;P2OUT|=BIT0;}
#define LOW_B_EIN {P2DIR|=BIT3;P2OUT|=BIT3;}
#define LOW_C_EIN {P2DIR|=BIT5;P2OUT|=BIT5;}

#define SENSE_A {CACTL1|=CAEX;CACTL2 = P2CA0+P2CA2+P2CA3; }                                                                                                                                //NULL_A连接CA-
#define SENSE_B {CACTL1|=CAEX;CACTL2 = P2CA4+P2CA2+P2CA3; }                                                                                                                                //NULL_B连接CA-
#define SENSE_C {CACTL1|=CAEX;CACTL2 = P2CA0+P2CA4+P2CA2+P2CA3; }                                                                                                                //NULL_C连接CA-

#define SENSE ((CACTL1&CAifg))
#define SENSE_L (!(CACTL2&CAOUT))                                                                                                                                                                                //MITTEL电压低于NULL_X时表达式为真
#define SENSE_H ((CACTL2&CAOUT))                                                                                                                                                                                //MITTEL电压        高于NULL_X时表达式为真
#define ENABLE_SENSE_INT {CACTL1 |= CARSEL+CAON+CAIE;}                                                                                                                                        //打开并使能CA中断
#define DISABLE_SENSE_INT {CACTL1 &= ~(CARSEL+CAON+CAIE);}                                                                                                                                //关闭并禁用CA中断
#define SENSE_FALLING_INT ((CACTL1|=CAIES))                                                                                                                                                                //设置CA下降沿中断
#define SENSE_RAISING_INT ((CACTL1&=~CAIES))                //设置CA上升沿中断

void Manuell(void);
void TA0_Init();
unsigned int SetDelay(unsigned int t);
char CheckDelay(unsigned int t);
void Delay_ms(unsigned int w);
//########################################################################
unsigned char Phase=0;
volatile unsigned int CountMilliseconds=0;
void main()
{
        WDTCTL=WDTPW+WDTHOLD;
        TA0_Init();
          BCsctL1 = CALBC1_1MHZ;
          DCOCTL = CALDCO_1MHZ;
          BCSCTL3|=LFXT1S_2;

          DISABLE_SENSE_INT;

          TA1CTL = TASSEL_1 +TACLR+MC_1;
          TA1CCR0 =12000;
          TA1CCR1=5000;
          TA1CCTL1=OUTMOD_7;
          TA1CCR2=5000;
          TA1CCTL2=OUTMOD_7;

          while(1)
          {
                 Delay_ms(500);
                  Manuell();
                  Phase++;
                  Phase%=6;
          }


}
//########################################################################
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0()
{
        CountMilliseconds++;
}
//########################################################################
//
unsigned int SetDelay(unsigned int t)
{
        return(CountMilliseconds+t-1);
}
#pragma vector=COMPARATORA_VECTOR
__interrupt void COMPARATORA()
//########################################################################
{
        unsigned char sense=0;
        do
        {
        if(SENSE_H)
                sense=1;
        else
                sense=0;
        switch(Phase)
        {
        case 0:
                STEUER_A_H;
                if(sense)
                {
                        STEUER_C_L;
                        SENSE_FALLING_INT;
                        SENSE_B;
                        Phase++;
                }
                else
                        STEUER_B_L;
                break;
        case 1:
                STEUER_C_L;
                if(!sense)
                {
                        STEUER_B_H;
                        SENSE_A;
                        SENSE_RAISING_INT;
                        Phase++;
                }
                else
                        STEUER_A_H;
                break;
        case 2:
                STEUER_B_H;
                if(sense)
                {
                        STEUER_A_L;
                        SENSE_FALLING_INT;
                        SENSE_C;
                        Phase++;
                }
                else
                        STEUER_C_L;
                break;
        case 3:
                STEUER_A_L;
                if(!sense)
                {
                        STEUER_C_H;
                        SENSE_RAISING_INT;
                        SENSE_B;
                        Phase++;
                }
                else
                        STEUER_B_H;
                break;
        case 4:
                STEUER_C_H;
                if(sense)
                {
                        STEUER_B_L;
                        SENSE_FALLING_INT;
                        SENSE_A;
                        Phase++;
                }
                else
                        STEUER_A_L;
                break;
        case 5:
                STEUER_B_L;
                if(!sense)
                {
                        STEUER_A_H;
                        SENSE_RAISING_INT;
                        SENSE_C;
                        Phase=0;
                }
                else
                        STEUER_C_H;
                break;
                }
        }
        while((SENSE_L&&sense)||(SENSE_H&&!sense));
}
//########################################################################
//
void Manuell(void)
//########################################################################
{
        switch(Phase)
        {
        case 0:
                STEUER_A_H;
                STEUER_B_L;
                SENSE_C;
                SENSE_RAISING_INT;
                break;
        case 1:
                STEUER_A_H;
                STEUER_C_L;
                SENSE_B;
                SENSE_FALLING_INT;
                break;
        case 2:
                STEUER_B_H;
                STEUER_C_L;
                SENSE_A;
                SENSE_RAISING_INT;
                break;
        case 3:
                STEUER_B_H;
                STEUER_A_L;
                SENSE_C;
                SENSE_FALLING_INT;
                break;
        case 4:
                STEUER_C_H;
                STEUER_A_L;
                SENSE_B;
                SENSE_RAISING_INT;
                break;
        case 5:
                STEUER_C_H;
                STEUER_B_L;
                SENSE_A;
                SENSE_FALLING_INT;
                break;
        }
}
//########################################################################
//
void TA0_Init()
//########################################################################
{
        TACTL=TASSEL_2+MC_1;
        CCTL0 = CCIE;
        CCR0=1000;
        _BIS_SR(GIE);
}

//########################################################################
//
//########################################################################
char CheckDelay(unsigned int t)
{
        return(((t-CountMilliseconds)&0x8000)>>8);
}
//########################################################################
//
//########################################################################
void Delay_ms(unsigned int w)
{
        unsigned int akt;
        akt=SetDelay(w);
        while(!CheckDelay(akt));
}
//########################################################################
为什么会出现如图所示的问题???

此帖出自单片机论坛
搜狗截图20170215093621.png


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-2-15 09:43:08 | 显示全部楼层
新手就是截图截不到重点,要把报告的错误发出来才行。

点评

被发现了,哈哈  详情 回复 发表于 2017-2-15 09:44
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-2-15 09:44:59 | 显示全部楼层
lcofjp 发表于 2017-2-15 09:43
新手就是截图截不到重点,要把报告的错误发出来才行。

被发现了,哈哈
搜狗截图20170215094425.png


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-2-15 10:13:30 | 显示全部楼层
QQ截图20170215100747.png

暂不说缺少大括号的事,你这种风格的宏定义明显是存在问题的,没出现问题是因为单个语句你都放在else语句里面用了,如果
if (xxx)
   PWM_A_ON;
else
   PWM_OFF;
这样用就有问题的,块+;=两个语句。这样很容易出错

点评

谢谢  详情 回复 发表于 2017-2-15 10:38
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-2-15 10:15:16 | 显示全部楼层
可以改成这样的形式:
do{P2DIR|=BIT0+BIT3+BIT5;P2OUT|=BIT0;P2OUT&=~(BIT3+BIT5);}while(0)
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-2-15 10:38:52 | 显示全部楼层
lcofjp 发表于 2017-2-15 10:13
暂不说缺少大括号的事,你这种风格的宏定义明显是存在问题的,没出现问题是因为单个语句你都放在else语 ...

谢谢


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-19 20:09 , Processed in 0.407020 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表