| 
 
查看: 1530|回复: 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 好像不怎么好。。。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 
 |   | 
            本周最热论坛帖子
 
 
 
 |