頑張ってハンダ付けしましょうw
そんなに大変な作業ではないです。
まぁ、私はフリー拡張スロットのコネクタのハンダ付け、一部失敗して斜めについてますけどね……。
MAPLE boardについてきたのは、TC1602E-25Aという型番のLCDでした。
このLCDは、4または8ビットモード(HD44780互換)ということですから、HD44780のデータシートを探してくることにします。
というわけで、alldatasheetから拾って来ました。
MAPLE board附属の回路図を見れば分かる通り、DB0〜DB3は接続されていませんので、4ビットモードでの動作となります。
また、R/WがGNDに接続されていますので、Writeモード固定ということになります。
Writeモード固定なので、Busyフラグチェックは出来ませんから、コマンド実行後は実行時間分待つ必要があります。
LPC1769は、LPC1768と同じなので、MAPLE boardの取扱説明書「8.3 LPCXPresso LPC1768 使用時」というところのピン配置を見ると、どのピンが何に割当たっているのかわかります。
以下のようになっているみたいですね。
ポート番号 | ピン番号 | LCD |
P0 | 15 | D5 |
P0 | 16 | D6 |
P0 | 17 | D4 |
P2 | 1 | RS |
P2 | 2 | E |
P2 | 3 | D7 |
まずは、ledtest02と同じように、FreeRTOSの新規プロジェクトを作って、ひと通り設定をしておきます。
プロジェクト名は、「lcdtest」としました。
元々のLEDと今回のLCD、それに全体的な管理をするアプリケーションとしてのタスクを作って動かすようにしてみましょう。
それぞれをモジュールとして管理し、モジュールを管理するためのデータをハンドル的に扱えるようにします。
データをハンドル化し、ロジックと切り離すことによって、LEDが2つとか、LCDが2つとかになった場合でも、それぞれを独立して動かせるようになるはずです。
LEDのソースにもありましたが、ピンをGPIOとして使うのでも、ペリフェラルの機能を使うのでも、ポート番号とピン番号の指定が必要になります。
なので、セットで扱えるような構造体を用意しておきます。
共通で使うので、src直下に置いておきましょう。
ファイル名はapldevice.hとしました。
#ifndef APLDEVICE_H_ #define APLDEVICE_H_ // ポートピンセット typedef struct _tagPORTPIN_SET{ uint8_t port_num; // ポート番号 uint8_t pin_num; // ピン番号 } PORTPIN_SET, *LPPORTPIN_SET; #endif /* APLDEVICE_H_ */
次に、各タスクのプライオリティ定義用意しておきましょう。
タスク間の関係は、アプリケーション全体で相互に意識しなければならないので、これもsrc直下に置いて共通で使います。
ファイル名はapltask.hとしました。
#ifndef APLTASK_H_ #define APLTASK_H_ #include "FreeRTOS.h" #include "task.h" #define APL_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) #define LED_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) #define LCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) void TaskDelay( portTickType time ); #endif /* APLTASK_H_ */
タスクプライオリティの関係は、アプリケーションとしての動作をアイドルの一つ上に、表示系をその一つ上としました。
また、LEDサンプルの時に使ったvTaskDelayのラッパーとして、TaskDelayという関数を定義しておきます。
TaskDelayの実体は、apltask.cファイルをsrc直下に作って、以下のように作っておきます。
#include "apltask.h" void TaskDelay( portTickType time ) { vTaskDelay( time / portTICK_RATE_MS ); }