查看: 1474|回复: 11
|
877a interrupt 的问题
[复制链接]
|
|
我想问关于 interrupt 的问题。。。
其实我不是很明白 interupt 是什么作用的。。。
各位大大可以解释吗?
是不是像一个 program 在 run 时,那个program可以停下来 serve 另外一个 program?
877a 的 portA 是不是 interrupt 来的? |
|
|
|
|
|
|
|
发表于 9-11-2007 06:23 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 9-11-2007 06:41 PM
|
显示全部楼层
interrupt 也有software 和 hardware.
以motorola 来说, hardware interrupt 有
NMI , IRQ , FIRQ 等。
NMI 是最重要, 就是不管在做什么, 还是你 interrupt 得 flag 是什么, 他都跳去那个 address , 跳之前, 会把目前PC , ACC A , B 等都 stack 起来。 比如拿来做火警, 如果 NMI 得 PIN 被 ground 了, 那么正在执行的马上被stack , 然后就跳入火警的 function. 执行晚了, 就要return from interrupt.继续之前的东西。
IRQ 和 FIRQ 都要看 interrupt flag. 用了要记得clear. 就好像上厕所, 上了没冲水, 谁人敢用? FIRQ stack 比较少东西,stack 几个重要的罢了。 |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2007 06:49 PM
|
显示全部楼层
回复 #2 rothmans 的帖子
你的例子好好哦。。。
我明白你要讲什么了。。。
那么如果说用 RB0/INT外部中断,那么在 asm 方面就是先要activated int 咯?
PIC 说你的 asm 超强。。。
那么就要请教你了。。。
如果要用RB0/INT外部中断,那么怎样activated呢?
是不是不管在什么情况下,一旦RB0 有input, 整个程序就跳去另外一个program 了?
谢谢教导了... |
|
|
|
|
|
|
|
发表于 9-11-2007 09:35 PM
|
显示全部楼层
原帖由 jason86 于 9-11-2007 06:49 PM 发表
你的例子好好哦。。。
我明白你要讲什么了。。。
[quote]
那么如果说用 RB0/INT外部中断,那么在 asm 方面就是先要activated int 咯?
是的,你必须要让它激活。
呵呵!pic版主这帽子也太高了 。
不敢,一起研究,研究好了。
如果要用RB0/INT外部中断,那么怎样activated呢??
你必须先将 OPTION_REG 里的 INTEDG 设成输入为 "1" 或者是 "0", 发生中断。
然后 将 INTCON 里的 RBIF 设成 “0”,INTE 设成 “1”。
最后将 INTCON 里的 GIE 设成 “1”。就成了。
是不是不管在什么情况下,一旦RB0 有input, 整个程序就跳去另外一个program 了?
这要看你是设成输入为 "1" 或者是 "0", 发生中断咯!
其实 RB4 ~ RB7也是有外部中断功能的。它的操作方法是一但外部任何一支脚有变化都会产生中断( 即是说从 “0” 变 “1”或 相反都会发生中断)。
[ 本帖最后由 rothmans 于 9-11-2007 11:21 PM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2007 10:19 PM
|
显示全部楼层
你必须先将 OPTION_REG 里的 INTEDG 设成输入为 "1" 或者是 "0", 发生中断。
然后 将 INTCON 里的 RBIF 设成 “0”,INTE 设成 “1”。
最后将 INTCON 设成 “1”。就成了。
其实你有没有一个asm 的例子可以给我参考啊?
就像一旦 RB0 有interrupt,那么程序就停止,interrupt 会 turn on portD
我现在大概大概知道你说什么,如果有例子那么我会更明白咯。。。
谢谢了 |
|
|
|
|
|
|
|
发表于 9-11-2007 10:38 PM
|
显示全部楼层
回复 #6 jason86 的帖子
什么是interrupt?
好比电话, 有来电时, 就会响铃, 铃声就是interrupt,响铃时, 你知道了, 放下工作去听电话,听完就回去继续工作。(较复杂, 但efficient)
如果电话没有铃声, 你要知道有没有来电, 你就要定时的把话筒拿起,听有无来电,放下话筒,继续工作, 这就是Polling。(简单,, 但不efficient)
拿I/O作例子, 来解释interrupt 和 polling.
当port b.0=1 时, count variable 就加1。
一般Polling 的方法。
- int count=0;
- void main()
- {
- while(1)
- {
- // 当port b.0=1 时, count variable 就加1。
- if(input(pin_b0))
- {
- count++;
- }
- //do other code here
- /*
- ...
- ...
- ...
- ...
- */
- }
- }
复制代码
使用interrupt的方法。
- //使用interrupt的方法。
- int count=0;
- // PortB0 µÄinterrupt routine
- #INT_EXT
- void ext_isr()
- {
- //当port b.0=1 时, count variable 就加1。
- if(input(pin_b0))
- {
- count++;
- }
- }
- void main()
- {
- // Setup interrupt
- ext_int_edge(L_TO_H);
- enable_interrupts(INT_EXT);
- enable_interrupts(GLOBAL);
- while(1)
- {
- // do your code here
- }
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 9-11-2007 11:38 PM
|
显示全部楼层
回复 #7 pic 的帖子
其实我对C++没有认识很深,只会少许罢了。。。
我的asm比较强,可以给个简单的asm例子吗?
我知道C时目前很强的语言,我会进修的,不过现在想用asm先,因为我的partner不会C,
如果一个用C一个用ASM,那么就世界大乱了!!
谢咯
|
|
|
|
|
|
|
|
发表于 10-11-2007 09:29 AM
|
显示全部楼层
原帖由 jason86 于 9-11-2007 11:38 PM 发表
其实我对C++没有认识很深,只会少许罢了。。。
我的asm比较强,可以给个简单的asm例子吗?
我知道C时目前很强的语言,我会进修的,不过现在想用asm先,因为我的partner不会C,
如果一个用C一个用ASM,那么就 ...
请问你们在作些什么? 可以分享吗? |
|
|
|
|
|
|
|
楼主 |
发表于 10-11-2007 11:57 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 10-11-2007 12:49 PM
|
显示全部楼层
对你的硬体XY table比较有兴趣。。。
原帖由 jason86 于 10-11-2007 11:57 AM 发表
我用sensor 来控制,一旦有东西靠近machine 时,整个 machine 会停止运作。。 ...
其实, 作个盖, 盖着是最好, 有人打开盖才停机, 是比较实际的。
如转嘴断了飞出来, 有盖可以保护到。
你要用Sensor, 那你用的是什么sensor? |
|
|
|
|
|
|
|
楼主 |
发表于 10-11-2007 12:59 PM
|
显示全部楼层
原帖由 pic 于 10-11-2007 12:49 PM 发表
对你的硬体XY table比较有兴趣。。。
其实, 作个盖, 盖着是最好, 有人打开盖才停机, 是比较实际的。
如转嘴断了飞出来, 有盖可以保护到。
你要用Sensor, 那你用的是什么sensor?
你的提议不错。。。
我暂时还没决定用什么sensor, IR sensor 好像不怎么好。。。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|