サンプル::LED点灯

サンプル::LED点灯

EZ-KITを使う 08:03

EZ-KITでプログラムを動かして見ます。最初のお題はC++言語によるLEDの点灯です。今回のお題はアナログデバイセズが出しているLED点灯プログラムを元に作っています。殆ど変りません。

EZ-KIT BF533は他のEZ-KITと異なりLEDの制御を外部デバイスで行っています。このデバイスはST Micro製のFLASH/PLD/ポートエクステンダーでなかなかおもしろいチップなのです。それはともかく外部デバイスですので内部レジスタ以外のレジスタを設定しなければなりません。チップが非同期SRAMポートに接続されているため、レジスタもそのメモリー空間にありますがEZ-KITにはそのレジスタをアクセスするためのマクロは付いてきません。そこで最初にアクセスマクロを作ります。

アクセスマクロは#defineによる擬似ポインタ定義です。アドレスとオブジェクトの型を指定してレジスタへのポインタを作り出します。ポインタは出力方向制御レジスタ(FLASHA_PORTB_DIR)とデータレジスタ(FLASHA_PORTB_OUT)レジスタです。アドレスはEZ-KITのマニュアルに載っています。

#include <cdefBF533.h>

  // FLASH AのポートB設定レジスタ
#define pFLASHA_PORTB_OUT ((volatile unsigned char * )0x20270005)
#define pFLASHA_PORTB_DIR ((volatile unsigned char * )0x20270007)

実行文は単純です。最初に非同期SRAMポートを初期化して外部のポートレプリケーターチップへのアクセスを可能にした後、チップを出力に設定しLEDへのアクセスを行います。LEDは6個ありますが、これがポートBのビット0から5までに接続されています。

int main(void)
{
  *pEBIU_AMBCTL0 = 0x7bb07bb0;  // 非同期ポート0,1の初期化
  *pEBIU_AMBCTL1 = 0x7bb07bb0;  // 非同期ポート2,3の初期化
  *pEBIU_AMGCTL  = 0x000f;      // 全非同期ポートをイネーブル

  *pFLASHA_PORTB_DIR = 0x3f;    // bit0-5を出力に
  *pFLASHA_PORTB_OUT = 0x00;    // LED オフ
  *pFLASHA_PORTB_OUT = 0x31;    // 110001を出力
}

このプログラムにはひねりはありません。ステップ実行するとLEDが全消灯して次に点灯するのがわかります。レジスタに書き込んだビット・パターンとLEDの点灯パターンを見比べてください。"1"のLEDが光るのはよいとして、パターンが左右逆です。この辺のセンスの悪さはADI独特のものです。