| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
51外部中斷的奇怪現(xiàn)象。大家看看。 | 
  
| 作者:mbutterfly 欄目:單片機 | 
請教大家一個51中斷的問題,鍵盤輸入相與接外部中斷1,外部中斷1采用邊沿觸發(fā)方式。程序中設(shè)了兩個斷點,一個在外部中斷1開頭,一個在主循環(huán)中。我一直按著某個按鍵,運行程序,程序可以一直從一個斷點到另一個斷點。 就是這個鍵一直按著,那中斷入口一直是低,應(yīng)該執(zhí)行一次中斷,可為什么中斷出來又進入中斷呢?  | 
  
| 2樓: | >>參與討論 | 
| 作者: szzhengjin 于 2006/10/23 16:11:00 發(fā)布:
         你檢查一下你的電路 PC機的鍵盤CLK接中斷上,具體可以找相應(yīng)的資料去,中斷為邊沿觸發(fā)是對的,不能是電平觸發(fā),若選了電平觸發(fā)就會出現(xiàn)一個位的數(shù)據(jù)多次接收了 你的這種情況用示波器等測一下就知道問題在哪了  | 
  |
| 3樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 10:07:00 發(fā)布:
         謝謝szzhengjin 我用示波器測了,按著的時候是那個中斷引腳一直為低的。而且還又個怪現(xiàn)象,我用P2口低4位做的鍵盤掃描輸出,現(xiàn)在只有和P2口最低位接的那個鍵不出現(xiàn)這種現(xiàn)象。如果都出現(xiàn)還好說點,現(xiàn)在的情況比較特速啊  | 
  |
| 4樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 13:48:00 發(fā)布:
         我的掃描程序如下: 掃描程序如下: UC scankb_2(void) { UC sccode; sccode=0x0E; for(ii=1;ii<5;ii++) { P2=sccode; //行掃描開始 //PC = P1; PC = P1 & 0x0C; //P2=0x40; if(PC==P_P) //若在該行 { { P2=0x40; //sccode=0x00; ////// //P1=P1&0x0f; while((P1&0x0f)!=0x0f) {_nop_();} return(ii); //返回Keyword } else {sccode=(sccode<<1)|0x01; //不在該行則掃下一行 sccode=sccode&0x0f;} } return(0x09); } P1口低4位接鍵盤輸入,P2口低4位接鍵盤輸出。P10,P11經(jīng)74LS21相與后接INT0,P12,P13相與后接INT1。 中斷程序部分如下: void Int_Ext_1(void) interrupt 2 using 2 { PC = P1; PC = PC & 0x0C; EX1 = 0; //關(guān)中斷1使能 ////// if(PC==0x08) //判斷鍵值 { //delay(); delayms_1(30); //PC = P1; // PC = P1 & 0x0C; if(PC==0x08) {P_P=PC; //scankb(); KValue=scankb_2();} else _nop_(); } else if(PC==0x04) { //delay(); delayms_1(30); //PC = P1; // PC = P1 & 0x0C; if(PC==0x04) {P_P=PC; //scankb(); KValue=scankb_2()+0x04;} else _nop_(); } else _nop_(); SWITCH (KValue) {. .........  | 
  |
| 5樓: | >>參與討論 | 
| 作者: kyokyxxj 于 2006/10/24 14:11:00 發(fā)布:
         按著不放中斷能返回? while((P1&0x0f)!=0x0f) {_nop_();}  | 
  |
| 6樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 14:57:00 發(fā)布:
         回 kyokyxxj 這句是我后加的,為了不要有連續(xù)的按鍵。放開按鍵后,發(fā)現(xiàn)還是連續(xù)按了兩次。呵呵,我被按鍵要折磨一個月了,前段時間是8255PC口做輸入,51P2口做輸出,發(fā)現(xiàn)不行。因為讀8255PC口時我的地址時6000,那無法用P2口掃描了,F(xiàn)在還是不行  | 
  |
| 7樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 15:00:00 發(fā)布:
         回自己 我想還是我的鍵盤掃描有問題  | 
  |
| 8樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 16:06:00 發(fā)布:
         我想是不是這樣的 當(dāng)行掃描的時候,P2為1110->1101......,如果是與P2最低位相連的鍵按下,那掃描只到1110,這樣,P2最低位沒有從1到0的跳變,可以正確執(zhí)行中斷的程序。如果是與P2^1相連的鍵按下,那P2從1110—>1101,P2^1從1到0有個跳變,那與P2^!對應(yīng)的輸入端就會有個1->0的跳變。這個跳變反映到中斷引腳(因列輸入相與后接中斷引腳),之后使標(biāo)記位置位。中斷雖 不能馬上執(zhí)行這個中斷,中斷結(jié)束后會執(zhí)行這個中斷,造成了兩次中斷。  | 
  |
| 9樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 16:15:00 發(fā)布:
         huiziji 看來鍵盤掃描的不能接中斷啊,唉  | 
  |
| 10樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/24 16:26:00 發(fā)布:
         事情真的是這樣的,告訴初學(xué)者個秘密 象上面我說的那樣,鍵盤掃描用了中斷,那中斷結(jié)束的時候要清相應(yīng)的硬件中斷IE,否則有掃描帶來的跳變會使這個IE位置一的,那就會中斷后馬上又來個中斷。我試了,好用了,呵呵  | 
  |
| 11樓: | >>參與討論 | 
| 作者: dengm 于 2006/10/24 16:44:00 發(fā)布:
         采用電平觸發(fā)方式就不會有問題了, 如用邊沿觸發(fā)方式,必須關(guān)中斷、變?yōu)殡娖接|發(fā)方式,過一段時間后,再 變?yōu)檫呇赜|發(fā)方式、開中斷。 CLR EX1 CLR IT1 RETI .... .... SETB IT1 SETB EX1  | 
  |
