Tochan keyer FRISK version
Instruction Bookby
JN3XBY
2011-2-27 ver1.0

【仕様】
１．FRISK ケースサイズの小型軽量
２．短点・長点メモリー
３．スクイーズ機能
４．2CH メッセージメモリー機能
５．CW 練習用 ランダムコード発生機能（2 モード）
６．VR によるスピード調整機能
７．無操作での 10 分後 パワーダウン機能【基本操作】
1. 送信(1) 通常使用
エレキー用パドルが接続された状態で、短点、長点の操作により、ブザーによる入力されたモールス信号の音声が出力されると共に、キー出力からキー制御信号が出力されます。
(2) メッセージ送信
メモリーキーを押すことにより、あらかじめ記録されたメッセージモールス信号が自動的に送信されます。
メモリーボタンは、1 と 2 の 2 個装備されており、2 種類のメッセージを送信することが出来ます。
メッセージの送信が終了した時、LED が点滅し、終了を明示します。
２．メッセージメモリー(1) 操作手順① ”REC MODE” スイッチを ON にします。
ブザーが ”ピ、ピ、ピ”、と 3 回鳴ります。
②メモリーさせるメモリーキーを押します。
1 番のメモリーキーを押した場合、”ピ”、とブザーが 1 回鳴ります。
2 番のメモリーキーを押した場合、”ピ、ピ”、とブザーが２回鳴ります。
この操作により、パドルからキー入力待機状態となります。
最初のパドルキー入力操作が実行されるまで、メモリーは開始されません。
最初の短点、長点の入力をずっと待っています。

③通常の送信と同じように、パドル操作を行い、メモリーしたいメッセージを打ち込みます。
この時、通常の送信操作と違うのが、メッセージのメモリー操作の時は、バドル操作にあわせて LED が点灯します。
④メモリーされる最大ステップ容量は、短点、長点、スペースを含めて、1 メッセージあたり256 となります。
例：JN3XBY と入力した場合- －－－_ －-_--- －－_ －--－_ －--- _－-－－ _ となり、全部で 29 ステップとなります。
⑤メッセージの入力が終了した場合、パドル操作を終了してスパースの時間が文字間スペースの 4 倍以上になった場合に、ブザーが”ピ、ピ、ピ”、と 3 回鳴って入力ステップが２５６に満たなくても、自動的にメモリー状態から脱出します。
この時、メッセージには、ステップ数が２５６に達していなくても、メッセージ終了の信号が自動的に書き込まれます。
逆に、メッセージのステップ数が 256 を超えた場合、自動的にメモリー操作が強制終了されます。
⑥メッセージの入力を間違えた場合、メッセージの入力終了を検出した”ピ、ピ、ピ”、と鳴るブザー音の後、再度、メモリーキーを押す事により、再入力が可能です。
この時、1 番のメモリーキーを押した場合、”ピ”、とブザーが 1 回鳴ります。
2 番のメモリーキーを押した場合、”ピ、ピ”、とブザーが２回鳴ります。
⑦メッセージの入力は、”REC MODE” スイッチが ON の時、メモリー 1、メモリー 2 それぞれ個別にも入力できますが、連続してメモリーナンバーを選択して入力することも可能です。
⑧入力が完了したら、”REC MODE” スイッチを OFF にします。
⑨メッセージの再生は、１．(2)のメッセージ送信の操作により実行できます。
この時、”REC MODE” スイッチが OFF になっていることを必ず確認ください。ON の状態で、メモリーキーを押すと、再入力モードになります。
３．ランダム CW 練習モード(1) 操作手順①”CW Random Mode” スイッチを ON にします。
②ランダムモードの選択のために、メモリーキーを選択します。（１ or ２）③１を選択した場合、6 文字ごとに区切られたランダムモールス信号が送出されます。
２を選択した場合、1 文字ごとに区切られたランダムモールス信号が送出されます。

４．回路図５．プログラム（BASOCM－AVR による BASIC プログラム）
別紙

６．接続インターフェース

