AVR 102 :ARDF 用 IDジェネレータ


説 明プログラム
80m用 IDジェネレータ

 受信機(PJ-80)が我が家に来たので練習用としてSGが欲しくなりました、とりあえず送信機をコントロールすれば良いのでCWのKEY端子に付けるコントローラーを作る事にしました。

 構造は簡単で1分間にDE+CALL+MOE(E.I.S.H.5)で後はMOEの連続になります。
 単なるモールス信号の送出だけなので前回の[モールス・ガン]に少し手を加えれば出来そうです。
 ただ、独特なルールがあるので順次問題点が出た所で修正したいと思います。
 80mの場合CW信号で良いそうです。
(JA4WSH 田中さん有難う御座います)

初めてなので簡単に!

 モールス発生ではAT90S1200を使ったのでこれで作る事にしました、メインクロックは1MHz(5V時)なのでこれから1分間を作ります、内部発振なので精度は取れませんが練習用ですから「まあ・良いか」という感じです。
 誤差は1分間が電圧の都合で多少変ります、例えば60秒の所が53秒とか65秒になる程度です。予め合わせこんで置けばそんなにずれないと思いますけど、競技では問題になりますが練習用の1台だけですからまあ問題は無いでしょう!
 5Vで想定しましたが、セラロックにして3Vの乾電池動作だと数mAとなり節電可能です、でも006Pから落として使う予定なので5V動作としました。

細かい動作は!

 はっきり解らない事が多過ぎです、ホームページを見て来ると次の動作が必要の様です。
●何台のコントローラが同時に動くのか(A-SW)。
●このコントローラは何番目を担当するのか(MO-SW)。

 MO-SWは前記のMOEを発生するのに必要な情報で予め使用直前に設定します。A-SWは全部で何台のコントローラが動作するのか設定し最大値でこれも同様直前に設定します。
 当初出力はCW信号だけだと思っていたのですが、2mなどFM機で送信する場合変調してないとハンディ機が激しくコントロールされそのまま信号が出るのか少し疑問です。
 そこで「PTT信号と音によって変調されたコントロール信号が必要ではないか」と思い出力はCW信号の他に音声出力PTTも出す事にしました。
(国際ルールはA2信号の様でこれにも曲がりなりに対応出来る様にしました、今は必要有りません!)

 3台のコントローラの場合(スイッチの設定)
1台目はA=3 MO=1に
2台目はA=3 MO=2に
3台目はA=3 MO=3に設定します。これで3台が1分交代で信号を出せる事になります。

 今回作ったのは可能性としてこの様になっていますが練習用として1台で使う予定でA=2 MO=1又は2で使うと1分間隔で信号が出る事になります。本当は2台ぐらい作動させるとより実践的になると思います。
 複数台をコントロールするには時計機能が正確でないとオーバーラップします、後で水晶かセラロックで合わせ込む方式にVer UPしたいと思います。  

IC 設定など!

 ICはAT90S1200Aで内部発振(1MHz)を使っています。 ○ポートD3は音声出力
○ポートD4はLEDを点灯させていますがCW出力です(Hアクティブ)。
○ポートD5はPTT出力
○ポートD6はPTT出力(Lアクティブ)
○ポートB7.6.5はMOのSW入力
○ポートB4.3.2はA-SW入力
 他は未使用です。

プログラム

 動作はタイマーを使って1分間(タイマー1/1024/250と外部に240)を作り全体をコントロールしています。
 信号を作る方法は前回の[モールス発生部]と同じです、特殊DATAを書き込んでそれを利用します。DATAはそちらに一覧表として出していますのでご覧下さい。
 待ち時間に1KHz前後でスイッチして音声信号を作りモニター用として利用します、CWのスピードはパラメーターを書き換える事によって変更出来ます、この辺は好みで設定を変て下さい。


