2011年2月20日 星期日

Arduino 筆記 – bitlash 基本要素簡介(2)

前一篇簡介了數值變數(Numeric variables)、腳位變數(Pin variables) 、指令(Commands) 跟內建函式(Build-in functions)這些基本要素。其中有幾個指令比較重要,底下將特別介紹。

help - 查詢可用的指令和函式

如果你忘了指令或函式的名稱,可以輸入 help 指令,Bitlash 就會列出所有指令與內建函式給你看:

> help
bitlash here! v2.0 RC1 (c) 2011 Bill Roy -type HELP- 999 bytes free
http://bitlash.net
See LICENSE for license
Pins: d0-22,a0-22  Variables: a-z, 32 bit long integers
Operators: + - * / ( ) < <= > >= == != << >> ! ^ & | ++ -- :=
Commands: arg boot else function help if ls peep print ps return rm run stop switch while
Functions:abs ar aw baud bc beep br bs bw constrain delay dr dw er ew free inb max millis min outb pinmode pulsein random sign snooze

巨集功能(Bitlash Functions)

1) 用 function 指令定義巨集(Defining a Bitlash function),語法:

     function name body

範例:

> function toggle13 {d13=!d13;}
saved
> function toggle12 {d12=!d12;}
saved

▲ 上列定義了 toggle13 和 toggle12 兩個巨集

要注意,巨集的取名必須符合下列規則:

  • 必須以英文字母或底線('_’)起始,最多 12 個字元
  • 必須超過一個字元,這是為了避免跟內建的數值變數(Numeric Variables)產生衝突
  • 不能跟腳位變數(a0 … an 與 d0 …dn)、內建函式以及指令產生衝突

假如沒有照上述規則取名的話,可能會得到一個 "unexpected id" 的錯誤,像底下這樣:

> function d13 {d13=!d13;}

-------------^
unexpected id

▲ 不能用 d13 當巨集名稱,會產生衝突,因為 d13 是腳位變數

2) 用 ls 指令列出已定義的巨集,例如:

> ls
function toggle13 {d13=!d13;};
function toggle12 {d12=!d12;};

▲ 列出已定義的巨集,目前有 toggle13 和 toggle12 兩個巨集

3) 用 rm 指令刪除巨集,例如:

> ls
function toggle13 {d13=!d13;};
function toggle12 {d12=!d12;};
> rm toggle12
> ls
function toggle13 {d13=!d13;};

▲ 本來有兩個巨集,刪掉 toggle12 後,現在只剩下 toggle13 一個巨集

4) 用 peep 指令印出 EEPROM 的內容,例如:

image_thumb[5]

▲ 巨集儲存在 EEPROM 裏

工作管理功能(Task management)

1) 在前景(foreground)跑巨集。直接輸入巨集的名稱,就可以執行巨集,它會在前景(foreground)跑:

> toggle13

▲ 跑巨集,toggle13 會在前景(foreground)執行

2) 用 run 指令在背景(background)跑巨集。例如:

> run toggle13,1000

▲ 讓 toggle13 每一秒鐘跑一次,toggle13 會在背景(background)執行

3) 用 ps 指令列出在背景執行的工作。例如:

> ls
function toggle13 {d13=!d13;};
function toggle12 {d12=!d12;};
> run toggle13,1000
> run toggle12,500
> ps
0: toggle13
1: toggle12

▲ 上列顯示目前一共有兩個工作正在背景執行,編號 0 和編號 1

4) 用 stop 指令停止背景工作。例如

> ps
0: toggle13
1: toggle12
> stop 1
> ps
0: toggle13

▲ 原本有兩個工作在執行,停掉第 1 個工作後(即 toggle12),只剩下第 0 個工作(即 toggle13)

Bitlash 允許你在背景最多同時執行 8 個工作。

兩個特殊的巨集: startup 和 prompt

Bitlash 裏有兩個特殊的巨集:

1) 會在開機的時候執行的 startup 巨集。如果你有定義 startup 巨集,它會在開機的時候自動執行,例如:

> function startup {print "Arduino startup";}
saved
> ls
function startup {print "Arduino startup";};
> boot
bitlash here! v2.0 RC1 (c) 2011 Bill Roy -type HELP- 1021 bytes free
Arduino startup

▲ 定義 startup 巨集,當用 boot 指令重開 Arduino 後,startup 巨集會自動執行

2) 用來更換指令提示符號(Command Prompt)的 prompt 巨集。Bitlash 預設的指令提示符號是 >,你可以定義個 prompt 巨集以改變提示符號,例如:

> function prompt {print "$ ",;}
saved
$ ls
function prompt {print "$ ",;};
$

▲ 把指令提示符號從原本的 > 換成 $

如何在開機的時候自動執行工作?

在「bitlash 新手入門 」一文中,我們寫了一支 Bitlash 版的 Blink 程式:

> function toggle13 {d13=!d13;}
saved
> run toggle13,1000

▲ 讓 toggle13 每一秒鐘跑一次,toggle13 會在背景(background)執行

這支程式是達到了我們的目的,可以讓 LED 每秒閃爍一次,不過它有一個問題,它在每次 Arduino 重開機後就停掉了。要怎麼做才可以把 run toggle13,1000 的工作安排在開機的時候自動執行呢? 嗯! 我想你應該已經知道答案了。沒錯!方法就是把它寫在 startup 巨集裏,像這樣:

> ls
function toggle13 {d13=!d13;};
> function startup {pinmode(13,1); run toggle13,1000;}
saved

▲ 定義 startup 巨集,在開機的時候自動跑 pinmode(13,1); 和 run toggle13,1000;

這麼一來,不管是斷電重新上電,或是用 boot 指令重開機器,這支程 Blink 程式都會正常運作,重開後 LED 還是會如預期不斷閃爍。數位腳位(digital pins)預設都是 input,記得要先跑一次 pinmode(13,1) 把 pin 13 設成 output。

動動腦

如果你定義了 prompt 巨集把指令提示符號改掉,之後要怎麼做才能還原改回預設的 > 符號呢? (提示: rm 指令)

0 意見: