目標

タイマーと浮動小数点を使って、1秒以下のウエイトを実現する。

作業手順

Chapter1で作成したプロジェクトをベースにします。 PSoC Creatorで、Chapter1のプロジェクトをオープンしておいてください。

mrubyスクリプトの自動コンパイル処理の追加

Chapter1では、手作業でmrubyスクリプトをコンパイルしていました。

頻繁に変更するようになると、作業が煩雑になりますので自動化します。

  1. コンパイル用バッチファイルmrbc.batをmrubyソースコードをおいたディレクトリへコピーします。バッチファイルは、ダウンロードページのmrubyコンパイラをダウンロードしてください。
  2. mrbc.bat中のset MRBC行をmrbc.exeの絶対パスに書き替えます。
  3. メニューからProject>Build Settingsダイアログを表示します。
    ARMGCC... >User Commands>User Commandsの設定欄Pre Buildへ mrbc.batを入力します。
 20180312

浮動小数点の利用

一秒おきのループを、以下の通り0.2秒おきにして、点滅のサイクルを短くしようと思います。


led = 0
while true
  if led == 1 
    led = 0 
  else 
    led = 1
  end

  if sw1_read() == 0
    led = 1 
  end

  led1_write( led )
  sleep 0.2 
end


ところが、これをコンパイルして実行しても、ハングアップしたように見えます。

PSoC5LPでは、浮動小数点を扱うために、以下の作業が必要です。 また、ヒープが不足するのでヒープサイズ増加も行っておきます。

    • メニューから Project > Build Settingsを選び、Build Settingsダイアログを表示する。Linker > Generalの設定欄、Use newlib-nano Float Formatting を Trueにします。
 20170106161419
  • 画面左 Workspace Explorerペインの System をダブルクリックしてシステム設定を表示します。 (表示されていない場合は、Project > Design Wide Resource 下にあるので、順に展開する)中央ペインのHeapSizeを0x400に書き換えます。
     20170116153103

ビルドと実行

  • メニューから、 Build > Clean and Build Design01 を選びます。
  • Output欄へ、「--------------- Build Succeeded: ...」と表示されるのを確認します。
  • デバイスをUSBポートへ接続します。
  • メニューから Debug > Program を選択します。
  • Output欄へ、「Device 'PSoC 5LP CY8C5888LT*-LP097' was successfully programmed at ...」と表示されるのを確認します。
  • デバイス上でLED1(青色)が前回よりも早い間隔で点滅し、プッシュスイッチ SW1を押すと点いたまま消灯しなくなる動作を確認します。

タイマーの利用

今まではハードウェアタイマーを使わずプログラムを動かしていましたので、点滅周期など正確ではありませんでした。 この項ではハードウェアタイマーをmruby/cに使わせることで、正確さを向上させます。

回路の追加

  • 画面左 Workspace Explorerペインから、TopDesign.cyschをダブルクリックして、回路図を画面に表示させます。
  • 画面右 ComponentCatalog ペインから、System > Clock をドラッグし、中央のペインへドロップします。
  • 配置された Clock_1をダブルクリックし、Configure Dialogを開きます。
  • Frequency を、1kHzに変更します。  
     20170116160030
  • 画面右 ComponentCatalog ペインから、System > Interrupt をドラッグし、中央のペインへドロップします。
  • 配置された isr1と先ほどのClock1をWireToolを使って接続します。
     20170116160415

main.c プログラムの変更

メインプログラムに、追加した回路のためのコードと、mruby/cへのインターフェースを追加します。


//================================================================
/*! タイマー割込ハンドラ
*/
CY_ISR(isr_1)
{
  mrbc_tick();
}


int main()
{
  CyGlobalIntEnable; /* Enable global interrupts. */
  mrbc_init(memory_pool, MEMORY_SIZE);

  isr_1_StartEx(isr_1);

  mrbc_define_method(0, mrbc_class_object, "sw1_read",   c_sw1_read);
  mrbc_define_method(0, mrbc_class_object, "led1_write", c_led1_write);

  mrbc_create_task( sample1, 0 );
  mrbc_run();

 return 0;
}


タイマー未使用宣言を撤回

前チャプターで、タイマー未使用を宣言しているので、それを撤回します。

  • メニューから、Project > Build Settings を選び、Build Settingsダイアログを開きます。
  • 左ペインの Design01 > ARM GCC... > Compiler > General をクリックし右ペインの Preprocessor Definitions欄を初期値へ戻します。
     20170116161326
    または、右端にある [...] をクリックして表示されるダイアログを使っても、同様の事ができます。

クリーンビルドと実行

前項で宣言を削除したので、クリーンコンパイルをします。

  • メニューから、 Build > Clean and Build Design01 を選びます。
  • Output欄へ、「--------------- Build Succeeded: ...」と表示されるのを確認します。
  • デバイスをUSBポートへ接続します。
  • メニューから Debug > Program を選択します。
  • Output欄へ、「Device 'PSoC 5LP CY8C5888LT*-LP097' was successfully programmed at ...」と表示されるのを確認します。
  • デバイス上でLED1(青色)が点滅し、プッシュスイッチ SW1を押すと点いたまま消灯しなくなる動作を確認します。