AVR 103B :ARDF 用 IDジェネレータ UB

このIDGは"おすすめ!"です

3.579904MHz(カラーTV用)に変更
MODE周波数周波数出力
A2AまたはF2A145.62 MHz145.78 MHz0.25-1.5 W
A1A3.520 MHz3.570 MHz3-5 W
2003年10月秋田森吉町のARDF案内に書かれていた物です、JARL NEWSから
今後2mのARDF競技はF2からA2(A2A)に変るそうです。
5クラスとする。
(1)YLクラス 女性で年令に制限はない
(2)JNクラス 19歳未満の男性
(3)OMクラス 19歳以上40歳未満の男性
(4)OTクラス 40歳以上55歳未満の男性
(5)VTクラス 55歳以上の男性


 [前回のプログラム]は周波数3.520MHz(セラロック)で動作させていましたが、3.579904MHz(カラーTV用3.579545MHz)に変更しました。
 これによって水晶の調達が容易になりました。また、100Hzまで周波数を合わせれば1時間に0.1秒の精度が保てるので実用には十分と思われます。

一部変更

 回路的にはほとんど同じで発振が水晶になるので多少の変動はありますが調整用のコンデンサーは15PFで合うようです。
 周波数は1024/160/1311で60秒を作っています、数字的には逆算しました。

 それと、待ち時間は電池の消耗を減らす為「スリープ動作」で節電をしています。これで平均消費電力を2台の時約半分、5台の時は1/3ぐらいでしょうか。
 スリープ中でも、タイマーは止めないので正確に時間はコントロールされます。

 Timer0/10/20/30分タイマーを付けました。戻り用のビーコン発生機にも使える様にCALL+MO以後MOの連続が出せる様にしました。(103のバージョンアップ版ですがしばらく103を消さずに置きます)
 各種設定ですが「電源オンでスイッチ情報を読み込む」方式で後の変更は無効で読み取りません。
タイマー
 前回の物はPB0/PB1の端子入力は遊んでいますがタイマーの入力端子としました「使う・使わないは別」として0/10/20/30分タイマーを追加しました。

 00は何もしないでそのまま設定された動作をする、10(1)は開始前10分、01(2)は開始前20分、11(3)は開始前30分と選べる様にしました、この時間経過後に正常動作をします。

回路図ビーコン(MO*スイッチで全てOFFの状態)
 にも使える様にMO*=000の設定はビーコンとし、DE+CALL+MO・MOの連続、1分後再度コールを出して繰り返す事にしました。これでかなり実戦向けになりました。
 通常は担当させるIDジエネレータになります(1.2.3.4.5を設定する)、DE+CALL+MO*・MO*の連続で1分間送信をコントロールする。
 5以上を設定した場合(6/7など)は5と判断します。

機器総数
 [A]スイッチで1.2.3.4.5を設定する。
 練習ではA=3、MO1とMO2で使うと交代に電波が出る、3番目は休みとして使います。

KEY信号
 送信機をコントロールする信号です、回り込みに注意します。

SOUND信号
 KEY信号を1KHzでスイッチした信号です、変調する時に使いますA2A・F2Aの時使います。

PTT(PTTb)信号
 PTTは1分間の連続信号です(Bは論理逆の信号)FMトランシーバーなどをコントロールします。

その他、参考に
 コールDATAは[avr101]をご覧になり、プログラムには私のコールが入れてありますが参考にして書換えて下さい。
	ldi	gr1,$77		;J 一文字分を設定
	rcall	CW_set		;CWの信号が出ます。
これを組合せてコールを出します。

 モールス符号のスピードはスピードパラメーターを変更すると替えられます、短点/speed=100が0.1秒です。

 外部との結線は電池(3V)以上の電圧が加わらない様にします。
 電源スイッチOFF後、次にONさせる場合5秒程度間をあけてからスイッチを入れて下さい、内部のコンデンサーに残っているとリセットされずに続けて作動する事がある。

 以下のプログラムはAT90S1200の物です茶色の文字色だけコピーして利用して下さい。
AT90S2313で試す方は後ろの方に追加しました、その部分と[star:]から初まる2行を追加して後は1200と同じプログラムで作動します。当然コールは自分のCALLにして下さい、一般に[/1]の様に移動先は付けない事が多いそうです。
 AT90S2313で作った場合ピン配列は同じなのでそのまま差換え可能です。

[ 3.0Vの時AT90S1200が約2.2/0.5mA(アクティブ/スリープ状態)、AT90S2313が約2.7/0.8mAでした。(このレベルでは腐った電池でも最初は動くので、大会などでは注意)]

 アッセンブルに慣れてない方は「パスの設定」に注意、私の場合"1200def.inc"又は"2313def.inc"が入っているホルダーが[C:\AVRTOOLS\APPNOTES]に入っています、自分のパソコンに合わせて下さい。

 2004/JUL/8 - JUL/30 


その後!

