Professional Documents
Culture Documents
作者 : 陳鍾誠
單位 : 金門技術學院資管系
Email: ccc@kmit.edu.tw
URL :
http://ccc.kmit.edu.tw
日期 : 09/10/09
嵌入式系統的範例
微波爐
數位相機
家用遙測裝置
2 陳鍾誠 - 09/10/09
微波爐
嵌入式處理晶片
BUS
輸入介面 輸出介面
輸入鍵 開門 馬達 風扇
磁電管 燈具
3 喇叭 陳鍾誠 - 09/10/09
數位相機
光學感應器
A/D 轉換 馬達
LCD 銀
影像儲存裝置 幕 計算機介面
4 連到 PC 的纜線
陳鍾誠 - 09/10/09
嵌入式系統處理器區塊圖
位址 平行 I/O 連接
資料 CPU 埠
控制
序列 I/O 連接
埠
內部記憶體
計時器 / 計數器
A/D 轉換 D/A 轉換
5 陳鍾誠 - 09/10/09
範例 : 鍵盤與顯示
BUS
DATAIN DATAOUT
CPU
INSTATUS OUTSTATUS
鍵盤 顯示裝置
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
INSTATUS OUTSTATUS
1 : 代表輸入裝置已有資料進入 1 : 代表顯示裝置已準備好
0 : 代表輸入裝置沒有資料 : 6 陳鍾誠 - 09/10/09
0 : 代表顯示裝置尚在處理上一個輸出中
記憶體映射 I/O
將裝置的狀態暫存器與資料暫
存器 裝成記憶體的一部 0000
輸入 : 裝置介面卡會有一個偵
測電路,一但偵測到位址匯流排
上的位址代表其裝置時,就將裝
置暫存器的 放到資料匯流排上
. FFFB
OUTSTATUS=FFFC
輸出 : 裝置介面卡會有一個偵 DATA OUT =FFFD
測電路,一但偵測到位址匯流排 INSTATUS=FFFE
上的位址代表其裝置時,就將資 DATAIN=FFFF
料匯流排上的資料設到對應暫存
器當中 .
7 陳鍾誠 - 09/10/09
輸出入程式的設計
輸出入程式的設計方式大致可分為兩類
輪詢 (Polling) :
不斷的偵測輸出入狀態,直到可以輸出入為止
接著將資料輸出入到對應位址中
中斷 :
搭配硬體,當有輸入發生時,硬體會通知 CPU ,
然後直接跳到預設好的中斷函數執行 .
8 陳鍾誠 - 09/10/09
輸出入程式範例– 組合語言
程式功能 : 從鍵盤讀入一行字,並顯示到銀幕上 .
説明 : 以輪詢 (Polling) 的方式 , 不斷從鍵盤讀入字元後 , 顯示該字元
到輸出裝置 , 直到讀到換行字元為止 .
void main() {
char buf[100]; // buf = 輸入行儲存區
char* LOC=buf; // LOC = 輸入行儲存位址
while (1) {
while (INSTATUS & 0x8 == 0) {} // 一直測到有鍵被按下為止
*LOC = *DATAIN; // 將該輸入鍵值儲存到儲存區
while (OUTSTATUS & 0x8 == 0) {} // 測試顯示器是否可以輸出了
*DATAOUT = *LOC; // 將剛剛讀入的鍵值送到顯示器顯示
LOC ++; // 前進到下一個字元
if (*LOC == ‘\n’) // 若是換行字元,則離開迴圈
break;
}
}
10 陳鍾誠 - 09/10/09
更完整的範例
- 反應計時器
作者 : 陳鍾誠
單位 : 金門技術學院資管系
Email: ccc@kmit.edu.tw
URL :
http://ccc.kmit.edu.tw
11 陳鍾誠 - 09/10/09
系統架構圖
VDD VDD VDD
Go
BCD 轉 7 BCD 轉 7 BCD 轉 7
段 段 段
式解碼器 式解碼器 式解碼器
… … …
Stop
PA7-4 PA3-0 PB7-4
3 2 1 0
13 陳鍾誠 - 09/10/09
記憶體空間映射
0: 計數器 1: 開始
1: 計時器
1: 停止
1: 啟用中斷
CTCONT 7 6 5 4 3 2 1 0
計時狀態暫存器
1: 計數器為 0
16 陳鍾誠 - 09/10/09
反應計時器的 C 語言程式
#define PAIN (volatile char*) 0xFFFFFFF0 // A 的輸入暫存器
#define PAOUT (char*) 0xFFFFFFF1 // A 的輸出暫存器
#define PADIR (char*) 0xFFFFFFF2 // A 的方向暫存器
#define PBIN (volatile char*) 0xFFFFFFF3 // B 的輸入暫存器
#define PBOUT (char*) 0xFFFFFFF4 // B 的輸出暫存器
#define PBDIR (char*) 0xFFFFFFF5 // B 的方向暫存器
#define CNTM (char*) 0xFFFFFFD0 // 計數暫存器
#define COUNT (char*) 0xFFFFFFD4 // 計時暫存器
#define CTCONT (char*) 0xFFFFFFD8 // 計時器狀態暫存器
void main() {
unsigned int counter_value, total_value;
unsigned int actual_time, seconds, tenths, hundredths;
// Initialize the parallel ports.
*PADIR = 0xFF; // A 連接到前兩個七段顯示器 , 因此設定方向為輸出
*PBDIR = 0xF4; // 設定 B 前半方向為輸出 , LED 為輸出 , Go, Stop 鍵為輸
入
*PAOUT = 0x0; // 七段顯示器顯示 0
*PBOUT = 0x4; // 熄滅 LED 燈
17 陳鍾誠 - 09/10/09
反應計時器的 C 語言程式 -
續
while (1) { // 無窮迴圈
while ((*PBIN & 0x2) == 0); // 等待按下 Go 鍵
*CNTM = 300000000; // 設定計時器為 300,000,000( 三秒 )
*CTCONT = 0x1; // 啟動計時器
while ((*CTSTAT & 0x1) == 0); // 等候 3 秒鐘直到計時器到達 0
*PBOUT = 0x0; // 點亮 LED 燈
*CNTM = 0xFFFFFFFF; // 設定最大計時初始 ( 下數計時器 )
*CTCONT = 0x1; // 開始計數
while ((*PBIN & 0x1) == 0); // 等待 Stop 鍵被按下
*PBOUT = 0x4; // 熄滅 LED 燈
*CTCONT = 0x2; // 停止計數
counter_value = *COUNT; // 計算總時間
total_count = (0xFFFFFFFF - counter_value); // 計算花費時間 ( 一億分之一秒為單位 )
actual_time = total_count / 1000000; // 除以百萬 , 以百分之一秒為單位
seconds = actual_time / 100; // 取得秒數
tenths = (actual_time - seconds * 100) /10; // 取得 0.1 秒數
houndredths = actual_time - (seconds * 100 + tenths * 10); // 取得 0.01 的秒數
*PAOUT = ((seconds << 4) | tenths); // 顯示前兩個數字
*PBOUT = (houndredths << 4) | 0x4); // 顯示第三個數字 , 同時熄滅 LED. 燈
}
}
18 陳鍾誠 - 09/10/09
參考文獻
Computer Organization, 5/e
Carl Hamacher, Zvonko Vranesic, Safwat Zaky
Section 2.7 : 輸出入作業
Chapter 9 : 嵌入式系統
19 陳鍾誠 - 09/10/09