ユビキタス鉄道模型
赤外線リモコン戦車
レーザ・グラフィックス
USB加速度センサマウス
├ ハードウェア
├ ソフトウェア
├ USB処理
├ 開発環境
└ 感想
ビジョンシステム
リアルタイムOS
LCD表示パネル
相撲ロボット
多自由度ロボット
 開発事例 TOPへ
 HOMEへ
イエローナビ
 ページTOPへ
 開発事例 TOPへ
 HOMEへ
YellowSoft.com
製品紹介 Q&A ダウンロード 開発事例 ユーザ ご購入 価格表 お問合せ
 USB加速度センサマウス


  H8S2655開発セットYH55-1Cを用いたUSB加速度センサマウスの開発
    AAF@Boston T.Yamamoto


  ソフトウェア

    (1) ソフトウェア概要

   
ソフトウェアの概要を図3に示します。



図3 ソフトウェアの概要


加速度センサUSBマウスのソフトウェアは、初期化処理以降は、センサインターフェイスの処理を行うためのウォッチドッグタイマ(WDT)を用いたタイマ割込みと、USBインターフェイスの処理を行うための外部信号割込み(IRQ)、この2つの割込みによる単純作業の反復で構成されます。

USBマウスの処理的には、外部信号割込みのみで全ての動作を行うこともできるのですが、USBデバイスの処理の実装とそのデバッグが一筋縄では行かない時のために、両者を切り離して実装することにしました。また、ソースコードも、USBに関する部分を完全に分離し、他のマイコンなどでも流用が効くように配慮しました。

 マウスインターフェイスの処理およびメインルーチンは、

- AccUSBMouse.h:加速度センサUSBマウスのプログラムのヘッダ
- AccUSBMouse.c:加速度センサUSBマウスのプログラム本体 に記述してあります。

AccUSBMouse.cについては、直接ハードウェアを制御するためレジスタアクセスを行っている都合上、使用するCPUが変更になった場合は、修正する必要が出てきます。 H8S/2655の内部レジスタアクセス用の諸設定は、

- H8S2655.h :H8S/2655のレジスタ設定他に記述してあります。

ハードウェアのレジスタアクセスなど、チップの仕様に密接に依存した位置部の関数もこのヘッダ中に実装しているので注意してください。使用するCPUが変更になった場合。このファイルは作りなおす必要があります。

 USBインターフェイスの処理は、

- USBN9603.h:USBN9603制御関連プログラムのヘッダ
- USBN9603.c:USBN9603制御関連プログラムの本体に記述してあります。

デバッグ用のLED点灯/消灯など、使用するCPUに依存する部分は、メイン側で設定してあるため、基本的にこのソースコードは他のCPUにおいても流用が可能です。(一部の関数を外部で設定しIncludeする必要あり)ただし、USBN-9603のアドレス設定のためのアクセスアドレス及びデータアクセスのためのアドレスは、メモリマップ上のどの位置にUSBN-9603を配置するかに依存するため、注意が必要です。

なお、USBインターフェイスの実装のデバッグが一つの開発における重要なポイントであったため、デバッグ用に使用したコードはそのまま残した形でソースコードを掲載しています。

 最後に、

- cc_m.asm:スタートアップルーチンがスタートアップルーチンになります。

スタートアップルーチンは、メインルーチン側で各種インターフェイスのレジスタの設定をしても実害が無いため、YellowSoftサンプルのコードにWDT割込みと、IRQ0割込みの関数を設定しただけになっています。

  ソースファイルのダウンロード


    (2) メインルーチン

メインルーチン(void main(void):AccUSBMouse.c)は非常に単純な構成になっています。 まず、H8S/2655でアプリケーション(このプログラム)が正常に起動したことを確認するためにタイトルを表示します。

起動しメイン関数が呼ばれた時点で既にSCIが使用できる状況になっていることが一つの味噌になっています。

その後、まず init_members(void):AccUSBMouse.cにより各種変数の初期化を行い、次いでinit_H8S2655():AccUSBMouse.cによりH8S/2655の各種レジスタの初期設定を行います。

この初期設定時に、WDT割込みやIRQ0割込みの設定とあわせてA/D変換の設定やIOポートの設定を行い、USBN-9603へアクセスするためのバス設定も行います。

この後、USBN9603_init():USBN9603.cを行い、USBN9603の初期設定を行います。USBN-9603へのレジスタアクセスが正常に行われているかチェックする意味で、このあとにUSBN9603_print_revision():USBN9603.cで、Deveice Revの表示させています。この時の表示が 0x02で無い場合、回路接続の不良もしくはH8S/2655のバス設定の不具合、もしくはUSBN-9603のアドレスマップ配置を間違っていることがわかります。

ここまでで、初期設定は完了となり、割込みを許可するために、CCRレジスタのIマスクをクリアする、ClearCCRIMask():H8S2655.hを呼び出します。その後は無限ループとなっています。無限ループのなかで、SCI FIFO のデータを表示させるchack_sci_fifo()AccUSBMouse.cを呼び出していますが、これについてはデバッグの項で説明します。


    (3) マウスインターフェイス処理

