打印
[AVR单片机]

请教一下,影响定时器频率的因素有哪些?

[复制链接]
1862|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金色大元宝|  楼主 | 2014-6-14 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
陆续买了2块ATMEGA 128的开发板,都是最小系统板,所有IO口引出。

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

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

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

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


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

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

/*
*********************************************************************************************************
*        函 数 名: SysTick_ISR
*        功能说明: SysTick中断服务程序,每隔1ms进入1次
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
extern void bsp_RunPer1ms(void);        /* 此函数在 bsp.c 中定义 */
extern void bsp_RunPer2ms(void);        /* 此函数在 bsp.c 中定义 */
extern void bsp_RunPer10ms(void);        /* 此函数在 bsp.c 中定义 */
extern void bsp_RunPer100ms(void);        /* 此函数在 bsp.c 中定义 */
extern void bsp_RunPer300ms(void);        /* 此函数在 bsp.c 中定义 */
extern void bsp_RunPer500ms(void);        /* 此函数在 bsp.c 中定义 */
#pragma vector=TIMER0_COMP_vect
__interrupt void SysTick_ISR(void)
{
        static Uint8 s_count = 0;
        static Uint8 t_count = 0;
        static Uint8 r_count = 0;
        static Uint16 u_count = 0;
        static Uint16 w_count = 0;

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

        if (++t_count >= 2)
        {
                t_count = 0;

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

        if (++s_count >= 10)
        {
                s_count = 0;

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

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

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

                bsp_RunPer500ms();        /* 此函数在 bsp.c 中实现(可以为空) */
        }
}
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 | 只看该作者
确定了。确实是熔丝位的关系。结贴。

使用特权

评论回复
5
原野之狼| | 2014-6-16 09:40 | 只看该作者
芯片被使用过吧?不是缺省配置。

使用特权

评论回复
6
金色大元宝|  楼主 | 2014-6-16 11:21 | 只看该作者
不是原始芯片,是买的最小系统板,一块附带7.372晶振,拿来就能用,应该是配置好了熔丝位,因为端口引出LED,而且无法跳帽断开。又买了另外一块,附带8M晶振,以为也和第一块一样,默认会配置好。所以也是拿来就用。发现频率不对。

两块板子不同,所以问下,晶振相同,程序相同,除了熔丝位,还有没有影响频率的因素。 当然,后来查明,第二块熔丝位未配置,配置好后就OK了。

使用特权

评论回复
7
金色大元宝|  楼主 | 2014-6-16 11:23 | 只看该作者
还有,咨询下“原版”,因为先用STM32的。SYSTICK独立时钟很好用,所以也移植到了AVR。这样的思想进行编程,会不会出问题?

STM32是独立的,其他的中断和延时,不会影响SYSTICK独立时钟,,而AVR用的是TC0,其他的中断会影响到,开关总中断也会影响。

使用特权

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

本版积分规则

24

主题

82

帖子

3

粉丝