'************************************************'*Tochan MessageKeyer by JN3XBY'************************************************'************************************************'*Hennsuu Sengen'************************************************
Dim Keyina As Byte
Dim Keyinb As Byte
Dim Tonefreq As Integer
Dim Sidetone As Integer
Dim Dot As Integer
Dim Dash As Integer
Dim Keyspace As Integer
Dim Keyspeed As Integer
Dim Wspace As Integer
Dim Keydata As Byte
Dim Keystatus As Byte
Dim Keymem As ByteDim Memory As Byte
Dim Memrec As Byte
Dim Memrecno As Byte
Dim Memcnt As Byte
Dim Memkeyinstartf As Bit
Dim Memendcnt As Integer
Dim Memend As Integer
Dim Messagedata As Byte
Dim Memadress As Byte
Dim Mem As Byte
Dim Memdatacnt As Byte
Dim Memdata As Byte
Dim Loopcnt As Byte
Dim Tcnt As Long
Dim I As Byte
Dim L As Byte
Dim Recflag As Bit
Dim Dotmemtimer As Integer
Dim Dashmemtimer As Integer
Dim Dotmemcnt As Byte
Dim Dashmemcnt As Byte
Dim Exkey As Bit
Dim Randtxt(78) As Word
Dim Randomdata As Word
Dim Random As Word

Dim M As Byte
Dim Randomcwf As Byte'************************************************'*
Port Settei'*
Port a7:EXTKeyin PullUp'*
Port b6:DashKeyin PullUp b5:Dotkeyin PullUp'*
Port b4:KeyOut(LED)b3:ToneOut'************************************************
Ddra = &B00000100
Porta = &B11111100
Ddrb = &B00011111
Portb = &B01100000
Tcnt = 0
Memkeyinstartf = 0'System Clk = 1MHz

Mem = &B10011001
Writeeeprom Mem , 64
Mem = &B11101001
Writeeeprom Mem , 65
Mem = &B10111001
Writeeeprom Mem , 66
Mem = &B10011110
Writeeeprom Mem , 67
Mem = &B10011000
Writeeeprom Mem , 68

'CQ

Randtxt(1) = &B01101010
Randtxt(2) = &B10110000
Randtxt(3) = &B01011010
Randtxt(4) = &B10110000
Randtxt(5) = &B01010110
Randtxt(6) = &B10110000
Randtxt(7) = &B01010101
Randtxt(8) = &B10110000
Randtxt(9) = &B01010101
Randtxt(10) = &B01110000
Randtxt(11) = &B10010101
Randtxt(12) = &B01110000
Randtxt(13) = &B10100101
Randtxt(14) = &B01110000
Randtxt(15) = &B10101001
Randtxt(16) = &B01110000
Randtxt(17) = &B10101010
Randtxt(18) = &B01110000
Randtxt(19) = &B10101010
Randtxt(20) = &B10110000'1

Randtxt(21) = &B01101100
Randtxt(22) = &B00000000
Randtxt(23) = &B10010101'A'2'3'4'5'6'7'8'9'10'B

Randtxt(24) = &B11000000
Randtxt(25) = &B10011001
Randtxt(26) = &B11000000
Randtxt(27) = &B10010111
Randtxt(28) = &B00000000
Randtxt(29) = &B01110000
Randtxt(30) = &B00000000
Randtxt(31) = &B01011001
Randtxt(32) = &B11000000
Randtxt(33) = &B10100111
Randtxt(34) = &B00000000
Randtxt(35) = &B01010101
Randtxt(36) = &B11000000
Randtxt(37) = &B01011100
Randtxt(38) = &B00000000
Randtxt(39) = &B01101010
Randtxt(40) = &B11000000
Randtxt(41) = &B10011011
Randtxt(42) = &B00000000
Randtxt(43) = &B01100101
Randtxt(44) = &B11000000
Randtxt(45) = &B10101100
Randtxt(46) = &B00000000
Randtxt(47) = &B10011100
Randtxt(48) = &B00000000
Randtxt(49) = &B10101011
Randtxt(50) = &B00000000
Randtxt(51) = &B01101001
Randtxt(52) = &B11000000
Randtxt(53) = &B10100110
Randtxt(54) = &B11000000
Randtxt(55) = &B01100111
Randtxt(56) = &B00000000
Randtxt(57) = &B01010111
Randtxt(58) = &B00000000
Randtxt(59) = &B10110000
Randtxt(60) = &B00000000
Randtxt(61) = &B01011011
Randtxt(62) = &B00000000
Randtxt(63) = &B01010110Randtxt(64) = &B11000000
Randtxt(65) = &B01101011
Randtxt(66) = &B00000000
Randtxt(67) = &B10010110
Randtxt(68) = &B11000000
Randtxt(69) = &B10011010
Randtxt(70) = &B11000000
Randtxt(71) = &B10100101
Randtxt(72) = &B11000000

