Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

改造課題の答え

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/11/28 13:00

 前回の課題の答えです。

改造1:レディランプをつける

1. 緑のLEDを点灯/消灯する関数をLed.cに追加

 緑のLEDはD3で、接続ポートはPORT_LED_D3と#defineしてありますから、これを使います。

void LedReady( int sw )
{
    if ( sw == LED_ON ){
        PORT_LED_D3 = LEVEL_ON ;
    }
    else{
        PORT_LED_D3 = LEVEL_OFF ;
    }

    return;
}

 led.hにプロトタイプ宣言を追加するのを忘れてはいけません。

void    LedReady( int sw );

2. LedReady()を呼ぶ場所は、MeasureIntervals()の冒頭

 最初の無音安定が確認できたら、スプーンオペレーションの受け付け可能な状態になっているわけですから、WaitInactive()の直後で点灯です。

 また消灯タイミングは。最初の音が入った直後です。ただし、仕事の優先度としてLEDを消すよりもタイマをスタートさせるほうが重要なので、StartTimer()を呼んだあとに消灯します。

WaitInactive( NOCHECK_TIME );   /* 初期無音安定待ち */
    LedReady( LED_ON );         /* 緑LEDを点灯する  */

    WaitSound( NOCHECK_TIME );      /* 最初のパルス待ち */
    StartTimer();               /* 計測タイマを起動する */

    LedReady( LED_OFF );            /* 緑LEDを消灯する  */
    Led( 1, LED_ON );           /* LED1 点灯        */

改造2:最初の4打の点灯パターンを変える

1. LEDの動作をよく考える

 現状から何を変えれば改造パターンになるでしょうか。

 最初の点灯は同じです。次に2番目が点灯したとき,改造後は1番目が消えています。3番目が点灯したとき、今度は2番目と1番目が消えていますが、1番目は2番目が点灯したときにもともと消えているので、わざわざ消す必要があるのは2番目だけです。同様に4番目が点灯したときは3番目を消す必要があります。

 これの一般解を考えると、

  • 1番目点灯時は同じ
  • 2番目~4番目点灯時は,N-1番目のLEDを消灯する

 となります。

 つまり、改造する場所は、2~4番目の点灯をしている部分ということになります。

 そこでMeasureIntervals()を見てみると、ちょうど2~4番目は1つのループで処理していて、

Led( i, LED_ON );   /* 対応するLEDを点灯する    */

 という場所が見つかります。この点灯時に、ひとつ前のLEDを消してやればいいので、

Led( i, LED_ON );   /* 対応するLEDを点灯する    */
    Led( i -1 , LED_OFF );  /* 前回のLEDを消灯する      */

 という記述を追加すれば、目的をはたすことができます。

 以上です。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 舘 伸幸(タチ ノブユキ)

    NECマイクロシステム株式会社 勤務 NPO法人SESSAME 所属 開発ツールのソフトウェア開発を経て組込みソフトウェア開発に従事。プライベートにも半田ごては手放さない。 2006年からSESSAME に参加。若い世代に物を作る楽しさを伝えていきたい。

バックナンバー

連載:たった5つのルールではじめるC言語開発

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5