TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F5436A使用CCS7.4.0,程序中if-else if-else语句中if else语句无法进入执行

芯片为MSP430F5436A,开发环境使用CCS7.4.0.

问题:使用IO口输出心跳信号,在Time1中断进行计数,在主程序中使用if else语句判断数值,然后对IO口进行置位或复位,主程序中无法进入else if语句。

程序如下:

//  Time1 初始化

/* Timer1 Initialize */
TA1CCTL0 = CCIE + SCS; // Timer1 CCR0 interrupt enabled
TA1CCR0 = 16000;            // ACLK = 16MHz
TA1CTL = TASSEL_1 + MC0 + TACLR; // ACLK, contmode, clear TAR
 MSPWorkingIndicate = 0;

// IO 口初始化

/* Initialize IO_UART_232 BUS*/P1.0做输出口,P1.1做UART232的数据输入口,P1.2做UART232数据输出口,P1.3、P1.4、P1.5做心跳信号输出口
P1SEL |= 0x02; // Set P1.1 to UART RX/TA0
P1SEL |= 0x04; // Set P1.2 to UART TX/TA0
P1DIR &= ~BIT1; // Set P1.1 to UART RX
P1DIR |= BIT2; // Set P1.2 to UART TX
P1DIR |= BIT0; // MSP Ask Data from FPGA: High or UP edge active
P1DIR |= BIT3; // MSP Working Indicate1
P1DIR |= BIT4; // MSP Working Indicate2
P1DIR |= BIT5; // MSP Working Indicate3

// Time1中断处理函数

// Timer A0 interrupt service routine 1ms
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) TIMER1_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
    MSP430Timer1msCounter++;
    MSPWorkingIndicate++;               // 心跳计数
    UartTxReadyCounter++;
}

// 主程序

if (0 < MSPWorkingIndicate <= 100)
{
    P1OUT |= 0x38;
}
else if(100 < MSPWorkingIndicate < 200)
{
P1OUT &= ~0x38;
}
else(MSPWorkingIndicate>=200)
{
MSPWorkingIndicate = 0;
}

程序设计为输出200ms周期占空比50%的方波信号,编译完成后不报错,但执行起来不对,P1.3、P1.4、P1.5输出为常高信号。连接好仿真器后在 else if 内部语句P1OUT &= ~0x38;前打断点断电颜色为灰色,而在第一个if语句前  P1OUT |= 0x38; 打断点为正常高亮断点图标。

将主程序改为:

if (0 < MSPWorkingIndicate <= 100)
{
P1OUT |= 0x38;
}
if(100 < MSPWorkingIndicate < 200)
{
P1OUT &= ~0x38;
}
if(MSPWorkingIndicate>=200)
{
MSPWorkingIndicate = 0;
}

if语句内均可正常打断点,断点为高亮图标,但是程序执行结果不对,P1.3、P1.4、P1.5输出波形为约5us周期高电平约几十ns的脉冲信号。

如果将主程序该段代码屏蔽,改到中断函数中:

// Timer A0 interrupt service routine 1ms
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) TIMER1_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
MSP430Timer1msCounter++;
MSPWorkingIndicate++;

if(MSPWorkingIndicate == 100)
    P1OUT |= 0x38;
if(MSPWorkingIndicate == 200)
{
    MSPWorkingIndicate = 0;
    P1OUT &= ~0x38;
}

}

输出信号正常,为200ms周期占空比为50%的方波信号。

如果程序有问题编译器应该报错或给警告,而且为什么在主程序中执行错误,在中断中可正常执行?搞不懂了

灰小子:

你的程序有问题啊,else(MSPWorkingIndicate>=200)

else后面没有带条件语句的

不报错可能在警告里面,注意看控制台的信息

Tao Liu7:

回复 灰小子:

if (0 < MSPWorkingIndicate <= 100)
{P1OUT |= 0x38;
}
else if(100 < MSPWorkingIndicate < 200)
{
P1OUT &= ~0x38;
}
else
{
MSPWorkingIndicate = 0;
}
这样也不行,执行的也不对

灰小子:

回复 Tao Liu7:

建议画一下流程图,弄清楚逻辑结构。
还有,建议上传下完整的代码。
中间如果有成功得到结果的情况,就在成功的情况下慢慢调整测试,不要一次改的太多。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5436A使用CCS7.4.0,程序中if-else if-else语句中if else语句无法进入执行
分享到: 更多 (0)