ミニ・エレキーを解剖する-モールス符号複合化編
2013-09-22
エレキーの機能としてポピュラーな「メッセージ自動送出」は、事前に作ったASCII文字列を、直前の記事にあるASCII ⇒モールス符号データ変換を使って実現できますが、そもそもメッセージが永久固定ならいざ知らず、コールサインの後に「移動地」を付けたくなったり、コンテストナンバーを変えたくなったりします。即ち、EEPROMなどの書換可能なメディアにメッセージを用意しておき、必要に応じて変更できるようにする必要があります。
今回作ったミニ・エレキーは、当初「コンテスト専用」として「固定メッセージ」で考えていました。必要に応じてPICをプログラムし直せばいいや・・・ってな具合だったわけですが、なんか片手落ちな気がして、結局EEPROMにメッセージを書き、後からパドル操作で書き換えられるようにしました。
◆ 手打ちの短・長点の順序と数を記録する
世にあるCW解読ソフトは、細かいタイムスロットで信号をサンプリングし、そのON/OFF情報を紡いで複合化しているものが多いと思いますが、ミニ・エレキーではこんな芸当をさせずとも「パドル操作で打たれた短点・長点を、順番に記録すればできる」ということに気づきました。そもそも、エレキーの基本機能に「スクイーズ動作に合わせて短・長点を送出する」という機能があるわけですから、手操作の開始と終了さえ判れば、その間の短・長点の順序と数を記録してしまえばいいわけです。
そこで、以下のような手順を守って入力するようにしました(関連記事はこちら)。
1) エレキーから「R」を送出
2) パドル操作で書き換えたい文字を入力
3) 文字入力が終了したらボタンを押下
◆ ビットデータを逆に作っていく
直前の記事で説明したように、今回はビットのOFF/ONを短点/長点とし、その頭に「スタートビット」を付け足したものを送出データとしていますから、記録した短・長点の情報について、0ビット目に設定しては左に1ビットシフトして展開し、最後にスタートビットを設定すればよく、これも非常に簡単のロジックと変数2つで実現できました。
例えば「Q」の場合は、以下のようになります。
Q : - - ・ -
(1)(2)(3)(4)
0) 事前に2つの変数「ptn」「sbit」を以下のように初期化
ptn : 00000000 sbit : 00000001
1) 長点
・ptnを左1ビットシフト
ptn : 00000000
・ptnのLSB(最下ビット)に長点を示す1をORでセット
ptn : 00000001
・sbitを左1ビットシフト
sbit : 00000010
2) 長点
・ptnを左1ビットシフト
ptn : 00000010
・ptnのLSB(最下ビット)に長点を示す1をORでセット
ptn : 00000011
・sbitを左1ビットシフト
sbit : 00000100
3) 短点
・ptnを左1ビットシフト
ptn : 00000110
・ptnのLSB(最下ビット)に短点を示す0をORでセット
ptn : 00000110
・sbitを左1ビットシフト
sbit : 00001000
4) 長点
・ptnを左1ビットシフト
ptn : 00001100
・ptnのLSB(最下ビット)に短点を示す1をORでセット
ptn : 00001101
・sbitを左1ビットシフト
sbit : 00010000
5) 終了
sbitをptnにORでセット
ptn : 00011101
1)から4)は同じ処理で作れますよ・・・念のため。
◆ パターンマッチングで逆引きしてASCIIコードへ
出来上がったパターンデータ「ptn」を、直前の記事にあるテーブルの先頭から順に比較します。一致するものがあったら、先頭から何番目で見つけたか・・・この数に0x20を加算すれば、ASCIIコード(値)が求められます。これを、EEPROMの所定位置に書き込めば、その位置のデータが書き換わります。
以上、参考になれば幸いです
今回作ったミニ・エレキーは、当初「コンテスト専用」として「固定メッセージ」で考えていました。必要に応じてPICをプログラムし直せばいいや・・・ってな具合だったわけですが、なんか片手落ちな気がして、結局EEPROMにメッセージを書き、後からパドル操作で書き換えられるようにしました。
◆ 手打ちの短・長点の順序と数を記録する
世にあるCW解読ソフトは、細かいタイムスロットで信号をサンプリングし、そのON/OFF情報を紡いで複合化しているものが多いと思いますが、ミニ・エレキーではこんな芸当をさせずとも「パドル操作で打たれた短点・長点を、順番に記録すればできる」ということに気づきました。そもそも、エレキーの基本機能に「スクイーズ動作に合わせて短・長点を送出する」という機能があるわけですから、手操作の開始と終了さえ判れば、その間の短・長点の順序と数を記録してしまえばいいわけです。
そこで、以下のような手順を守って入力するようにしました(関連記事はこちら)。
1) エレキーから「R」を送出
2) パドル操作で書き換えたい文字を入力
3) 文字入力が終了したらボタンを押下
◆ ビットデータを逆に作っていく
直前の記事で説明したように、今回はビットのOFF/ONを短点/長点とし、その頭に「スタートビット」を付け足したものを送出データとしていますから、記録した短・長点の情報について、0ビット目に設定しては左に1ビットシフトして展開し、最後にスタートビットを設定すればよく、これも非常に簡単のロジックと変数2つで実現できました。
例えば「Q」の場合は、以下のようになります。
Q : - - ・ -
(1)(2)(3)(4)
0) 事前に2つの変数「ptn」「sbit」を以下のように初期化
ptn : 00000000 sbit : 00000001
1) 長点
・ptnを左1ビットシフト
ptn : 00000000
・ptnのLSB(最下ビット)に長点を示す1をORでセット
ptn : 00000001
・sbitを左1ビットシフト
sbit : 00000010
2) 長点
・ptnを左1ビットシフト
ptn : 00000010
・ptnのLSB(最下ビット)に長点を示す1をORでセット
ptn : 00000011
・sbitを左1ビットシフト
sbit : 00000100
3) 短点
・ptnを左1ビットシフト
ptn : 00000110
・ptnのLSB(最下ビット)に短点を示す0をORでセット
ptn : 00000110
・sbitを左1ビットシフト
sbit : 00001000
4) 長点
・ptnを左1ビットシフト
ptn : 00001100
・ptnのLSB(最下ビット)に短点を示す1をORでセット
ptn : 00001101
・sbitを左1ビットシフト
sbit : 00010000
5) 終了
sbitをptnにORでセット
ptn : 00011101
1)から4)は同じ処理で作れますよ・・・念のため。
◆ パターンマッチングで逆引きしてASCIIコードへ
出来上がったパターンデータ「ptn」を、直前の記事にあるテーブルの先頭から順に比較します。一致するものがあったら、先頭から何番目で見つけたか・・・この数に0x20を加算すれば、ASCIIコード(値)が求められます。これを、EEPROMの所定位置に書き込めば、その位置のデータが書き換わります。
以上、参考になれば幸いです

