思丶无邪 发表于 2012-12-3 10:35:48

arduino中 阻塞延时

今天在弄一个脉冲的宽度是时候我不用delayMicroseconds()这个函数   就用asm("nop")这个语句在那里产生阻塞延时,板子的晶振是16M的,结果发现怪事了,我用的是这语句
int i=7;
PORTB|=(1<<PORTB7);
do{
    i--;
asm("nop");
}
while(i);
产生的延时时间是3.2微秒,结果i=6时 就立马跳到了440纳秒。i小于6时,延时的步长是62.5纳秒,如果i大于7,延时的步长就变成了440纳秒,不再是之前的62.5纳秒了,这让我有点搞不懂啊.....
结果我为了要产生1微妙的延时我用了笨的方法

for(int i=0;i<3;i++)   // delay 1 microsecond
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}

思丶无邪 发表于 2012-12-3 11:20:30

上面那里延时1微秒应该是
for(int i=0;i<2;i++)   // delay 1 microsecond
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}

linhaimi 发表于 2012-12-3 12:17:32

调用之前 asm("cli") 关全局中断

linhaimi 发表于 2012-12-3 12:17:51

之后 asm("sei") 恢复。

思丶无邪 发表于 2012-12-3 12:42:08

linhaimi 发表于 2012-12-3 12:17 static/image/common/back.gif
之后 asm("sei") 恢复。

我直接在loop的开始就用noIterrupts();关掉中断了...
页: [1]
查看完整版本: arduino中 阻塞延时