前言

其實一直有個心願,很想自己寫個迷你的 FORTH 系統在目前最通用的微處理器平台,採用 Atmel 的 AVR 系列微處理的 Arduino上。不過真的太忙了,AVR組合語言也只學了一點點,實在是沒有時間啊!我們還是乖乖地使用現有的平台好囉。

然後最重要的是最近無意中發現這個 Arduino FORTH 的網站,真是驚為天人啊。已經有一點社群的架勢囉,所以來加入他們吧!😬

Arduino 上面可以用的 FORTH 系統大概有三種,第一個是丁陳漢蓀老師的 eFORTH,再來是很老牌的 amFORTH,最後是後起之秀,專門為嵌入式系統所開發的 Flash FORTH。

丁陳老師的 eFORTH,因為老師太執著於可攜性了,所以很多的指令集並未針對 AVR 的微處理器做最佳化,所以憑良心說,我是比較不喜歡用的。

AmFORTH 素乎也是不錯,但也是有舊有的包袱,太大,太肥之類的的問題。Arduino 上面的記憶體可是寸土寸金啊!

看來看去,針對 PIC系列微處理器,及 AVR 系列的微處理器所開發的 Flash FORTH 還是比較成熟跟適合。難怪會被這個 Arduino FORTH 網站選擇為主要推廣的語言。

所以這篇來記錄一下,我怎麼順利成功地利用家裡的 iMac ,順利地將 Flash FORTH 系統燒錄到 Arduino UNO 上囉。

除了自己做個紀錄,以後步驟忘記了隨時可以回來查詢外,也提供給網路上芸芸眾生,有興趣的人可以來參考。

 

Flash FORTH

這篇主要是要來記錄如何安裝 FlashFORTH 的,所以大概根據網站的資料,簡單介紹一下 Flash FORTH 的特色

Flash FORTH 是個實作在 Microchip 八位元微處理器 PIC18F,16位元微處理器 PIC24, 30, 33 以及 Atmel 的 Atmega 系列的微處理器的一個 FORTH 語言系統。

當然啦, Flash FORTH 可以運作在目前最通用的 Arduino Uno 跟 Mega 的控制版之中。

整個系統提供了 FORTH 的翻譯器,編譯器,組合語言組合器,及多工器,也包含了可定義的微處理器中斷。

所以 Flash Forth 很適合來開發,或偵錯複雜的即時控制系統的應用。

對於 Arduino 上的 Flash FORTH 而言,完整系統約佔 12K 左右的二進碼。 Arduino Uno 的 Atmega328 有 32K 的 flash 記憶體,扣除 FORTH系統後約有 20K 左右的空間可以使用。

即使如此,根據測試,同樣的 LED 閃爍控制程式,整個 Flash FORTH 所佔用的 Flash 記憶體,依舊是由同樣功能 Arduino IDE 所編譯出來的 C語言二進碼的1/2 或甚至是 1/4 左右的大小,空間的利用率上,是比C語言優秀的。所以只要是 Arduino IDE 能夠完成的事情,使用 Flash FORTH 只會更快,更好。一切的限制,只來自於你的想像力。

 

自製 Arduino ISP 燒錄器

大家都知道, Arduino 之所以非常方便就是因為它有了個內建的 Boot Loader. 這個 Boot Loader 真的非常方便,它負責跟 Arduino 的 IDE 透過 USB 的 UART 來溝通。當 IDE 要燒錄新程式時,Boot Loader 會幫我們透過 USB 跟 IDE 取得編譯後的二進碼立即做燒錄的動作,隨燒隨用。(優點是方便,缺點就是有個 Bootload 在微處理器裡面佔空間)

但實際上,對於一個開發完畢的商用程式,假如要燒錄到全新的AVR微處理器,因為此時微處理器內部尚無任何可以運作燒錄的程式。所以要將程式二進碼放到內部 Flash 裡面,其實靠的是由微處理器內部已經預定的硬體燒錄程序,由內建 SPI 介面所組成的 ISP 來進行程式的燒錄。

