2012-12-19 102 views
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(); 
} 
+2

我注意到的第一件事是您有3个开头括号和5个右括号。 – Foggzie

+1

这是编译?您可以不带参数调用MyDelay。 MyDelay功能不会有任何延迟。 j的定义在哪里?如何调用LED_poll?你需要处理这个问题...... –

+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) 
} 
+0

感谢您的完美回复。至于位移,我会牢记这一点。是的,根据数据表,定时器重置自身。所以我需要检查的是在0xFF到0x00之间切换时标志开/关的时候。如果您查看数据表第170页,TOF部分。 – sheetansh

1

好吧,如果这是你的代码的复制粘贴你已经得到了一些东西来解决:

  • 1日这一行:While(j>0){我没有看到Ĵ声明或任何定义。编译器应该已经生成了一个错误,并且While应该是小写while (j > 0)

  • ch_nbr相同。

  • 当你拨打MyDelay()时,你写了一个&int,你可能意思是(int *j),那么你没有通过任何东西。

  • If必须是小写if

  • 是的,作为评论表明你有3个开括号{和5日收盘那些}

修复这些,确保它现在编译,然后解决任何逻辑。

+0

我已经做了必要的更改! – sheetansh

+0

太棒了!它现在按预期工作吗?或者需要更多更改? –

0
  1. 您有更多的右括号。尝试通过匹配括号来纠正这种情况(缩进将有所帮助)。

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

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

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

  5. 使用switchif ... else if而不是if ... if ... if ...。你的代码可以两种方式工作,但是使用开关或者其他的更快。

考虑学习更多关于C编程的位置:http://www.cprogramming.com/