AVR單片機原理及應(yīng)用:第4章 AVR單片機的中斷系統(tǒng)_第1頁
AVR單片機原理及應(yīng)用:第4章 AVR單片機的中斷系統(tǒng)_第2頁
AVR單片機原理及應(yīng)用:第4章 AVR單片機的中斷系統(tǒng)_第3頁
AVR單片機原理及應(yīng)用:第4章 AVR單片機的中斷系統(tǒng)_第4頁
AVR單片機原理及應(yīng)用:第4章 AVR單片機的中斷系統(tǒng)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第四章AVR單片機的中斷系統(tǒng)主程序中斷服務(wù)程序KK+1中斷響應(yīng)中斷返回中斷請求 中斷過程示意圖AVR單片機的中斷系統(tǒng)中斷的概念中斷服務(wù)程序與子程序的區(qū)別中斷是隨機發(fā)生的,其服務(wù)程序無需通過指令調(diào)用,返回用RETI普通子程序需通過rcall、ICALL、CALL指令調(diào)用,返回用RETATmega8有19個中斷源(含RESET,ATmega16有21個)。每個中斷源在程序空間都有一個獨立的中斷向量。所有的中斷事件都有自己的使能位。當(dāng)使能位置位且 SREG中的 I 也置位的情況下,中斷才可以被響應(yīng) 程序空間的最小地址塊定義為復(fù)位及中斷向量。在中斷向量表中處于低地址的中斷具有高的優(yōu)先級, 所以 RES

2、ET 具有最高的優(yōu)先級4.1 中斷向量 設(shè)置中斷向量地址最典型的方法如下: 地址 矢量號 代碼 注釋 $000 1 RJMP RESET ;復(fù)位(上電、外部、 BOD、看門狗) $001 2 RJMP EXT_INT0 ;IRQ0 $002 3 RJMP EXT_INT1 ;IRQ1 $003 4 RJMP TIM2_COMP ;T2比較匹配 $004 5 RJMP TIM2_OVF ;T2 溢出 $005 6 RJMP TIM1_CAPT ;T1 輸入捕捉 $006 7 RJMP TIM1_COMPA ;T1比較匹配A $007 8 RJMP TIM1_COMPB ;T1比較匹配B $008

3、 9 RJMP TIM1_OVF ;T1 溢出 $009 10 RJMP TIM0_OVF ;T0 溢出 $00a 11 RJMP SPI_STC ;SPI傳輸結(jié)束 $00b 12 RJMP UART_RXC ;UART接收結(jié)束 $00c 13 RJMP UART_DRE ;UART數(shù)據(jù)空 (續(xù)): 地址 矢量號 代碼 注釋 $00d 14 RJMP UART_TXC ;UART發(fā)送結(jié)束 $00e 15 RJMP ADC ;AD轉(zhuǎn)換結(jié)束 $00f 16 RJMP EE_RDY ;EEP準(zhǔn)備好 $010 17 RJMP ANA_COMP ;模擬比較器 $011 18 RJMP TWI_INT ;

4、TWI狀態(tài)中斷 $012 19 RJMP SPM_RDY ;寫Flash準(zhǔn)備好 ;下面主程序開始 $013 RESET: LDI R16,HIGH(RAMEND) $014 OUT SPH, R16 $015 LDI R16,LOW(RAMEND) $016 OUT SPL, R16 $017 XXX 中斷標(biāo)志:指示中斷(請求)是否存在的標(biāo)記,由內(nèi)部專用觸發(fā)器來存儲,觸發(fā)器置1表示有中斷,為0表示無中斷(或被清除)。各中斷標(biāo)志分布于相應(yīng)I/O寄存器中。如GIFR、TIFR等中斷處理當(dāng)程序計數(shù)器PC指向?qū)嶋H中斷向量開始執(zhí)行相應(yīng)的中斷例程時,硬件清除對應(yīng)的中斷標(biāo)志。一些中斷標(biāo)志位也可以通過軟件寫1