但因為我們的 Flash FORTH 系統,地位如同 BootLoader 般,本身除了是 FORTH 語言系統外,也有對內部 Flash 隨時燒錄新資料的能力。 所以我們的 Arduino FORTH 系統,不用 BootLoader,而是直接將整個 Flash FORTH 系統燒錄進去。

因為沒有 BootLoader,所以這個第一次的系統燒錄需採用 ISP 燒錄的方式。

 

ISP 燒錄通常需要 ISP 燒錄器。 Flash FORTH 官網的燒錄程序就是要求你去購買一個 ISP 燒錄器來燒錄二進程式碼進入 CPU 的 Flash 中。

但因為 ISP 燒錄器跟微處理器的溝通方式是透過 SPI 介面,所以其實不用在額外再買一個 ISP燒錄器的,你手上的 Arduino 就可以是最好的 ISP 燒錄器 -- 可以直接用一個 Arduino Uno 直接做一個 ISP 燒錄器。而關鍵的燒錄程式,Arduino 的開發單位可是很貼心的,早知道你會有這樣的需求,所以早就幫你寫好了附在 Arduino IDE 的開發環境中了。只要找個有Bootloader的Arduino ,把燒錄程式透過Bootloader 燒錄進去,這樣就變成一個 ISP 燒錄器囉。

Arduino 官網對如何用 Arduino 來當 ISP 燒錄器來進行 ISP 燒錄,這裡也做了詳細的說明!有興趣的也可以去詳細參考閱讀一下!

 

步驟:

(1) 準備一個有 Bootloader 的 Arduino UNO

(2) 打開 Arduino IDE, 載入範例11, ArduinoISP 的 Sketch (程式)

01 Arduino ISP memu.png

02 Arduino ISP code.png

 

(3) 將此 Arduino UNO 接上電腦,透過正常 Bootloader 燒錄程序,編譯並燒入 ArduinoISP 進去這台 UNO. 這樣,這台 Arduino Uno 就變成 ISP 燒錄器囉。

(4) 將欲燒錄 Falsh FORTH 的 Arduino Uno 依照下圖的方式跟我們剛剛才用 Arduino Uno 做好的 ISP 燒錄器做連接。

03 ArduinoUNOtoUNO_ISP2.jpg

 

這樣就完成燒錄器的準備動作

 

Avrdude 的安裝

有了 Arduino ISP 燒錄器這樣還是不夠的,電腦端那邊還是需要有可以跟 ISP燒錄器溝通並控制燒錄過程的燒錄軟體。這裡就需要 AVR 微處理器原廠 Atmel 的協助了。 Atmel 為了他們家晶片的燒錄,推出了一個叫做 Avrdude 的燒錄工具。這個軟體可以燒錄他們家 AVR 系列的所有微處理器,而且是跨平台 PC/UNIX/Linux/Mac 都支援。小缺點是它是以命令列的方式來運作。

所以我們的 Mac OS 要先安裝 Avrdude 的這個軟體

這個軟體因為 Mac OS 上沒有像 Linux 那麼方便的套件管理程式,所以要透過 HomeBrew 這個 OSX 上非常有名的套件管理軟體來進行安裝。也就是說要先安裝 HomeBrew 啦。

 

步驟:

(1) 打開 OSX 的 Terminal

同時按 command+space 呼叫 Find,鍵入 "Terminal" 後按 enter

 

(2) 鍵入下列指令安裝 HomeBrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

 

(3) HomeBrew 安裝完畢後,請 HomeBrew 幫我們安裝 Avrdude 

brew install avrdude

 

 

Flash FORTH hex 二進檔案的下載

然後再來就是要來下載 Flash FORTH 在 Arduion 上完整運行的系統囉。 Flash FORTH 目前最新的版本是 Flash FORTH 5.0,可以至官網下載。或是此處他們的 Source Forge.net下載

下載完畢,完整目錄如下圖所示。

Ardunio Uno 專用的二進檔放在 avr/hex/ff_uno.hex 中

04 flash forth dir.png

 

 

Flash FORTH 系統的燒錄

接下來就是要燒錄囉,依照下列步驟逐步執行

 

步驟

(1) 硬體接線

