エレキー


UP dated 2001.7.21 //Revised 2003.6.25//Rev2014.05.14

●CWエレキー

□□□□□□□ 最新のエレキープログラム Ekeym5.asm 2014.05.14 □□□□□□□□
OMのアドバイスを聞きながら、長短点メモリー、エレバグキー機能を追加し、打ちやすく、使いやすくした最新のプログラムは、本ページ中段の 「プログラムソース ダウンロード Ekeym5.asm及び回路図etc. 2014.05.14」よりダウンロードできます。
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

マイコンチップPIC16F84のエレキーを製作しました。古くなったCMOSのACCUキーヤの中身をPICに変えてみました。

コンセプトは、
・出来るだけ少ない部品で
・使わないときは、sleep mode で消費電流を100μA以下(実測では5μA)とし、電源SWは省略、
・スピードは、即座に変更できるように、VR式

・通常の「CQ CQ CQ de JK1XKP」 や「de JK1XKP」のメモリーキーヤ機能付き
メモリー文は次の4通り。4つ目(STAMP_SWで送出)は、ラバースタンプQSO用です。
・CQ_CQ_CQ_DE_JK1XKP_JK1XKP_JK1XKP_K 送出
・DE_JK1XKP_ 送出
・TEST_DE_JK1XKP送出
・TNX_FER_UR_CALL_BT_UR_RST_RST_599_5NN_ES_
HR_QTH_QTH_YOKOHAMA_YOKOHAMA_ES_NAME_YUJI_YUJI_HW_?_KN


・自由に書き換え可能なoption文メモリー :48文字。

●構造

・70mmx45mmの蛇の目基板に余裕を持って組込めます。タクトSWは、基板上に取り付けたので、押しノブでケース外側まで延長する必要があります。


・延長ノブは、ハトメの穴に割り箸を接着剤でねじ込みます。背の高いへりのある山高帽子のような形状になります。(上の写真右側)

・ハトメは、DIY店や、文具店で入手できます。


***********************************************************************
・PICを初めて使う方にもわかるようプログラムの作り方も解説を加えます。


●PICで遊ぶ環境

私の例を参考にして、道具・資料を揃えて下さい。
・パソコンIBM。windows95
・PICプログラマーキット(秋月で3年前の購入)
・PIC16F84取説書。秋月のキットに同封。
同時に買い求めます。
・電源15V300mA
・ パソコンとプログラマーの接続ケーブル


PICへの焼き付け手順
@パソコンの\Cドライブに Pic フォルダを作り、PICプログラマーキットに付属しているFDのファイルをまとめて移動します。
Aプログラムは、IBMのメモ帳で作成し、拡張子は *.asm とし、\C:\Pic に保存します。
Bパソコンの COM2 とプログラマーキット(当然ながらキットは製作して)を接続します。
Cパソコンを「スタート」−「プログラム」−「MS-DOSプロンプト」とします。
D「C:\WINDOWS>」と表示されるので、CD_\PIC と打ち込みフォルダを移動。「C:\PIC>」と表示。
Eアセンブルは、 PA_Ekey2 と打ち込みます。エラーがあればエラー表示されますので、デバッグします。
Fシミュレーションは、 PS_Ekey2。パソコン上でプログラムを走らすことができます。
GPICへの焼き付けは、PICW_-COM2 を起動した後、画面表示に従って書込みプログラムEkey2.hexを選びます。
HPIC16F84を差込み、「書込み」を押すと、10−20秒で焼き付けが完了します。
H 「MS-DOSプロンプト」からwindows へ戻るのは、C:\PIC>exit と打ち込みます。
・注) _ は、スペースキーのスペースです。

●回路図

・RB1,RB2には割り込み機能がないため、ダイオード 1S1588 でRB.0 をwake-upさせてます。
・メモリー機能、サイドトーン機能が不要ならば、全てのタクトSW,BZを省略してかまいません。
・機能する最低電圧は、2.1V。 1.7Vでは動作しませんでした。消費電流は、1.5mA(Vdd=5V)、0.5mA(Vdd=2.1V)。
・キーを停止してから約10秒後に sleep modeになりますが、その時は約5μA。 キーを打つと即座に wake-up します。

・Ra.0端子のBZ信号は直流一定電圧なので、直流BZを選ぶ。
・自由に書き換え可能なoptionメモリー :48文字。RB.3のSWを押すと、「HR_HR_BT」と送出されますので、続けてキーパドルから本文を打ち込みます。 option 文の末尾は、「VE=トトトツト」の打ち込みか、48文字かいづれかを検知すると、短点を10個発信し、EEPROMにSAVEされたことを表示します。


