1,根据手册,R8C芯片的中断响应时序需要20个指令周期、假如响应前在执行的是最耗时的DIVX指令,为30个周期,那么在Fosc=10MHz时,中断响应的时间最多为5us
可是为什么我实际的中断响应时间都在7us以上,且仅使用DIVU.W指令,周期为18+7?
注:所有中断内的第一句就是 I =1,开中断
另外:1个指令周期=1个时钟周期,我认为
2,为什么一个中断控制寄存器写入00h,即禁止该中断,可中断依然发生,当程序停止在该中断内时观察此中断控制寄存器的值是00h(或者08h,即有中断请求)
烦请帮忙解答上面2个让人很困惑的问题
谢谢!!
共8条
1/1 1 跳转至页

2楼
谢谢2位热心的回答,太感谢了,呵呵。
1,我觉得中断响应顺序应当包括压栈、保存寄存器等操作,我程序里是没这些操作的
2,即使计算测点程序时间也应当没那么长,我用汇编,执行效率应当较高。
更重要的是,个别响应时间居然达到近14us,实在不解。。。。
我先试下 FLCR I 指令。
1,我觉得中断响应顺序应当包括压栈、保存寄存器等操作,我程序里是没这些操作的
2,即使计算测点程序时间也应当没那么长,我用汇编,执行效率应当较高。
更重要的是,个别响应时间居然达到近14us,实在不解。。。。
我先试下 FLCR I 指令。

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

4楼
我程序用汇编写的,有3K多。。。。
要看懂也得个把月
把程序截出来给你们吧,又没多大意义
唉,看来我又要在黑暗中摸索啦
我已经在N次黑暗中摸索,每次都看到光明
希望这次也会
呵呵
非常感谢你们的帮助!!!
要看懂也得个把月
把程序截出来给你们吧,又没多大意义
唉,看来我又要在黑暗中摸索啦
我已经在N次黑暗中摸索,每次都看到光明
希望这次也会
呵呵
非常感谢你们的帮助!!!

5楼
终于看到光明了!!!
非常奇怪!!操作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
这个问题解决后,中断就可以响应的更快点,又省去一个标志量

非常奇怪!!操作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
这个问题解决后,中断就可以响应的更快点,又省去一个标志量

6楼
总结点经验:
1,我的调试方法是:
在不该中断的地方发生中断后触发另一个中断,在第二个中断里设个死循环
程序进入死循环后,停止程序,然后跳出第二个中断返回第一个,再跳出第一个中断
此时光标指示位置的上面的几句中就有触发第一个中断的指令,该指令的操作不当造成第一个中断的发生。
2,尽量按照官方的说明去操作中断控制寄存器
1,我的调试方法是:
在不该中断的地方发生中断后触发另一个中断,在第二个中断里设个死循环
程序进入死循环后,停止程序,然后跳出第二个中断返回第一个,再跳出第一个中断
此时光标指示位置的上面的几句中就有触发第一个中断的指令,该指令的操作不当造成第一个中断的发生。
2,尽量按照官方的说明去操作中断控制寄存器

7楼
因为需要做PWM的死区
死区是程序编出来的
需要响应快,否则死区超限会短路,烧MOS
所以在程序里不能有长时间的屏蔽中断
有长时间中断也可以,但死区时间就要减小,那死区就是鸡肋啦
不到万不得已,我也不会有前面提到的2个违法操作,都是为了死区。。。。。。
死区是程序编出来的
需要响应快,否则死区超限会短路,烧MOS
所以在程序里不能有长时间的屏蔽中断
有长时间中断也可以,但死区时间就要减小,那死区就是鸡肋啦
不到万不得已,我也不会有前面提到的2个违法操作,都是为了死区。。。。。。

共8条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
分享一种检测按键状态的方法被打赏20分 | |
周末总结一下,STM32C0系列的开发经验被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下定时器配置被打赏20分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下PWM配置被打赏20分 | |
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 | |
VOFA+波形显示+JYD-31蓝牙发送和解析不定长数据被打赏10分 | |
【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度被打赏22分 | |
【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器被打赏23分 | |
宏定义和const关键字定义被打赏5分 |