だいぶ前にこの件を記事で書いておきながらしばらくほったらかしにしてましたが、最近またぼちぼち再開しています。あの記事の直後は確かパソコンとの接続で困っていたような気がします。H8 マイコンとの接続は RS-232C のシリアルポート(台形の形をした、昔はモデムとか繋いでいたアレ)を使って行うのですが、最近のパソコンにこれが付いているものは殆どありませんので、USB を RS-232C に変換するケーブルを所望しました。RS-232C なんて枯れたインターフェースだから何買ってきても同じだろうと思って、一番安いやつを買ってきたのですが、Flash Development Toolkit によるフラッシュ ROM 書き込みはうまくいっても、HTerm によるモニタがうまくいかない...。あとあと調べたらどうやら USB - RS-232C 変換ケーブルとの相性問題が結構あるらしくて、泣く泣く ELECOM の高級品を買ってきたら無事に動きました...。原因が分かるまでだいぶかかりました。
ほとんどは自宅で作業してますが、動作の検証にはご家庭にはなかなか置いていないオシロスコープやファンクションジェネレータの類が必要になるので、詰めは会社でやらなければいけません。作業のためには3つほどソフトを入れなければならないのですが、会社に置いてあるパソコンはすべてアクセス権限が厳重に管理されているのでインストールすることが出来ません。なので仕方なく唯一持っているノート PC である Vaio type P にインストールしてこそこそ作業を進めています。
コーディング *1 、コンパイル *2 、シリアル経由での CPU への書き込み *3 のいずれも大してマシンパワーを必要とするものではないので、Type P の ATOM 1.33GHz でも性能的には十分です。しかしType P は画面解像度はそこそこありますが、ネットブックなため画面サイズが小さく特殊(1600 x 768)なので、正直厳しいかと思いました...が結構イケます。が、長時間の作業は字が小さいので目をやられるかも知れませんね。それよりキーボードが薄すぎて若干打ちにくいことの方が気になります。マイコンのベースボードも小型で乾電池駆動なので、その気になりゃ外出先...そこらへんのカフェとかでもマイコンプログラミング作りが可能ですね。まぁやりませんが。ああでもコンパイルはマックで暇つぶしにやったりはしました(笑)
作ろうとしているものは、周期的なトリガを出力するタイミングジェネレータ的な物なのですが、交流電源周期に合わせなければならないため、結構面倒くさそうです。交流電源をトランスか何かで降圧してオペアンプの差動増幅回路でタイミング用トリガを作って H8 に入力し、入力したトリガを元に絶妙なタイミングでカウントしたパルスを出力します。交流電源のピーク時にパルスが出るようにプログラミングしなければなりませんが、H8 のハードウェア自体に実装されている、簡単な設定で PWM 波形を出す機能(タイマ W)のみでは無理ですね。自分で割り込み条件を作った上で、きちんと時間をカウンタで計ってあげなきゃならなさそうです。ああ面倒くさそう。ちなみに以下のプログラムは簡単な設定で PWM 波形を出すプログラム。本当に簡単です。これを DC モータに FET *4 か何かを介して入力してあげれば、モータの速度調整をマイコンで行えます。アマチュアロボット競技コンテストのサーボモーター制御などでよく使われています(たぶん)。
#include
#include "3694s.h"
#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif
void main(void)
{
//---- 1600Hz(タイマW)の設定 ----
TW.TMRW.BIT.PWMD = 1; // H8 FTIOD端子(P84)をPWM出力モードに設定
TW.TCRW.BIT.CCLR = 1; // カウンタクリア(コンペアマッチAによってTCNTをクリアする)
TW.TCRW.BIT.CKS = 0x00; // 内部クロックφ/1をカウント
TW.TCRW.BIT.TOD = 1; // タイマ出力レベルセット(最初のコンペアマッチDが発生するまでFTIOD端子の出力値がHighレベルになる)
TW.TCNT = 0x0000; // タイマカウンタの初期値を0にする
TW.GRA = 0xC400; // ジェネラルレジスタAの設定(周期を決める)
TW.GRD = 0x6200; // ジェネラルレジスタDの設定(Highレベルの幅を決める)
TW.TMRW.BIT.CTS = 1; // カウンタスタート(カウンタ動作の開始)
while(1); // 無限に繰り返す
}
void abort(void)
{
}
あとはハードウェア作りですね。秋葉原の名店、秋月通商で CPU を買ってきて、トラ技付録用 H8 ボードをベースに、ラッピング処理にてユニバーサル基板上で作る予定。さぁ果たして完成はいつ!? ...ちなみに2種類ほど置き換えを考えていて、最初はまず簡単なやつからです。マックの WiFi スポットで基盤繋ぎながら C 書いている奴がいたらそれは私です...。ある程度実績を作ったらエミュレータも所望してみようかな...。
USB⇔232では、おいらも随分と苦労しました。
ケーブルの中のチップは、世界で2~3種類しか存在しないそうなのですが、
ハードウェア的な精度の問題なのかなぁ。
読めるけど書けないとか、
あのPCならOKだけど、こっちの子ぢゃダメとか、
同じPCのこっちのポートならいけるけど、あっちのポートぢゃダメとか・・・
おいらのUSB不信は、ここに始まってます。(www
RS-232 自体の規格が結構うるさいらしくて、準拠している製品自体も少ないと聞きます…。
コメントする