マウスインターフェイスの処理は、ウォッチドッグタイマを用いたタイマ割込みにより約6.6ms周期で3つの処理を行います。

一つは、アナログ情報の取得(void update_AD(viod):AccUSBMouse.c)で、A/Dコンバータから加速度センサと調整可変抵抗の出力を取得します。A/Dコンバーターは、Scanモードで無限ループでハード的処理により変換をさせているため、これによって最新のアナログ情報の更新を6.6ms周期で行うことになります。

次に、ボード上のスイッチの状態を取得(void update_AD():AccUSBMouse.c)します。

最後に、この取得したセンサ情報とスイッチ情報を用いて、キャリブスイッチが押されて離された瞬間であった場合は、加速度センサの零点調整処理をするのがvoid update_calib(void):AccUSBMouse.cです。零点調整中は、LED7を点灯させる事で外観上動作モードを確認できるようにしています。

最後に、0.5秒置きにLED6を点灯/消灯させていますが、これはタイマ割込み処理が正常に動作していることを外観上モニタするためのものです。USB関連の処理が無限ループに落ちた場合やハングアップした場合などの判定にも利用でき、非常に助けになりました。


    (4) USBインターフェイス処理

USBインターフェイスの処理ですが、これについて簡単に説明することは少々困難で、実際にUSBマウスのわずかこれだけの実装をするためだけでもUSBの仕様に関する理解が非常に重要になってきます。逆に、この実装を通してUSBの仕様について多くを学ぶことができました。

USBの仕様書は、USBフォーラムで入手することができます。ただし、この仕様書はアーキテクチャからはじまり電気的仕様、機械的仕様などなど実際に実装をする上で必ずしも理解をする必要がない部分を多々含んでいます。

実際にソフトウェアを実装する上では、もちろんUSBに関する基礎的な知識は必要なのですが、どちらかというと使用するUSBノードコントローラーの仕様に関する理解の方が重要で、USB加速度センサマウスの実装においてもUSBN-9603の仕様の解釈/理解で苦労しました。

参考文献を以下に示しておきます。

1.トランジスタ技術 2000年6月号 作るオリジナルUSBアダプタ
2.インターフェイス 2000年3月号 USBターゲット機器の設計法
3.インターフェイス 2001年1月号 USB機器&ドライバ実践開発手法
4.インターフェイス増刊 TECHI Vol.8 USBハード&ソフト開発のすべて

CQ出版社 4のTECHIは、丁度このUSBマウスの開発でUSBN-9603の仕様の理解とプログラムの実装で思考錯誤を繰り返し泥沼化しつつあった時に創刊されたのですが、サンプルソフトがCD-ROMで添付されており、USBN-9603の仕様の理解とプログラムの実装をする上で非常に参考になった一冊です。とりあえずUSBデバイスに挑戦すると言った場合にはお薦めの一冊です。

なお、IRQ0割込みでの処理は、USBN-9603による割込みが発生したことを外見上判断できるように、LED5を点灯させたのち、USB経由でPCに送信するマウス情報(ポインタの移動量X,Yとボタンの状態)の更新(void update_MS(void)::AccUSBMouse.c)を行った後、USBN-9603に対する処理を void USBN9603_int(void):USBN9603.cを呼び出します。

この処理については4章で説明します。最後にIRQ0割込みフラグをクリアした後、IRQ0割込み処理の終了を外見上判断できるように、LED5を消灯させています。


    (5) デバッグ

マウスインターフェイス部分のデバッグには、SCIを用いたターミナルに対するprintf()等を用いることで比較的簡単に行うことができます。

しかし、USBN-9603のような、デバイスが独自に外部インターフェイスと通信を行って処理を実行するようなインテリジェントデバイスの場合、外部インターフェイス(この場合PCとのUSB)との通信と、ファームウェア側のCPU(この場合H8S/2655)との通信のタイミングにより、ソフトウェアの挙動が全く変わってしまうため、通信速度が遅く処理をポーリングするようなprintf()などを用いてのデバッグは非常に苦しいものがあります。

そこで、この加速度センサマウスのプログラムでは、メインルーチンが完全にアイドリングであることを利用し、FIFOバッファによるCPUのアイドルタイムを用いてのターミナルへのデバッグ用文字列の表示をさせることで、USBN-9603とのUSBイベント処理の流れを結果として表示させ、それを用いてデバッグを行いました。

この方法では、USBN-9603の割込み要求に対してデバッグの為に実行される処理は基本的にはメモリ空間へのデータコピーに終始するため、printf()等に比べれば殆ど無視できると言ってもいいほどの処理時間になります。

SCI送信完了割込みなどを利用してのSCI送信FIFOを正式に組むのも一つの方法なのですが、今回はUSBデバイスを利用することが目的であったために、この用な簡易なFIFOバッファの実装に留めています。



← ハードウェア 3/6 USB処理 →