极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10972|回复: 4

arduino中 阻塞延时

[复制链接]
发表于 2012-12-3 10:35:48 | 显示全部楼层 |阅读模式
今天在弄一个脉冲的宽度是时候  我不用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");
}
回复 支持 反对

使用道具 举报

发表于 2012-12-3 12:17:32 | 显示全部楼层
调用之前 asm("cli") 关全局中断
回复 支持 反对

使用道具 举报

发表于 2012-12-3 12:17:51 | 显示全部楼层
之后 asm("sei") 恢复。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-3 12:42:08 | 显示全部楼层
linhaimi 发表于 2012-12-3 12:17
之后 asm("sei") 恢复。

我直接在loop的开始就用noIterrupts();关掉中断了...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 00:02 , Processed in 0.065533 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表