プログラムを利用する!

 プログラムですがコールの所に私の物が入っています、当然ここを変更してアセンブルしてICに書き込みます。[/1]を付けてもいいですね。
 自分でコールを書き込める様にするにはかなりプログラムが面倒なので、今回はコールを入れるには書込み器を持っている方に限定します(すみません)。

 まだ送信部は10W機をパワーを絞って使う予定、現在ICだけのむき出しの状態で机の上でLEDが点滅したりモニター音がピコピコ聞える状態です。[CWG_1.asm]

 次のバージョンは水晶発振でタイマーを安定化する事でしょうか、送信機も3.5MHzと低周波並なので簡単に出来そうです。

 2004/JUN/15 

;*************************************
;Title	: ADRF Signal_generater
;Date	:2004/6/13	BY JA1HWO
;*************************************
;ADRF用の信号発生機で1分間にDE+CALL+MOE(MOI.S.H.5)+MOE+...
;機器数の設定で5台分設定と信号の番号の設定(MOE)の設定が出来ます。
;出力はCW信号や1KHz近くの音で変調した物、1分間のPTT信号が取り出せます。

.include "C:\AVRTOOLS\APPNOTES\1200def.inc"

.cseg
.org	0
;**** set ****
.equ	sound	=3		;PortD3	
.equ	LED	=4		;PortD4 CW Mode
.equ	PTT	=5		;PortD5
.equ	PTTb	=6	;PortD6 not PTT for Handy transceiver
				;PortB Set/No/Timer
.def	back_f	=r0		;SREG
.def	back_i	=r1		;SREG
.def	tc_set	=r2		;for Timer
.def	mo_SW	=r4		;Signal No
.def	ac_SW	=r5		;Max SG
.def	kiki	=r6		;input PortB
.def	cunt_m	=r7		;1-7min counter
.def	temp	=r16
.def	gr1	=r17		;
.def	gr2	=r18		;
.def	cunt_i	=r20		;60sec counter
.def	speed	=r21		;for A/D timer
.def	wcunt	=r22		;timer
;------------------------------------
	rjmp	star		;Reset
	reti			;Ex0
	rjmp	T_60m		;timer overflow
	reti			;Analog Comparator
star:	ldi	temp,0		;all=input
	out	DDRB,temp
	ldi	temp,$ff
	out	PortB,temp	;pull up
	ldi	temp,0b11111100	;PortD 01=input
	out	DDRD,temp
	ldi	temp,$02
	out	PortD,temp	;input pull up
	sbi	PortD,PTTb	;PTT Off
	clr	cunt_i		;counter
	ldi	temp,1
	mov	cunt_m,temp
	ldi	temp,5		;in Clock=1/1024
	out	TCCR0,temp	;T/C0
	ldi	temp,-250	;*250=4Hz(0.25S)
	mov	tc_set,temp
	out	TCNT0,tc_set	;
	in	kiki,PinB	;PortB check
	com	kiki
	mov	temp,kiki
	swap	temp		;Generater No(1-7)
	lsr	temp
	andi	temp,$07
	mov	mo_SW,temp	;PortB567
	mov	temp,kiki	;ac_SW ?
	andi	temp,0b00011100
	lsr	temp
	lsr	temp
	mov	ac_SW,temp	;PortB234
	ldi	temp,2
	out	TIMSK,temp	;Timse Interrupts ON
	sei			;Interrupts on
;--------------------------------------------
main:	cp	cunt_m,mo_SW	;time=mo_SW ?
	brne	main		;no to
	ldi	temp,8		;Wait0.25*8=2 Sec
