循环和微控制器

时间:2012-12-19 18:21:15

标签: c loops while-loop microcontroller

这是我想弄清楚的,我有一个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();
} 

3 个答案:

答案 0 :(得分:3)

首先,您可能希望使用bit shifting来显着简化代码(因为这正是您实际所做的,转移一点)。

这意味着每个位置不需要有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;
}

接下来,比轮询计时器值更好的方法是使用interrupt routines。您需要设置一个函数,只要您的计时器完成计数,它就会自动调用。

我不确定你的代码是否真的像这样。您的计时器的目的是在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)
}

答案 1 :(得分:1)

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

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

  • ch_nbr相同。

  • 当你致电MyDelay()时,你写了&int而你可能意味着(int *j),那么你没有传递任何东西。

  • If必须为小写if

  • 是的,因为评论显示您有3个左括号{和5个结束}

修复这些问题,确保它现在可以编译然后处理任何逻辑。

答案 2 :(得分:0)

  1. 您的结束括号多于左括号。尝试通过匹配括号来修正此问题(缩进将有所帮助)。

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

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

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

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

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