ホームページ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(ウィキ)


 作業の記録

 以下は対症療法的試行錯誤の結果を整理したものです。漏れや何か問題がある可能性があります。

 <ファイルの追加>
  1. ベースには、その9で使用した「NA2」を用いる。
  2. あらかじめ、作者様のサイト(H8/3052F 16x2文字LCD表示器)から「myfunc.h」の内容を保存しておく。
  3. NA2/srcフォルダ内に、lcdled.c , lcdled.h , lcdled.cfg という名前のファイルを新規作成。
 <Makefileの編集>
  1. NA2/Makefile
     「アプリケーションプログラムに関する定義」(の例えば telnet.o の後ろ)に、lcdled.oを追加
 <ソースの編集>
  1. 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
    
  2. NA2/src/lcdled.c
     a. まず、myfunc.h の関数部分(「lcdのリセット動作」以降)をコピー&ペースト
     b. その後、先頭部分に以下を追加(抜けがあったので追加しました。)
    #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;
    		}
    	}
    }
    
     c. さらに、itu0_wait_init()、itu0_wait()を以下の通り書き換え(あるいは削除して、呼び出し側と辻褄を合わせる)
    void itu0_wait_init(void){
    }
    
    void itu0_wait(int msec){
    	dly_tsk(msec);
    }
    
  3. 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			/* 資源数 				*/
    	});
    
  4. 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 );			// セマフォを返却
    
  5. 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]