2015年8月22日 星期六

ROSA 系統開發 1 ─ 一個複雜程式怎麼寫?

http://4rdp.blogspot.com/2015/08/rosa-1.html

接下來將一系列專文說明 ROSA 的程式開發,複雜的東西就是要切塊逐一處理,因為 Arduino 有很多 pin 腳,每隻腳都是獨立運作,因此採功能模組方式開發,參考程式範例如下:

// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)
// System
#define TARGET   mBot
#if TARGET == mBot
  #define DIGITAL    14
  #define ANALOG     8
#elif TARGET == motoduino
  #define DIGITAL    14
  #define ANALOG     6
#elif TARGET == UNO
  #define DIGITAL    14
  #define ANALOG     6
#endif
enum {    // CONFigure
  DOUT,
  DIN,
  DIN_UP,
  ADIN,
  ADIN_UP,
  PWM_,
  LED = 7,
  TONE,
  SERVO,
  I2C,
  SER_RX,
  SER_TX,
  IR_RX,
  IR_TX,
  XXXX
};
const byte  CFD[] PROGMEM = {     // DIGITAL + ANALOG   pin default 
  #if TARGET == mBot
    SER_RX, SER_TX, IR_RX, IR_TX, DIN,  DIN,  DIN,  DIN,
    TONE,   DIN,    DIN,   DIN,   DIN,  LED,
    ADIN,   ADIN,   ADIN,  ADIN,  ADIN, ADIN, ADIN, ADIN 
  #elif TARGET == motoduino
    SER_RX, SER_TX, DIN,  DIN,  SERVO, PWM_, PWM_, SERVO,
    SERVO,  PWM_,   DOUT, DOUT, DOUT,  DOUT,
    ADIN,   ADIN,   ADIN, ADIN, ADIN,  ADIN
  #elif TARGET == UNO
    SER_RX, SER_TX, IR_RX, IR_TX, DIN,  DIN,  DIN,  DIN,
    TONE,   DIN,    DIN,   DIN,   DIN,  LED,
    ADIN,   ADIN,   ADIN,  ADIN,  ADIN, ADIN
  #endif
};


首先將系統相關的東西提出來定義規劃,這程式先開發 mBot、motoduino 與 UNO 三種版本,它們的 MCU 相近,因此程式碼也絕大部分相同,程式碼能否將差異部分分開,其它只要寫一次就好?C 語言是最接近組合語言的高階程式語言,常常有這樣需求,因此它有這種可自行定義的前置處理器指令 (pre-processor directive),給程式編譯器看。所以用 #define 定義 TARGET 為 mBot,接下來的程式將只編譯 TARGET == mBot 的部分,mBot 有 14 個數位 pin 與 8 個類比 pin。

接下是列舉 (Enumerations) 定義,enum 會從 0 開始依整數排序對每一個整數常數給值,Arduino pin 可以因應需求定義功能,在此列出 14 種功能,綜觀目前現有 S4A、S2A、Firmata 腳位功能列舉還沒 ROSA 多,有些功能沒列上例如超音波,它是可用一個數位輸出及一個數位輸入組合成的,因此基本上 ROSA 可涵蓋多樣功能需求。

CFD[] 是將每一 pin 預設功能用陣列形式建表,const 就是將此表儲存於 ROM 程式區塊,這表是 ROSA 開機後要預設各個 pin 腳功能時使用,因為初始值是常數,所以用 const 儲存,加 PROGMEM 關鍵字是為了減少消耗 SRAM 空間,少了這個關鍵字宣告,常數資料會在執行階段被複製到 SRAM 佔用空間,之前 ROSA 的 SRAM 寫爆就是這緣故,也與 Arduino 編譯器有關,這種情形我倒是第一次遇到,此外 ROSA 另有指令可以切換 pin 腳功能,不必擔心被 Arduino 內部韌體綁死。

本系列文章適合進階玩家,並不適合初學者,因此不會逐行解說程式碼。



沒有留言:

張貼留言