准备一个不起眼的问题。
我正在为这个新的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++) {}
}
提前感谢您的帮助!
答案 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)
i
的定义是什么? char i
? int i
? long i
?如果您使用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位,看它是否开始工作。