For循环不递增

时间:2013-10-08 23:51:34

标签: c for-loop microcontroller mplab

我今天一直在研究这个代码类,并向你保证我已经多次使用过它。出于某种原因,每当我设置断点以确定“channelsel”的值时,我得到的都是“0”。我从来没有得到1,2,3或4(我的MAXCHANNELS是5)。

我正在使用:P18F45K22微控制器和mplab c18。

请查看以下代码,并提前感谢

int channelsel = 0;
for (channelsel = 0; channelsel < MAXCHANNELS; channelsel++)
    {   
    switch(channelsel)
       {
        case 0:
            SetChanADC(ADC_CH0);
            break;
        case 1:
            SetChanADC(ADC_CH1);
            break;
        case 2: 
            SetChanADC(ADC_CH2);
            break;
        case 3:
            SetChanADC(ADC_CH3);
            break;
        case 4: 
            SetChanADC(ADC_CH4);
            break;
        default:
            SetChanADC(ADC_CH0);
            break;
        }   
    ConvertADC();
    while(BusyADC() == TRUE) Delay1TCY();       
    sampledValue = ReadADC();
    setCurrentTemperatureForChannel(channelsel, sampledValue);
    sprintf (buf, "current Temp of channel %i is %x \n\r", channelsel, sampledValue);
    puts1USART(buf);
    Delay10KTCYx(10);
}

2 个答案:

答案 0 :(得分:0)

将渠道声明为易失性

    volatile int channelsel

很可能你的编译器正在优化其余的语句,以便它们甚至不在反汇编中。当处理更新速度非常快的值或接近控制值声明和赋值的条件语句时, volatile 告诉编译器我们总是希望为此变量设置一个新值并采用任何值捷径。依赖于IO的变量应始终声明为volatile,而像这样的情况是其使用的良好候选者。编译器都不同,您的里程可能会有所不同。

如果您确定您的硬件配置正确,这将是我的建议。如有疑问,请发布此段的反汇编代码。

答案 1 :(得分:0)

我一直在研究PIC18,这是我的同事发现的一个错误,因为循环不能与c18编译器一起使用,如果你把它改成while循环它会正常工作。