最近モールス符号を出すコードを見ました。
皆さんが使っているコードを使って私も使って「信号でも出してみようか!」と思いここに書き出してみることにしました。
"1"=125 "2"=61 "3"=29 "4"=13 "5"=5 "6"=133 "7"=197 "8"=229 "9"=245 "0"=253 "/"=149 "A"=66 "B"=132 "C"=164 "D"=131 "E"=1 "F"=36 "G"=195 "H"=4 "I"=2 "J"=116 "K"=163 "L"=68 "M"=194 "N"=130 "O"=227 "P"=100 "Q"=212 "R"=67 "S"=3 "T"=129 "U"=35 "V"=20 "W"=99 "X"=148 "Y"=180 "Z"=196 モールスのコードはご承知の通りです、これをMCUでコントロールするには信号を出す手段を考えなければなりません。
そのコードは次の様になっている様です、全体は8bitで構成され左側の5bitがモールス記号で残り3bitが文字数を表す固定式です。例えばAは・−です、[・が0]で[−が1]と処理します。
コード0100 0010(66/$42)で文字数は[010]だから2つで初めの[01]だけが有効となります。
[?マークはどうするのだろう、この方式では出せないかも!]
DATAから後ろの3bitをカウンターに入れ、左シフトしてキャリ−が出れば[ツー]無ければ[トン]でしょうか。
適当にタイミングを取りながら出せば出来そうですね、カウンターが0になるまでループを回れば一文字完成です。
"1"=7B "2"=3B "3"=1B "4"=0B "5"=03 "6"=83 "7"=C3 "8"=E3 "9"=F3 "0"=FB "/"=93 "?"=31 " "=FF "A"=5F "B"=87 "C"=A7 "D"=8F "E"=3F "F"=27 "G"=CF "H"=07 "I"=1F "J"=77 "K"=AF "L"=47 "M"=DF "N"=9F "O"=EF "P"=67 "Q"=D7 "R"=4F "S"=0F "T"=BF "U"=2F "V"=17 "W"=6F "X"=97 "Y"=B7 "Z"=C7 "BK"=8A モールス符号のコード U
昔いじっていた物とDATAが違うので以前の物を出してみました、この場合[?]もちゃんと送信出来ます。
これは[01]を最終のSTOPビットとして使う物です。例えばAなら0101 1111($5F)で[・が0]で[−が1]と処理します、信号の出し方は同じですがストップの所が異なります。
キャリーをセットしてシフトします、これだとシフト後にレジスターをチエックすれば$FFとなっていれば終了と解ります。これで前が5文字分に対し7文字まで扱えます(逆にSTOPビット10でも作動しますがDATAを変更するのが面倒なのでこのまま利用します)。以上が古いコードです、どちらが良いかは別としてPICでは前のSOFTが(プログラムが少し簡単)出回っています。
DATAのサンプル:"V V V DE JA1HWO"
17 FF 17 FF 17 FF 8F 3F FF 77 5F 7B 07 6F EF 00(00が文字列の終了)
AT90S1200です、これのPortD6にLED1KΩを付けて点灯(set)させて見ました。SWオンでLEDがCQと点滅するだけです(CW_set:は一文字出力として使えます)。
5V動作の内部発振です、短点が50mSですがspeed=50を変更すれば自由に出来ます。
スイッチをたくさん付けて信号を選び出せる方式にすれば「CQガン」ですね。;************************************* ;Title : CW_Generater AT90S1200A ;Date :2004/6/9 BY JA1HWO ;************************************* .include "C:\AVRTOOLS\APPNOTES\1200def.inc" .cseg .org 0 .equ LED =6 ;PortD6 .def back_f =r0 ;SREG .def temp =r16 .def gr1 =r17 ; .def gr2 =r18 ; .def speed =r20 ;for A/D timer .def wcunt =r21 ;timer ;------------------------------------ rjmp star ;Reset reti ;Ex0 reti ;timer overflow reti ;Analog Comparator star: ldi temp,0 ;all=input out DDRB,temp ldi temp,0b11111100 ;PortD 01=input out DDRD,temp ldi temp,$02 out PortD,temp ;input pull up ldi speed,50 ; main: ldi gr1,$a7 ;C rcall CW_set ldi gr1,$d7 ;Q rcall CW_set main2: rjmp main2 ;------------------------------------------------- CW_set: ;gr1=DATA cpi gr1,$ff ;" "? breq C_5 c_2: sec ;carry Flag rol gr1 ;Rotate left in back_f,SREG sbi PortD,LED ;LED ON(H) rcall wait out SREG,back_f brcc c_3 ;s to rcall wait rcall wait c_3: cbi PortD,LED ;LED OFF rcall wait mov temp,gr1 ;end ? sec ;carry Flag rol temp ;Rotate left cpi temp,$ff brne c_2 C_5: rcall wait rcall wait ret ;------------------------------------------------- Wait: ;1MHz=1uS(speed=50 to 50.157mS) mov gr2,speed ;speed*1mS wa1: ldi wcunt,250 ;1=4uS wa2: nop dec wcunt ;4*250*1u=1000uS brne wa2 dec gr2 ; brne wa1 ret ;**** End of File ****2004/JUN/9
もどる [MAIN MENU]