將要燒錄的 Arduino Uno 照前面所指示的,跟我們自製的 Arduino ISP 燒錄器依序接好,然後將 Arduino ISP 燒錄器 USB 接上 iMac 電腦!

 

(2) 打開 OSX 的 Terminal

同時按 command+space 呼叫 Find,鍵入 "Terminal" 後按 enter

 

(3) 將ff_uno.hex 二進檔移到 Home 目錄,呼叫 Avrdude 進行燒錄,

將要燒錄的 ff_uno.hex 檔案放到 Home 檔案夾。鍵入下列指令進行燒錄

sudo avrdude -P /dev/tty.usb* -c avrisp -b 19200 -p m328p -e -U flash:w:ff_uno.hex:i -U efuse:w:0xff:m -U hfuse:w:0xda:m -U lfuse:w:0xff:m

 

要注意的,這裏有三個很重要的 fuse 參數, efuse, hfuse 跟 lfuse

對於 Arduino Uno: E:0xff H:0xda L:0xff.

對於 Ardunio Mega: E:0xff H:0xdc L:0xff

 

這裏的

/dev/tty.usb* 是 USB Serial Port 的位置.

avrisp 指的是要使用 ArduinoISP 燒錄器,不同的燒錄器這個參數會不一樣

flash:w:ff_uno.hex:i 是我們的檔案位置

 

假如一切順利, Terminal 中會回報燒錄跟驗證成功。有任何問題, Terminal 中都會有訊息回報。

05 avrdude r1.png

06 avrdude r2.png

 

燒錄成功後, Done!

現在我們已經把一片 Arduino控制板變成是一台迷你的,交談式的 FORTH 單晶片電腦囉!

 

 

Serial Tools 的下載

 

這台 FORTH 單晶片電腦,沒有鍵盤,沒有螢幕。但是我們可以透過 USB Serial 的終端機來跟它交談。

當然, Arduino IDE 內建了一個 Serial Terminal,可以直接拿來驗證。但是,那個主要是設計來顯示用的,用在一問一答的交談上非常的不好用!

 

但是假如有專屬的 Serial Terminal 來使用,會更方便許多。

這裏推薦兩個 Serial Terminal,第一個是一個叫做 Serial Tools 的工具軟體。可以直接在 MacOS 的 App Store 直接下載安裝

07 serial Tool App Store.png

 

Arduino 所使用的硬體 Serial Port 驅動程式代碼,可以很容易地在 IDE 中查詢到

08 usb serial driver.png

這裡可以看到,叫做 usbmodem14101

填入 Serial Tools 中的設定,即可使用, Flash FORTH 所用的 Serial Port 參數為 Baud: 38400, Data Bits: 8, Party Check: No, Stop Bits: 1. (8-N-1) 

09 serial tool setting.png

 

很順利地跟我們的 Arduino FORTH 單晶片電腦交談起來惹

4 + 5 = ?   答案是 9

10. serial tool flash forth.png

 

 

iTerm2 終端機軟體的下載

 

另外一個是 iTerm2 可以到他們的官網直接下載

這個 iTerm2 其實只是 MacOS 內建的終端機的進階版本,要跟 USB Serial Port 做連接需進一步建立並設定profile,利用 UNIX 的 Screen 指令,當終端機視窗打開時,直接執行 Screen 指令透過 USB Serial 埠來跟我們的 Arduino FORTH 電腦連接。

到官網下載 iTerm2 安裝執行後,到菜單 Profile 裡面建立新的 Profile

關鍵是 Command 那一欄,選擇 Command,並鍵入 "screen /dev/cu.usbmodem14101 38400" 這行指令

這是要求當這個 Profile 的 Terminal 執行時,立即執行這行 screen 指令。

screen <serial port> <baud rate>

這個 screen 指令會將螢幕的輸入輸出以你定義的 <baud rate> 速度,導向你所定義的 <serial port>

 

11. iTerm2 Script.png

 

 

和 FORTH Arduino 交談的結果,順利成功!

4 + 5 = ?  答案是 9

12. iTerm2 flash FORTH.png

 

xxxxXXX

 

arrow
arrow

    ohiyooo2 發表在 痞客邦 留言(1) 人氣()