搜索
bottom↓
回复: 6

M8想定时1微秒是不是很难呀?附上两个例子。

[复制链接]

出0入0汤圆

发表于 2012-12-2 21:27:49 | 显示全部楼层 |阅读模式
期望产生一个1s的方波,让PD0口的小灯0.5秒闪烁一次,实测后发现4.41秒闪一次。但是使用8分频产生1毫秒就没有问题。

以下为错误的代码:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <inttypes.h>

  4. volatile uint16_t count0 = 0;

  5. void port_init(void)
  6. {
  7.     DDRD = 0xFF;//输出
  8.     PORTD = 0x00;
  9. }

  10. void T0_init(void)
  11. {
  12.     TCCR0 |= (1<<CS00); // 不分频,1M内部晶振
  13.     TCNT0  = 0xFF; //1微秒后溢出
  14.     TIMSK |= (1<<TOIE0);// 使能T/C0中断
  15.     SREG  |= 0x80;//全局全局中断
  16. }


  17. int main(void)
  18. {
  19.     port_init();
  20.     T0_init();

  21.     while(1)
  22.     {
  23.     }
  24. }

  25. ISR (TIMER0_OVF_vect)
  26. {
  27.     //(256-TCNT0)/1M = 1us,TCNT0 = 0xFF
  28.     TCNT0  = 0xFF;
  29.     count0++;

  30.     if (count0 >= 50000) //50毫秒
  31.     {
  32.         count0 = 0;
  33.         PORTD ^= (1<<PD0);
  34.     }
  35. }
复制代码
以下为正确的代码:
  1. /* 1M RC, 定时500ms
  2. * T0, T1
  3. */
  4.   #include <avr/io.h>
  5. #include <avr/interrupt.h>
  6. #include <inttypes.h>
  7.   
  8. volatile uint16_t count0 = 0,count2 = 0;
  9.   
  10. void port_init(void)
  11. {
  12.     DDRD = 0xFF;//输出
  13.     PORTD = 0x00;
  14. }
  15.   
  16. void T0_init(void)
  17. {
  18.     TCCR0 |= (1<<CS01); // 8分频,1M
  19.     TCNT0  = 0x83;
  20.     TIMSK |= (1<<TOIE0);// 使能T/C0中断
  21.     SREG  |= 0x80;//全局全局中断
  22. }
  23.   
  24. void T2_init(void)
  25. {
  26.     TCCR2 |= (1<<CS21); // 8分频,1M
  27.     TCNT2  = 0x83;
  28.     TIMSK |= (1<<TOIE2);// 使能T/C2中断
  29.     SREG  |= 0x80;//全局全局中断
  30. }
  31.   
  32. int main(void)
  33. {
  34.     port_init();
  35.     T0_init();
  36.     T2_init();
  37.   
  38.     while(1)
  39.     {
  40.     }
  41. }
  42.   
  43. ISR (TIMER0_OVF_vect)
  44. {
  45.     //(256-TCNT0)*8/1M = 1ms,TCNT0 = 0x83
  46.     TCNT0  = 0x83;
  47.     count0++;
  48.   
  49.     if (count0 >= 500)
  50.     {
  51.         count0 = 0;
  52.         PORTD ^= (1<<PD0);
  53.     }
  54. }
  55.   
  56. ISR (TIMER2_OVF_vect)
  57. {
  58.     //(256-TCNT0)*8/1M = 1ms, TCNT2 = 0x83
  59.     TCNT2  = 0x83;
  60.     count2++;
  61.   
  62.     if (count2 >= 500)
  63.     {
  64.         count2 = 0;
  65.         PORTD ^= (1<<PD1);
  66.     }
  67. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-12-2 21:41:52 | 显示全部楼层
1M的时钟,一个周期就是1us,还要入栈出栈怎么算都不止1us了,你想累死M8啊

出0入0汤圆

发表于 2012-12-2 21:48:31 | 显示全部楼层
M8想定时1微秒是不是很难呀?


You simply have no idea what you are doing.

出0入42汤圆

发表于 2012-12-2 21:53:15 | 显示全部楼层
你的实测表明,AVR对中断的处理效率还是蛮高的

出0入0汤圆

发表于 2012-12-2 22:52:01 | 显示全部楼层
很容易做到的,

出0入0汤圆

 楼主| 发表于 2012-12-3 19:13:00 | 显示全部楼层
millwood0 发表于 2012-12-2 21:48
You simply have no idea what you are doing.

我就是想写一个可以定义一个很小的时间量的函数,以后用起来方便些。
比如delay_us(1000)就可以延时1个毫秒。

现在的问题变成了:m8可以较精确的定义最小的时间量是多少呢?

出500入0汤圆

发表于 2012-12-3 20:06:14 来自手机 | 显示全部楼层
仿真调延时,或者定时器吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 05:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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