AVR 107 :コール入力のIDG-X


コール入力が出来るIDGです

 以前、AT90S2313を使って試していた物をBODの付いているATTiny26に移植した物です。
 これだと電源を切っても勝手にコールが書き換わる事はありません、AT90S2313でもリセットICを付ければ同じ動作をします(リセットICも安くないので付属の物を使いました)。

 本来はメインプログラムにコールを入れて書込むのが最も安定して良いのですが、書込み器を持ってない方の為に作りました(動作は同じです)。

 「ARDF 用 IDジェネレータの作り方」は[別のMENU]をご覧下さい、CALLの入れ方など関連の説明もありますので参考にして下さい。
 組立て例はMenu内の「IDジェネレータ (2)」です。

 2004/JUL/15 

プログラムプログラム(続き)

;*************************************
;Title	: ADRF Signal_generater
;Date	:2004/6/4	BY JA1HWO
;Last	:Tiny26	7/8 Timer
;*************************************
; ADRF用の信号発生機で1分間にDE+CALL+MOE(MOI.S.H.5)+MOE+...
; 機器数の設定で5台分設定可、信号の番号の設定(MOE)の設定が出来。
;例全部で3台でこのセットは2番目(MOI)等です。
; 出力はCW信号の他、1KHz近くの音で変調した物と1分間のPTT信号を設定した。
; CALL入力モードはSWを押しながら電源を入れる、直ぐBKと始まり数字、
;文字が出るので必要な物の所でボタンを押していると"OK"が出て次の文字入力になる。
; "BK"で押すと入力は終了、ミスしたら初めからやり直し!通り過ぎたら
;1回転するのを待つ。

.include "C:\AVRTOOLS\APPNOTES\Tn26def.inc"

.eseg
.org 0
TEST_DATA:
.db	$FF,$31,$FF,0
;	?	:$FF=Space	0=END

.cseg
.org	0
;**** set ****
;				PortA1 A-SW MO*SW Timer
.equ	sound	=0		;PortB0	
.equ	key	=1		;PortB1 CW Mode
.equ	PTT	=2		;PortB2
.equ	PTTb	=3	;PortB3 not PTT for Handy transceiver
				;PortB4.5 Xtal
.equ	in_sw	=6		;PortB6  input

.def	m_data	=r0
.def	back_f	=r1		;SREG
.def	back_i	=r2		;SREG
.def	tc_set	=r3		;for Timer
.def	mo_SW	=r4		;Signal No
.def	ac_SW	=r5		;Max SG
.def	kiki	=r6		;input PortA
.def	cunt_m	=r7		;1-7min counter
.def	call_no	=r8		;ward No
.def	Timer_c	=r9		;Minute

.def	temp	=r16
.def	gr0	=r17		;
.def	gr1	=r18		;
.def	gr2	=r19		;
.def	ic_1	=r20		;60sec counter
.def	ic_2	=r21		;60sec counter 2
.def	speed	=r22		;for KEY
.def	wcunt	=r23		;timer
;------------------------------------
	rjmp	star		;Reset
	reti			;External Interrupt0
	reti			;Pin change
	reti			;Output Compare1A
	reti			;Output Compare1B
	reti			;Overflow1
	rjmp	T_60m		;Overflow0
	reti			;USI_STARTaddr
	reti			;USI_OVFaddr
	reti			;EEPROM Ready
	reti			;Analog Comparator
	reti			;A/D変換完了
star:
	ldi	temp,LOW(RAMEND)
	out	SPL,temp	;RAM=128
	ldi	temp,0		;all=input
	out	DDRA,temp
	ldi	temp,$ff
	out	PortA,temp	;pull up
	ldi	temp,0b00111111	;
	out	DDRB,temp	;PortB output/B6 input
	sbi	PortB,in_sw	;pullup
	sbi	ACSR,ACD	;Analog Comparator off
	sbi	PortB,PTTb	;PTT Off
	in	kiki,PinA	;PortA check
	com	kiki
	sbic	PinB,in_sw	;check SW
	rjmp	m_n		;nomal to main
	ldi	speed,120	;cw span
	clr	call_no
;--------------------------------------------
;CALL input Mode
call_in:
	ldi	ZL,low(m_code*2)
	ldi	ZH,high(m_code*2)
call_1:	lpm
	mov	gr1,m_data	;
	and	m_data,m_data
	breq	call_in		;end to again
	rcall	CW_set		;gr1=DATA to CW
	ldi	gr1,$ff
	rcall	CW_set		;"_"
	sbic	PinB,in_sw	;check key ?
	rjmp	call_2		;nomal to next
	ldi	speed,80
	ldi	gr1,$EF		;OK mark "O"
	rcall	CW_set		;
	ldi	gr1,$AF		;OK mark "K"
	rcall	CW_set		;
	ldi	speed,120
	ldi	gr1,$ff
	rcall	CW_set		;"_"
