我的PIC的时间延迟

时间:2014-01-11 21:37:36

标签: delay timing pic

准备一个不起眼的问题。

我正在为这个新的PIC编写一些超简单的代码,我刚刚得到了它。我所要做的就是闪烁LED。下面是两个代码示例 - 第一个工作,但第二个没有。为什么??我看不出第二个问题。

WORKS:

        while(1)
{
    i=99999;
    while(i--) {
        LATAbits.LATA0 = 0;  // set RA0 to logic 1
    }
    i=99999;
    while(i--) {
    LATAbits.LATA0 = 1;  // set RA0 to logic 0
    }
}    

不工作:

        while(1)
{
    LATAbits.LATA0 = 1;  // set RA0 to logic 1
    for(i=0;i<99999;i++) {}
    LATAbits.LATA0 = 0;  // set RA0 to logic 0
    for(i=0;i<99999;i++) {}
}

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

试试这个:

while(1)
{
    for(i=0;i<99999;i++) 
    {
        LATAbits.LATA0 = 1;  // set RA0 to logic 1
    } 
    for(i=0;i<99999;i++) 
    {
        LATAbits.LATA0 = 0;  // set RA0 to logic 0
    }
}

也许你的编译器正在优化并忽略for语句,因为它们没有要在里面执行的代码。我所做的是将RA0赋值放在这些语句中,迫使编译器保持延迟循环。

您还可以将参数-S传递给编译器以查看生成的汇编代码,并确认已删除for语句。 -S选项生成一个带有“。S”扩展名的中间文件。

答案 1 :(得分:0)

  1. 您对i的定义是什么? char iint ilong i
  2. 你在使用什么PIC?
  3. 如果您使用int,则8位PIC使用16位int

    那会发生什么:

    // Try to stuff 99999 into 16-bits, but it becomes 34463
    i=99999;
    
    // Count-down from 34463 to zero
    while(i--) {}
    
    // Successfully exit delay
    

    相反:

    // Count up from zero
    // Get to 65535 and then reset to zero
    // Never reach 99999
    for(i=0;i<99999;i++) {}
    // Never exit delay
    

    尝试将unsigned long int用于i,它在PIC上往往是32位,看它是否开始工作。