★実験中「時折リセットされない」ことがありました、回路図のリセット端子(@ピン)に1000PFを付けると確実に動作しましたので修正します。500PFでも動作しました。

★初めの「開始時間を2秒」取っていました(これはオーバーラップを避けるため)少し多い感じなので「半分の1秒に変更」しました(下のプログラムは修正しました)。(2004/9/4)
プログラムプログラム(続き)
;*************************************
;Title	: ADRF ID Generater (cwg37.asm)
;Date	:2004/6/4	BY JA1HWO
;*************************************
;ADRF用の信号発生機で1分間にDE+CALL+MOE(MOI.S.H.5)+MOE+...
;機器数の設定(5台)と担当番号(MOE)の割当。
;例、全部で3台でこのセットは2番目(MOI)。
;出力はCW信号・1KHzで変調した音・1分間のPTT信号。

.include "C:\AVRTOOLS\APPNOTES\1200def.inc"
.cseg
.org	0
;------------------------------------
.equ	sound	=3		;PortD3	
.equ	KEY	=4		;PortD4 CW Mode
.equ	PTT	=5		;PortD5
.equ	PTTb	=6	;PortD6 not PTT
			;PortB0,B1	Timer
			;PortB2-7 A*234 - MO*567
.def	back_f	=r0		;SREG
.def	back_i	=r1		;SREG
.def	tc_set	=r2		;for Timer
.def	mo_SW	=r4		;Signal No
.def	a_SW	=r5		;Max SG
.def	kiki	=r6		;input PortB
.def	cunt_m	=r7		;1-7min counter
.def	Timer_c	=r8		;Minute

.def	temp	=r16
.def	gr1	=r17		;
.def	gr2	=r18		;
.def	ic_1	=r19		;60sec counter
.def	ic_2	=r20		;60sec counter
.def	speed	=r21		;CW Speed timer
.def	wcunt	=r22		;timer
;------------------------------------
	rjmp	star		;Reset
	reti			;Ex0
	rjmp	T_60m		;timer overflow
	reti			;Analog Comparator
;DATA				[ USER CALL SET ]
CALL:	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,$93		;/
	rcall	CW_set
	ldi	gr1,$7b		;1
	rcall	CW_set
	rjmp	callb
;------------------------------------
star:
	;[以下AT90S2313と共通]
	ldi	temp,0		;all=input
	out	DDRB,temp
	ldi	temp,$ff
	out	PortB,temp	;pull up
	ldi	temp,0b11111111	;PortD
	out	DDRD,temp
	sbi	PortD,PTTb	;PTT Off
	sbi	ACSR,ACD	
	clr	ic_1		;counter
	clr	ic_2
	clr	cunt_m		;
	ldi	temp,5		;in Clock=1/1024
	out	TCCR0,temp	;T/C0
	ldi	temp,-160	;1024/160/1311=60S
	mov	tc_set,temp
	out	TCNT0,tc_set	;
	in	kiki,PinB	;PortB check
	com	kiki
	ldi	temp,2
	out	TIMSK,temp	;Timse Interrupts ON
	ldi	temp,0b00100000	;SLEEP/Idle mode
	out	MCUCR,temp	;waiting time to sleep
	sei			;Interrupts on
;Timer ------------------------------------
	mov	temp,kiki	;Timer check
	andi	temp,3
	breq	time		;0 to
	mov	gr1,temp
	lsl	temp		;*2
	lsl	temp		; *2
	add	temp,gr1	;+1=5
	lsl	temp		;*2=10or20or30 TEST
	mov	Timer_c,temp	;set Timer counter
tim1:	SLEEP
	and	Timer_c,Timer_c	;timer end ?
	brne	tim1
	clr	cunt_m		;reset
time:	mov	temp,kiki	;mo_SW ?
	swap	temp		;Generater No(1-7)
	lsr	temp
	andi	temp,$07
	brne	s1		;0=beacon
	inc	temp		;
	clr	kiki		;a_SW=0
s1:	mov	mo_SW,temp	;PortB567
	mov	temp,kiki	;a_SW ?
	andi	temp,0b00011100
	lsr	temp
	lsr	temp
	brne	s_2
	ldi	temp,1
s_2:	cpi	temp,5
	brcs	s_3
	ldi	temp,5
s_3:	mov	a_SW,temp	;PortB234
;------------------------------------
main:	SLEEP	;Low Power Idle and Power Down Modes
	and	cunt_m,cunt_m	;
	brne	main0
	inc	cunt_m
main0:	cp	cunt_m,mo_SW	;time=mo_SW ?
	brne	main		;no to
	ldi	temp,4		;Wait0.25*4=1 Sec
main1:	ldi	speed,250	;250*1mS
	rcall	wait2
	dec	temp
	brne	main1
	ldi	speed,80	;
	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
	rjmp	call		;USER CALL
