パドル使ってCWを打つときは、以前製作したCW用エレクトリックキーヤー自作基板を使っています。
その制御プログラムは。
・DOTが押されたらDOTパルスをDASHが押されたらDASHパルスを出す。
・パルスを出し終えたら次にDOTかDASHが押されるまで待ちDOTかDASHが押されたらパルスを出す。
・もし、DOTとDASHが同時押しされた時は、1つ前がDOTならDASHを、1つ前がDASHならDOTパルスを出す。(スクイーズ機能)
という単純な物。
この自作エレキーを使っているんですが練習不足もありミスがなかなか減らない。
DOTやDASHパルス出力中もキー入力を監視して記憶したら抜けが減って良い感じになるのではないか。
そこで、次の様にプログラムを一部変更しようかと考えました。
・DOTが押されたらDOTパルスをDASHが押されたらDASHパルスを出す。
・DOTパルス出力中にDASHが押されたら次回予約としてDASHを記憶。
・DASHパルス出力中にDOTが押されたら次回予約としてDOTを記憶。
・パルスを出し終えた時点で次回予約があればその予約を実行する。
この動作フローでスクイーズ機能は有効に働きます。
早速、動作プログラム修正開始です。
プログラムを修正しPICマイコンに書き込んでエレキー基板に載せて動作確認。
動作を試すと、パドル操作はミスなくスムーズ。
以前だとDASHの後に早めにDOT操作解放してしまうと無視されて「空振り」することがあったんですがこのプログラムだと「空振り」が少なくなりました。
なかなか気持ち良くパドル操作ができ、上達したような錯覚を起こしてしまいます。
たまたまかもしれませんが私のフィーリングと合う様なのでこのプログラムを使う事にします。
以前作った基板です。
その回路図がこれ
動作プログラム開発環境は以前と同じです。
Cコンパイラはコンパイル後のバイナリデータが小さくなる整数型のPIC_CCです。
下記に今回作ったC言語のソースを参考までに張り付けます。
---------------- ここから -------------
/* ELEKEY PROGRAM Ver2.0 */
#include "io.c"
#include "stdio.h"
/* For Key input!!*/
static int k;
/* For Semi Break Im input!!*/
static int bk;
/*static int dotordash;*/
wait(){
int i,j;
for(i=0;i<120;i++){
j++;
}
}
semibkon(){
int x;
x = RdPortA();
x |= 0x04;
WrPortA(x);
}
semibkoff(){
int x;
x = RdPortA();
x &= 0xfb;
WrPortA(x);
}
bzon(){
int x;
x = RdPortA();
x |= 0x02;
WrPortA(x);
}
bzoff(){
int x;
x = RdPortA();
x &= 0xfd;
WrPortA(x);
}
cwon(){
int x;
x = RdPortA();
x |= 0x01;
WrPortA(x);
}
cwoff(){
int x;
x = RdPortA();
x &= 0xfe;
WrPortA(x);
}
speedchk(){
int x;
x = (RdPortB() & 0x0f);
x = (17 - x);
return x;
}
dot(){
int i,a;
a = speedchk();
/* OUT=ON */
cwon();
bzon();
for(i=0;i<a;i++){
wait();
}
/* OUT=OFF */
cwoff();
bzoff();
for(i=0;i<a;i++){
k=(k & RdPortA());
wait();
}
}
dash(){
int i,a,b;
a=speedchk();
b=a+a+a+(a>>4); /* b=3.0625a */
/* OUT=ON */
cwon();
bzon();
for(i=0;i<b;i++){
wait();
}
/* OUT=OFF */
cwoff();
bzoff();
for(i=0;i<a;i++){
k=(k & RdPortA());
wait();
}
}
/* エラーが出るので消すな */
/* 割り込み処理ルーチン・・・・・未使用です。*/
#asm
interrupt
;; bsf t_,1 ;割り込みがあった事をマーキングする。
;; bcf 0bh,1 ;next int ok
;; retfie
#endasm
main(){
int a;
int r; /* for KEY reverse */
/* Port Init */
SetP_A(0x18); /* Port A Set 0,1,2:OUT 3,4:IN */
SetP_B(0x1f); /* Port B Set 5-7:OUT 0-4:IN */
WrPortA(0);
bk=0; /* Semi Break Flug reset */
k=0xff; /* Key flug reset */
while(1){
while(1){
if( ((k & 0x10) == 0) || ((k & 0x08) == 0) ){
break;
}
k=(k & RdPortA());
bk=bk-1; /* Semi Break Flug -1 */
if(bk==0xff){
bk=0;
}
if(bk==0){
semibkoff(); /* Semi Break OFF */
}
else{
semibkon(); /* Semi Break ON */
}
}
/* Key In!! */
bk=0xfe; /* Semi Break Timer SET!! */
semibkon(); /* Semi Break ON */
r=RdPortB() & 0x10; /* for KEY reverse */
/* Dash key (at NotReverse) */
if((k & 0x10) == 0){
k=0xff;
if(r != 0){ /* Not reverse */
dash();
k=k|0x10; /* only dot mark */
}
else{ /* reverse */
dot();
k=k|0x10; /* only dash mark */
}
}
/* Dot key (at NotReverse) */
else{
k=0xff;
if(r != 0){ /* Not reverse */
dot();
k=k|0x08; /* only dash mark */
}
else{ /* reverse */
dash();
k=k|0x08; /* only dot mark */
}
}
}
}
---------------- ここまで -------------