main0:	ldi	speed,250	;250*1mS
	rcall	wait2
	dec	temp
	brne	main0
	ldi	speed,150	;
	sbi	PortD,PTT	;PTT ON
	cbi	PortD,PTTb	;PTT ON
	ldi	gr1,$8f		;D
	rcall	CW_set
	ldi	gr1,$3f		;E
	rcall	CW_set
	ldi	gr1,$ff		;" "
	rcall	CW_set
	ldi	gr1,$77		;J
	rcall	CW_set
	ldi	gr1,$5f		;A
	rcall	CW_set
	ldi	gr1,$7b		;1
	rcall	CW_set
	ldi	gr1,$07		;H
	rcall	CW_set
	ldi	gr1,$6f		;W
	rcall	CW_set
	ldi	gr1,$ef		;O
	rcall	CW_set
	ldi	gr1,$ff		;" "
	rcall	CW_set
	ldi	gr1,$ff		;" "
	rcall	CW_set
	ldi	speed,255	;
main2:
	ldi	gr1,$df		;M
	rcall	CW_set2
	ldi	gr1,$ef		;O
	rcall	CW_set2
	mov	temp,mo_SW	;1.2.3.4.5
	cpi	temp,2
	breq	m22
	brlo	m21
	cpi	temp,4
	brlo	m23
	breq	m24
	ldi	gr1,$03		;5
	rjmp	m2e
m21:	ldi	gr1,$3f		;e
	rjmp	m2e
m22:	ldi	gr1,$1f		;i
	rjmp	m2e
m23:	ldi	gr1,$0f		;s
	rjmp	m2e
m24:	ldi	gr1,$07		;h
m2e:	rcall	CW_set2
	ldi	gr1,$ff		;" "
	rcall	CW_set2
	cp	cunt_m,mo_SW	;time=mo_SW ?
	breq	main2		;no to
	cbi	PortD,LED	;LED OFF Limit
	cbi	PortD,PTT	;PTT Off
	sbi	PortD,PTTb	;PTT Off
	rjmp	main
;-------------------------------------------------
;gr1=DATA	use temp	sub Wait
;output PortD6 Set & Clear/LED or TX control
CW_set:
	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	wait2
	mov	temp,gr1	;end ?
	sec			;carry Flag
	rol	temp		;Rotate left
	cpi	temp,$ff
	brne	c_2
C_5:	rcall	wait2
	rcall	wait2
	ret
CW_set2:
	cp	cunt_m,mo_SW	;time=mo_SW ?
	breq	cw_set		;no to
	ret
;-------------------------------------------------
;Interrupt	minute counter (0.25S*240)
T_60m:
	in	back_i,SREG	;0.25S*240=60S(1 minute)
	inc	cunt_i
	cpi	cunt_i,240	;
	brne	t_6e		;
	clr	cunt_i
	inc	cunt_m		;1.2..ac_SW
	cp	ac_SW,cunt_m	;
	brcs	t_61		;if(activ SW < cunt_m) to
	rjmp	t_6e
t_61:	clr	cunt_m
	inc	cunt_m		;
t_6e:	out	TCNT0,tc_set	;next
	out	SREG,back_i
	reti
;-------------------------------------------------
Wait:		;1MHz=1uS
	mov	gr2,speed
wa1:	sbi	PortD,sound
	ldi	wcunt,83	;
wa2:	dec	wcunt		;3*83*1u=249uS
	brne	wa2
	cbi	PortD,sound
	ldi	wcunt,83
wa3:	dec	wcunt		;3*83*1u=249uS
	brne	wa3
	dec	gr2
	brne	wa1
	mov	gr2,speed
wa11:	sbi	PortD,sound
	ldi	wcunt,83	;
wa12:	dec	wcunt		;3*83*1u=249uS
	brne	wa12
	cbi	PortD,sound
	ldi	wcunt,83
wa13:	dec	wcunt		;3*83*1u=249uS
	brne	wa13
	dec	gr2
	brne	wa11
	ret
;-------------------------------------------------
Wait2:		;1MHz=1uS
	mov	gr2,speed	;speed*1mS
wa21:	ldi	wcunt,250	;1=4uS
wa22:	nop
	dec	wcunt		;4*250*1u=1000uS
	brne	wa22
	dec	gr2
	brne	wa21
	ret

[もどる]もどる  [MAIN MENU

inserted by FC2 system