5、來清除 當(dāng)一個符合條件的中斷發(fā)生后,如果相應(yīng)的中斷使能位為0,則中斷標(biāo)志被掛起,并一直保持到中斷被響應(yīng),或者被軟件清除 如果全局中斷標(biāo)志I被清零,則所有的中斷都不會被執(zhí)行,直到I置位,然后被掛起的各個中斷按中斷優(yōu)先級依次被響應(yīng) 中斷響應(yīng)時間AVR中斷響應(yīng)時間最少為4個時鐘周期。在這4個時鐘期間,PC(2個字節(jié))自動入棧,而SP減2。在通常情況下,中斷向量處為一個相對跳轉(zhuǎn)指令,此跳轉(zhuǎn)要花2個時鐘周期。如果中斷在一個多周期指令執(zhí)行期間發(fā)生,則在此多周期指令執(zhí)行完后,MCU才會執(zhí)行中斷程序從中斷例程返回亦需4個時鐘周期。在此期間,PC將被彈出棧,SP增2,SREG的位I 被置位中斷返回時,總是返回到

6、主程序斷點位置并執(zhí)行一條指令之后才能再響應(yīng)被掛起的中斷注意:進(jìn)入中斷服務(wù)程序時狀態(tài)寄存器SREG不會被自動保存,從中斷服務(wù)程序返回(RETI)時也不會被自動恢復(fù)。用戶編寫中斷例程時必須注意保護(hù)SREG。如:EXT_INT0: in r1,sreg ;保護(hù)狀態(tài)寄存器SREG out sreg,r1 ;恢復(fù)狀態(tài)寄存器SREG reti 能否直接用PUSH、POP?4.2 外部中斷外部中斷由INT0 (PD2)和INT1 (PD3)引腳觸發(fā)。應(yīng)當(dāng)注意:如果中斷使能,則即使INT0/INT1配置為輸出,也可觸發(fā)中斷。此特性提供了一個產(chǎn)生軟件中斷的方法。觸發(fā)方式可為上升沿、下降沿、電平變化或低電平,由M

7、CU控制寄存器MCUCR設(shè)定。當(dāng)設(shè)置為低電平觸發(fā)(此時沒有中斷標(biāo)志位)并使能中斷時,只要電平為低,中斷就一直觸發(fā);當(dāng)電平變?yōu)楦吆螅袛鄺l件即終止4.3有關(guān)中斷的I/O寄存器1、MCU控制寄存器MCUCR位7-4:休眠使能及休眠模式相關(guān) 位3,2:ISC11, ISC10 中斷1的觸發(fā)方式控制位,位3和位2 選擇INT1中斷的邊沿或電平注意:改變ISC11/ISC10時,首先要禁止INT1(GICR 的INT1位清零),否則可能引發(fā)不必要的中斷(對于INT0也類似)ISC11ISC10描述00INT1低電平中斷01上升沿和下降沿都觸發(fā)中斷10INT1下降沿中斷11INT1上升沿中斷位1,0:IS

8、C01, ISC00 中斷0的觸發(fā)方式控制位,位1和位0 選擇INT0中斷的邊沿或電平INTn 引腳的電平在檢測邊沿之前采樣。如果選擇邊沿中斷,則寬于一個CPU 時鐘的脈沖將觸發(fā)中斷。太窄的脈沖不能保證中斷。如果選擇了低電平觸發(fā),則低電平必須保持到當(dāng)前執(zhí)行的指令結(jié)束才會引發(fā)中斷ISC01ISC00描述00INT0低電平中斷01上升沿和下降沿都觸發(fā)中斷10INT0下降沿中斷11INT0上升沿中斷4.3 有關(guān)中斷的I/O寄存器2、通用中斷控制寄存器GICR*器件不同時,I/O寄存器的名稱或每位的含義可能會不同(詳見相應(yīng)器件的數(shù)據(jù)手冊)以下只討論與ATmega8相關(guān)的GICR位7:INT1 外部中斷

