求教: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;
}
定时器分频、初值设定没问题,但是如下几个有毛病:
1. 定时器安全操作是先关闭 TCCR0=0 再给其他寄存器赋值,最后再 TCCR0=2,避免在运行中动态切换状态;
2. irtime 变量没有初始化就自增了,造成第一次循环时间不确定
3. 建议写成 if(irtime>=100),避免主函数循环(后台)错过 100 点的隐患
AVRSTUDIO 里边直接打断点,可以查看 CPU 运行时间,当然前提是要设置好运行频率 fosc 本帖最后由 rjx 于 2019-4-14 10:15 编辑
t3486784401:请帮看看,在AVR Studio里调试,已设置了断点,为什么一直不停的跑啊?我哪里搞的不对,请指教。压缩文件是跑的视频。 好久没用atmel单片机了,是不是一直没进入中断,“irtime==100”一直不成立,可以试试把断电设置在“if(irtime==100)”试试 哪位能指导一下,究竟该怎么用AVR Studio来检查定时器溢出中断的时间? 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 中断响应函数,或者暂时关闭之 非常感谢t3486784401,感谢你能花时间仔细查看我的视频并提出解决问题的办法。好人啊!我先试试看,有问题再请教。
本帖最后由 rjx 于 2019-4-16 17:51 编辑
可以了,按t3486784401的建议改了一下,主要改动:一是把无关的东西统统去掉;二是将主循环里的判断条件改成“>=”,就可以仿真了,亦可以计算定时器溢出中断的时间了。
看下面两个图:第一图,秒表的的起始时间是786us,断点停止时是2210us,共中断10次。因此:(2210-786)/10=142.4us,与设定的中断时间140us,有少许误差。
页:
[1]