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


80m用 IDジェネレータ U

 [前回のプログラム]は1MHzでの簡単コントローラでしたが周波数を正確に合わせたいと思い、競技で使う周波数3.520MHzで動作するのを目標に作ってみる事にしました。
 コントロール自体は同じですがタイミングを水晶やセラロックで合わせるのでかなり精度を保てます。

 複数のコントローラを同時に使うには、1分交代で電波を出す事になるので精度の高い物が要求されます。水晶発振素子が一般的ですが安価なセラロックも考えに入れてみました(手持ちの物が有る)。

回路図 プログラム!

 プログラムは前回の物とほぼ同じですが、タイマー関係が少し異なります、簡単に説明すると1MHzだった物が3.52MHzですから単純に3.52倍すれば出来る事になります。
 実際のプログラムは内像のタイマーを使います、一応8ビットのものを使う事にして3.52MHzを1/1024と1/250を設定しここで割込みが発生します。
 割込み処理プログラムで825個数えると丁度60秒となり1分が取り出せる事になります((1/3.52*10-6)*(211.2*106))。
 この1分を利用して何台作動させるかの[A]スイッチ・何台目を担当するのかの[MO]スイッチからコントロール信号を作っています。

 他Wait等のタイミングを少し変更しています。Timerがもう一つ有れば(そのavrは多数ある)プログラム的には少し簡単に出来る。また16bitタイマーが使えるとこれ又コントロールが少し楽になります。

 信号は1分間続き「DE+CALL+MO*」で以後MO*が繰り返されます。

変 更

 私のコールサインを書換えれば皆さんの物に変更出来ます、モールス符号のスピードは[speed]パラメーターの数を変更すれば出来ます。
 speedの単位は短点換算で1mS(1/1000秒)づつ設定出来るので好みの速さに調整して下さい。

特 徴

 発振部を水晶やセラロックにすると発振が電源電圧から影響を受けないので電圧を下げる事が出来ます。
 「一般にICは5V動作で使います」がavrは2.5Vでも作動するので乾電池2個での使用も可能です、これだと消費電流もかなり減って助かります。
 ただ、その発振電力を使いたい場合、電圧が低いと「パワーとしては思ったほど取り出せない」事になりますが通常のコントロールでは全く問題にならず使えます。

 2004/JUN/20 

IC=ピン[AT90S1200]

@ ;リセット
A ;未使用
B ;未使用
C ;Xtal
D ;Xtal
E ;未使用
F ;sound/PortD3
G ;LED/PortD4 CW Mode
H ;PTT/PortD5
I ;電源-
S ;電源+
R ;MO-4/PortB7
Q ;MO-2/PortB6
P ;MO-1/PortB5
O ;A-4/PortB4
N ;A-2/PortB3
M ;A-1/PortB2
L ;未使用
K ;未使用
J ;PTTb/PortD6
プログラムプログラム(続き)
;*************************************
;Title	: ADRF Signal_generater
;Date	:2004/6/4	BY JA1HWO
;	:6/14 3.52MHz	[CWG3_614.asm]
;*************************************

.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	ic_1	=r19		;60sec counter
.def	ic_2	=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	ic_1		;counter
	clr	ic_2
	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
	brne	s_2
	ldi	temp,1
s_2:	cpi	temp,5
	brcs	s_3
	ldi	temp,5
s_3:	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,120	;
	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,200	;
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
T_60m:
	in	back_i,SREG	;*825=60S(1 minute)
	inc	ic_1
	brne	t_601
	inc	ic_2
t_601:
	cpi	ic_1,low(825)	;825=$339
	brne	t_6e
	cpi	ic_2,high(825)
	brne	t_6e		;
	clr	ic_1
	clr	ic_2
	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:		;3.52MHz=0.284uS 1mS
	mov	gr2,speed
wa1:	sbi	PortD,sound
	ldi	wcunt,220	;
wa2:	nop			;4*220*0.284u=250uS
	dec	wcunt
	brne	wa2
	cbi	PortD,sound
	ldi	wcunt,220
wa3:	nop
	dec	wcunt		;4*220*0.284u=250uS
	brne	wa3
	dec	gr2
	brne	wa1
	mov	gr2,speed
wa11:	sbi	PortD,sound
	ldi	wcunt,220	;
wa12:	nop
	dec	wcunt		;4*220*0.284u=250uS
	brne	wa12
	cbi	PortD,sound
	ldi	wcunt,220
wa13:	nop
	dec	wcunt		;4*220*0.284u=250uS
	brne	wa13
	dec	gr2
	brne	wa11
	ret
;-------------------------------------------------
Wait2:		;3.52MHz=0.2841uS
	mov	gr2,speed	;speed*1mS
wa21:	ldi	wcunt,251	;
wa22:	nop			;
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop			;14*251*0.2841u=1000uS(1mS)
	dec	wcunt
	brne	wa22
	dec	gr2
	brne	wa21
	ret
;-------------------------------------------------
;ADRF用の信号発生機で1分間にDE+CALL+MOE(MOI.S.H.5)+MOE+...
;機器数の設定で5台分設定と信号の番号の設定(MOE)の設定が出来。
;全部で3台でこのセットは2番目(MOI)等です。
;出力はCW信号の他、1KHz近くの音で変調した物と1分間のPTT信号を設定した。
;-------------------------------------------------

[もどる]もどる  [MAIN MENU

inserted by FC2 system