搜索
bottom↓
回复: 7

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

[复制链接]

出0入0汤圆

发表于 2019-4-13 19:28:33 | 显示全部楼层 |阅读模式
本帖最后由 rjx 于 2019-4-14 08:34 编辑

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

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

// 宏定义---
typedef  unsigned int  uint;
typedef  unsigned 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[TIM0_OVF] void timer_ovf(void)
{
  irtime++;
  TCNT0=0X74;   
}





出200入2554汤圆

发表于 2019-4-13 21:05:39 | 显示全部楼层
定时器分频、初值设定没问题,但是如下几个有毛病:

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

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

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

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

出0入0汤圆

 楼主| 发表于 2019-4-14 10:09:52 | 显示全部楼层
本帖最后由 rjx 于 2019-4-14 10:15 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出10入10汤圆

发表于 2019-4-14 10:16:27 | 显示全部楼层
好久没用atmel单片机了,是不是一直没进入中断,“irtime==100”一直不成立,可以试试把断电设置在“if(irtime==100)”试试

出0入0汤圆

 楼主| 发表于 2019-4-15 19:58:08 | 显示全部楼层
哪位能指导一下,究竟该怎么用AVR Studio来检查定时器溢出中断的时间?

出200入2554汤圆

发表于 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 中断响应函数,或者暂时关闭之

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-4-16 14:27:52 | 显示全部楼层
非常感谢t3486784401,感谢你能花时间仔细查看我的视频并提出解决问题的办法。好人啊!我先试试看,有问题再请教。


出0入0汤圆

 楼主| 发表于 2019-4-16 17:47:13 | 显示全部楼层
本帖最后由 rjx 于 2019-4-16 17:51 编辑

可以了,按t3486784401的建议改了一下,主要改动:一是把无关的东西统统去掉;二是将主循环里的判断条件改成“>=”,就可以仿真了,亦可以计算定时器溢出中断的时间了。
看下面两个图:第一图,秒表的的起始时间是786us,断点停止时是2210us,共中断10次。因此:(2210-786)/10=142.4us,与设定的中断时间140us,有少许误差。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

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

GMT+8, 2024-4-20 15:55

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

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