PICを使ったダム端末の製作(進行中)

Last-modified: 2015-08-16 (日) 14:20:32

(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には無料版があります


初出 2006-8-18
最終更新 2006-11-15
開発時期 2006-3~
picterm_1_s.jpg
 

Unix、Linuxサーバ等にシリアルでログインしてコマンドを実行したりその実行結果を見たり、viを操作することを目指しています。(客観的には、はっきり言ってお馬鹿ネタです。でも勉強になると思います。)

 

とはいっても20x4行液晶とPICで、使いやすいダム端末が作れるとは思っていません。自分で端末を作る課程で様々な知識を得ることが主たる目的です。

 

現時点で、サーバにログインしてコマンドを実行することは一応出来ています(これは簡単だから当たり前ですね)。

 

他に64行分のバッファやスクロール(正方向)や行の折り返しも一応実装しています。

 

picterm_2_s.jpg
自分としては本格開発する為の土台が出来たなと思っています。当分、ハードを改良する必要もないし、どうやってソフトを実装するかについて悩む必要もなく、これからは淡々と機能を盛り込んでいけばいいと思っています。

 

このプロジェクトでは副次的な産物として、PIC用のPS/2キーボードドライバが得られています(まだ開発途中。野田指令のBSDライセンスのソースを一部流用しています。)

 

DCE装置とDTE装置の切替機能も持っているので、シリアルプリンタを接続することもでき、簡易タイプライタにもなります。

 

また本機のシリアルポートにセンサー等のアタッチメントを取り付けることで計測機器などに仕立てることもできます。(この場合、本機はシリアルポートを通じての電力供給と液晶表示機能のみ受け持つということになります。)

 

現在はPIC18F452を使用しています。初期にはPIC16F877Aを使用していましたが、バッファ用のメモリが欲しいと思い、877Aとピン互換のPIC18F452に交換しました。

 

回路図

picterm_circt_s.png
D-subの9番ピンへの出力はデバッグ用ソフトウェアシリアル送信です。二股ケーブルで分岐させます。
(2007-11-13 追加)本サイトでは多くのページにソフトウェアシリアル送信の使用例を載せています。しかし、それらの殆どで"ソフトウェアシリアル送信"ではなく、"ソフトウェアTX"という表記を使用しています。

 

BSch3V形式(zip圧縮)


接続表
PICPin番号Pin名接続先PinPin名
8RE0液晶6E
9RE1液晶5R/W
10RE2液晶4RS
19RD0液晶7DB0
20RD1液晶8DB1
21RD2液晶9DB2
22RD3液晶10DB3
27RD4液晶11DB4
28RD5液晶12DB5
29RD6液晶13DB6
30RD7液晶14DB7
25TXADM3202 11T1IN
26RXADM3202 9R2OUT
3RA0ADM3202 10T2IN
33RB0DIN6 5PS/2 Clock
34RB1DIN6 1PS/2 Data
4RA1ソフトウェアTx

基板

picterm_3_s.jpg
ケースはお茶の木箱です。実用できるまで開発が進めば、小型化してみたいと思います。(キーボードと一体化とか、)

PIC抜き鳥道具

picterm_4_s.jpg

先がつぶれて捨てようとしていた100円ショップの精密ドライバを曲げたものです。あいにくプラスだったので、先を少々平らに削ってあります。
数秒で抜き取れます。オンボードプログラミングをせず、ゼロプレッシャーソケットを使わなくても何とかなります。抜き差しを重ねる度に抜き差しがし易くなります。

二股ケーブル(デバッグ用)

picterm_5_s.jpg
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標準のシリアルドライバは使用せず専用のドライバを用いるという違いが見受けられます。

 

ご要望、ご意見、質問を下のフォームにどうぞ
(でもここより、掲示板書き込みフォームのページに書いて頂いた方が気づき易いと思います。)