最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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外部中斷的奇怪現(xiàn)象。大家看看。
請教大家一個51中斷的問題,鍵盤輸入相與接外部中斷1,外部中斷1采用邊沿觸發(fā)方式。程序中設(shè)了兩個斷點,一個在外部中斷1開頭,一個在主循環(huán)中。我一直按著某個按鍵,運行程序,程序可以一直從一個斷點到另一個斷點。

就是這個鍵一直按著,那中斷入口一直是低,應(yīng)該執(zhí)行一次中斷,可為什么中斷出來又進入中斷呢?

2樓: >>參與討論
szzhengjin
你檢查一下你的電路
PC機的鍵盤CLK接中斷上,具體可以找相應(yīng)的資料去,中斷為邊沿觸發(fā)是對的,不能是電平觸發(fā),若選了電平觸發(fā)就會出現(xiàn)一個位的數(shù)據(jù)多次接收了

你的這種情況用示波器等測一下就知道問題在哪了

3樓: >>參與討論
mbutterfly
謝謝szzhengjin
我用示波器測了,按著的時候是那個中斷引腳一直為低的。而且還又個怪現(xiàn)象,我用P2口低4位做的鍵盤掃描輸出,現(xiàn)在只有和P2口最低位接的那個鍵不出現(xiàn)這種現(xiàn)象。如果都出現(xiàn)還好說點,現(xiàn)在的情況比較特速啊

4樓: >>參與討論
mbutterfly
我的掃描程序如下:
掃描程序如下:
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
按著不放中斷能返回?
        while((P1&0x0f)!=0x0f)
            {_nop_();}

6樓: >>參與討論
mbutterfly
回 kyokyxxj
這句是我后加的,為了不要有連續(xù)的按鍵。放開按鍵后,發(fā)現(xiàn)還是連續(xù)按了兩次。呵呵,我被按鍵要折磨一個月了,前段時間是8255PC口做輸入,51P2口做輸出,發(fā)現(xiàn)不行。因為讀8255PC口時我的地址時6000,那無法用P2口掃描了,F(xiàn)在還是不行

7樓: >>參與討論
mbutterfly
回自己
我想還是我的鍵盤掃描有問題

8樓: >>參與討論
mbutterfly
我想是不是這樣的
當(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
huiziji
看來鍵盤掃描的不能接中斷啊,唉

10樓: >>參與討論
mbutterfly
事情真的是這樣的,告訴初學(xué)者個秘密
象上面我說的那樣,鍵盤掃描用了中斷,那中斷結(jié)束的時候要清相應(yīng)的硬件中斷IE,否則有掃描帶來的跳變會使這個IE位置一的,那就會中斷后馬上又來個中斷。我試了,好用了,呵呵

11樓: >>參與討論
dengm
采用電平觸發(fā)方式就不會有問題了,
如用邊沿觸發(fā)方式,必須關(guān)中斷、變?yōu)殡娖接|發(fā)方式,過一段時間后,再
變?yōu)檫呇赜|發(fā)方式、開中斷。
          CLR EX1
          CLR IT1
          RETI
  ....
  ....
          SETB IT1
          SETB EX1

          

12樓: >>參與討論
conwh
也可以從中斷出來后進行鍵盤檢驗,確認(rèn)按鍵松開后,再繼續(xù)
 
13樓: >>參與討論
一無所知
類似的情況我們碰到過
外部中斷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
中斷處理也太多了吧
提個建議:
   樓主你的中斷內(nèi)做的事情也太多了吧,又是延時又是掃描的。居然還有分支處理也在里面。
   你就不怕在這個中斷里面一直不出來影響到你其他的程序運行???

15樓: >>參與討論
hkap
一直按的時候也會有機械抖動的
 
16樓: >>參與討論
mbutterfly
不是抖動的毛病
這只是前小部分,后面還很多呢。呵呵,不過它還能出來。不過我應(yīng)該改一改的。那死循環(huán)后面來判斷是哪個鍵,之后做相應(yīng)處理是嗎?

17樓: >>參與討論
mbutterfly
為什么中斷程序不能很長?
 
18樓: >>參與討論
emailli
中斷程序不能很長原因多了
第一:中斷程序處理一般在中斷開始的時候關(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
多謝emailli!。。。。。。。。。。。。!
書本的上就是說中斷別太長,也沒有細(xì)細(xì)分析原因,現(xiàn)在看你一說,疑惑大開。呵呵,多謝emailli了。幸好我的程序小,什么都有多余的,不然真的要改動了。

20樓: >>參與討論
thunder_f
再反映個奇怪現(xiàn)象
還是外部中斷,進入中斷出來后端口竟然被自動置0了,害我不得不加一句置1的指令(主程序里)
是不是仿真器的原因?還是???

21樓: >>參與討論
emailli
什么端口?
你指的端口是指你的IO端口嗎?
是不是你的P0口啊
P0口是集電極開漏輸出,如果你沒有上拉的話,很有可能本身他的電平就不對。和你的中斷沒有關(guān)系的。
另外,IO口的動作和你的中斷沒有任何關(guān)系,你要仔細(xì)看看程序哪里出了問題才可以下結(jié)論。

22樓: >>參與討論
thunder_f
是中斷源的那個端口,作為輸入腳用的。
 
23樓: >>參與討論
mbutterfly
怎么我的程序燒到芯片里就運行不正常呢
用仿真器調(diào)的時候好好的,用串口的方法燒到FLASH里(我用的89S52)就不運行了。用仿真器時,用它上面的晶振(也可能是板子上的晶振)可以單步運行,跳線跳到另側(cè)就不可以了。是不是燒寫的錯誤,就是沒有燒進去還是別的原因呢?

24樓: >>參與討論
emailli
EA
你的電路板上的EA有沒有上拉啊。

沒有上拉你燒錄后不能運行的哦。

這個是其中一種可能性。

25樓: >>參與討論
liukejj
請仔細(xì)看手冊
  電平觸發(fā)和邊沿觸發(fā),一個是需要軟件清標(biāo)志位,一個是自動清標(biāo)志位的
  不要以為外部中斷都是自動清位

26樓: >>參與討論
mbutterfly
謝謝樓上兩位
鍵盤的問題是liukejj所說的情況.EA上拉了啊.現(xiàn)在問題找到了.一是看門狗沒用好,二是時序上有些問題.

27樓: >>參與討論
111

你可以檢查一下復(fù)位電路

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
有個超聲波測距的項目,哪位能幫幫忙?有酬謝的
從機收到復(fù)位命令,程序怎么使機器復(fù)位?
燒錄文件轉(zhuǎn)回源文件
看好了:80C51的I/O該如何利用晶體管驅(qū)動外圍設(shè)備
說說按鍵處理到底要怎么做才實時性好!
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號