rjx 发表于 2019-4-13 19:28:33

求教:M8的定时器0这样设置对吗?麻烦各位指导一下

本帖最后由 rjx 于 2019-4-14 08:34 编辑

下面的程序就是M8的TIM0的验证代码,请教两个问题:
1、请各位看看这个定时器的设置对不对,0.140MS溢出中断,中断函数对不对?
2、主循环里有几句简单的判断语句,主要是想验证中断溢出的时间对不对,想在AVR Studio里看时间,但还没弄清该怎么验证,这个方法能验证码?

#include <mega8.h>;                //包含单片机内部资源预定义
#include <delay.h>;

// 宏定义---
typedefunsigned intuint;
typedefunsigned char uchar;

#define NOP()#asm("nop")
void MCU_init (void);// 涵数声明---   
uchar irtime;// 全局变量---           

void main (void)
{       
        MCU_init();                                                // 初始化MCU                
        #asm("sei")      
   
        while (1)            
   {      
            if(irtime==100)
                {
                  TCCR0=0X00;
                  irtime=0;   
                           
                }            
    }
}
// ------------------------------------------------- //

void MCU_init (void)    //单片机初始化
{      
   // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: On
    // INT1 Mode: Low level
    GICR|=0xC0;
    MCUCR=0x02;
    GIFR=0xC0;
    GIFR|=(1<<INTF0);
   
    TCCR0=0X02;//WGM01=0、WGM00=0,普通模式;COM01=0、COM00=0,PB3为普通I/O(OC0不与引脚相连)
                        //CS02=0、CS01=1、CS00=0,8分频
    TCNT0=0x74;   //定时器频率=8M/8=100000HZ,定时器初值设定时间=(256-116)/100000=0.140ms
    //OCR0 =0x73;   //匹配值                      
    TIMSK |=0X01;// 允许中断
   
}

// ------------------------------------------------- //

interrupt void timer_ovf(void)
{
irtime++;
TCNT0=0X74;   
}





t3486784401 发表于 2019-4-13 21:05:39

定时器分频、初值设定没问题,但是如下几个有毛病:

1. 定时器安全操作是先关闭 TCCR0=0 再给其他寄存器赋值,最后再 TCCR0=2,避免在运行中动态切换状态;

2. irtime 变量没有初始化就自增了,造成第一次循环时间不确定

3. 建议写成 if(irtime>=100),避免主函数循环(后台)错过 100 点的隐患

AVRSTUDIO 里边直接打断点,可以查看 CPU 运行时间,当然前提是要设置好运行频率 fosc

rjx 发表于 2019-4-14 10:09:52

本帖最后由 rjx 于 2019-4-14 10:15 编辑

t3486784401:请帮看看,在AVR Studio里调试,已设置了断点,为什么一直不停的跑啊?我哪里搞的不对,请指教。压缩文件是跑的视频。

szxszx 发表于 2019-4-14 10:16:27

好久没用atmel单片机了,是不是一直没进入中断,“irtime==100”一直不成立,可以试试把断电设置在“if(irtime==100)”试试

rjx 发表于 2019-4-15 19:58:08

哪位能指导一下,究竟该怎么用AVR Studio来检查定时器溢出中断的时间?

t3486784401 发表于 2019-4-15 21:11:45

rjx 发表于 2019-4-14 10:09
t3486784401:请帮看看,在AVR Studio里调试,已设置了断点,为什么一直不停的跑啊?我哪里搞的不对,请指教 ...

我逐帧观看了你的视频,应该发现了问题所在:

BUG现象:进入 while 循环后不久又自动进入 MCU_init

BUG分析:
1. 我看到了你有正确开启中断标志,左侧 SREG.I 标志位正确置位,如下图:


2. 每次意外跳转 MCU_init 之前,SREG.I 居然复位了(代码里没有CLI),如下图:


3. 如果你熟悉 AVR 的话,SREG.I 被硬件复位只有一种情况:
   就是发生中断尚未调用 RETI 指令。说开来就是:“存在未处理的中断”。
   考虑到你 MCU_init 当中有开启 INT0/1,很显然某种原因使其发生了中断,
   并且你没有写对应的中断处理函数,导致程序在 INT0/1 向量处跑飞。

解决建议:
建议添加 INT0/1 中断响应函数,或者暂时关闭之

rjx 发表于 2019-4-16 14:27:52

非常感谢t3486784401,感谢你能花时间仔细查看我的视频并提出解决问题的办法。好人啊!我先试试看,有问题再请教。


rjx 发表于 2019-4-16 17:47:13

本帖最后由 rjx 于 2019-4-16 17:51 编辑

可以了,按t3486784401的建议改了一下,主要改动:一是把无关的东西统统去掉;二是将主循环里的判断条件改成“>=”,就可以仿真了,亦可以计算定时器溢出中断的时间了。
看下面两个图:第一图,秒表的的起始时间是786us,断点停止时是2210us,共中断10次。因此:(2210-786)/10=142.4us,与设定的中断时间140us,有少许误差。
页: [1]
查看完整版本: 求教:M8的定时器0这样设置对吗?麻烦各位指导一下