9、請求1使能 當(dāng)INT1位和SREG中的I位都為1時,外部引腳(INT1)中斷使能。MCU 通用控制寄存器MCUCR中的中斷檢測控制位1/0(ISC11和ISC10) 定義中斷1是上升沿中斷還是下降沿中斷,或者是低電平中斷。即使管腳被定義為輸出,中斷仍可產(chǎn)生。相應(yīng)的中斷從程序存儲器的(字)地址$002起執(zhí)行位6:INT0 外部中斷請求0使能 當(dāng)INT0位和SREG中的I位都為1時,外部引腳(INT0)中斷使能。MCU 通用控制寄存器MCUCR中的中斷檢測控制位1/0(ISC01和ISC00) 定義中斷1是上升沿中斷還是下降沿中斷,或者是低電平中斷。即使管腳被定義為輸出,中斷仍可產(chǎn)生。相應(yīng)的中斷從

10、程序存儲器的(字)地址$001起執(zhí)行3、通用中斷標(biāo)志寄存器GIFR位7:INTF1 外部中斷標(biāo)志1 當(dāng)INT1引腳信號邊沿或邏輯變化觸發(fā)中斷請求時,INTF1置位1。如果SREG中的I位及GICR中的INT1位都為1,則MCU將跳轉(zhuǎn)到中斷地址$002。中斷例程執(zhí)行時,此標(biāo)志被清除,也可以通過向其寫1來清除。當(dāng)配置為低電平中斷時,該標(biāo)志恒為0,因低電平中斷可由讀PIN寄存器決定位6:INTF0 外部中斷標(biāo)志0 當(dāng)INT0引腳信號邊沿或邏輯變化觸發(fā)中斷請求時,INTF0置位1。如果SREG中的I位及GICR中的INT0位都為1,則MCU將跳轉(zhuǎn)到中斷地址$001。中斷例程執(zhí)行時,此標(biāo)志被清除,也可以

11、通過向其寫1來清除。當(dāng)配置為低電平中斷時,該標(biāo)志恒為0,因低電平中斷可由讀PIN寄存器決定4、定時器/計數(shù)器中斷屏蔽寄存器TIMSK位7:OCIE2 T/C2輸出比較匹配中斷使能 當(dāng)OCIE2位和SREG中的I都為1時,T/C2比較匹配中斷使能。當(dāng)T/C2的比較匹配發(fā)生(即定時器/計數(shù)器中斷標(biāo)志寄存器TIFR中的OCF2置位)時,中斷例程(中斷矢量地址$003)將執(zhí)行 位6:TOIE2 T/C2溢出中斷使能 當(dāng)TOIE2 和I 都為1 時,T/C2 溢出中斷使能。當(dāng)T/C2 溢出(即TIFR 中的TOV2 位置位)時,中斷例程($004)得到執(zhí)行位5:TICIE1 T/C1輸入捕捉中斷使能 當(dāng)

12、TICIE1和I 都為1時,輸入捕捉事件中斷使能。當(dāng)PD6(ICP)的捕捉觸發(fā)事件發(fā)生(即TIFR 中的ICF1置位)時,中斷例程($005)將執(zhí)行 位4:OCIE1A T/C1輸出比較A 匹配中斷使能 當(dāng)OCIE1A和I都為1時,輸出比較A匹配中斷使能。當(dāng)T/C1的比較A 匹配發(fā)生(即TIFR中的OCF1A置位)時,中斷例程($006)將執(zhí)行 位3:OCIE1B T/C1 輸出比較B 匹配中斷使能 當(dāng)OCIE1B和I都為1時,輸出比較B匹配中斷使能。當(dāng)T/C1 的比較B 匹配發(fā)生(即TIFR 中的OCF1B置位)時,中斷例程($007)將執(zhí)行 位2:TOIE1 T/C1 溢出中斷使能 當(dāng)TO

