AVR-CDCにLCD/EEPROM操作機能を組み込む
2011年5月 AVR-CDCを活用しています。PCに接続した自作機器を簡単なソフトで自由にコントロールできるのは魅力的です。AVR-CDCをより便利に使うため、機能を拡張してみました。 関連リンク AVR-CDC開発サイト Recursion Co., Ltd.(サイト内 AVR-CDCのページ) |
AVR-CDCの機能を拡張する |
「LCDモジュール SC162シリーズ」の記事ではAVR-CDCを使い、PCからLCDモジュールを制御しました。このときLCDの内蔵コマンドを実行するシーケンスは全てPCから送信しました。ビット操作をする度に通信するので、1文字表示するだけでも時間がかかりました。LCDの反応は全体的にもっさりしていました。 決まった手順の処理内容であれば、あらかじめAVR-CDC内に関数を持っておき、ネイティブで(AVR内部で)処理すれば高速に実行できます。PCからは実行指示を出すだけです。今回はそのような改造をしてみました。 AVR-CDCのATmega48版は3.6KBです。ATmega88[8KB]に書き込んで利用するとき、フラッシュメモリは約4KB余ります。余った容量はPC側から活用できるわけではなく、まるまる空きっぱなしです。この分を有効に活用する意味でも、AVR-CDCの拡張(内部に関数を作り込んでおく)は有意義ではないでしょうか。 ATmega48版のAVR-CDCを改造します。改造後のファームのサイズは5.5KBになります。 ATmega48[4KB]ではフラッシュ容量が足りなくなります。改造後のファームはATmega88/168が書き込み対象です。 ATtiny4x版の改造は試していませんが、同様に行えるはずなので記事を参考にしてください。フラッシュメモリの容量の関係からATtiny85/861が対象になると思います。 もともと容量いっぱいで、機能を削っているほどのATtiny2313版は改造の対象外です。 【改造にあたっての注意】 AVR-CDCが正常に使用できる環境であること。既にドライバのインストールが済み、動作確認ができていること。 使用するLCDモジュールはSC1602/SD1602などHD44780互換コントローラのものが前提です。 |
AVR-CDC 改造手順 | |||||||||||||||
【ファイルを配置する】
【main.cを編集する】 下記テキストボックス内の記述(断片的なソース)を、main.cの該当箇所にコピー&ペーストしてください。 1. 先頭付近にlcdlib, eeprlibのヘッダファイルをincludeします。 2. 「@」「?」「=」などコマンドを解釈している部分に、LCD操作のコマンド「#」とEEPROM操作のコマンド「:」の解釈と処理内容を追加します。
【リビルドする】 プロジェクトのOptionダイアログを開きます。 「Use External Makefile」のチェックを外し、 「Device:」を「atmega88」など目的のデバイスに変更します。 メニューバーの Build → Rebuild All でリビルドします。 【ファームを書き込む】 作成されたhexファイルを目的のデバイスに書き込んで完成です。 |
PC側からの呼び出し方 | ||||||||||||||||||||||||||||||||||||||||||||||
改造といってもAVR-CDCのコマンドを追加しただけなので、PC側からの使い方は従来と同様です。 データとして2つの値を送信することが多いので、'$'コマンド(set2()関数)と同じ書式になります。 LCDを操作するコマンドが'#'、EEPROMを操作するコマンドが':'です。それぞれにサブコマンドがあります。 AVR-CDC側は通常通りコマンド('#' ':' '@' '?' '=' など)で処理を振り分けます。コマンドがLCD操作('#')、EEPROM操作(':')だった場合はサブコマンドを解釈し、それに割り当てられた具体的な処理を実行します。 AVR-CDCが1回に受信できるデータは8byteまでです。[値][空白][値][空白][値][空白][コマンド]で7byte。一度に4個以上の値を受信することができません。そのため今回の改造ではAVR-CDC内に16byte分のバッファを持たせました。 ※16byteの理由はLCDの1行を16桁と想定しているからです。1行分の文字列をまとめて処理できるように。正確にはヌル文字の分を入れて17byteで定義しています。 例えば10文字の文字列"アイウエオカキクケコ"を表示したい場合、次のようにします。 LCMD_BUF_READYでバッファ準備→LCMD_BUF_SETで2文字ずつ5回送信→LCMD_STRINGで表示開始。 AVR-CDC側はLCMD_STRINGを受信すると、バッファ内の値を対象として文字列表示の処理を実行します。 1文字転送→1文字表示→1文字転送→1文字表示→…を10回繰り返すよりも処理が速いです。 EEPROM操作では書き込み処理でアドレス/データとも16bitの場合があり、4byte分のデータを送信することになります。そのため、サブコマンドでアドレス指定とデータ指定の処理に分け、2byteずつ2回送信します。 LCD操作 PCからAVR-CDCへ送信する内容 「data2 data1 cmd '#'」 ※dataの並び順に注意
LCD操作のサブコマンド
EEPROM操作 PCからAVR-CDCへ送信する内容 「data2 data1 cmd ':'」 ※dataの並び順に注意
EEPROM操作のサブコマンド
|
作例:リソースモニタ | |||||
改造版AVR-CDCの利用例としてリソースモニタを作りました。 LCD操作方法、EEPROM操作方法のサンプルとしてソースファイルを公開します。
主なソースファイルの説明 ATmega48.cs AVR-CDCのサンプルプロジェクト内のatmega48.cs(レジスタ名の定義ファイル)にビット名の定義を追加しました。 CdcIO.cs AVR-CDCのサンプルプロジェクト内のcdcio.cs(SerialPortの派生クラス)を補強し、LCD操作、EEPROM操作の関数を追加しました。 CmdDefine.cs LCD操作、EEPROM操作のサブコマンドの定義です。AVR Studioで追加したlcdlib_cdc.c, eeprlib_cdc.c内にも同じ定義があり、サブコマンドが指す意味と値が一致している必要があります。 Program.cs リソースモニタのプログラム本体です。COMポートのオープン/クローズ、LCDの初期化、LCDの外字登録、LCDの文字列表示、EEPROMの読み書き、のやり方が分かります。 【実行手順】 改造版AVR-CDCをPCに接続します。 デバイスマネージャからCOMポート番号を確認します。番号はPC環境により異なります。 コマンドプロンプトを開き、次のように入力してリソースモニタを起動します。COMポート名を引数にします。
起動すると、このように表示されます。※初回起動時は日時が正しく表示されません。 【動作中の様子】 1秒周期でCPU負荷と空きメモリ容量をLCDに表示します。 CPU負荷が50%以上になると右上に「!!」マークが出ます。 [K]キーを押すごとに「FreeMem」←→「空きメモリ」の表示が切り替わります。
|
◆ ◆ ◆ |
AVR-CDCを改造しました。サブコマンドを定義したことがポイントです。 ターゲットの容量が許す限りAVR-CDCの機能をいろいろ拡張することができます。 拡張した機能はPCからの通信による制御ではなくAVR内部で自立的に実行されるので、AVR-CDCに接続した機器を高速に扱えることになります。 PC側で処理手順を記述する必要が無くなり、ソフトの開発が楽になります。 |
2011/06 追記
|
(C) 『昼夜逆転』工作室 | [トップページへ戻る] |