'C
'D
'E
'F
'G
'H
'I
'J
'K
'L
'M
'N
'O
'P
'Q
'R
'S
'T
'U
'V
'W
'X
'Y
'Z

Randtxt(73) = &B10010101
Randtxt(74) = &B10110000
Randtxt(75) = &B10011010
Randtxt(76) = &B01110000
Randtxt(77) = &B01100110Randtxt(78) = &B01110000'BT'KN'AR'***************************************************'*Tone INTIALIZE'***************************************************
Tccr1b = $84'Prescaler=1/8' (125KHz at OSC=1MHz)'***************************************************'*TIMER INT ROUTINE INTIALIZE'***************************************************
Config Timer0 = Timer , Prescale = 8
On Timer0 Tim0_int
Enable Timer0
Enable Interrupts'OSC 1MHz 2.048mS'***************************************************'*INTIAL PORT TEST'***************************************************
Mem = &B01100111
Gosub Memloop'***************************************************'*
Main Program Routine'***************************************************
Main:Dotmemtimer = 0
Dashmemtimer = Dash / 2
Memend = Wspace * 4'Dot / 2'***************************************************'*
Tone Freqency Sub'***************************************************'Gosub Tonefreq
Tonefreq = 100
Ocr1b = Tonefreq
Ocr1c = Tonefreq'625Hz'Tone Frequency'Tone Frequency'***************************************************'*Key Syori'***************************************************
If Keymem = 1 Then Gosub Keyon_dot
If Keymem = 2 Then Gosub Keyon_dash
If Keydata = 1 Then Gosub Keyon_dot
If Keydata = 2 Then Gosub Keyon_dash'Dot'Dash'''''

If Exkey = 1 Then
Keydata = 3Gosub Exkey
Exkey = 0End If
If Memory = 1 Then Gosub Memory1
If Memory = 2 Then Gosub Memory2
If Randomcwf = 1 Then Gosub Randomcw1
If Randomcwf = 2 Then Gosub Randomcw2
If Memrecno = 1 Then Gosub Memrec1
If Memrecno = 2 Then Gosub Memrec2

If Memcnt > Keyspace Then
Memrec = &B00000011
Gosub Memrec_loop
End IfIf Memendcnt > Memend ThenFor I = 1 To 4
Memrec = &B00000000
Gosub Memrec_loop
Next I
Memendcnt = 0
Memkeyinstartf = 0
Recflag = 0
Waitms 50''''

I = 2Tonefreq = 40
Gosub Tone
Gosub Sig_tone
End If

Goto Main'***************************************************'*Key Dot Out Subroutine'***************************************************
Keyon_dot:
If Recflag = 1 Then Goto Keyon_dot_rec
Keymem = 0
If Keystatus = 1 Then ReturnKeystatus = 1
Dashmemcnt = 0'Set Portb.2'Mute_ON