| 12樓: | >>參與討論 | 
| 作者: conwh 于 2006/10/25 0:50:00 發(fā)布:
         也可以從中斷出來后進行鍵盤檢驗,確認(rèn)按鍵松開后,再繼續(xù)  | 
  |
| 13樓: | >>參與討論 | 
| 作者: 一無所知 于 2006/10/25 10:14:00 發(fā)布:
         類似的情況我們碰到過 外部中斷INT0 和INT1的電平在每個機器周期的S5P2時被采樣并鎖存到IE0和IE1中,這個置入到IE0和IE1的狀態(tài)在下一個機器周期才被查詢電路查詢,如果產(chǎn)生了一個中斷請求,而且滿足響應(yīng)的條件,CPU響應(yīng)中斷,由硬件生成一條長調(diào)用指令轉(zhuǎn)到相應(yīng)的服務(wù)程序入口。這條指令是雙機器周期指令。因此,從中斷請求有效到執(zhí)行中斷服務(wù)程序的第一條指令的時間間隔至少需要三個完整的機器周期。 負(fù)邊沿觸發(fā)即只要檢測到送至 上的信號由1變成0時,中斷請求標(biāo)志位IEX就被設(shè)定為1,并且一直維持著1,直到此中斷請求被接收為止,且必須用軟件來清除IEX,如JBC IE1,LOOP。 通過對以上敘述的研究,判斷如下。外部中斷的標(biāo)志位IEX和TI/RI等中斷標(biāo)志位一樣,它的狀態(tài)改變是受外部條件件的控制的,而與EA及EX是否使能無關(guān)。那么就以為著如果引入中斷的服務(wù)程序中如果有震蕩存在,那么雖然ADUC845的IEX會在進入中斷服務(wù)程序后會被硬件自動清零,但若在清零后,退出中斷之前如果 引腳上有震蕩出現(xiàn),那么IEX會由于再次出現(xiàn)的下降沿被硬件再次置1。從而在退出中斷服務(wù)程序后導(dǎo)致MCU再次響應(yīng)中斷,從而出現(xiàn)前述的實驗現(xiàn)象。  | 
  |
| 14樓: | >>參與討論 | 
| 作者: emailli 于 2006/10/25 14:12:00 發(fā)布:
         中斷處理也太多了吧 提個建議: 樓主你的中斷內(nèi)做的事情也太多了吧,又是延時又是掃描的。居然還有分支處理也在里面。 你就不怕在這個中斷里面一直不出來影響到你其他的程序運行???  | 
  |
| 15樓: | >>參與討論 | 
| 作者: hkap 于 2006/10/25 15:00:00 發(fā)布:
         一直按的時候也會有機械抖動的  | 
  |
| 16樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/25 15:55:00 發(fā)布:
         不是抖動的毛病 這只是前小部分,后面還很多呢。呵呵,不過它還能出來。不過我應(yīng)該改一改的。那死循環(huán)后面來判斷是哪個鍵,之后做相應(yīng)處理是嗎?  | 
  |
| 17樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/26 14:04:00 發(fā)布:
         為什么中斷程序不能很長?  | 
  |
