簡単ファイルシステム評価ボード ALFATを使ってみよう! 其の四 [ALFAT]
※注意!
これからこのブログを書きながら最終的なハードウエアデバック、アプリケーションソフトウエアの構築に入ります。なので、写真や文章と実際の製品では異なる部分が出る可能性が有ります。その点をご了承下さい。
動作確認編2
前回まではデバックモニタをインストールし、HTERMに標準で備え付けられている機能を使って、汎用ポートの動作確認をしました。
まあそこそこの機能的な確認をこのHTERMのPeripheral機能だけで出来る事が判って貰えたと思いますが、しかしより複雑な設定が必要となるデバイスの場合は、Peripheralで行うのは実際的ではありません。
そこで今回からは簡単なプログラムを作成して周辺を動かしてみます。
いきなりALFATの動作確認に入るのは止めて、まずはLCDからです。
さて、動作確認は折角前回デバックモニタをインストールしたのだから、これを使わない手は無い訳で、H8/Tinyの内蔵RAM上にプログラムを展開します。なお、このプログラムはHEWのワークスペースとして作成しました。このワークスペースも収録する予定となっています。 以下がセクション情報を保存したhsiファイルの中身で、この割付を参考に各セクションを配置すれば、なんとか内蔵RAMに納まると思います。 [Hew Section Information] Version=1.0 Entry=2 Group1=PResetPRG,P,C,C$DSEC,C$BSEC,D(0000E800) Group2=B,R,S(0000F840)H8/3687Fには4KbyteのSRAMが内蔵されている事は以前書きましたが、実際には4Kbyteが連続領域にある訳ではなく、2つに分断される形で存在します。 そこで、2つの領域に上手く収まる様にセクションを割り振る必要があります。 今回はプログラムコードの類がそれ程大きなサイズではなかったので、ROM上に配置すべきセクションと、RAM上に配置すべきセクション程度の理由で別けてあります。 各セクションを簡単に解説すると、 PResetPRGはHEWのウイザードが生成した起動ルーチンのセクションです。 Pは標準のプログラムコードセクションです。 Cは標準のコンストセクションです。 C$DSEC、C$BSECは変数領域の初期化時にHEW独自の組み込み関数が使用する変数領域のセクション名です。dbsct.cの中でセクション定義を見る事が出来ます。 Dはデータ領域のコピー元のセクションです。これと対になるのがRセクションで、こちらはコピー先なのでRAM上に配置する必要があります。 Bはmainが走る前に初期化を必要としない変数領域のセクションです。しかし初期化を行わないと言っても、mainが走る前には領域全体は0クリアされている事が前提となっています。 Rは先程のDセクションのコピー先の変数領域です。つまりmainが走る前に決められた初期化が完了している必要があります。 B、R共に0クリアであったり、初期化であったりの処理は何処で行われているかと言えば、HEWのウイザードが生成する「resetprg.c」の中の「_INITSCT()」と言う関数で行われています。この関数はソースコードが提供されておりませんので、具体的な解説は出来ません。内緒だそうです。 Sはスタック領域のセクションです。Call Walkerやシミュレータを使って正確なスタックサイズを調べて、stacksct.hの定義を修正して使います。 ※今回は割り込みを使用していないので、割り込みベクター関連のセクションは用意していません。 |
ところでこのLCDですが、きわめて一般的なキャラクタLCDであり、まあほとんどの方が何らかのマイコンでいじった事があると思われるので、プログラミングに関しての詳細な解説は省きます。大変ですから。 このLCDはH8/3687Fのポート3に接続されています。それぞれの信号線とbitの対応をイメージし易い様にビットフィールドで表しますと、 typedef struct { unsigned char led2 :1; /*LED2*/ unsigned char led1 :1; /*LED1*/ unsigned char e :1; /*Ebit*/ unsigned char rs :1; /*RSbit*/ unsigned char data :4; /*D4からD7までの線に接続*/ } LCD;です。LCDは4bitモードで使用し、R/W端子はGNDへ固定としている為に、データは4bitずつ二回に別けて転送し、また書き込みのみしか使えないと言う事になます。 H8の周辺I/OはメモリマップドI/Oであり、またデータレジスタはリードモデファイライトなので、一種のメモリとしてポートを扱う事とすると、構造体のポインタを用いて以下の様に記述する事が出来ます。 LCD *lcd = (LCD *)&IO.PDR3.BYTE; static void LcdWrite4( char c ) { lcd->e = 1; /*Ebitを立てる*/ /* lcd->e = 1;*/ /*Ebitを立てる*/ lcd->data = c; /*データ書込み*/ /* lcd->data = c;*/ /*データ書込み*/ lcd->e = 0; /*Ebitを下げると書き込まれる*/ } |
さて。適当なメッセージを決めたらビルドを行って、HTERM上からターゲットに転送を行いましょう。正しくエントリーポイントが設定されているならば、GOコマンドでメッセージが表示されます。が、メッセージが表示されない方はまずLCDのコントラストを調整してみてください。LCDの左下に有る半固定抵抗がそれです。 コントラストをいじってもメッセージの影も形も見られないなら、それこそデバックモニタの出番です。HEWのDebugセクションでプログラムのビルドを行ったのなら、自動的にABSファイルにソースコードを参照する情報を付加されていますので、ABSファイルの読み込みが終了した時点で開くダイアログではソースコードの表示を行う方を選択し、HTERMのソースコードウインドウにソースコードを表示させます。これでソースレベルデバックが可能となりました。 |
2006-09-29 23:34
nice!(0)
コメント(4)
トラックバック(0)
こんにちは。
当方、HD44780を使った LCDモジュールを SH2で使用しようとしているのですが、質問したいことがあります。
この記事で、4bitの書き込みに Eを2回立てて、データを2回書き込んで、と言うことをしていますが、何か意味があるのでしょうか?
E-Hi, Data, E-Loの1回ずつではダメなのでしょうか?
お教えください。よろしくお願いします。
by Koji (2006-10-16 09:29)
タイミングを作る為にやっている処置ですが、ASMに展開されたコードを見ると、特に二重にする必要は無いかもしれない。
これはH8(20MHz)の話で、SH2ではどうなるか判らないけれど。
by hamayan (2006-10-16 17:23)
お返事ありがとうございます。
タイミングなら、適当にウェイト入れてやればいいかな?ドキュメントのタイミング読んで適当に入れてみます。
by Koji (2006-10-17 14:18)
特に二重にする必要は無いみたいですね。
by hamayan (2006-10-24 02:14)