第三章、 可由使用者程式化的 WINS
3.4 編撰使用者 script
CMD Index (b7~b3)
CMD Para 1 (b2~b0)
Byte1 HEX
Para2 Remark
Rn.0=0:StandBy, Rn.0=1:Rx);
b7=0(b0=0:Standby, b0=1:Rx)
8 Timer_Proc 000: Set Timer 40 b7~b6:Timer index, b4~b0: Reg# Reg_n: TimerL, Reg_n+1: TimerH 000: #Data -> Reg0 48 Immediate data
001: #Data -> Reg1 49 Immediate data 010: #Data -> Reg2 4A Immediate data 011: #Data -> Reg3 4B Immediate data 100: #Data -> Reg4 4C Immediate data 9 Data_Cpy2
101: #Data -> Reg5 4D Immediate data
1. 設定 Port 0 為 0xFE 以點亮 LED0 2. 延遲 0.5 秒
3. 設定 Port 0 為 0xFB 以點亮 LED1 4. 延遲 0.5 秒
5. …8 個 LED 都點亮過後從第 1 步重新開始
因為 8 個 LED 都在同一個輸出埠 P0 上,可以用「左旋」運算功能簡化程式;故整個 程式可以寫成如下的迴圈型式:
1. 設定 Reg0 為 0xFE (LED 為低位驅動, 0xFE 為只有 LED0 低位) 2. 將 Reg0 資料輸出至 Port 0 以點亮 LED
3. 延遲 0.5 秒
4. 將 Reg0 內容左旋 1 個 bit 5. 跳回第 2 步
步驟三、查表並將所需之命令逐一填入
表格 6:跑馬燈之程式設計命令表 Step Line# Instruction CMD Code 說明
1 00 #FEh -> R0 48h, FEh 將立即值放入 R0 2 01 R0 -> P0 10h, 00h 將 R0 內容 copy 至 P0 3 02 (RL R0 once) -> R0 2Ah, 20h 將 R0 左旋一個 bit, 放回 R0 4 03 Delay 500mS 0Fh, D0h 延遲 500mS 以供顯示
5 04 Jump to CMD line#1 30h, 01h 跳回 line#1(從 0 起算),造成 無限迴圈
從這一個簡單的實作中可以發現,使用本系統開發這類小型設備的操作程式是十分地簡 單與直覺,只要可以描述得出來便可以撰寫得出來,本系統將 delay 這些最常用的程式寫
成了單一個命令,而且未來隨時可依需求加入更多更方便的命令,以加速並簡化 script 寫 作。
3.4.3 無線收發功能驗證 script 設計
在上一節中驗證了 script 的架構及硬體基本動作之後,接下來本節會驗證硬體之無線收 發功能,這是 WINS 中最重要的一項硬體功能,沒有無線收發能力,便只能稱為是自動控 制實驗板了。
步驟一、定義並詳細描述系統的功能
本節的 script 會每 0.5 秒無線發送一筆資料,然後將剛發出去的資料進行左旋轉運算(像 上節一樣),在等待下一個 0.5 秒到來之時會持續檢查是否有收到資料(從另一個 WINS 發 出),會將收到的資料顯示在連結在 P0 上的 LED。
步驟二、決定程式的流程及細部的行為
1. 設定 nRF2401 RF Address 為 9BA1592647H:
1.1 設 Reg0 為 9BH 1.2 設 Reg1 為 A1H 1.3 設 Reg2 為 59H 1.4 設 Reg3 為 26H 1.5 設 Reg4 為 47H
1.6 設定 RF Address 為從 Reg0 起的 5 個 Register 內容 2. 設定 nRF2401 RF Channel 為 1AH
3. 設定 Reg5 為 7FH (此為供發送用之資料) 4. 設定 Timer0 之 interval 為 0.5 秒
4.1 設 Reg0 為 D0H
4.2 設 Reg1 為 07H
4.3 設定 Timer0 之初值為 Reg0 起的 2 個 Register 內容,並啟動 Timer0 5. 設定 nRF2401 為資料發送模式
5.1 禁止 nRF2401 接收模式 5.2 將 nRF2401 設成發送模式 6. 將 Reg5 內容左旋 1 個位元 7. 將 Reg5 內容複製到 Reg6
7.1 將 Reg5 內容複製到 Acc 7.2 將 Acc 內容複製到 Reg6
8. 將 Reg6 至 Reg12 之資料由 nRF2401 送出(一個封包中 PAYLOAD 為 7 個 byte) 9. 設定 nRF2401 為接收模式
10. 致能 nRF2401 接收模式
11. 將 nRF2401 的狀態讀回,放在 Reg2 中 12. 將 Reg2 內容複製到 Acc
13. 若 Acc 之 bit0 為 0(未收到資料),跳至 16
14. 將 nRF2401 接收到之資料複製到從 Reg6 至 Reg12 的 7 個 register 內 15. 將 Reg6 的內容顯示在 P0 上(這是由另一個 node 所發出的)
16. 若 Timer0 時間未到,則跳至 11 17. 跳至 4
步驟三、查表並將所需之命令逐一填入
表格 7:無線收發功能驗證 script 設計命令表
Line # Function Block Instruction
Byte1 HEX
Byte2 HEX
Remark / 說明
0 #9BH -> Reg0 48 9B
1
Set RF Address 9BA1592647H
#A1H -> Reg1 49 A1
Line # Function Block Instruction
Byte1 HEX
Byte2 HEX
Remark / 說明
2 #59H -> Reg2 4A 59
3 #26H -> Reg3 4B 26
4 #47H -> Reg4 4C 47
5 Set RF Address 3A 00
設定 RF Address 為從 R0 開始的 5 個位置內 容
6 Set RF Channel 1AH Set RF Channel 38 1A 設定 RF 頻道為 1A
7
設定 Reg5 為 7FH (此為供發送用之 資料)
#7FH -> Reg5 4D 7F 設定 Reg5 為 7F(待送出之資料)
8 #D0 -> Reg0 48 D0
9 #07 -> Reg1 49 07
10
設定 Timer0 之 interval 為 0.5 秒
Set RF Rx 40 00
設定 Timer0 之初值為 Reg0 起的 2 個 Register 內容,並啟動 Timer0
11 3E 00 Disable Rx
12
設定 nRF2401 為資料發送模式
39 00 Set Tx
13 將 Reg5 內容左旋 1 個位元 RL Reg5 2A 25 Rotate Reg5 left, once
14 Reg 5 -> A 23 05
15
將 Reg5 內容複製到 Reg6
A -> Reg 6 22 06
16
將 Reg6 至 Reg12 之資料由 nRF2401 送出
Send RF data 3C 06 將 Reg6 至 Reg12 之資料由 nRF2401 送出
17 Set Rx 39 01
18
設定並致能 nRF2401 為接收模式
Enable Rx 3E 01
19
將 nRF2401 的狀態讀回,放在 Reg2 中
Get RF status ->
Reg2
3B 02
20 將 Reg2 內容複製到 Acc Reg2 -> A 23 02
21
若 Acc 之 bit0 為 0(未收到資料), 跳 至 24
JNB,A.0,+3 35 03
22
將 nRF2401 接收到之資料複製到 從 Reg6 至 Reg12 的 7 個 register 內
Get Data -> R6~ 3D 06 接收到的資料放在從 R6 開始的 7 個位置中
23
將 Reg6 的內容顯示在 P0 上(這是 由另一個 node 所發出的)
Write Reg6 to P0 10 06 Write Reg6 to port 0
24 若 Timer0 時間未到,則跳至 19 JMP if not timer0 37 1B JNTimer0,-5 (000 11011)
25 Loop Jump to line #8 30 08
此一 script 最大的功能便是驗證硬體的收發功能:首先讓 A 與 B 都執行這個 script,然 後會看到 A 與 B 的 LED 每隔 0.5 秒便會變換狀態,若將 A 之電源關閉,則會發現 B 的 LED 也不會變化了,這能證實該 B 所顯示的資料的確是從 A 而來。