13、IE1和I 都為1時,T/C1溢出中斷使能。當(dāng)T/C1溢出(即TIFR 中的TOV1 位置位)時,中斷例程($008)得到執(zhí)行 位1:Res 保留位,讀出為0位0:TOIE0 T/C0 溢出中斷使能 當(dāng)TOIE0和I 都為1時,T/C0溢出中斷使能。當(dāng)T/C0溢出(即TIFR 中的TOV0 位置位)時,中斷例程($009)得到執(zhí)行5、定時器/計數(shù)器中斷標(biāo)志寄存器TIFR位7:OCF2 T/C2輸出比較標(biāo)志 當(dāng)T/C2 與OCR2 的值匹配時,OCF2 置位。 此位在執(zhí)行中斷例程時硬件清零,或者通過對其寫 1 來清零。當(dāng)SREG中的位I、OCIE2和OCF2 一同置位時,中斷例程得到執(zhí)行位6:T

14、OV2 T/C2溢出中斷使能 當(dāng)T/C2 溢出時,TOV2置位。執(zhí)行相應(yīng)的中斷例程時此位硬件清零,也可通過向其寫 1來清零。 當(dāng)SREG 中的位I、TOIE2和TOV2一同置位時,中斷例程得到執(zhí)行。在PWM模式中,當(dāng)T/C2在$00 改變計數(shù)方向時,TOV2置位 位5:ICF1 輸入捕獲標(biāo)志1 當(dāng)輸入捕獲事件發(fā)生時,ICF1置位,表明T/C1 的值已經(jīng)送到輸入捕獲寄存器ICR1。清零方式同前。當(dāng)SREG中的位I、TICIE1和ICF1一同置位時中斷例程得到執(zhí)行位4:OCF1A 輸出比較標(biāo)志1A當(dāng)T/C1與輸出比較寄存器OCR1A的值匹配時,OCF1A置位。清零方式同前。當(dāng)SREG 中的位I、O

15、CIE1A和OCF1A 一同置位時 中斷例程得到執(zhí)行位3:OCF1B 輸出比較標(biāo)志1B當(dāng)T/C1與輸出比較寄存器OCR1B的值匹配時,OCF1B置位。清零及中斷與上面類似位2:TOV1 T/C1溢出標(biāo)志 當(dāng)T/C1溢出時,TOV1置位。當(dāng)SREG 中的位I、TOIE1和TOV1一同置位時,中斷例程得到執(zhí)行。在PWM 模式中,當(dāng)T/C1 在$0000 改變計數(shù)方向時,TOV1 置位位1:保留位。讀出為0位0:TOV0 T/C0溢出標(biāo)志當(dāng)T/C0溢出時,TOV0置位。當(dāng)SREG 中的位I、TOIE0和TOV0一同置位時,中斷例程得到執(zhí)行P143例4-1:利用外部中斷INT0觸發(fā)PB口LED依次發(fā)光

16、 P143例4-1:(程序代碼): .include “m8def.inc .org $000 rjmp main rjmp ext_int0 .org $013main:ldi r16,low(ramend) out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff out ddrb,r16 ; PB口設(shè)為輸出 ldi r16,$00 out portb,r16 ;LED全滅 ldi r16,0b00000010 ;int0下降沿中斷 out mcucr,r16 ldi r16,0b01000000 ; out GIFR,r16 ;清除

17、int0中斷標(biāo)志 out GICR,r16 ;允許int0中斷 CBI ddrd,2 ;PD2設(shè)為輸入 SBI portd,2 ;使能PD2內(nèi)部上拉電阻 SEI ;開全局中斷LOOP: NOP NOP NOP NOP RJMP LOOPext_int0: IN R1,SREG LDI R16,$FF OUT PORTB,R16 LDI ZL,LOW(TAB1*2) LDI ZH,HIGH(TAB1*2) LDI R25,8LOOP1:LPM R16,Z+ OUT PORTB,R16 NOP RCALL DELAY ;延時子程序略 DEC R25 BRNE LOOP1 OUT SREG,R1 r

18、etiTAB1: .DB $01,$02,$04,$08,$10,$20,$40,$80補充例:中斷計數(shù)int0(PD2),int1(PD3)分別通過按鍵接地,r27:r26存計數(shù)值(初值為0),按int0一次計數(shù)增10,按int1一次計數(shù)增1,計數(shù)值在5位共陰數(shù)碼管中顯示,PA口驅(qū)動字線,PC0PC4分別選擇個位萬位部分程序代碼:.include 8535 $000rjmp $001rjmp ext_ $002rjmp ext_ $011tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7

