1

我今天一直在研究这个代码类,并向你保证我已经经历了很多次。出于某种原因,每当我设置断点来确定“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);
}
4

2 回答 2

0

我一直在研究 PIC18,这是我的同事发现的一个错误,for 循环不适用于 c18 编译器,如果将其更改为 while 循环,它将正常工作。

于 2014-01-15T21:21:26.490 回答
0

将通道声明为 volatile

    volatile int channelsel

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

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

于 2013-10-09T11:52:04.043 回答