AVR 101 :モールス・コード


最近モールス符号を出すコードを見ました。

 皆さんが使っているコードを使って私も使って「信号でも出してみようか!」と思いここに書き出してみることにしました。

"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

inserted by FC2 system