ホームページ>H8をMacで>その9a・I/OボードのLCDとLEDを使えるようにする
目次
その9a・I/OボードのLCDとLEDを使えるようにする
目的と経緯
以下は、マイコンボードでインターネットラジオを再生することを模索した際の覚書です。
付属のI/Oボード(マザーボード)には、LCDとLEDが組み込まれていますが、これらを前回のインターネットラジオ用のソフトウェアで使えるようにしてみます。
方針
LCD表示で真っ先に思い浮かべるのは、インターネットラジオのメタデータ(曲名やアーティスト名を含む)ですが、これは、表示以前の話として、まずストリームからメタデータを切り出さなくてはいけません。(そしておそらく、MP3デコーダへは、切り出し後のストリームデータを送り込まなければいけない筈。)
ということで、初手としては敷居が高いと思われるため、まずは「自身のIPアドレスを表示してみる」という、シンプルな機能に絞り込んでみました。
LCD制御部分につきましては、今回も有用なソフトウェアが公開されていましたので、これを使わせて頂く事としました。
作者様はH8/3052Fを使われていますが、H8/3069Fでも問題なく使えました。
ただし、I/Oボードでは、LCDはポート4に繋がれているので、その部分のみ変更が必要です。また、ウェイトの発生は16ビットタイマを使わず(3069用への書き換えと、TOPPERS側がタイマを使用しているので競合を回避する必要があるため)に、dly_tsk()で代用する事としました。参考サイト(1):H8/3052F 16x2文字LCD表示器
LEDの方はもっと単純で、レジスタの値を制御するだけです。なので、簡単な関数を自作することとしました。
(ただし、使い方には注意が必要、とのことです。)
参考サイト(2):LEDをつけてみる - やまねこのマイコン実験室 - livedoor Wiki(ウィキ)
作業の記録
以下は対症療法的試行錯誤の結果を整理したものです。漏れや何か問題がある可能性があります。
<ファイルの追加>
<Makefileの編集>
- ベースには、その9で使用した「NA2」を用いる。
- あらかじめ、作者様のサイト(H8/3052F 16x2文字LCD表示器)から「myfunc.h」の内容を保存しておく。
- NA2/srcフォルダ内に、lcdled.c , lcdled.h , lcdled.cfg という名前のファイルを新規作成。
<ソースの編集>
- NA2/Makefile
「アプリケーションプログラムに関する定義」(の例えば telnet.o の後ろ)に、lcdled.oを追加
- NA2/src/lcdled.h
myfunc.h から、プロトタイプ宣言部分をコピー&ペーストし、LEDのdefineを追加(抜けがあったので追加しました。)void lcd_init(void); void lcd_write8(char str); void lcd_write4(char str,char rs); void lcd_locate(char x,char y); void lcd_print(char *str); void lcd_clear(void); void lcd_shift_disp(char dir); void lcd_shift_cursor(char dir); void itu0_wait_init(void); void itu0_wait(int msec); void led_onoff(int clr, int func); // Added. 2012.04.02 #define LED_RED 0 #define LED_GREEN 1 #define LED_OFF 0 #define LED_ON 1- NA2/src/lcdled.c
a. まず、myfunc.h の関数部分(「lcdのリセット動作」以降)をコピー&ペースト
b. その後、先頭部分に以下を追加(抜けがあったので追加しました。)c. さらに、itu0_wait_init()、itu0_wait()を以下の通り書き換え(あるいは削除して、呼び出し側と辻褄を合わせる)#include <s_services.h> // Added. 2012.04.02 for dly_tsk() #include "lcdled.h" #include "3069S.H" #define LCD_PORT_DDR P4DDR #define LCD_RS P4DR.BIT.B4 #define LCD_E P4DR.BIT.B5 #define LCD_DATA P4DR.BYTE #define LED_RED_PORT P4DR.BIT.B6 #define LED_GREEN_PORT P4DR.BIT.B7 // LEDの操作 void led_onoff(int clr, int func){ if (clr == LED_RED) { if (func == LED_ON) { LED_RED_PORT = LED_ON; } else { LED_RED_PORT = LED_OFF; } } else if (clr == LED_GREEN) { if (func == LED_ON) { LED_GREEN_PORT = LED_ON; } else { LED_GREEN_PORT = LED_OFF; } } }void itu0_wait_init(void){ } void itu0_wait(int msec){ dly_tsk(msec); }- NA2/src/lcdled.cfg
全文を以下の通りとする。/* * セマフォ */ CRE_SEM(LCD_SEM, { TA_TPRI, /* 待ち行列から優先順位順に起動される */ 1, /* 初期状態での利用可能資源数 */ 1 /* 資源数 */ }); CRE_SEM(LEDR_SEM, { TA_TPRI, /* 待ち行列から優先順位順に起動される */ 1, /* 初期状態での利用可能資源数 */ 1 /* 資源数 */ }); CRE_SEM(LEDG_SEM, { TA_TPRI, /* 待ち行列から優先順位順に起動される */ 1, /* 初期状態での利用可能資源数 */ 1 /* 資源数 */ });- NA2/src/na2.c
以下を追加(LCDの初期化は「MMC の初期化」の前、LCD表示とLED操作は「IP アドレスの設定」と「DDNS の設定」の間に挿入)#include "lcdled.h" … // LCD の初期化 lcd_init(); syslog(LOG_NOTICE, "[NA2] LCD Initialized."); … // IP AddressをLCDに表示 static UB addr[sizeof("123.123.123.123")]; ip2str(addr, &ipv4_addr); wai_sem( LCD_SEM ); // セマフォを取得 lcd_locate(0,0); // カーソルを一行目へ lcd_print("my IP Address:");// ラベルの表示 lcd_locate(0,1); // カーソルを二行目へ lcd_print(addr); // アドレスの表示 sig_sem( LCD_SEM ); // セマフォを返却 // LEDの操作 wai_sem( LEDR_SEM ); // セマフォを取得 led_onoff(LED_RED, LED_ON); // 赤LEDを点灯 dly_tsk(100); // 100ms待つ led_onoff(LED_RED, LED_OFF); // 赤LEDを消灯 sig_sem( LEDR_SEM ); // セマフォを返却 wai_sem( LEDG_SEM ); // セマフォを取得 led_onoff(LED_GREEN, LED_ON); // 緑LEDを点灯 dly_tsk(100); // 100ms待つ led_onoff(LED_GREEN, LED_OFF); // 緑LEDを消灯 sig_sem( LEDG_SEM ); // セマフォを返却- NA2/src/na2.cfg
以下を追加#include "src/lcdled.cfg"
動作テスト
ビルド方法は前回と同じです。
実行してみたところ、LCD表示、LED点灯とも、確認できました。
注)写真撮影のため、(ソフトウェアを改変して)LEDを付けっ放しにしています。
今後の課題
まずは、SDカード再生時のファイル名表示/ラジオ再生時の局名表示、辺りでしょうか。
その後、(実用になるかは別として)メタデータ表示の実験、といったところでしょうか。
お世話になったサイト
有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)
参考サイト(1):H8/3052F 16x2文字LCD表示器
参考サイト(2):LEDをつけてみる - やまねこのマイコン実験室 - livedoor Wiki(ウィキ)
更新履歴
2012.03.31 新規作成
[Home] [MacSoft] [Donation] [History]