搜索
bottom↓
回复: 4

<<AVR单片机嵌入式系统原理与应用实践》书中测周法不大明白。

[复制链接]

出0入0汤圆

发表于 2009-11-11 11:26:07 | 显示全部楼层 |阅读模式
第327页

一条语句不明白
TIFR|=0x02;  //写逻辑1到OCF0。

问题1:后面的解释是清除T/C2的中断标志位。不解??
问题2:对于中断标志位,书中都有这么类似的一句话
“写入一个逻辑‘1’到某中断标志位,将清除该中断标志位”
这句话从一开始就不大明白,由于程序中不怎么涉及,所以自己把它理解为“将中断标志位置0”,
自己也觉得这样理解有点问题,把1写进去怎么会0呢?以上纯属个人理解,请教正确的解释。。

如果问题2的理解正确的话,就有问题3:
进入T2的匹配中断后,中断标志位由硬件自动清零,那么为什么要在T1匹配中断中,清除T2中断标志位?是不是多余了。亦或是来不及自动清零就先运行了嵌套的T1的匹配中断??


以上纯属理解问题,自己解决不了,请教。。

出0入0汤圆

 楼主| 发表于 2009-11-11 16:30:12 | 显示全部楼层
附上程序(源程序是CVAVR的,改成ICC的):
程序大致意思:
测量频率,定时器0工作在计数模式,定时器2记录中断次数,
在限定的脉冲内计算周期,
时间=中断次数*计数一次时间+最后的TCNT2的值。

#include"iom16v.h"
#include"macros.h"
#define uchar unsigned char
#define uint unsigned int
const uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
const uchar pos[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar disbuf[8],posit;
uchar freq_ok;
uchar time2_new;
uint freq;
long freq_temp;
void display()
{
PORTC=0xff;
PORTA=led[disbuf[posit]];
//if(posit==5) PORTA|=0x80;
PORTC=pos[posit];
if(++posit>=8) posit=0;
}
#pragma interrupt_handler time0_comp:20
void time0_comp()
{
time2_new=TCNT2;
TCNT2=0;
TIFR|=0x02;                        //由此语句引发出的疑惑。。。。
freq_temp=freq;  //中断次数
freq=0;
freq_ok=1;
}
#pragma interrupt_handler time2_comp:4
void time2_comp()
{
freq++;
SEI();
display();
}
void freq_con()
{
uchar i,j=7;
for(i=0;i<=7;i++)
{
  disbuf[j-i]=freq_temp%10;
  freq_temp=freq_temp/10;
}
}
void main()
{
uchar i;
DDRA=0xff;
DDRC=0xff;
TCCR2=0x0a;
TCNT2=0;
OCR2=0xf9;
TCCR0=0x0e;
OCR0=0xf9;
TIMSK=0x82;
for(i=0;i<=7;i++) disbuf=0;
SEI();
while(1)
{
  if(freq_ok)
  {
   freq_temp=freq_temp*250+time2_new;
   freq_temp=(long)(125000000/freq_temp);
   freq_con();
   freq_ok=0;
  }
}
}

出0入0汤圆

发表于 2009-11-11 17:02:40 | 显示全部楼层
TIFR|=0x02;//清除定时器0的比较匹配标志,此位在进入定时器0的比较匹配中断程序时硬件清零,可以不写,写了也无妨

出0入0汤圆

发表于 2009-11-12 10:02:31 | 显示全部楼层
问题1:后面的解释是清除T/C2的中断标志位。不解??

此句 TIFR|=0x02 有误,应该为 TIFR = 0X80; 在本书第2次印刷版中已经做了勘误修改。
它是在T/C0中断服务中,清除T/C2的中断标志位。

=======================================================================
问题2:对于中断标志位,书中都有这么类似的一句话
“写入一个逻辑‘1’到某中断标志位,将清除该中断标志位”
这句话从一开始就不大明白,由于程序中不怎么涉及,所以自己把它理解为“将中断标志位置0”,
自己也觉得这样理解有点问题,把1写进去怎么会0呢?以上纯属个人理解,请教正确的解释。

与传统的51不同,在现在的新型的芯片中,对中断标志位的清零许多都使用写“1”清零。这个主要是为了适合使用C的编程(没有位操
作,需要读、改、写的操作)在内部硬件上做了变化。如果你学习STM32的话,可以明显的看到这个变化。

具体的原因到了一定的水平后自己会体会和明白的,一般初学者不容易理解。这里的掌握的就是,对中断标志位写“1”与其它不同,不是将“1”写到标志位中,这个“1”相当控制中断标志位的清零控制信号,将中断标志位清零。简单可以理解中断标志位相当一个数字逻辑电路中的一个RS触发器的输出,该RS触发器有个RESET控制信号输入,当RESET为“1”,清零输出,RESET为“0”,RS触发器的输出不变。写“1”的指令不是让RS触发器输出“1”,而是将RS触发器的RESET置“1”,此时RS触发器的输出为“0”了。

=====================================================

如果问题2的理解正确的话,就有问题3:
进入T2的匹配中断后,中断标志位由硬件自动清零,那么为什么要在T1匹配中断中,清除T2中断标志位?是不是多余了。亦或是来不及自动清零就先运行了嵌套的T1的匹配中断??

进入T2的匹配中断后,中断标志位是已经由硬件自动清零了,但注意T2是会被T0中断打断的,这样T2中断的执行可能为T2+T0两个中断服务的时间,如果这个时间过长,超出T2的中断间隔,那么T2中断还没退出,T2中断标志位会建立的。这样的话,本次T2中断退出时,可能马上又进入中断,freg就会多加一次,造成主代码中频率计算的不正确。

这里的例子是一个简单的中断嵌套的例子,并不全面。但也说明中断嵌套需要考虑很多的问题,如何保证不冲突等。也是让大家体会,我前面讲的:中断服务需要尽量的短,以及尽量不采用中断嵌套的原则。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-3 05:20

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

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