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