'Waitms 1
Set Portb.4
Tccr1a = $10
Waitms Dot
Goto Keyoff'KEY_ON'Tone_ON'***************************************************'*Key Dash Out Subroutine'***************************************************
Keyon_dash:
If Recflag = 1 Then Goto Keyon_dash_rec
Keymem = 0
If Keystatus = 2 Then ReturnKeystatus = 2
Dotmemcnt = 0'
Set Portb.2'Waitms 1
Set Portb.4
Tccr1a = $10
Waitms Dash
Goto Keyoff'Mute_ON'KEY_ON'Tone_ON'***************************************************'*Key Off Routine'***************************************************Keyoff:
Reset Portb.4'KEY_OFF
Tccr1a = $20'Tone_OFF'
Waitms 1'
Reset Portb.2
Waitms Keyspace
Keystatus = 0
Return'*****************************************************'*
Message Memory Call SUBROUTINE'*****************************************************
Memory1:
Memadress = 00
Goto Memory
Memory2:Memadress = 64
Goto Memory
Memory:Set Portb.2
Waitms 100
Reset Portb.2

For Loopcnt = 0 To 63
Gosub Memloop_sub
Memadress = Memadress + 1
NextMemory = 0
Gosub Led
ReturnMemloop_sub:
Readeeprom Mem , Memadress
Memloop:
Memdatacnt = 4
Memloopr:
If Keydata <> 0 Then
Memory = 0
Memdatacnt = 4
Keydata = 0
Goto Main
End If'Memory karano dassyutu'saiyo no keyin ha musyori

Memdata = Mem And &B11000000
If Memdata = &B01000000 Then Gosub Keyon_dot
If Memdata = &B10000000 Then Gosub Keyon_dash
If Memdata = &B11000000 Then Waitms Wspace
If Memdata = &B00000000 Then
Loopcnt = 63
Memdatacnt = 0Return
End IfRotate Mem , Left , 2
Memdatacnt = Memdatacnt - 1
If Memdatacnt > 0 Then Goto Memloopr
Tcnt = 0
Return'*****************************************************'*Random CW SUBROUTINE'*****************************************************
Randomcw1:
M = 6

Goto Randomcw
Randomcw2:
M = 1
Randomcw:
For L = 1 To M
I = Rnd(39)I = I + I
I = I - 1
Mem = Randtxt(i)Gosub Memloop
I = I + 1
Mem = Randtxt(i)Gosub Memloop
Next LMem = &B11111100
Gosub Memloop'i=i*2-1

Memory = 0
Return'*****************************************************'*
Message Memory REC SUBROUTINE'*****************************************************
Memrec1:
Waitms 200
I = 1
Tonefreq = 60
Gosub Tone
Gosub Sig_tone
Memadress = 0
Memdatacnt = 4
Mem = 0
Memrecno = 0
ReturnMemrec2:
Waitms 200
I = 2
Tonefreq = 60
Gosub Tone
Gosub Sig_tone
Memadress = 64

Memdatacnt = 4
Mem = 0
Memrecno = 0Return

Keyon_dot_rec:
Keymem = 0
If Keystatus = 1 Then Return
Keystatus = 1
Set Portb.2
Tccr1a = $10
Waitms Dot
Memrec = &B00000001
Goto Keyoff_rec'LED_ON'Tone_ON

Keyon_dash_rec:
Keymem = 0
If Keystatus = 2 Then Return
Keystatus = 2
Set Portb.2
Tccr1a = $10
Waitms Dash
Memrec = &B00000010
Goto Keyoff_rec'LED_ON'Tone_ON

Keyoff_rec:Tccr1a = $20
Reset Portb.2
Waitms Keyspace
Keystatus = 0
Memkeyinstartf = 1
Memendcnt = 0'Tone_OFF'LED_OFF'memory rec start

Memrec_loop:
Memcnt = 0
Mem = Mem Or Memrec
Memdatacnt = Memdatacnt - 1
If Memdatacnt > 0 Then
Rotate Mem , Left , 2
ReturnEnd If
Writeeeprom Mem , Memadress
Mem = 0Memdatacnt = 4'1Byte no Write to Eeprom

Loopcnt = Loopcnt + 1
Memadress = Memadress + 1'Memory No Hosei hituyou

If Loopcnt = 63 Then
Recflag = 0End If
Return'***************************************************'*Tone Freqency Sub'***************************************************
Tonefreq:'***************************************************'*
Tone Freqency Set Subroutine'***************************************************
Tone:
Ocr1b = Tonefreq
Ocr1c = Tonefreq'Tone Frequency

