混合信號嵌入式設(shè)計實驗指南-數(shù)字實驗之:實驗2—中斷
下面給出了代碼的例子(也可用于Lab2C)
#include m8c.h> // part specific constants and macros
#include PSoCAPI.h // PSoC API definitions for all User Modules
extern unsigned char bShadow=0; void main(void)
{
PRT1DR=0;
INT_MSK0|=0x40;
M8C_EnableGInt;
while(1)
{
M8C_Sleep; //sleep commandbShadow++; PRT1DR=bShadow;
}
}
1.2.4 實驗2D—匯編器中斷服務(wù)例程
步驟1:創(chuàng)建新的工程。?復(fù)制Lab2C,將其命名為Lab2D。
所有參數(shù)和跳線連接保持一樣。重新生成應(yīng)用。
步驟2:修改代碼。創(chuàng)建新的名字為SleepTimerRoutines.asm 的匯編文件。打開該文件,并按照圖1.16 所示添加代碼。
圖1.16 SleepTimer 中斷服務(wù)程序
需要注意這個工程中的一些條目:
保存累加器的值,以后從堆棧中恢復(fù)。中斷硬件只保護程序計數(shù)器和標志寄存器,這是一個中斷服務(wù)程序的最小要求。其他主程序使用的寄存器也需要保護。這通常是通過將它們暫存在堆棧中實現(xiàn)的。
bShadow 是一個在main.c 中聲明的全局變量。當(dāng)使用匯編語言時,必須在這個變量前加一個下劃線。反之,任何一個在匯編文件中定義的全局變量,必須以下劃線開頭,為了讓C 例程能找到它。
例程以reti 結(jié)尾。—打開boot.asm 文件,在休眠定時器向量位置放置如下代碼:ljmp SleepTimerISR 練習(xí)2D-1 :這個指令要求多少個字節(jié)?
重新生成工程。
打開boot.asm ,并且驗證剛才輸入的代碼消失了,這是因為當(dāng)每次重新生成工程時,每次都重寫boot.asm 。對于這個地方的代碼,必須輸入到用于生成boot.asm 的模板文件。
打開boot.tpl ,將下面的代碼放到休眠定時器向量位置。
ljmp SleepTimerISR
重新生成工程。
打開boot.asm ,驗證代碼現(xiàn)在駐留在正確的向量位置。
打開main.c 文件,刪除控制循環(huán)內(nèi)的所有代碼。程序始終處于這個循環(huán),一直等到在休眠定時器中斷服務(wù)程序中為休眠定時器服務(wù)為止。
重新建立工程,下載到Eval1 板子,并運行。
像前面一樣驗證程序。
1.2.5 實驗2E—C 語言中斷服務(wù)例程
步驟1:創(chuàng)建新的工程。
復(fù)制Lab2D,將其命名為Lab2E。
所有參數(shù)和跳線連接保持一樣。
重新生成應(yīng)用。
步驟2:修改代碼。
刪除名字為SleepTimerRoutines.asm 的匯編文件。
打開main.c 文件,并按照圖1.17 所示添加代碼。
圖1.17 Lab2C 控制軟件
需要注意這個工程中的一些條目:
Pragma 允許一個函數(shù)被用做一個中斷句柄。編譯器將自動添加必要的代碼來保護它所使用的任何寄存器。它被用做一個也添加reti。?當(dāng)然,這樣一個函數(shù)不能接受參數(shù)和返回一個結(jié)果。
練習(xí)2E-1:為什么?
將必要的代碼添加到該函數(shù)中,實現(xiàn)前面的匯編中斷服務(wù)程序。打開boot.tpl ,轉(zhuǎn)到休眠定時器向量,在SleepTimerISR 前面添加下劃線。注意:對于在C 中聲明的函數(shù)和變量,添加下劃線。如果在C 中聲明了一個變量
CVar ,則在匯編例程中作為_iCVar 使用,在C 中作為iCVar 使用。如果_iAsmVar 在匯編語言中聲明為一個變量,則它在匯編例程中作為_iASmVar 使用,在C 例程中作為iCVar 使用。iAsmVar 是一個在匯編語言中聲明的變量,它可以在匯編例程中作為iASmVar 使用,但在C 中不可使用。
重新生成應(yīng)用,重新建立工程,下載到Eval1 板子,運行;像前面一樣驗證程序。
評論