2

这就是我想要弄清楚的,我有一个 MC9S08AW60。它有两个计时器,我正在尝试配置或仅检查计时器的滴答声,即,我只想检查溢出标志何时更改。代码的基本设计是:

PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0    0x01
#define mLED1    0x02
#define mLED2    0x04
#define mLED3    0x08
#define mLED4    0x10
#define mLED5    0x20
#define mLED6    0x40
#define mLED7    0x80



void main()
{

  While(j>0){

  ch_nbr++;
  if (ch_nbr == 8)  ch_nbr = 0;
  if (ch_nbr == 0)  PTFD = mLED0;  // Turn LED0 on, other LEDs off
  if (ch_nbr == 1)  PTFD = mLED1;  // Turn LED1 on, other LEDs off
  if (ch_nbr == 2)  PTFD = mLED2;  // Turn LED2 on, other LEDs off
  if (ch_nbr == 3)  PTFD = mLED3;  // Turn LED3 on, other LEDs off
  if (ch_nbr == 4)  PTFD = mLED4;  // Turn LED4 on, other LEDs off
  if (ch_nbr == 5)  PTFD = mLED5;  // Turn LED5 on, other LEDs off
  if (ch_nbr == 6)  PTFD = mLED6;  // Turn LED6 on, other LEDs off
  if (ch_nbr == 7)  PTFD = mLED7;  // Turn LED7 on, other LEDs off
  Mydelay();
   }
   } 
 void Mydelay(int *j)
{

 if (TPM1SC_TOF == 0) j=0;
 else j=1;
 return j;
 }

这个想法是检查值“j”是否同时决定 LED 是否应该亮起!这段代码不起作用。自从我使用 C 编程以来已经有一段时间了。我有点动摇,需要一些帮助。一个适当的解释会很好。请考虑 MCU 数据表的以下链接:http: //cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf

是否可以替换以下函数而不是现有的 Mydelay:

int Mydelay(int& j)
{
 if(TPM1SC_TOF == 0) j=0;
 else j=1;
 return j;
}
void main()
{
  PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0    0x01
#define mLED1    0x02
#define mLED2    0x04
#define mLED3    0x08
#define mLED4    0x10
#define mLED5    0x20
#define mLED6    0x40
#define mLED7    0x80   
  While(j==1)
 {
  ch_nbr++;
  if (ch_nbr == 8)  ch_nbr = 0;
  if (ch_nbr == 0)  PTFD = mLED0;  // Turn LED0 on, other LEDs off
  if (ch_nbr == 1)  PTFD = mLED1;  // Turn LED1 on, other LEDs off
  if (ch_nbr == 2)  PTFD = mLED2;  // Turn LED2 on, other LEDs off
  if (ch_nbr == 3)  PTFD = mLED3;  // Turn LED3 on, other LEDs off
  if (ch_nbr == 4)  PTFD = mLED4;  // Turn LED4 on, other LEDs off
  if (ch_nbr == 5)  PTFD = mLED5;  // Turn LED5 on, other LEDs off
  if (ch_nbr == 6)  PTFD = mLED6;  // Turn LED6 on, other LEDs off
  if (ch_nbr == 7)  PTFD = mLED7;  // Turn LED7 on, other LEDs off
 }
 Mydelay();
} 
4

3 回答 3

3

首先,您可能希望使用位移来显着简化您的代码(因为这就是您本质上在做的事情,位移位)。

这意味着您不需要为每个位置设置 8 个常量,而只需使用<<运算符在每次迭代时将位向左移动一个位置:

int MoveToLeft(int bitPosition)
{
    // shift left
    bitPosition = bitPosition << 1;

    // reset to '1' when we shift through all 8 bits
    if ((bitPosition & 0xFF) == 0)
        bitPosition = 1;

    return bitPosition;
}

接下来,比轮询定时器值更好的方法是使用中断例程。您需要设置一个函数,该函数将在您的计时器完成计数时自动调用。

我不确定您的代码是否可以这样工作。您的计时器的目的是在 LED 更改之间产生延迟吗?您的计时器会自动重置吗?如果计时器只在转换前等待,这样的事情会更合乎逻辑:

while (1) // repeat indefinitely
{
     // shift the bit
     ch_nbr = MoveLeft(ch_nbr);
     PTFD = ch_nbr;

     // while the timer is counting, do nothing
     while (TPM1_TOF == 0) 
     { }

     // reset the timer
     (not sure about this part, check your docs)
}
于 2012-12-19T20:39:07.150 回答
1

好吧,如果这是您代码的剪切粘贴,那么您需要解决一些问题:

  • 第一行:While(j>0){我没有看到 j 在任何地方声明或定义。编译器应该对此产生错误,并且While应该是小写while ( j > 0 )的。

  • 与 相同ch_nbr

  • 当你打电话时,MyDelay()你写了它&int,你可能的意思是(int *j),然后你什么都没有传递。

  • If需要小写if

  • 是的,正如评论显示的那样,您有 3 个左括号{和 5 个右括号}

修复这些,确保它不时编译,然后处理任何逻辑。

于 2012-12-19T18:32:29.933 回答
0
  1. 右括号比左括号多。尝试通过匹配括号来纠正这个问题(缩进会有所帮助)。

  2. 您没有在任何地方声明变量jcn_nbr 但您使用它们。

  3. C 语句是小写的 ( while, not While)。

  4. Mydelay()Mydelay(int &j)期望一个参数时,您正在不带参数地调用。此外,&j返回变量的地址j。我想你想要int *j这里。阅读更多关于指针的信息。

  5. 使用switchorif ... else if代替if ... if ... if .... 您的代码可以双向工作,但使用 switch 或 if else 更快。

考虑在此处了解有关 C 编程的更多信息:http ://www.cprogramming.com/

于 2012-12-19T18:35:06.313 回答