在說明中斷使用方式之前,用戶要了解中斷寄存器,及與中斷息息相關(guān)的控制寄存器( Control Register),另外在芯片中預(yù)除器( Prescalar )的使用方法,用戶也需要住意。
寄存器0X0F使用到的有BIT0 ~ BIT2。BIT0在TCC計時器計數(shù)溢位時就會被設(shè)定,用戶可以根據(jù)0X0F的BIT0被設(shè)定而判定TCC計數(shù)溢位。跟TCC配合的還有另一個寄存器---控制寄存器(Control Register,簡稱CONT)?刂萍拇嫫0X0F各位安排如下:
Bit3預(yù)除器配置:
0:TCC
1:WDT
□ Bit4 TCC遞增時機(jī):
0:外部信號,觸發(fā)邊沿為正沿觸發(fā)。
1:外部信號,觸發(fā)邊沿為負(fù)沿觸發(fā)。
□ Bit5 TCC信號來源:
0:內(nèi)部指令周期觸發(fā)。
1:外部引腳(第三腳)觸發(fā)。
□ Bit6 INT使能標(biāo)志:
0:禁止所有中斷產(chǎn)生。
1:使能中斷信號。
□ Bit7 無使用。
三種中斷產(chǎn)生都有其先前的設(shè)定值,接下來會以示例說明。
l 例:寫一個程序,將寄存器0X20當(dāng)做計數(shù)器,每當(dāng)TCC中斷產(chǎn)生,就自動加1。
MOV A, @0X0 ;設(shè)定 A = 0。
IOW 0X0E ;關(guān)閉Watch Dog。
ORG 6 ;設(shè)定接下來的程序位址。
CLR 0X20 ;清除寄存器0X20。
JMP TCC_PRO ;跳轉(zhuǎn)到TCC_PRO。
INT_PRO: DISI ;關(guān)閉各項中斷功能。
CLR 0X0F ;清除中斷寄存器。
INC 0X20 ;計數(shù)器加1。
RETI ;返回主程序,並使能中斷。
TCC_PRO: CLR 0X0F ;清除中斷寄存器。
MOV A, @0X01 ;設(shè)定 A = 1。
IOW 0X0F ;使能TCC溢位中斷產(chǎn)生。
MOV A, 0X40 ;設(shè)定 A = 0X40。
CONTW ;將A的值寫入控制寄存器。
ENI ;使能中斷。
TCC_WAIT: NOP ;等待TCC計數(shù)器計數(shù)溢位。
NOP ;等待TCC計數(shù)器計數(shù)溢位。
JMP TCC_WAIT ;等待TCC計數(shù)器計數(shù)溢位。
TCC中斷產(chǎn)生有幾個設(shè)計的重點(diǎn):
1. 關(guān)閉看門狗計時器(Watch Dog Timer)。
2. 設(shè)定控制寄存器(包括預(yù)除器、TCC信號來源、觸發(fā)時機(jī)…)。
3. 使能中斷(下ENI指令)。
4. 使能TCC中斷(設(shè)定中斷控制寄存器的bit0為1)。
5. 中斷服務(wù)位址為0X08。
6. 進(jìn)入中斷服務(wù)程序首先要將中斷禁止,否則會產(chǎn)生重復(fù)中斷。
7. 中斷寄存器0X0F,在進(jìn)入中斷服務(wù)程序時可以提供用戶判斷為何種中斷,判斷完成之后用戶必須自行清除。
8. 由中斷服務(wù)程序返回主程序應(yīng)使用指令RETI。
l 例:寫一個程序,將寄存器0X20當(dāng)做計數(shù)器,每當(dāng)PORT6 Change中斷產(chǎn)生,就自動加1。
PORT6 == 6 ;定義。
DISI ;中斷禁止。
ORG 6 ;設(shè)定下一個位址為0X06。
CLR 0X20 ;清除計數(shù)寄存器。
JMP PORT6_CH ;跳轉(zhuǎn)到主程序。
DISI
INT_PRO: ;0X08為中斷服務(wù)程序起始。
NOP
CLR 0X0F ;清除中斷標(biāo)志寄存器。
INC 0X20 ;計數(shù)器遞增。
MOV PORT6, PORT6 ;將PORT6的值存入正反器。
RETI ;回主程序。
PORT6_CH:
CLR 0X0F ;清除中斷標(biāo)志寄存器。
MOV A, @0XFF ;設(shè)定 A = 0XFF。
IOW PORT6 ;將PORT6設(shè)成輸入口。
MOV PORT6, PORT6 ;將PORT6的值存入正反器。
ENI ;使能中斷。
MOV A, @0X02 ;設(shè)定 A = 0X02。
IOW 0X0F ;使能PORT6 Change中
WAIT_INT:
WDTC ;清除Watch Dog Timer。
NOP ;等待PORT6 Change。
NOP ;等待PORT6 Change。
JMP WAIT_INT ;循環(huán)。
使用PORT6 Change中斷有下列幾個步驟。
1. 關(guān)閉看門狗計時器(Watch Dog Timer),若看門狗計時器未關(guān)閉,用戶要定時下WDTC的指令。
2. 清除中斷寄存器。
3. 設(shè)定PORT6為輸出口。
4. 將PORT6的值存入觸發(fā)器中(這很重要)。
5. 使能中斷(下ENI的指令)。
6. 使能PORT6 Change中斷(設(shè)定中斷控制寄存器的bit1為1)。
7. 中斷服務(wù)程序的啟始位址在0X08。
8. 進(jìn)入中斷服務(wù)程序首先要將中斷禁止,否則會產(chǎn)生嵌套中斷。
9. 中斷寄存器0X0F,在進(jìn)入中斷服務(wù)程序時可以提供用戶判斷為何種中斷,判斷完成之后用戶必須自行清除。
10. 由中斷服務(wù)程序返回主程序應(yīng)使用指令RETI。
l 例:寫一個程序,將寄存器0X20當(dāng)做計數(shù)器,每當(dāng)外部中斷產(chǎn)生,就自動加1。
所謂的外部中斷就是利用IC外部引腳,針對單片機(jī)外部的信號做為信號源來產(chǎn)生中斷。EM78系列的外部中斷引腳是第4腳,是和PORT6位0合用,所以再使用前要先設(shè)定PORT6 , BIT0是要單純用做I/O引腳,或是中斷輸入引腳。
ORG 6 ;設(shè)定啟始位址為0X06。
CLR 0X20 ;清除計數(shù)器。
JMP EXT_PRO ;跳轉(zhuǎn)到主程序。
INT_EXT:
DISI ;中斷禁止。
CLR 0X0F ;清除中斷標(biāo)志。
INC 0X20 ;遞增計數(shù)寄存器。
RETI ;返回主程序。
EXT_PRO:
CLR 0X0F ;清除中斷標(biāo)志。
MOV A, @0X04 ;A = 0X04。
IOW 0X0F ;使能外部中斷信號產(chǎn)生。
MOV A, @0X40 ;A = 0X40。
IOW 0X0E ;設(shè)定PORT6, BIT0為中斷輸入腳
ENI ;返回主程序。
EXT_WAIT:
NOP ;等待外部中斷輸入。
NOP ;等待外部中斷輸入。
JMP EX_WAIT ;循環(huán)。
外部中斷顯然比較容易了解。所需注意的項目有:
1. 禁止中斷。
2. 設(shè)定中斷服務(wù)程序的地址在0X08。
3. 清除中斷標(biāo)志寄存器。
4. 使能外部中斷信號產(chǎn)生(設(shè)定中斷控制寄存器為0X04)。
5. 將PORT6, BIT0設(shè)定成外部中斷引腳(設(shè)定控制寄存器0X0E, BIT6為1)。
6. 使能中斷信號(ENI)。
7. 用戶在進(jìn)入中斷服務(wù)程序(0X08)時,首先要記得禁止中斷(DISI)。
8. 可以由中斷標(biāo)志寄存器判斷中段的信號為何產(chǎn)生,判斷完之后應(yīng)自行清除中斷標(biāo)志。
9. 返回主程序時用指令RETI。
以上三支中斷程序的寫法都是利用無窮循環(huán),所以用戶想要看到結(jié)果只有結(jié)束程序,然后查看計數(shù)寄存器(0X20)的計數(shù)狀況。