这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于中断的几个困惑的问题

共15条 1/2 1 2 跳转至

关于中断的几个困惑的问题

助工
2008-04-18 08:22:41     打赏
1,根据手册,R8C芯片的中断响应时序需要20个指令周期、假如响应前在执行的是最耗时的DIVX指令,为30个周期,那么在Fosc=10MHz时,中断响应的时间最多为5us
可是为什么我实际的中断响应时间都在7us以上,且仅使用DIVU.W指令,周期为18+7?
注:所有中断内的第一句就是 I =1,开中断
另外:1个指令周期=1个时钟周期,我认为

2,为什么一个中断控制寄存器写入00h,即禁止该中断,可中断依然发生,当程序停止在该中断内时观察此中断控制寄存器的值是00h(或者08h,即有中断请求)

烦请帮忙解答上面2个让人很困惑的问题
谢谢!!



关键词: 关于     中断     几个     困惑     问题    

菜鸟
2008-04-18 09:36:57     打赏
2楼

1、中断响应不仅包括中断响应时序的20个指令周期和完成当前执行的指令如:DIVX的时间,还需要压栈、保存寄存器的时间,你可能没把这个时间算进去,所以感觉中断响应慢了。
另外,如果不对时钟周期分频的话,1个指令周期=1个时钟周期。

2、R8C的硬件手册中注意事项有写到,对中断寄存器的改写必须在中断请求不发生的位置,改写,而且最好用MOV指令。你试一下在asm("FLCR I"),关闭中断后改写中断控制寄存器,然后打开中断,这样就不会进入中断程序。


菜鸟
2008-04-18 09:44:41     打赏
3楼

呵呵,刚才有笔误,应该这样写:
 asm("FCLR I");
 中断控制寄存器 = 00h;
 asm("FSET I");

或者在中断服务程序中写:
中断控制寄存器 = 00h;


助工
2008-04-18 09:46:59     打赏
4楼

谢谢kejian2000的问题与楼上回答。我稍微补充一下,但因为不知您用哪一款R8C,也不清楚您计测中断响应时间的方法,我以R8C/1B为例大致说明:
中断从发生中断请求到开始执行中断程序的时间称为中断响应时间。
主要由2部分组成:1)等待正在执行的指令完成的时间(最长为30个系统时钟周期,您说的对);2)单片机内部中断时序(20个系统时钟周期)组成。【请参考您所使用单片机的HW manual】,另外,实际测量时,如采用端口置位等方法测量,还必须考虑测试点程序执行周期。

《R8C/1A,1B》书上写得比较详细,我摘出来供参考:
中断响应的时序:
如果在指令执行中发生中断请求,就在该指令执行结束后判定优先权,并且从下一个周期转移到中断顺序。
但是,对于SMOVB、SMOVF、SSTR以及RMPA各指令,如果在指令执行中发生中断请求,就暂时中断指令的运行,转移到中断顺序。
 
中断顺序运行如下:
(1) 通过读地址00000h,CPU获得中断信息(中断序号、中断请求级)。此后,该中断的IR位变为“0”(无中断请求)。
(2) 将中断顺序前的FLG寄存器保存到CPU内部的暂存器(此过程由CPU自动执行,用户不能使用)。
(3) I标志为“0”(禁止中断)
(4) U标志为“0”(指定ISP)但是,在执行软件中断序号32~63的INT指令时,U标志不变。
(5) 将CPU内部的暂存器压栈(此过程由CPU自动执行,用户不能使用)。
(6) 将PC压栈。
(7) 给IPL设定接受中断的中断优先级。
(8) 中断向量所设定的中断程序的起始地址存入PC。
(9) 在中断顺序结束后,从中断程序的起始地址执行指令。
--------

关于后面的中断问题,您可以把源程序寄给我们,具体分析。


助工
2008-04-18 10:10:43     打赏
5楼
谢谢2位热心的回答,太感谢了,呵呵。

1,我觉得中断响应顺序应当包括压栈、保存寄存器等操作,我程序里是没这些操作的
2,即使计算测点程序时间也应当没那么长,我用汇编,执行效率应当较高。
更重要的是,个别响应时间居然达到近14us,实在不解。。。。

我先试下 FLCR I 指令。

助工
2008-04-18 10:54:47     打赏
6楼
FCLR I 用了,还是无效。。。。。

我程序里有2处违法操作
1,高速内部晶振=10MHz,手册规定为8MHz左右
2,大部分的中断控制寄存器都没按照注意事项说的那样操作,没先FCLR I ,而是直接MOV赋值

不知道是否有影响。。。。

助工
2008-04-18 11:08:43     打赏
7楼
注意中断响应时间还包括单片机内部响应处理的时间(R8C1B是20个cycle,并非指中断时通过程序进行压栈与保存寄存器操作),压栈与保存寄存器操作的时间要节省的话,可以采用寄存器组切换(通过B标志设定)的方式节省时间。

新的R8C/3x在中断响应时间上有新的改进,进一步降低了响应时间。
您要是能把测试中断时间的方法与程序发给我们,我们一定可以给您分析出中断时间长了的原因。在这里探讨只能是一般性的。

另外,您看看CPU时钟用的是多少MHz?

助工
2008-04-18 11:35:31     打赏
8楼
我程序用汇编写的,有3K多。。。。
要看懂也得个把月
把程序截出来给你们吧,又没多大意义
唉,看来我又要在黑暗中摸索啦
我已经在N次黑暗中摸索,每次都看到光明
希望这次也会
呵呵

非常感谢你们的帮助!!!

菜鸟
2008-04-19 01:47:31     打赏
9楼

编程要多讨论,集思广益,bug也就少了。一个人钻胡同里就出不来了,估计Kejian2000哪里设定有些小问题,要不测量方法值得商榷。把中断程序和初始化程序贴上来,大家看看~~


助工
2008-04-22 10:44:40     打赏
10楼
终于看到光明了!!!
非常奇怪!!操作CMP1IC居然会影响到CMP0IC
是因为CMP1IC的操作而使得CMP0IC有中断请求。。。。
原来主程序里使用MOV打开和关闭CMP1IC的中断,改为and后OK
子程序里这样的,有点复杂,CMP1IC事先需要压栈:
  push.b cmp1ic
  fclr i
  mov.b #00h,cmp1ic    ;此句改为and无效,只好用先关全局中断然后再开,改后程序OK
;  nop
;  nop
  fset i
  mov.b #04h,adcon0    ;select AD channel AN4(p03)
  bset ad_on     ;start AD
wait_ad:  
  btst ad_on
  jc  wait_ad
  mov.b ad,ad_temp     ;get AD result
  pop.b cmp1ic

这个问题解决后,中断就可以响应的更快点,又省去一个标志量

共15条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]