EM78系列單片機(jī)--中斷程序的設(shè)計(jì)
在EM78X56系列的IC中有三種中斷信號,分別是:
TCC溢位中斷。
PORT6Change中斷。
外部信號中斷。
在說明中斷使用方式之前,用戶要了解中斷寄存器,及與中斷息息相關(guān)的控制寄存器(ControlRegister),另外在芯片中預(yù)除器(Prescalar)的使用方法,用戶也需要住意。
中斷信號顯示寄存器0X0F各位安排如下:
BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
中斷信號-----外部中斷標(biāo)志PORT6ChangeTCC溢位標(biāo)志。
寄存器0X0F使用到的有BIT0~BIT2。BIT0在TCC計(jì)時(shí)器計(jì)數(shù)溢位時(shí)就會(huì)被設(shè)定,用戶可以根據(jù)0X0F的BIT0被設(shè)定而判定TCC計(jì)數(shù)溢位。跟TCC配合的還有另一個(gè)寄存器---控制寄存器(ControlRegister,簡稱CONT)??刂萍拇嫫?X0F各位安排如下:
BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
控制信號-INTTSTEPABPSR2PSR1PSR0
各位的代表意義如下:
□PSR2~PSR0:TCC/WDT預(yù)除器設(shè)定。
PSR2PSR1PSR0TCC比例WDT比例
0001:21:1
0011:41:2
0101:81:4
0111:161:8
1001:321:16
1011:641:32
1101:1281:64
1111:2561:128
FIGURE3.5PS0~PS2的設(shè)定值與預(yù)除器和TCC及WDT的比例關(guān)係。
Bit3預(yù)除器配置:
0:TCC
1:WDT
□Bit4TCC遞增時(shí)機(jī):
0:外部信號,觸發(fā)邊沿為正沿觸發(fā)。
1:外部信號,觸發(fā)邊沿為負(fù)沿觸發(fā)。
□Bit5TCC信號來源:
0:內(nèi)部指令周期觸發(fā)。
1:外部引腳(第三腳)觸發(fā)。
□Bit6INT使能標(biāo)志:
0:禁止所有中斷產(chǎn)生。
1:使能中斷信號。
□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。
IOW0X0E;關(guān)閉WatchDog。
ORG6;設(shè)定接下來的程序位址。
CLR0X20;清除寄存器0X20。
JMPTCC_PRO;跳轉(zhuǎn)到TCC-_PRO。
INT_PRO:DISI;關(guān)閉各項(xiàng)中斷功能。
CLR0X0F;清除中斷寄存器。
INC0X20;計(jì)數(shù)器加1。
RETI;返回主程序,並使能中斷。
TCC_PRO:CLR0X0F;清除中斷寄存器。
MOV A,@0X01;設(shè)定A=1。
IOW0X0F;使能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ù)溢位。
JMPTCC_WAIT;等待TCC計(jì)數(shù)器計(jì)數(shù)溢位。
TCC中斷產(chǎn)生有幾個(gè)設(shè)計(jì)的重點(diǎn):
1.關(guān)閉看門狗計(jì)時(shí)器(WatchDogTimer)。
2.設(shè)定控制寄存器(包括預(yù)除器、TCC信號來源、觸發(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)PORT6Change中斷產(chǎn)生,就自動(dòng)加1。
PORT6==6;定義。
DISI;中斷禁止。
ORG6;設(shè)定下一個(gè)位址為0X06。
CLR0X20;清除計(jì)數(shù)寄存器。
JMPPORT6_CH;跳轉(zhuǎn)到主程序。
DISI
INT_PRO:;0X08為中斷服務(wù)程序起始。
NOP
CLR0X0F;清除中斷標(biāo)志寄存器。
INC0X20;計(jì)數(shù)器遞增。
MOV PORT6,PORT6;將PORT6的值存入正反器。
RETI;回主程序。
PORT6_CH:
CLR0X0F;清除中斷標(biāo)志寄存器。
MOV A,@0XFF;設(shè)定A=0XFF。
IOWPORT6;將PORT6設(shè)成輸入口。
MOV PORT6,PORT6;將PORT6的值存入正反器。
ENI;使能中斷。
MOV A,@0X02;設(shè)定A=0X02。
IOW0X0F;使能PORT6Change中
WAIT_INT:
WDTC;清除WatchDogTimer。
NOP;等待PORT6Change。
NOP;等待PORT6Change。
JMPWAIT_INT;循環(huán)。
使用PORT6Change中斷有下列幾個(gè)步驟。
1.關(guān)閉看門狗計(jì)時(shí)器(WatchDogTimer),若看門狗計(jì)時(shí)器未關(guān)閉,用戶要定時(shí)下WDTC的指令。
2.清除中斷寄存器。
3.設(shè)定PORT6為輸出口。
4.將PORT6的值存入觸發(fā)器中(這很重要)。
5.使能中斷(下ENI的指令)。
6.使能PORT6Change中斷(設(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外部引腳,針對單片機(jī)外部的信號做為信號源來產(chǎn)生中斷。