51單片機的外部中斷有兩種觸發(fā)方式可選:電平觸發(fā)和邊沿觸發(fā)。選擇電平觸發(fā)時,單片機在每個機器周期檢查中斷源口線,檢測到低電平,即置位中斷請求標(biāo)志,向cpu請求中斷。選擇邊沿觸發(fā)方式時,單片機在上一個機器周期檢測到中斷源口線為高電平,下一個機器周期檢測到低電平,即置位中斷標(biāo)志,請求中斷。
這個原理很好理解。但應(yīng)用時需要特別注意的幾點:
1)電平觸發(fā)方式時,中斷標(biāo)志寄存器不鎖存中斷請求信號。 也就是說,單片機把每個機器周期的s5p2采樣到的外部中斷源口線的電平邏輯直接賦值到中斷標(biāo)志寄存器。標(biāo)志寄存器對于請求信號來說是透明的。這樣當(dāng)中斷 請求被阻塞而沒有得到及時響應(yīng)時,將被丟失。換句話說,要使電平觸發(fā)的中斷被cpu響應(yīng)并執(zhí)行,必須保證外部中斷源口線的低電平維持到中斷被執(zhí)行為止。因 此當(dāng)cpu正在執(zhí)行同級中斷或更高級中斷期間,產(chǎn)生的外部中斷源(產(chǎn)生低電平)如果在該中斷執(zhí)行完畢之前撤銷(變?yōu)楦唠娖剑┝?,那么將得不到響?yīng),就如同 沒發(fā)生一樣。同樣,當(dāng)cpu在執(zhí)行不可被中斷的指令(如reti)時,產(chǎn)生的電平觸發(fā)中斷如果時間太短,也得不到執(zhí)行。
2)邊沿觸發(fā)方式時,中斷標(biāo)志寄存器鎖存了中斷請求。中斷口線上一個從高到低的跳變將記錄在標(biāo)志寄存器中,直到cpu響應(yīng)并轉(zhuǎn)向該中斷服務(wù)程序時,由硬件自動清除。因此當(dāng)cpu正在執(zhí)行同級中斷(甚至是外部中斷本身)或高級中斷時,產(chǎn)生的外部中斷(負(fù)跳變)同樣將被記錄在中斷標(biāo)志寄存器中。在該中斷退出后,將被響應(yīng)執(zhí)行。如果你不希望這樣,必須在中斷退出之前,手工清除外部中斷標(biāo)志。
3)中斷標(biāo)志可以手工清除。一個中斷如果在沒有得到響應(yīng)之前就已經(jīng)被手工清除,則該中斷將被cpu忽略。就如同沒有發(fā)生一樣。
4)選擇電平觸發(fā)還是邊沿觸發(fā)方式應(yīng)從系統(tǒng)使用外部中斷的目的上去考慮,而不是如許多資料上說的根據(jù)中斷源信號的特性來取舍。比如,有的書上說(《keilc51使用技巧及實戰(zhàn)》),就有類似的觀點。
mcs51單片機系列屬于8位單片機,它是intel公司繼mcs48系列的成功設(shè)計之后,于1980年推出的產(chǎn)品。由于mcs51系列具有很強的片內(nèi)功能和指令系統(tǒng),因而使單片機的應(yīng)用發(fā)生了一個飛躍,這個系列的產(chǎn)品也很快成為世界上第二代的標(biāo)準(zhǔn)控制器。51系列單片機有5個中斷源,其中有2個是外部輸入中斷源int0和int1??捎芍袛嗫刂萍拇嫫鱰con的it1(tcon.2)和it0(tcon.1)分別控制外部輸入中斷1和中斷0的中斷觸發(fā)方式。若為0,則外部輸入中斷控制為電平觸發(fā)方式;若為1,則控制為邊沿觸發(fā)方式。這里是下降沿觸發(fā)中斷。
1、問題的引出
幾 乎國內(nèi)所有的單片機資料對單片機邊沿觸發(fā)中斷的響應(yīng)時刻方面的定義都是不明確的或者是錯誤的。例如文獻(xiàn)[1]中關(guān)于邊沿觸發(fā)中斷響應(yīng)時刻的描述為“對于脈 沖觸發(fā)方式(即邊沿觸發(fā)方式)要檢測兩次電平,若前一次為高電平,后一次為低電平,則表示檢測到了負(fù)跳變的有效中斷請求信號”,但實際情況卻并非如此。
我們知道,單片機外部輸入的中斷觸發(fā)電平是ttl電平。對于ttl電平,ttl邏輯門輸出高電平的允許范圍為2.4~5v,其標(biāo)稱值
為3.6v;輸出低電平的允許范圍為0~0.7v,其標(biāo)稱值為0.3v[2],在0.7v與2.4v之間的是非高非低的中間電平。
這 樣,在實際應(yīng)用中,假設(shè)單片機外部中斷引腳int0輸入一路由+5v下降到0v的下降沿信號,單片機在某個時鐘周期采樣int0引腳得到2.4v的 高電平;而在下一個時鐘周期到來進行采樣時,由于實際的外部輸入中斷觸發(fā)信號由高電平變?yōu)榈碗娖酵枰欢ǖ臅r間,因此,檢測到的可能并非真正的低電平 (小于0.7v),而是處于低電平與高電平之間的某一中間電平,即0.7~2.4v的某一電平。對于這種情況,單片機是否會依然置位中斷觸發(fā)標(biāo)志從而 引發(fā)中斷呢?關(guān)于這一點,國內(nèi)的絕大部分教材以及單片機生產(chǎn)商提供的器件資料都沒有給予準(zhǔn)確的定義,但在實際應(yīng)用中這種情況確實會碰到。
以美國analog公司生產(chǎn)的運算放大器芯片ad708為例,其轉(zhuǎn)換速率(slewrate)為0.3v/μs,在由ad708芯片組成的比較器電路中, 其輸出方波的下降沿由2.4v下降到0.7v,所需時間約為:(2.4v-0.7v)/0.3v·μs-1=4.67μs。即需要 約4.67μs的過渡時間,下降沿才真正地由高電平下降為低電平,在實際應(yīng)用電路中,這個下降時間往往可達(dá)10μs以上。對于精密的測量系統(tǒng),這么 長的不確定時間是無法接受的,因此,有必要對單片機邊沿中斷觸發(fā)時刻進行精確的測定。
2、測試波形的設(shè)計與分析
為了測定mcs51單片機下降沿觸發(fā)的實際時刻,使用agilent公司生產(chǎn)的型號為33250a的80mhz函數(shù)/任意波形發(fā)生器(function/arbitrarywaveformgenerator),產(chǎn)生出如圖1所示的周期為20ms的周期波形。
圖1周期為20ms的周期波形
將該波形通過單片機的外部中斷0輸入,可以測出下降沿中斷觸發(fā)的實際時刻,下面對該波形進行具體分析。建立如圖2所示的直角坐標(biāo)。
圖2建立的直角坐標(biāo)設(shè)
圖2所示波形的周期為t,單片機在電壓下降到y(tǒng)=y′時刻觸發(fā)中斷,t1′、t2′、t3′分別為前后周期的中斷觸發(fā)時刻,則有:
將 以上波形由單片機外部中斷0輸入,選擇邊沿觸發(fā)方式,通過中斷服務(wù)程序測取t1或者t2的值,從而可求出中斷發(fā)生時刻的電平值y′,即邊沿觸發(fā)中斷的實際 時刻。在使用單片機對中斷時刻進行測量時,使用兩個計數(shù)器,均設(shè)為方式1(16位計數(shù)方式)。其中,第一個計數(shù)器用于記錄從程序開始執(zhí)行到第一個下降沿到 來所經(jīng)歷的時間,第二個計數(shù)器用來記錄程序開始執(zhí)行到第二個下降沿到來所經(jīng)歷的時間,將兩個計數(shù)器的計數(shù)值相減便可以得到兩個下降沿之間的時間間隔。由前 面的分析可知,該時間間隔可能有兩種情況:一種是t1時間,即t1′與t2′之間的時間間隔;另一種是t2時間,即t2′與t3′之間的時間間隔。其 中,t1+t2=t,t1時間要小于t2時間。通過測量得到t1或者t2時間,利用式(4)便可求得下降沿觸發(fā)中斷時刻的實際電平。
3、測試流程和相應(yīng)的單片機程序
該單片機的中斷服務(wù)程序流程如圖3所示。
相應(yīng)的中斷服務(wù)程序為:
incr1
mova,r1
cjnea,#01h,sec
clrtr0
mov20h,tl0
mov21h,th0
clrie0
reti
sec:clrtr1
mov22h,tl1
mov23h,th1
clrex1
clrex0
reti
由于程序執(zhí)行有一定的延時,在中斷返回后,還需對兩個計數(shù)器的輸出值進行校正。本實驗采用偉福公司生產(chǎn)的h51/l仿真器為單片機測量系統(tǒng),測得t1值為6.514ms,由式(4)可得:y′=0.729v,即當(dāng)y′約為0.73v時,單片機下降沿觸發(fā)中斷。