【问题标题】:For loop is not incrementingFor循环不递增
【发布时间】:2013-10-08 23:51:34
【问题描述】:

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

【问题讨论】:

  • 在我已包含在此源文件中的头文件中
  • 这是我的头文件中的语句#define MAXCHANNELS 5
  • USART 线是否正确连接?在我看来,puts1USART 永远卡住了。
  • 我确定串口中的线是正确的,但是你建议我怎么做?
  • 根据您的调试器,尝试逐行检查您的程序。尝试删除可疑行(毕竟这是一个简短的程序,所以这仍然是可行的)。将您的channelsel 初始化为不同于0 的内容(这样您就可以区分stuck-in-loopstuck-before-loop

标签: c for-loop microcontroller mplab


【解决方案1】:

将channelsel声明为volatile

    volatile int channelsel

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

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

【讨论】:

  • Cory,我确实看过那个变量,它是在我的无限 for 循环的范围内声明的……我在全局范围内声明了它,现在它正在递增!非常感谢您的帮助!
  • 不客气。这是有道理的,尽管我建议不要使用全局变量,除非绝对需要。我仍然建议您查看反汇编,以便您了解此问题的“原因”。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多