● プログラムフローダイアグラム

プログラム全体のフローは◇ダウンロード プログラムフローD2000文書

・左に ように「QT」と打つ場合を考えます。CWの短点の長さをmark*2 とすると、以下の規則があります。
・mark *2で短点1個
・mark*6で長点1個
・space*2で1スペース
・space*6で文字間スペース
・space*14で単語間スペース



・エレキーのmainフローダイアグラムを下に示します。下のフローをたどり、上の規則通りにmark ,space が送出されることを確認してください。△は、判断分岐点を示します。

・単語間スペースの「space*14」は、考慮していません。文字間スペースの「space*6」は、慣れるときれいに打てますが、無い方がよいかもしれません。各自このフローを変更して、長短のウェイト比を変えて個性にあったエレキーを作成してください。 フローダイアグラムとプログラムソース(Ekey1.asm)を見比べると、どこを直すか分かると思います。 プログラムを作る楽しさは、目新しい機能をもったICで電子回路を組む楽しみと類似するところがあります。
・・スピードは、markの最初に spchルーチンを呼び、CR時定数(0.001μFの充電電圧が0.6V以下に下がる時間を計測しています。要する時間は、約0.05msec〜0.4msecです。



● プログラムソース

プログラムソースは、マウス右クリックで「対象をファイルに保存」を選んで、ダウンロード。

 ◇ダウンロード Ekey4.asm
ソースの中身のコールサイン(JK1XKP),QTH(YOKOHAMA)は各自書き換えてアセンブル下さい。プログラムソースの各行の右側に ctm (=customiseの略)を記入してますので、メモ帳の検索機能を使って変更個所を探してください。
このまま使うと、私のコールサインを送出してしまいますので、ご注意下さい。
2003.6.25 一部不具合(速度20WPM付近で符号乱れ)があったため、ソフト変更。
asmコードのアセンブルには、秋月のAKI-PICプログラマーCDに付属しているPa.exeが必要です。



 ◇ダウンロード Ekeym5.asm及び回路図etc 2014.05.14
asmコードは、MPLAB IDEでアセンブルします。
上記の Ekey4.asmを MPLAB用に移植しました。 同時に 訂正符号HH(短点8個)を打ち間違えて、6短、7短点、9短点、10短点打った時にも強制的に8短点を打つ プログラムを追加しました。 Asmコード備考欄;;HH と書いています。

● セミブレークイン機能付き エレキー






 ◇ダウンロード Ekey6.asm

asmコードのアセンブルには、秋月のAKI-PICプログラマーCDに付属しているPa.exeが必要です。


● 製作記録

2001.7.1 回路図を決定。プログラムソースを製作(約400バイト)
2001.7.8 蛇の目基板に製作。プログラムソースのデバッグ6回で動くようになったが、VRスピード調整はうまく行かず、スピード固定(speed=10WPM)でデバッグ中。
2001.7.11 VRスピード調整完成。Option 文の打ち込みプログラムを除いてOK。Ekey。
2001.7.14 ソフトデバッグ完了。Ekey1.最終的に約0.7kBで、製作時間は、延べ30時間。
2001.7.21 キーを打ちやすくするための、プログラムの若干の改善。Ekey2へ
2003.6.25 一部不具合(速度20WPM付近で符号乱れ)があったため、ソフト変更(Ekey4.asm)。
2003.9.26 セミブレークイン機能付き、サイドトーン880Hz付きプログラム追加(Ekey6.asm)。

● プログラムヒント及び 解説


● CWコードの8bit化
・JR7RAR 猪瀬秀一氏のアイデア(ref p121 of CQ March 1998)をそのまま使用させて頂いてます。
・bit7〜bit3 の5ビットは、長点(dash)、短点(dot)とし、bit2〜bit0 の3ビットを、CWコードを構成する長点、短点の合計数としています。
・MORSEcode A=01000010b 2点構成(010b) で トツー(01)
・MORSEcode Q=11010100b 4点構成(100b) で ツーツートツー(1101)


● PICの便利な retlw 命令
・main プログラムで working register;W=0 。命令「call xkp_bun」で、1行目へ飛んできます。



・最初の行の「 addwf pc,1 」は、pc=W+pc の計算をさせます。pc は、プログラムカウンタで 次の実行する命令の番地が入っています。W=0なので、pc=0+pc となり、2行目「retlw 74h」へ行きます。

・データの表を参照するときによく使う命令が retlw です。「retlw 74h」は、Wに74hの16進数をロードし、call命令で飛んできた元の番地(「call xkp_bun」の次の番地)に戻ります。

・code=74h=01110 100b でコードをモールス音にする処置ルーチン;trans がcall されていますので、4個構成=100b の 0111 トツーツーツー 、Jを発します。

・「goto xkp1」により 2順目に入りますが、pos は、1つインクリメントされていますので、W=1 でxkp_bunへ行き、code=0a3h=「モールスコード K」となります。

・このretlw 命令で注意することは、retlw の一連の表は、プログラムの最初;start の前の置くことです。
・PIC16F84は 400h(1024番地)のプログラム領域がありますが、pcは8bit=2桁なのでretlwが迷子にならないのは、0〜FFhの間です。
・プログラムの最初から数えて、FFh=255行目を超えたり、またぐとpcが迷子になります。
● ポートのプルアップ
・初心者が迷うのは、私もそうでしたが、RBポートのプルアップ、内部プリスケーラーPSAの初期設定のために option レジスタへの書込み方法です。
・option はバンク1にあります。電源投入時のデフォルトは、バンク0が開いています。「bsf status,5」〜「bcf status,5」という決まり文句を書込む必要があります。

・通常は、第0銀行の貸し金庫を使っていて、option レジスタは、第1銀行に預けてあるので、第1銀行の扉を開けて中に入り、用済後、扉を締めて帰ってくるようなものです。


・RBポートは内部で約100μAでプルアップされます。入力ポートが50kΩでVdd へ接続されているようなイメージです。4.7kΩ以下の抵抗でポートを接地すると、ポートはLレベルとなります。

● 省電力 SLEEP MODE
・趣味の世界では普通は、省電力モードのsleep mode を考える必要はほとんどありません。機器の電源を切ればよいのです。
・15年ほど前に作った CMOS 4001 のACCU エレキーは、休止時4μAしか消費しないので、電池は1年以上もちます。同じことをPIC キーヤーでもやろうと思い、初めて挑戦しました。

SLEEPからのWAKE-UPの割り込みは、
・[RB.0,RB.4〜7の信号変化]、
・[TMR0カウンタのオーバフロー時]、
・[EEPROM書込み終了時]
の3つがあります。
INTCON レジスターの該当ビットON/Offすることにより機能します。
・最初 Loopのルーチンがないときは、作動が不安定でしたので、GIE を強制的にクリアしました。

● CRによる時定数でのスピード調整
・PICの内部には、OSC/4 のパルスをプリスケーラPSAを介して数える タイマ(TMR0)が作動しています。OSC=4MHz,上述の[ポートのプルアップ]の項で、PSA=1/2 と設定しているので、2μsec毎の周期でパルスを数えています。

・通常は、RA.2とRA.3は出力ポートでRA2=H(2.4V),RA3=L(GRD)に保持されています。サブルーチンspchがcallされると、RA.2を入力ポートに切替え、コンデンサ0.001μFが放電を始めます。t秒後に0.6Vまで下がった時に、RA.2はLと判断し、その時のTMR0 のカウント数を レジスタspeed にmov します。

・R=70kΩ、C=0.001μFで 概ね t=100μsecなので、speed=TMR0=50 となり、キースピードは10WPM(50文字/分)です。

・key の操作がなくなり、sleep modeに入る寸前に、RA3=H(2.4V)に保持し、1kΩ+VRからの漏れ電流を最小にして、眠りにはいります。


● バグの修正
・バグの原因がわからないときは、関係するレジスタの数値を表示(液晶がある時)したり、音を出す(ブザー音が出せるとき)プログラム(下の例では、"ルーチンCR") を仮に書き込み、レジスタの変化をトレースすると解決の糸口が見出せます。


・左の例では、、CWの速度を決めるレジスタspeedが変化するかを耳で確認します。

・サブルーチンspdch の中で CRの時定数により変化する speedの値を tes7にも代入しています。

・サブルーチンspdch より CRルーチンへ戻ると、tes7を code に移し、 サブルーチンtrans をcall していますので、tes7 によるモールスコードを発信します。

・例えば、
speed=tes7=30h=0011 0000b
であると 何も音を出しません。  

・speed=tes7=32h=0011 0010b
であると 2つの長短点数からなる、00=トトですから モールスコード I となります。

・speed=tes7=54h=0101 0100b
であると 4つの長短点数からなる、00=トツートツーですから 和文の ロ となります。

● 15年間ご苦労様でした。

・今も健在ですが、CMOS keyerは引退となりました。15年間ご苦労様でした。


◇ホームページ インデックスへ戻る