19、f,$6fmain:ldi r16,low(ramend)out spl,r16ldi r16,high(ramend)out sph,r16ldi r16,0b00001011 ;int1下降沿中斷,int0上升沿中斷out mcucr,r16clr r16out ddrd,r16 ;PD口設(shè)為輸入ser r16out portd,r16 ;使能上拉out ddra,r16 ;PA、PC口設(shè)為輸出out ddrc,r16out gifr,r16 ;清中斷標(biāo)志寄存器ldi r16,$C0out gimsk,r16 ;(GICR)允許int0 int1中斷l(xiāng)di r26,0 ;r27:r26初值

20、為0ldi r27,0seiaa: mov r16,r26mov r17,r27rcall b16td5 ;調(diào)二轉(zhuǎn)十子程 mov r22,r20 ;將 BCD 碼送 r18r22 mov r21,r19 mov r20,r18 mov r19,r17 mov r18,r16 rcall smiao ;調(diào)動態(tài)掃描子程 rjmp aa ext_int0:adiw r26,10retiext_int1:adiw r26,1reti打印機接口設(shè)計Centronic接口打印機一般采用8位數(shù)據(jù)線和3根基本的應(yīng)答控制線/STB, BUSY, /ACK以 PP40 彩色繪圖打印機為例,接口時序如圖8535 與

21、 PP40 的接口電路如圖若打印如下兩行字符 t: 32C P: 102kPa 則要把以下 ASCII 碼送給打印機: $74(t), $3A(:), $20(空格), $33(3), $32(2), $6F(), $43(C),$0A(換行), $50(P), $3A(:), $20(空格), $31(1), $30(0), $32(2), $6B(k), $50(P), $61(a), $0A(換行) 設(shè)事先已將這些 ASCII 碼放在 SRAM 中$100 開始的單元中 1 采用查詢的方法。單片機每送一個數(shù)據(jù),發(fā)選通脈沖后,打印機忙線變高,同時接收處理該數(shù)據(jù),完成后忙線變低,單片機查到忙

22、線變低后再送下一個數(shù)據(jù)。.include “8535def.inc” RESET: ldi r16,low(ramend) ;棧指針置初值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定義 C 口為輸出 out ddrc,r16 ldi r16,$01 ;定義PD0為輸出, PD2為輸入 out ddrd,r16 sbi portd,0 ;先使PD0輸出為高 ldi xh,$01 ;X指向打印緩沖區(qū)首址 ldi xl,$00 ldi r25,18 ;要打印的字符數(shù) loop: ld r24,x+ ;向打印機數(shù)據(jù)口送一個字符

23、 out portc,r24 cbi portd,0 ;發(fā)選通脈沖 rcall t1us sbi portd,0 rcall t1us ;延時 3us rcall t1us rcall t1us loop1: sbic pind,2 ;等待忙線變低(耗時長) rjmp loop1 dec r25 ;字節(jié)數(shù)是否發(fā)完 brne loop ;沒發(fā)完再發(fā)下一個 here: rjmp here 打印機中的微電機和機械的動作是一個慢過程,需要幾ms才能傳送一個字節(jié)數(shù)據(jù)。用查詢的方法送一組數(shù)據(jù)給打印機有時需要數(shù)秒鐘,單片機在這段時間內(nèi)就不能干別的事情,這樣常常是不允許的2 采用中斷的方法。主程序送第一個數(shù)據(jù)給打印機數(shù)據(jù)口,接著發(fā)選通脈沖,打印機接收處理該數(shù)據(jù)時,忙線變高,直到處理好此數(shù)據(jù)后忙線變低,BUSY的下降沿產(chǎn)生一個INT0中斷,在中斷服務(wù)子程序中再送下一個數(shù)據(jù),發(fā)送選通脈沖后立即返回主程序。這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論