[AVR单片机] 定时器0用于计时的问题

[复制链接]
3651|11
 楼主| huamunv 发表于 2009-12-23 21:58 | 显示全部楼层 |阅读模式
最近试着做超声波测距的时候,用T/C0进行计时,我是这样设计程序的,该部分的几句程序如下:
void timer0(void)
{
  TCNT0=0X00;
  TCCR0=0X00;           //定时器初始化
}
//****主程序******
void main()
{
  ...........
  fasong();               //调用发送程序
  ...........
}
//****发送程序******
void   fasong(void)
{
  ...........
  TCCR0=0X01;         //在发送程序中发送完40khz脉冲
                  //后定时器启动
  ...........
}
//*******中断程序****
#pragma vector=INT1_OVF_vect
__interrupt int1_ovf_isr()
{
  ...........
  value=TCNT0;         //接收到超声波时进入中断,在中断中读取计数器值
  TCCR0=0X00;         //关闭定时器
  ............               //下面有计算距离的程序
}
程序如上,但老感觉别扭,请各位帮忙看下行不?
Karlshen 发表于 2009-12-25 11:58 | 显示全部楼层
中间省略了很多
lovelyegle 发表于 2009-12-26 22:03 | 显示全部楼层
别扭是啥?通不过?
laslison 发表于 2009-12-27 23:07 | 显示全部楼层
我学程序就很头疼,支持一下哈
 楼主| huamunv 发表于 2010-3-9 08:20 | 显示全部楼层
3# lovelyegle
感觉写的不好,可否优化
lianda_ 发表于 2010-3-10 12:02 | 显示全部楼层
"别扭"是什么意思嘛?
liao_fangxing 发表于 2010-3-11 11:29 | 显示全部楼层
本帖最后由 liao_fangxing 于 2010-3-11 11:31 编辑

就LZ贴出来的程序 感觉没啥好优化压缩的(个人水平有限)  但偶想弱弱地问句:
__interrupt int1_ovf_isr()
{
  ...........
  value=TCNT0;         //接收到超声波时进入中断,在中断中读取计数器值
  TCCR0=0X00;         //关闭定时器
  ............               //下面有计算距离的程序
}

中“ ............               //下面有计算距离的程序”  这块程序量大不??要是大 何不移走?
maxmin 发表于 2010-3-11 13:31 | 显示全部楼层
是挺别扭的,小小的一个功能,何必一定要使用中断?其实发送之后等待接收就可以了。
中断的作用是供CPU处理紧急情况的,上述事项中CPU并不忙,呆着也是呆着,等中断与空等待有什么区别?让我们的程序更容易读,按正常的思路正常的流程图进行,就不别扭了。

评分

参与人数 1威望 +1 收起 理由
huamunv + 1

查看全部评分

maxmin 发表于 2010-3-11 13:33 | 显示全部楼层
技术是为人服务的,掌握技术是为解决问题的,简单就是美!复杂就是不美。
 楼主| huamunv 发表于 2010-4-8 14:28 | 显示全部楼层
maxmin的意见很好,谢谢了
bbsavrvicom 发表于 2010-4-28 09:31 | 显示全部楼层
感觉楼上读取TCNT0有点问题。都已经溢出了。有必要读吗? 不就是TCNT0=256;中断程序需要思考
1# huamunv
lpydidi 发表于 2010-4-29 21:25 | 显示全部楼层
就进行一项任务,在实际中不太常用吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

730

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部