打印
[AVR单片机]

定时器0用于计时的问题

[复制链接]
2868|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 | 只看该作者
我学程序就很头疼,支持一下哈

使用特权

评论回复
5
huamunv|  楼主 | 2010-3-9 08:20 | 只看该作者
3# lovelyegle
感觉写的不好,可否优化

使用特权

评论回复
6
lianda_| | 2010-3-10 12:02 | 只看该作者
"别扭"是什么意思嘛?

使用特权

评论回复
7
liao_fangxing| | 2010-3-11 11:29 | 只看该作者
本帖最后由 liao_fangxing 于 2010-3-11 11:31 编辑

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

中“ ............               //下面有计算距离的程序”  这块程序量大不??要是大 何不移走?

使用特权

评论回复
8
maxmin| | 2010-3-11 13:31 | 只看该作者
是挺别扭的,小小的一个功能,何必一定要使用中断?其实发送之后等待接收就可以了。
中断的作用是供CPU处理紧急情况的,上述事项中CPU并不忙,呆着也是呆着,等中断与空等待有什么区别?让我们的程序更容易读,按正常的思路正常的流程图进行,就不别扭了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
huamunv + 1
9
maxmin| | 2010-3-11 13:33 | 只看该作者
技术是为人服务的,掌握技术是为解决问题的,简单就是美!复杂就是不美。

使用特权

评论回复
10
huamunv|  楼主 | 2010-4-8 14:28 | 只看该作者
maxmin的意见很好,谢谢了

使用特权

评论回复
11
bbsavrvicom| | 2010-4-28 09:31 | 只看该作者
感觉楼上读取TCNT0有点问题。都已经溢出了。有必要读吗? 不就是TCNT0=256;中断程序需要思考
1# huamunv

使用特权

评论回复
12
lpydidi| | 2010-4-29 21:25 | 只看该作者
就进行一项任务,在实际中不太常用吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

730

帖子

1

粉丝