[AVR单片机] 请教一下,影响定时器频率的因素有哪些?

[复制链接]
2230|6
 楼主| 金色大元宝 发表于 2014-6-14 16:50 | 显示全部楼层 |阅读模式
陆续买了2块ATMEGA 128的开发板,都是最小系统板,所有IO口引出。

同样的一个测试程序,就是定时器计数,每100ms反转LED。同样的8M晶振。

反正一片正常,另外一片明显缓慢。将近1s才反转。

想咨询下,影响定时器的因素大概会是什么?

熔丝位没有配置过,同一个程序,IAR编译,JTAGICE烧写。


  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: bsp_InitTimer
  4. *        功能说明: 配置systick中断,并初始化软件定时器变量
  5. *        形    参:无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_InitTimer(void)
  10. {
  11.         _CLI();                                   // 关总中断
  12.         TCCR0 = 0x00;          //停止定时器0
  13.         TIMSK &= ~(1<<OCIE0);  //禁止T/C0比较中断,只修改OCIE0的值,而不影响其他位
  14.        
  15.         TCCR0 = 0x0C;          //内部时钟,CTC模式,进行64分频 (0x0000 1100)(8 Mhz/64 = 125 khz)
  16.         TCNT0 = 0x00;          //赋计数初值
  17.         OCR0 = 0x7C;           //OCR0 = 0x7C(124),(124+1)/125khz= 1ms

  18.         TIMSK |= (1<<OCIE0);   //启用T/C0比较中断,将原来OCIE0为0的值,修改为1,而不影响其他位的值       
  19.         _SEI();                // 开总中断
  20.         
  21. }

  22. /*
  23. *********************************************************************************************************
  24. *        函 数 名: SysTick_ISR
  25. *        功能说明: SysTick中断服务程序,每隔1ms进入1次
  26. *        形    参:无
  27. *        返 回 值: 无
  28. *********************************************************************************************************
  29. */
  30. extern void bsp_RunPer1ms(void);        /* 此函数在 bsp.c 中定义 */
  31. extern void bsp_RunPer2ms(void);        /* 此函数在 bsp.c 中定义 */
  32. extern void bsp_RunPer10ms(void);        /* 此函数在 bsp.c 中定义 */
  33. extern void bsp_RunPer100ms(void);        /* 此函数在 bsp.c 中定义 */
  34. extern void bsp_RunPer300ms(void);        /* 此函数在 bsp.c 中定义 */
  35. extern void bsp_RunPer500ms(void);        /* 此函数在 bsp.c 中定义 */
  36. #pragma vector=TIMER0_COMP_vect
  37. __interrupt void SysTick_ISR(void)
  38. {
  39.         static Uint8 s_count = 0;
  40.         static Uint8 t_count = 0;
  41.         static Uint8 r_count = 0;
  42.         static Uint16 u_count = 0;
  43.         static Uint16 w_count = 0;

  44.         bsp_RunPer1ms();                /* 此函数在 bsp.c 中实现(可以为空) */

  45.         if (++t_count >= 2)
  46.         {
  47.                 t_count = 0;

  48.                 bsp_RunPer2ms();        /* 此函数在 bsp.c 中实现(可以为空) */
  49.         }

  50.         if (++s_count >= 10)
  51.         {
  52.                 s_count = 0;

  53.                 bsp_RunPer10ms();        /* 此函数在 bsp.c 中实现(可以为空) */
  54.         }
  55.         if (++r_count >= 100)
  56.         {
  57.                 r_count = 0;

  58.                 bsp_RunPer100ms();        /* 此函数在 bsp.c 中实现(可以为空) */
  59.         }
  60.         if (++u_count >= 300)
  61.         {
  62.                 u_count = 0;

  63.                 bsp_RunPer300ms();        /* 此函数在 bsp.c 中实现(可以为空) */
  64.         }
  65.         if (++w_count >= 500)
  66.         {
  67.                 w_count = 0;

  68.                 bsp_RunPer500ms();        /* 此函数在 bsp.c 中实现(可以为空) */
  69.         }
  70. }
  1. bsp_RunPer100ms();     //此函数里就只有一个语句,反转LED


wolension 发表于 2014-6-14 17:30 | 显示全部楼层
你也说了,熔丝位没有配置过,那为什么不按你的实际要求配置熔丝位呢?
虽然没有用过128,不过AVR很多芯片的时钟都是由熔丝来配置的啊。

不是你放了个8M晶振,时钟就是8M,也许它正在跑内部1M呢。

评分

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

查看全部评分

 楼主| 金色大元宝 发表于 2014-6-15 08:50 | 显示全部楼层
嗯。主要是两块板子送来的时候,附带的是7.6和11.0592晶振,印象中,超过3M以上,外部时钟晶振的熔丝位是一致的。所以一开始没管他

周一装个AVR STUDIO去配置下熔丝位后再试试。
 楼主| 金色大元宝 发表于 2014-6-16 08:23 | 显示全部楼层
确定了。确实是熔丝位的关系。结贴。
原野之狼 发表于 2014-6-16 09:40 | 显示全部楼层
芯片被使用过吧?不是缺省配置。
 楼主| 金色大元宝 发表于 2014-6-16 11:21 | 显示全部楼层
不是原始芯片,是买的最小系统板,一块附带7.372晶振,拿来就能用,应该是配置好了熔丝位,因为端口引出LED,而且无法跳帽断开。又买了另外一块,附带8M晶振,以为也和第一块一样,默认会配置好。所以也是拿来就用。发现频率不对。

两块板子不同,所以问下,晶振相同,程序相同,除了熔丝位,还有没有影响频率的因素。 当然,后来查明,第二块熔丝位未配置,配置好后就OK了。
 楼主| 金色大元宝 发表于 2014-6-16 11:23 | 显示全部楼层
还有,咨询下“原版”,因为先用STM32的。SYSTICK独立时钟很好用,所以也移植到了AVR。这样的思想进行编程,会不会出问题?

STM32是独立的,其他的中断和延时,不会影响SYSTICK独立时钟,,而AVR用的是TC0,其他的中断会影响到,开关总中断也会影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

82

帖子

3

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