昨日の JB8 用プログラムを JB16 に適用してみた。変更に当たっては CodeWarrior でデフォルトの JB16 スケルトンをベースにできるようにしている。元のプログラムではレジスタやビットマスクの定義に hc08jb8.h を使用していたが、これを derivative.h → mc68hc908jb16.h でのマクロに合わせた。
ファームウェアの書き込みには「マイコン工作ファンショップ」の HC08 スターターボードを使用している。スターターボードについての解説は「マイコン工作の実験室」を参照されたし。JB8/JB16 に関しては同サイトの「HC08スターター・ボードで USBマイコンMC68HC908JB8のデバッグ~書き込みを行う」や hamayan さんの「フリスク USBマイコンの基板 新企画編 [HCS08] 」などを参照されたし。
注意点として .prm ファイルの変更がある。割込みベクタテーブルの定義(vecjb8.c)中に RESET も含まれているため、"VECTOR 0 _Startup" をコメントアウトする。更に constant として宣言されている USB デスクリプタオブジェクトをリンクするために "ENTRIES" セクションを用意して "InterfaceDesc Endpoint1Desc Endpoint2Desc" を含める。当初、これを見落としていて随分悩んでしまった。実はこれらの値はプログラム中で明示的に参照されていないために "smart" リンカがコード生成から除外してしまう。これを避けるために ENTRIES での宣言が必要となる。なお、これらは直前の ConfigDesc にくっつけて参照されている。ちょっと反則臭いコードだ。
このソースコードを JB8 で使うには main 関数(u08main.c) の一行を変更すれば良い。# Project.prm 部分 : ENTRIES InterfaceDesc Endpoint1Desc Endpoint2Desc END STACKSIZE 0x50 // VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
IO の初期化などがいい加減なのは御容赦。 Posted by masato at 05:43 PM# u08main.c の一部 void main() { uchar n, a; uchar io_buffer[8]; CONFIG = 0x21; // USB Reset Disable, COP Disable // T1SC = 0x00; // clear TSTOP, Prescaler=0 : JB16 用 TSC = 0x00; // JB8 用
hamayanさんや、k_tさんのところではお世話になっております。
プロジェクト、参考にさせていただきます。
rpmの変更、二つ目は全く知らない話でした。
DAI さん、こんにちは。
これについてはちょっと説明を追加しました。SETUP パケットでコンフィグレーションデスクリプタ(ConfigDesc)を要求されて送信しますが(関数 getDescriptor、SetupBuffer.wValue.hi==DT_CONFIGURATION)、その際に u08desc.c で ConfigDesc の後に宣言されている InterfaceDesc、Endpoint1Desc、Endpoint2Desc もまとめて送信しています。送信サイズが ConfigDesc.wTotalLength.lo であることと、これが sizeof(configuration_descriptor) + sizeof(interface_descriptor) + sizeof(endpoint_descriptor) + sizeof(endpoint_descriptor) であることに注目してください。もちろんこれは処理系(コンパイラ、リンカ等)に依存する方法であり、要注意です。
ベクタテーブルのほうは RESET の宣言を vecjb8.c から外しても良いですし、interrupt VectorNumber_XX 形式で列記しても良いです。
Posted by: masato%管理人 at 01/21, 2008 10:35 AMおそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。