- 関連記事
-
- パドルのチャタを見てみよう!
- LFタイプの検証と回路直しのオマケ
- ミニ・エレキーを解剖する-モールス符号複合化編
- ミニ・エレキーを解剖する-モールス符号データ編
- ミニ・エレキーを解剖する-C言語処理編
コメントの投稿
そういえばまだ10月号見てない
こんにちは。こちらはお昼休みです(^-^)/
ソフトの解説惜しみなく公開いただいてありがとうございます!スタートビットのアイディア大変参考になりました。早速取り入れさせていただきました。
符号データは和文や記号符号含めて1文字あたり6ビットを超えないことを確認したので(訂正の「HH」は除く...といってもメッセージでは使いませんよねw)スタートビットを含めると1ビット残りますから、ここにワードスペース情報を潜り込ませることにしました。
メッセージ記録と再生ルーチンの手順を紙にひととおり書きだせたので、後日苦し、もとい楽しいコーディングに入る予定です。
ところで、SLEEP命令をメインルーチンの最後のほうに入れてみましたが、待機電流は(VDD3.3V)入れる前が約600μA、入れた後56μAと10分の1まで下がりました。しかしいまひとつだなーと思って12F629のリファレンスで電源関係の部分を眺めてたら、BOD(Brown_out detect)に結構電流が流れるようなので、CONFIG文でオフにしたところ、0.3μA以下(秋月テスタで計れないくらい)まで下がりました。
バッテリー運用を想定しており、BODを外してもバッテリーの接触不良以外は問題にならなさそうなので完成後実運用で検証してみたいと思います。
ソフトの解説惜しみなく公開いただいてありがとうございます!スタートビットのアイディア大変参考になりました。早速取り入れさせていただきました。
符号データは和文や記号符号含めて1文字あたり6ビットを超えないことを確認したので(訂正の「HH」は除く...といってもメッセージでは使いませんよねw)スタートビットを含めると1ビット残りますから、ここにワードスペース情報を潜り込ませることにしました。
メッセージ記録と再生ルーチンの手順を紙にひととおり書きだせたので、後日苦し、もとい楽しいコーディングに入る予定です。
ところで、SLEEP命令をメインルーチンの最後のほうに入れてみましたが、待機電流は(VDD3.3V)入れる前が約600μA、入れた後56μAと10分の1まで下がりました。しかしいまひとつだなーと思って12F629のリファレンスで電源関係の部分を眺めてたら、BOD(Brown_out detect)に結構電流が流れるようなので、CONFIG文でオフにしたところ、0.3μA以下(秋月テスタで計れないくらい)まで下がりました。
バッテリー運用を想定しており、BODを外してもバッテリーの接触不良以外は問題にならなさそうなので完成後実運用で検証してみたいと思います。
アンテナ切替機がぶっ壊れ・・・
ぶんさん、コメントありです(^^)v
参考にして下さり、光栄の至り! もっと良い方法もあろうかと思いますが、ロジック的には素直で良いかと自画自賛・・・。
何と、頂いたコメントにポイント2つ発見せり! 1つはBODの件・・・接触不良に関しては、確かに考慮しておくべき・・・とすると、電池であっても「ちょっとしたケミコン」を電源ライン(って言うのか?)に入れておくと良さそうですね。幸い、大きめに作った恩恵がこの辺りに!?
もう1つは「お題を頂いた格好」になりますので、早速記事を認めておこうかと思います。
参考にして下さり、光栄の至り! もっと良い方法もあろうかと思いますが、ロジック的には素直で良いかと自画自賛・・・。
何と、頂いたコメントにポイント2つ発見せり! 1つはBODの件・・・接触不良に関しては、確かに考慮しておくべき・・・とすると、電池であっても「ちょっとしたケミコン」を電源ライン(って言うのか?)に入れておくと良さそうですね。幸い、大きめに作った恩恵がこの辺りに!?
もう1つは「お題を頂いた格好」になりますので、早速記事を認めておこうかと思います。