ReturnSig_tone:
For L = 1 To I
Tccr1a = $10
Waitms 50
Tccr1a = $20
Waitms 100
Next L'Tone_ON'Tone_OFF

Gosub Tonefreq
ReturnLed:
Set Portb.2
Waitms 200
Reset Portb.2
Return'***************************************************'*
External Key Sub'***************************************************'Exkey:'Set Portb.2'Waitms 1'
Set Portb.4'Tccr1a = $10'
Keyina = Pina And &B11111000'If Keyina = &B01111000 Then'
Memory = 0'
Goto Exkey'End If'Mute_ON'KEY_ON'Tone_ON

'''''

Tccr1a = $20
Reset Portb.4
Waitms 1Reset Portb.2
Return'Tone_OFF'KEY_OFF'Mute_OFF'*****************************************************'*TIMER INT SUBROUTINE'*****************************************************
Tim0_int:'***************************************************'*
KeySpeed Set (KeySpeed A/D Input)'***************************************************
Set Porta.2
Start Adc
Keyspeed = Getadc(0)Shift Keyspeed , Right , 4'
Keyspeed = Keyspeed / 16
Keyspeed = 30 + Keyspeed
Stop Adc
Reset Porta.2'***************************************************'*
Dot,Dash,Space Nagasa no Hi Set'***************************************************
Dot = Keyspeed
Dash = Dot + Dot
Dash = Dash + Dot
Keyspace = Dot
Wspace = Dot + Dot'Dash = Dot * 3'***************************************************'*Key Input & Hantei'***************************************************
Keyinb = Pinb And &B01100000
If Keyinb = &B00100000 Then Gosub Keyin_dot 'Dot
If Keyinb = &B01000000 Then Gosub Keyin_dash'Dash
If Keyinb = &B00000000 Then Gosub Squiz
If Keyinb = &B01100000 Then Keydata = 0'Keyoff

Keyina = Pina And &B11110000
If Keyina = &B01100000 Then Randomcwf = 1
If Keyina = &B10100000 Then Randomcwf = 2If Keyina = &B01110000 Then Memory = 1If Keyina = &B10110000 Then Memory = 2If Keyina = &B11010000 Then
If Recflag = 0 Then
Waitms 500
I = 3
Gosub Sig_tone'Random CW1'Random CW2' goto mem rec modeEnd If
Recflag = 1End If
If Keyina = &B01010000 Then Memrecno = 1
If Keyina = &B10010000 Then Memrecno = 2If Keyina = &B11110000 Then
Recflag = 0Memendcnt = 0Memcnt = 0
Memkeyinstartf = 0Randomcwf = 0End If

Incr Tcnt
If Memkeyinstartf = 1 Then
Incr Memcnt
Incr Memendcnt
End If'mem rec mode OFF'= Tcnt + 1' = Memcnt + 1' = Memendcnt + 1

Dotmemcnt = Dotmemcnt + 1
Dashmemcnt = Dashmemcnt + 1
If Tcnt = 300000 Then Goto Goodbye
ReturnKeyin_dot:
If Keystatus = 2 Then
If Dashmemcnt > Dashmemtimer Then Keymem = 1End If
Keydata = 1Tcnt = 0
ReturnKeyin_dash:
If Keystatus = 1 Then
If Dotmemcnt > Dotmemtimer Then Keymem = 2End If
Keydata = 2Tcnt = 0
ReturnSquiz:

If Keystatus = 1 Then Keydata = 2
If Keystatus = 2 Then Keydata = 1
Tcnt = 0
Return'***************************************************'*
Power Save Mode'***************************************************
Goodbye:
Mem = &B10100101
Gosub Memloop
Mem = &B01110101
Gosub Memloop
Mem = &B01101000
Gosub Memloop
Ddra = 0
Ddrb = 0
Enable Interrupts
Enable Int0
Disable Adc
Powerdown
Disable Int0'70uA at 3V'1.5mA Normal'15mA Key On

Goto 0End