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