callb:	ldi	gr1,$ff		;" "
	rcall	CW_set
	ldi	gr1,$ff		;" "
	rcall	CW_set
	ldi	speed,100	;
main2:
	ldi	gr1,$df		;M
	rcall	CW_set2
	ldi	gr1,$ef		;O
	rcall	CW_set2
	and	kiki,kiki	;? beacon
	breq	m2e+1		;yes to
	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
	ldi	gr1,$ff		;" "
	rcall	CW_set2
	cp	cunt_m,mo_SW	;time=mo_SW ?
	breq	main2		;no to
	cbi	PortD,KEY	;OFF Limit
	cbi	PortD,PTT	;PTT Off
	sbi	PortD,PTTb	;PTT Off
	rjmp	main
;------------------------------------ 
;gr1=DATA	use temp	sub Wait
;output PortD6 Set & Clear/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,KEY	;ON(H)
	rcall	wait
	out	SREG,back_f
	brcc	c_3		;s to
	rcall	wait
	rcall	wait
c_3:	cbi	PortD,KEY	;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
T_60m:
	in	back_i,SREG	;*1311=60S(1 minute)
	inc	ic_1
	brne	t_601
	inc	ic_2
t_601:
	cpi	ic_1,low(1311)	;1311
	brne	t_6e
	cpi	ic_2,high(1311)
	brne	t_6e		;
	clr	ic_1
	clr	ic_2
	inc	cunt_m		;1.2..a_SW
	dec	Timer_c
	cp	a_SW,cunt_m
	brcs	t_61	;if(a SW < cunt_m) to
	rjmp	t_6e
t_61:	clr	cunt_m
t_6e:	out	TCNT0,tc_set	;next
	out	SREG,back_i
	reti
;------------------------------------
Wait:		;3.58MHz=0.2793(1mS)
	mov	gr2,speed
wa1:	sbi	PortD,sound
	ldi	wcunt,224
wa2:	nop		;4*224*0.279u=250uS
	dec	wcunt
	brne	wa2
	cbi	PortD,sound
	ldi	wcunt,224
wa3:	nop
	dec	wcunt
	brne	wa3
	dec	gr2
	brne	wa1
	mov	gr2,speed
wa11:	sbi	PortD,sound
	ldi	wcunt,224	;
wa12:	nop
	dec	wcunt
	brne	wa12
	cbi	PortD,sound
	ldi	wcunt,224
wa13:	nop
	dec	wcunt
	brne	wa13
	dec	gr2
	brne	wa11
	ret
;------------------------------------
Wait2:		;3.579904MHz=0.279337uS
	mov	gr2,speed	;speed*1mS
wa21:	ldi	wcunt,224	;
wa22:	nop			;
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	dec	wcunt	;16*224*0.279337=1000uS(1mS)
	brne	wa22
	dec	gr2
	brne	wa21
	ret
;-------------------------------------------------

;AT90S2313を使う場合
;*************************************
;Title	: ADRF ID Generater
;Date	:2004/6/4	BY JA1HWO
;*************************************
.include "C:\AVRTOOLS\APPNOTES\2313def.inc"
.cseg
.org	0
;------------------------------------
.equ	sound	=3		;PortD3	
.equ	KEY	=4		;PortD4 CW Mode
.equ	PTT	=5		;PortD5
.equ	PTTb	=6	;PortD6 not PTT
			;PortB0,B1	Timer
			;PortB2-7 A*234 - MO*567
.def	back_f	=r0		;SREG
.def	back_i	=r1		;SREG
.def	tc_set	=r2		;for Timer
.def	mo_SW	=r4		;Signal No
.def	a_SW	=r5		;Max SG
.def	kiki	=r6		;input PortB
.def	cunt_m	=r7		;1-7min counter
.def	Timer_c	=r8		;Minute
.def	temp	=r16
.def	gr1	=r17		;
.def	gr2	=r18		;
.def	ic_1	=r19		;60sec counter
.def	ic_2	=r20		;60sec counter
.def	speed	=r21		;CW Speed timer
.def	wcunt	=r22		;timer
;------------------------------------
	rjmp	star		;Reset
	reti			;External Interrupt0
	reti			;External Interrupt1
	reti			;Input Capture1 Interrupt
	reti			;Output Compare1 Interrupt
	reti			;timer overflow 1
	rjmp	T_60m		;timer overflow 0
	reti			;UART Receive Complete
	reti			;UART Data Register Empty
	reti			;UART Transmit Complete
	reti			;Analog Comparator
;DATA				[ USER CALL SET ]
CALL:	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,$93		;/
	rcall	CW_set
	ldi	gr1,$7b		;1
	rcall	CW_set
	rjmp	callb
;------------------------------------
star:	ldi	temp,LOW(RAMEND)
	out	SPL,temp

;***** 以後1200と共通プログラム *****
	ldi	temp,0		;all=input
	out	DDRB,temp

[もどる]もどる  [MAIN MENU

inserted by FC2 system