SVX日記
2005-04-02(Sat) コードを書きつつ、PICのUSART機能の翻訳(受信の巻)
えー、今日明日とカミさんがお出かけなので、丸二日ねっとりとプロッタを改造するのである。実は昨日、ウソネタをシコシコと書きつつも、めでたくPIC単体でのパラレル通信および印字には成功し「イ号作戦」を完遂していたのであった。ちなみに、一昨日の時点でハマっていた原因は「オイラSTROBEは正論理だもんね」という理由であった。実はシャープはMZ-1500の時代あたりまで神をも恐れぬ「MZ仕様」というプリンタを生産し続けていて、単純に言うとコレは「セントロニクス仕様」とSTROBEの意味が逆の通信仕様なのである。セントロでは「STROBEをH→Lと変化したらD0〜D7読んでね」という意味なのだが「MZ仕様ではL→Hと変化したらD0〜D7読んでね」なのである。このX1C用のプロッタは、MZ-700時代から生産されているプロッタの兄弟なのであるから、ちょっと考えればスグ気づきそうなものであるが、オイラはこの事実を知りつつも、接続先がX1だからという理由でしばらくタコっていたのであった。X1Cのプリンタポートは清く正しくセントロ仕様であるが、きっとプロッタの接続ポートには専用に論理反転回路が組まれていたのであろう。まーそれはともかく、PICが発するSTOROBEの論理を反転したらあっさり動いたというコトである。
で、次はシリアル通信を実装するという「ロ号作戦」に突入するのであるが、ついでにかなり前に予告しつつもすっぽかしていたPICのUSARTの機能の受信部の翻訳を進めながらコードを書くコトにするのである。オイラが先日苦心の末にあみだしたバルーンヘルプ法(訳文中の「。」にマウスカーソルを当てると原文が表示される)は翻訳中や開発中に自分が参照するぶんにも便利なので、今日は更新しながらの作業である。ひとつライブ感覚でヨロシクシェケナベィベェ。
12.2.2 USART非同期通信受信ポート_
USART受信ポートのブロックダイアグラムを図12-8に示します。RB1/RX/DTピンで受信された信号は、データ復号器にかけられます。データ復号器は実質的にはボーレートの16倍の高速シフト演算器で、実際にはメインの受信シリアルシフト演算はビットレートかFOSCで稼動します。
非同期モードの場合、受信動作を行うにはCRENビット(RCSTA<4>)をセットする必要があります。
受信ポートの主役は受信(シリアル)シフトレジスタ(RSR)です。ストップビットが検出されると、RSR内の受信データはRCREGレジスタに移動(RCREGに空きがある場合)され、移動が完了すると、RCIFビット(PIR1<5>)がセットされます。この時に割り込みを発生させるか否かは、ビットRCIE(PIE1<5>)で設定できます。なお、RCIFビットは読み出し専用ですが、RCREGレジスタが読み出されて空になると自動的にクリアされます。いうなればRCREGレジスタはダブルバッファリングされたレジスタです(深さ2のFIFOバッファと言えます)。2バイトのデータをRCREGバッファに転送、溜めておくことができ、3バイト目のデータもRSRレジスタで受信開始することができます。ただし、3バイト目のデータのストップビットを検出した時点でRCREGレジスタがデータで一杯だった場合、オーバランエラーが発生しOERRビット(RCSTA<1>)がセット、RSR内のデータは失われてしまいます。RCREGレジスタは、FIFOバッファ内の2バイトを取り出すため、連続2回読み出すことができます。
オーバランエラーのOERRビットはユーザがクリアする必要があり、これは受信回路をリセット(CRENをクリアしセット)することで実行できます。OERRビットが一旦セットされると、RSRレジスタからRCREGレジスタへの移動は停止してしまうので、OERRビットをクリアすることは重要です。
一方で、ストップビットがクリア(LOW)で検出された場合、フレーミングエラーのFERRビット(RCSTA(<2>)がセットされます。FERRビットとパリティビットは受信データと同じようにバファリングされるので、RCREGを読み出すとRX9DとFRRは次の値に更新されます。したがって、直前のRX9DとFRRの情報を失わないよう、RCREGレジスタ読み出す前に、RCSTAレジスタの内容を確認することが重要です。
非同期通信モードに設定する場合は、以下の順序で行います。
1. RB2/TX/CKピンとRB1/RX/DTピンを同期/非同期通信用の送受信ピンとして設定するため、TRISB<1>ビットをセット、TRISB<2>ビットをクリアします。
2. 望むボーレートが得られるようにSPBRGレジスタを設定します。高速ボーレートモードを利用する場合は、BRGHビットもセットします(12.1節 USARTボーレートジェネレータ(BRG)参照)。
3. SYNCビットをクリアし、SPENビットをセットすることで、非同期通信モードに設定します。
4. 割り込みを利用する場合は、RCIEビットをセットします。
5. パリティ付き9ビット送信を利用する場合、RX9ビットをセットします。
6. CRENビットをセットし受信許可の状態にします。
7. 受信が完了するとRCIFビットがセットされます。RCIEビットをセットしていたなら割り込みも発生します。
8. RCSTAビットを読んでパリティビットを取得し(有効にした場合)、受信中のエラーの有無を判定します。
9. RCREGレジスタから、8ビットの受信データを取得します。
10. 何らかのエラーが発生した場合、CRENビットをクリアしてエラーをクリアします。
……などと、マニュアルはガシガシと訳せても、コードはサッパリ動いてくれないのが世の常である。翻訳は質が低くてもある程度は役立つが、コードは動かなければまったく役に立たない。翻訳の質には上には上があるが、コードは動けばその上はあまりない。このあたり、文系と理系のソリが合わない理由なのかもしれない。
散々、悩みに悩んだのでアッサリと原因を書いてしまうのはもったいない気もするのだが、もったいぶっていても仕方ないのでアッサリ書く。ひとつの原因はメモリバンクの切り替え忘れであった。SPBRGとTXSTAにアクセスするにはバンク1に切り替える必要があるのだ。概ねPICに実装された特殊機能というのは、一度コードが書きあがってしまえば流用が利くのだが、一発目が動くまでが大変なのだ。ガッチリとマニュアルを訳し、その機能について深く知れば知るほど、うっかりタコまでの距離は離れてゆくのである……と、これくらいいーわけすれば、ダサミスをごまかせるだろ。ふぅ。
あまりにもコードでハマってたので、気分転換にハンダ付け(?)だ。先日サボッて接続してなかった、RX/TXの配線を済ませて……コテが温まったついでに、USB変換基板の抵抗なんかも付けておくか……って、ご本尊のFT232BMのみ付けないのも不自然だな……付けちゃうか!? 今度は細いコテを温めて0.8mmピッチの足をハンダ付け。作業が2度目のせいか、非常にアッサリと付いてしまった。意外とお上手じゃんオイラ。こんなにアッサリ付くなら配布中の変換基板にサービスでFT232BMのみ実装コースを設けようかしらん。
とかなんとかで、ようやくオシロレベルながら、PICのRB2/TX/CKポートからシリアル信号が出るようになりましたゼ!! で、USB変換基板経由でPCに接続し、Rubyで簡易通信スクリプト組んだら、画面に'A'がゾロゾロと出てきましたわ。FT232BMバンザイ!! USB変換基板バンザイ!!
つーわけで、なりゆきでPIC→PCへのUSB通信が成功してしまったので「ロ号作戦」を完了せずして、一気に「ハ号作戦」に差し掛かってしまったコトになるのだが、PC→PIC側の通信ができないったら、できないったら、できないったらない。目標は単なるエコーバック(PCからPICへ送ったデータを送り返す動作)なのだが、受信してるのかしてないのか、まったくの沈黙なのである。
2006-04-02(Sun) 電車の中でLANを組む
なんだか、だいぶ間があいてしまったが、まずは今年も、志半ばにして病に倒れてしまった我が心の師、祝一平氏を偲んで、1分間の黙祷を捧げさせていただく。そちらはどんな塩梅でしょうか? 今もその筋なコトを考え、実践されていらっしゃるのでしょうか? もしかしたら、もう生まれ変わって、コチラの世界で再びその筋を目指してマイ進中なのでしょうか?
さて、今日は予告どおりWBEL3とWBEL4を同時に起動して、互いに通信をしてみちゃったりしたい。フツーならWBEL4をcoLinuxで動かしたりしたら、次はXの設定なんかに進んでGUI環境を整えちゃったりするものなのだが、オイラはXにまるで興味がない。よって、こーゆー地味な方に突っ走っていってしまうのである。あーぁ、こんなコトだから、今日もスクリーンショットが地味すぎて困ってしまうのだ。
まずは、WBEL4を起動したら、いきなりネットワークがつながらない。WBEL3を起動していたりすると、Win側にひとつしかないTAPドライバの口を取り合ってしまうのが常だが、それが原因ではなくネットワークがつながらない。なぜなら、一旦ノートPCにインストールした時にeth0の設定にMACアドレスが書き込まれてしまっているので、それとインターフェイスが矛盾していると上がらないのだ。これの修正は矛盾したHWADDRを消すだけ。ついでにeth0のネットワークの設定もしておこう……
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.5.129
NETMASK=255.255.255.224
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.5.130
・HWADDRの行は消す
# ifup eth0
・これでインターフェイスは起動するはず
# ifconfig
・上がっているか確認する
で、あまり必要ではないのだが、Win側のIPアドレスはcoLinux側のdhcp機能で設定させたりしてみたい。こーすると、Win側のTAPの設定は自動にしておくだけで済む。あ、まずはdhcpパッケージのインストールね。
# rpm -ivh /mnt/bin3/WhiteBox/RPMS/dhcp-3.0.1-38_EL4.i386.rpm
# cp /usr/share/doc/dhcp-3.0.1/dhcpd.conf.sample /etc/dhcpd.conf
# vi /etc/dpcpd.conf
ddns-update-style interim;
ignore client-updates;
subnet 192.168.5.128 netmask 255.255.255.224 {
option subnet-mask 255.255.255.224;
range dynamic-bootp 192.168.5.144 192.168.5.159;
default-lease-time 21600;
max-lease-time 43200;
host suzaku40 {
hardware ethernet 00:FF:00:D7:A7:A1;
fixed-address 192.168.5.130;
}
}
縁起モンなので、ここらで一度、再起動しておこう……と、その前にうっとおしいサービスを落としておく。落としとくとよいサービスは、canna, kudzu, messagebus, smartdあたり。あと、cronを生かしておくと、突然makewhatisというmanページかなんかのインデックス処理が走ってCPUを食いまくるので、cronを落としておくか、/etc/cron.daily, /etc/cron.weeklyの中のmakewhatisをコメントアウトしておくのもよい。サービスを落とすにはntsysvコマンドを利用するとラクでいいぞ。
再起動したら、起動時の[FAILED]エラーが相当減ったはずである。気分よく、一般ユーザを追加したりしてみよう。apacheを動かした時にsuexecで悩まないように、uid, gidとも500で作る。
# groupadd -g 500 furuta
# useradd -u 500 -g 500 -m mitsu
# passwd mitsu
$ ssh 192.168.5.129 -l mitsu
作業の順番が前後するが、WBEL3とWBEL4を同時に使う場合、TAPデバイスを追加する必要がある。つまりは、仮想Linuxサーバとはいってもサーバであるから、2台のサーバに各々1枚ずつ(1枚以上でもよい)ネットワークカードが必要になるのだ。PC内部に存在するサーバに対し、ネットワークカードを1枚追加で挿すイメージである。
設定、コントロールパネル、ハードウェアの追加、次へ、ハードウェアを接続しています、次へ、新しいハードウェアデバイスの追加、次へ、一覧から選択したハードウェアをインストールする、次へ、次へ、ネットワークアダプタ、次へ、TAP-Win32 Provider(coLinux)、TAP-Win32 Adapter V8(coLinux)、次へ、次へ、続行、完了……って感じだ。
TAPデバイスが追加できたら、名前をcoLinux30とかcoLinux40とかにしておく。で、この名前は、coLinuxの起動設定ファイル、wbel4.colinux.xml等から参照される。具体的には設定ファイルの末尾の設定を、以下のような記述に変更する。
<network index="0" type="tap" name="coLinux40" />
各々の環境をちゃんと設定すると、WBEL3とWBEL4の両方が立ち上がるようになる。cygwinの端末から、各々の環境にsshでログインできるか確認してほしい。この時点で/etc/hostsはこんな感じかな。
192.168.5.65 wbel3-co wbel3-co0
192.168.5.66 suzaku3 suzaku30
192.168.5.129 wbel4-co wbel4-co0
192.168.5.130 suzaku4 suzaku40
実はcoLinuxは起動直後にTAPデバイスが有効になるので、Win側からはその時点でdhcpへの照会が始まるのだが、coLinux上でdhcpdが起動するまでには相当のタイムラグがあるので間に合わず、Win側のTAPデバイスに変なIPが付くコトがある。その場合は、Win側でipconfig /renewを実行し、IPを設定しなおすとよい。
で、仕上げ。この状況ではWinマシンがルータの役割をしないので、WBEL3とWBEL4の間で通信ができない。Winマシンをルータにするには、サービスを立ち上げればいい。マイコンピュータ、管理、サービスとアプリケーション、サービス、Routing and Remote Access、開始だ。スタートアップの種類を自動に設定しておくと、再起動毎にサービスを開始する手間がなくていい。
さて、WBEL3からWBEL4へのpingは通るだろうか? ルーティングの設定をちゃんとすると、個々の環境からLynxでWebアクセスもできるようになる。時々はwgetでrpmファイルをゲットする必要もあるであろうから、ネットワークはちゃんと設定しておくに越したことはない。
2008-04-02(Wed) ゼビウススティック、ナハトムジーク
氏はゲームをする時に、いわゆる「ゼビウススティック」を愛用されていた。「ゼビウススティック」とは、電波新聞社がシャープのX1用ゲームソフト「ゼビウス」を出す際、せっかくだからキーボードでなく、ジョイスティックでゲームセンターの雰囲気を満喫して欲しい、との思いから、ソフトに同梱されて発売された周辺機器の通称だ。正式名称はXE-1。なお、ジョイスティックを同梱しないバージョンも同時発売されたが、値段差は2〜3千円だったと思う。つまり、このスティックは2〜3千円の品ってコトになる。
このジョイスティックは、想像以上に評判がよく、その後に発売された他機種用のゼビウスにも、その機種用にI/Fをカスタマイズされたバージョンが同梱されたばかりか、単体発売までされるほどの人気であった。元祖はクリーム色だったが、黒バージョンや、金ピカバージョンも出ていた気がする。実はオイラも、単体発売された黒バージョンを購入し、愛用していた。
祝氏は、電波新聞社がこのゼビウススティックをディスコンにし、もっとゲームセンターのモノに近い、プロバージョンを出すようになってしばらくの後、氏の創刊したディスクマガジンである電脳倶楽部上で、中古を大量購入したい旨の告知を出していた……あ、あれ? 昨日の今日だが、気が付けば、これは「お気に入りガヂェット一生分購入」に他ならないではないか。なんかオイラと共通点の性癖があったんだな……あはは。あは。
ちなみに、ふと電波新聞社の近況が気になって調べたとところ、今もコンシューマー向けにアイテムを発売しているようだ。PCとTVの映像信号を変換する系の機械が十数種類。既にジョイスティックは作っていないようだが、この映像変換機にも「型番がXで始まる」という「ゼビウススティック」の名残が残っている……というか、そもそもこの映像変換機も、当初はゲームをするのを主用途に発売されたものなのだが。
2017-04-02(Sun) 戦士のマウス、製作中
形状的に重力サーベルっぽいこともあり、そのうち公式に発売されるんじゃないかと思っていたのだが、発売されず、誰かがやってんじゃないかとも思っていたのだが、誰もやってないようだ。
元のマウスは、ロジクールの安いワイヤレス。だが、前回と同様、デザインがシンプルで邪魔をしないところがいいのだ。
一応、最初に作る「戦士のマウス」ということなので、シリアルナンバー1の大山トチローモデルらしく、グレーと茶色にしてみた。これがハーロックモデルなら「黒か深緑」エメラルダスモデルなら「赤」になるところだろう。鉄郎モデルなら「ガンメタ」かな。
割と意図したデザインに仕上がった。次の週末にでもクリアで仕上げることにしようかな。
■ 菌 [かきかけ、すら無いですよ?? エラーなのでしょうか?]