;1文字 Save m_data to EEPROM
	mov	gr0,call_no	;address
	mov	gr1,m_data	;DATA
	cpi	gr1,$8A		;"BK"
	brne	call_11
	clr	gr1	
call_11:
	rcall	eepw		;EEPROM write
	inc	call_no
	ldi	temp,$0f	;Max 16
	cp	temp,call_no
	brcs	m_n
	mov	gr1,m_data
	cpi	gr1,$8A		;"BK"
	breq	m_n		;end! to main
	ldi	gr1,$ff
	rcall	CW_set		;"_"
	ldi	gr1,$ff
	rcall	CW_set		;"_"
	ldi	gr1,$ff
	rcall	CW_set		;"_"
	rjmp	call_in		;next ward
call_2:	adiw	ZL,1
	rjmp	call_1		;Loop
;	Nomal Mode
m_n:	ldi	temp,1
	mov	cunt_m,temp
	clr	ic_1		;i_minute counter
	clr	ic_2
	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	;
	ldi	temp,2
	out	TIMSK,temp	;Timse Interrupts ON
	ldi	temp,0b00100000	;スリープ許可/アイドル動作
	out	MCUCR,temp
	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		;begin
time:	mov	temp,kiki	;MO check?
	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	;PortA 567
	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	ac_SW,temp	;PortA 234
;--------------------------------------------
main:	SLEEP
	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,8		;Wait0.25*8=2 Sec
main1:	ldi	speed,250	;250*1mS
	rcall	wait2
	dec	temp
	brne	main1
	ldi	speed,80	;
	sbi	PortB,PTT	;PTT ON
	cbi	PortB,PTTb	;PTT ON
	ldi	gr1,$8f		;DE_
	rcall	CW_set
	ldi	gr1,$3f
	rcall	CW_set
	ldi	gr1,$ff
	rcall	CW_set
	clr	gr0		;CALL read and Send
main01:	rcall	eepr	;gr0=address to gr1=data
	and	gr1,gr1
	breq	main02
	rcall	CW_set		;gr1=DATA to CW
	inc	gr0
	rjmp	main01
main02:
	ldi	gr1,$ff		;" "
	rcall	CW_set
	sbrs	kiki,1		;if bit1=H(SW ON)
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	PortB,key	;OFF Limit
	cbi	PortB,PTT	;PTT Off
	sbi	PortB,PTTb	;PTT Off
	rjmp	main
;-------------------------------------------------
;gr1=DATA	use temp	sub Wait
;output PortB6 Set & Clear/key 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	PortB,key	;ON(H)
	rcall	wait
	out	SREG,back_f
	brcc	c_3		;s to
	rcall	wait
	rcall	wait
c_3:	cbi	PortB,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..ac_SW
	dec	Timer_c
	cp	ac_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
;-------------------------------------------------
;use	:gr0=[address] to gr1=[data]
eepr:	out	EEAR,gr0
	sbi	EECR,EERE
	sbi	EECR,EERE
	in	gr1,EEDR
	ret
eepw:	out	EEAR,gr0	;
	out	EEDR,gr1
	sbi	EECR,EEMWE
	sbi	EECR,EEWE
eepwe:	sbic	EECR,EEWE
	rjmp	eepwe	
	ret
;-------------------------------------------------
Wait:		;3.58MHz=0.2793(1mS)
	mov	gr2,speed
wa1:	sbi	PortB,sound
	ldi	wcunt,224	;4*224*0.279u=250uS
wa2:	nop
	dec	wcunt
	brne	wa2
	cbi	PortB,sound
	ldi	wcunt,224
wa3:	nop
	dec	wcunt
	brne	wa3
	dec	gr2
	brne	wa1
	mov	gr2,speed
wa11:	sbi	PortB,sound
	ldi	wcunt,224	;
wa12:	nop
	dec	wcunt
	brne	wa12
	cbi	PortB,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
;-------------------------------------------------
m_code:	;BK(end_mark)A to Z and 1 to 0 + / (all=38+0)
.db	$8A,$5F,$87,$A7,$8F,$3F,$27,$CF		;BK A-G
.db	$07,$1F,$77,$AF,$47,$DF,$9F,$EF		;H-O
.db	$67,$D7,$4F,$0F,$BF,$2F,$17,$6F		;P-W
.db	$97,$B7,$C7,$7B,$3B,$1B,$0B,$03		;X-Z 1-5
.db	$83,$C3,$E3,$F3,$FB,$93,0			;6-0 /
;-------------------------------------------------

[もどる]もどる  [MAIN MENU

inserted by FC2 system