3.579904MHz(カラーTV用)に変更
[前回のプログラム]は周波数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]