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]