我今天一直在研究这个代码类,并向你保证我已经多次使用过它。出于某种原因,每当我设置断点以确定“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);
}
答案 0 :(得分:0)
将渠道声明为易失性
volatile int channelsel
很可能你的编译器正在优化其余的语句,以便它们甚至不在反汇编中。当处理更新速度非常快的值或接近控制值声明和赋值的条件语句时, volatile 告诉编译器我们总是希望为此变量设置一个新值并采用任何值捷径。依赖于IO的变量应始终声明为volatile,而像这样的情况是其使用的良好候选者。编译器都不同,您的里程可能会有所不同。
如果您确定您的硬件配置正确,这将是我的建议。如有疑问,请发布此段的反汇编代码。
答案 1 :(得分:0)
我一直在研究PIC18,这是我的同事发现的一个错误,因为循环不能与c18编译器一起使用,如果你把它改成while循环它会正常工作。