| 18樓: | >>參與討論 | 
| 作者: emailli 于 2006/10/27 9:19:00 發(fā)布:
         中斷程序不能很長原因多了 第一:中斷程序處理一般在中斷開始的時候關(guān)總中斷,在結(jié)尾的時候開總中斷 這樣可以保證中斷處理的時候不被打斷,否則有可能你的程序在中斷中一 直走下去知道死機 第二:中斷內(nèi)代碼多了,如果涉及變量很多,會導(dǎo)致需要比較大的堆棧需要,不合適 第三:中斷內(nèi)最好不要調(diào)用其他函數(shù),假如需要,也不要太多,調(diào)用其他函數(shù)有可能由于寄存器組不一致而出問題,當(dāng)然,如果實在需要,調(diào)用一個也不是不行。 假設(shè)如下,系統(tǒng)有兩個中斷A和B,優(yōu)先級等同或者A比B高 其中中斷A比較頻繁,中斷B不是那么頻繁 時刻一,中斷B發(fā)生了,由于你在中斷B內(nèi)處理時間較長,而你又沒有在中斷B開始的時候關(guān)總中斷,那么很有可能在你處理中斷B的時候,中斷A來了,于是,中斷B的處理暫停,開始執(zhí)行中斷A的程序,執(zhí)行A的時候你又調(diào)用了其他的函數(shù)(而調(diào)用函數(shù)有可能將B里面用到的參數(shù)給修改掉,即使不修改B的參數(shù)也有問題),經(jīng)過一段時間的處理以后,回到了B中斷,B中斷繼續(xù)執(zhí)行,還沒有執(zhí)行完,A又來了…… 你可以看到,你的前臺程序已經(jīng)很長時間沒有運行了,假設(shè)你有養(yǎng)狗的話,此時就很有可能沒有喂狗導(dǎo)致系統(tǒng)重新啟動了。 沒有養(yǎng)狗的話,你的前臺程序長時間不運行,是不是實時性也差了呢?  | 
  |
| 19樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/10/27 17:21:00 發(fā)布:
         多謝emailli!。。。。。。。。。。。。! 書本的上就是說中斷別太長,也沒有細(xì)細(xì)分析原因,現(xiàn)在看你一說,疑惑大開。呵呵,多謝emailli了。幸好我的程序小,什么都有多余的,不然真的要改動了。  | 
  |
| 20樓: | >>參與討論 | 
| 作者: thunder_f 于 2006/10/28 11:37:00 發(fā)布:
         再反映個奇怪現(xiàn)象 還是外部中斷,進入中斷出來后端口竟然被自動置0了,害我不得不加一句置1的指令(主程序里) 是不是仿真器的原因?還是???  | 
  |
| 21樓: | >>參與討論 | 
| 作者: emailli 于 2006/10/28 20:56:00 發(fā)布:
         什么端口? 你指的端口是指你的IO端口嗎? 是不是你的P0口啊 P0口是集電極開漏輸出,如果你沒有上拉的話,很有可能本身他的電平就不對。和你的中斷沒有關(guān)系的。 另外,IO口的動作和你的中斷沒有任何關(guān)系,你要仔細(xì)看看程序哪里出了問題才可以下結(jié)論。  | 
  |
| 22樓: | >>參與討論 | 
| 作者: thunder_f 于 2006/10/29 11:39:00 發(fā)布:
         是中斷源的那個端口,作為輸入腳用的。  | 
  |
| 23樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/11/7 10:09:00 發(fā)布:
         怎么我的程序燒到芯片里就運行不正常呢 用仿真器調(diào)的時候好好的,用串口的方法燒到FLASH里(我用的89S52)就不運行了。用仿真器時,用它上面的晶振(也可能是板子上的晶振)可以單步運行,跳線跳到另側(cè)就不可以了。是不是燒寫的錯誤,就是沒有燒進去還是別的原因呢?  | 
  |
| 24樓: | >>參與討論 | 
| 作者: emailli 于 2006/11/23 19:30:00 發(fā)布:
         EA 你的電路板上的EA有沒有上拉啊。 沒有上拉你燒錄后不能運行的哦。 這個是其中一種可能性。  | 
  |
| 25樓: | >>參與討論 | 
| 作者: liukejj 于 2006/11/24 12:07:00 發(fā)布:
         請仔細(xì)看手冊 電平觸發(fā)和邊沿觸發(fā),一個是需要軟件清標(biāo)志位,一個是自動清標(biāo)志位的 不要以為外部中斷都是自動清位  | 
  |
| 26樓: | >>參與討論 | 
| 作者: mbutterfly 于 2006/11/24 15:55:00 發(fā)布:
         謝謝樓上兩位 鍵盤的問題是liukejj所說的情況.EA上拉了啊.現(xiàn)在問題找到了.一是看門狗沒用好,二是時序上有些問題.  | 
  |
| 27樓: | >>參與討論 | 
| 作者: 111 于 2007/11/27 2:04:07 發(fā)布:
         你可以檢查一下復(fù)位電路  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |