(2011-12-31)5年以上前から放置したままです。「自作のダム端末を使ってみたい」と思って作っていたのですが、当時AVRのAppNoteに「AVR313 Interfacing a PC AT Keyboard on tinyAVR and megaAVR devices」を見つけたことと、これだけの開発規模をアセンブラでしかもICSP無しで開発することに馬鹿らしさを感じてしまったからです。再開するなら今度はAVRで当然C言語でやることになると思います。
AVRのAppNoteには「AVR244 UART as ANSI Terminal Interface」というのもあります。これはダム端末とは主従が逆なのですがかなり参考になると思います。
上記2つのAppNoteの付属ソースのコンパイルにはいずれも有償の「IAR Embedded Workbench」が必要です。アマチュアだとヘッダだけ手に入れてAVR-GCC用に自分で修正することになりそうです。
(2014-1-19)現在、IAR Embedded Workbenchには無料版があります
Unix、Linuxサーバ等にシリアルでログインしてコマンドを実行したりその実行結果を見たり、viを操作することを目指しています。(客観的には、はっきり言ってお馬鹿ネタです。でも勉強になると思います。)
とはいっても20x4行液晶とPICで、使いやすいダム端末が作れるとは思っていません。自分で端末を作る課程で様々な知識を得ることが主たる目的です。
現時点で、サーバにログインしてコマンドを実行することは一応出来ています(これは簡単だから当たり前ですね)。
他に64行分のバッファやスクロール(正方向)や行の折り返しも一応実装しています。
自分としては本格開発する為の土台が出来たなと思っています。当分、ハードを改良する必要もないし、どうやってソフトを実装するかについて悩む必要もなく、これからは淡々と機能を盛り込んでいけばいいと思っています。
このプロジェクトでは副次的な産物として、PIC用のPS/2キーボードドライバが得られています(まだ開発途中。野田指令のBSDライセンスのソースを一部流用しています。)
DCE装置とDTE装置の切替機能も持っているので、シリアルプリンタを接続することもでき、簡易タイプライタにもなります。
また本機のシリアルポートにセンサー等のアタッチメントを取り付けることで計測機器などに仕立てることもできます。(この場合、本機はシリアルポートを通じての電力供給と液晶表示機能のみ受け持つということになります。)
現在はPIC18F452を使用しています。初期にはPIC16F877Aを使用していましたが、バッファ用のメモリが欲しいと思い、877Aとピン互換のPIC18F452に交換しました。
回路図
D-subの9番ピンへの出力はデバッグ用ソフトウェアシリアル送信です。二股ケーブルで分岐させます。
(2007-11-13 追加)本サイトでは多くのページにソフトウェアシリアル送信の使用例を載せています。しかし、それらの殆どで"ソフトウェアシリアル送信"ではなく、"ソフトウェアTX"という表記を使用しています。
BSch3V形式(zip圧縮)
接続表 |
PICPin番号 | Pin名 | 接続先Pin | Pin名 |
8 | RE0 | 液晶6 | E |
9 | RE1 | 液晶5 | R/W |
10 | RE2 | 液晶4 | RS |
19 | RD0 | 液晶7 | DB0 |
20 | RD1 | 液晶8 | DB1 |
21 | RD2 | 液晶9 | DB2 |
22 | RD3 | 液晶10 | DB3 |
27 | RD4 | 液晶11 | DB4 |
28 | RD5 | 液晶12 | DB5 |
29 | RD6 | 液晶13 | DB6 |
30 | RD7 | 液晶14 | DB7 |
25 | TX | ADM3202 11 | T1IN |
26 | RX | ADM3202 9 | R2OUT |
3 | RA0 | ADM3202 10 | T2IN |
33 | RB0 | DIN6 5 | PS/2 Clock |
34 | RB1 | DIN6 1 | PS/2 Data |
4 | RA1 | ソフトウェアTx |
基板
ケースはお茶の木箱です。実用できるまで開発が進めば、小型化してみたいと思います。(キーボードと一体化とか、)
PIC抜き鳥道具
先がつぶれて捨てようとしていた100円ショップの精密ドライバを曲げたものです。あいにくプラスだったので、先を少々平らに削ってあります。
数秒で抜き取れます。オンボードプログラミングをせず、ゼロプレッシャーソケットを使わなくても何とかなります。抜き差しを重ねる度に抜き差しがし易くなります。
二股ケーブル(デバッグ用)
PC98の角型マウスを流用しました。
まだ、デバッグ出力は実装したばかりで、この機能を使った開発はおこなっていません。
PIC18シリーズを使ってみて、PIC16シリーズと比べて特に優れていると感じた点
- プログラムメモリがリニア
- 説明するまでもなく大きなメリット
- データメモリもアクセスしやすい
- データメモリにはバンクの概念が残っています。でも実際に使ってみると、これは障害にならないと感じました。間接アドレッシングを使う限り、データメモリのバンクを意識しなくて済む仕様となっているからです。大容量のデータメモリを扱う場合、よほど特殊な場合を除き、間接アドレッシングを使うと思います。だからデータメモリのバンクはハンディにならないのです。間接アドレッシングを使用する場合、データメモリも実質的にリニアです。
bank_bsr ; バンクのBSR=FSRH値 bank_adr ; バンク内のアドレス=FSRL値
間接アドレッシングでの書き込みは常にこんな感じで済みます。; アドレスのセット movf bank_bsr,W movwf FSR0H movf bank_adr,W movwf FSR0L
- データメモリにはバンクの概念が残っています。でも実際に使ってみると、これは障害にならないと感じました。間接アドレッシングを使う限り、データメモリのバンクを意識しなくて済む仕様となっているからです。大容量のデータメモリを扱う場合、よほど特殊な場合を除き、間接アドレッシングを使うと思います。だからデータメモリのバンクはハンディにならないのです。間接アドレッシングを使用する場合、データメモリも実質的にリニアです。
; 書き込み movf hogeval,W movwf INDF0
- 掛け算がハードウェアで出来る。
- 上で書いたことと関わっていますが、メモリアドレスの計算には掛け算が付き物です。掛け算がハードウェア(専用命令)でおこなえると劇的にパフォーマンスがアップします。
ソースコード
まだ中途の散らかしっぱなしの状態で一般にお店できる状態ではありません。
しかし、このPICダム端末の開発をご自身で進めて頂け、且つ、成果があった場合にそのソースコードを私に送付、もしくは公開することを約束して頂けるなら、メールでソースコード(MPASM)を送付します。
PICダム端末の開発を進めて頂ける方か否かは当方で判断します。必要十分条件はご自身で開発用ハードを作成され、それが確認できる写真を当方に送付頂くことです。
※内容を問わずPIC16F877Aのソースコードが必要な方はRS232Cロガー兼リピーターへどうぞ
terminfo
20文字x4行、エスケープシーケンスの複雑な解釈を詳細に実装するのは面倒、ってことで、専用のterminfoを作る必要があると思います。とりあえず、
pic, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cols#20, lines#4, bel=^G, cuu1=\E[A, cuf1=\E[C, csr=\E[%i%p1%d;%p2%dr,
こんなのを作りました。今後、ぼちぼちとデバッグ、開発を進めてゆけばいいでしょう。
RTS制御
言うまでもなく、PICの処理能力はPCと比べ物になりません。シリアル受信時の取りこぼしを防ぐ為にRTS制御を実装しました。(RTS制御はRS232Cロガー兼リピーターでも実装しています。こちらではソースも公開しています。)
Windows(ハイパーターミナル)と接続した場合、RTS制御で1バイトの取りこぼしも完全に防ぐことができます。
しかし、LinuxのシリアルドライバはPIC側でRTS制御をおこなっても”こまめ”に見てくれないようです。(見ることは見るようだが、その頻度が低すぎる)
setserialコマンドにもそのあたりを調整するパラメータは見当たらず、Linuxのシリアルドライバを改造することも考えましたが、他のOSで使用することも考えて当面は見送りです。
代わりに通信速度を下げています。
s1:12345:respawn:/sbin/agetty -h -L 2400 ttyS0 vt100
2400bpsにすると、1バイト毎にデバッグ用ソフトウェアTXする時間を確保できます。
LinuxのシリアルドライバはWindowsのそれと比べて少々融通が効かないものなのかもしれません。
Windows、Linux両対応のLIRCソフトウェアパッケージのシステム構成で比べてみますと、Windows上の場合はOS標準のシリアルドライバを使用するのにLinux上の場合はOS標準のシリアルドライバは使用せず専用のドライバを用いるという違いが見受けられます。