' ◇プログラムの利用は各自の責任でお願いします ' ハードウエアに合わせた修正が必要な場合は自由に行って構いませんが ' プログラムを利用して何らかの損害が生じても作者は責任を負いません ' ◇このプログラムの商用利用、不特定への無断配布はお断りします ' ◇本バージョンはIF10.700MHzにて50.472MHz〜50.7275MHzカバーです ' 実際のIFが10.693MHzの場合は50.465MHz〜50.7205MHzカバーになります ' 設定はプログラム中のIF周波数値、運用周波数下限値で行います '-------------------------------------------------------------------------------- 'Voltage Controled Digital Synthesizer program v2.41 '2014.08.18 (C)JA1VZV 'DDS out freq.= (F-10.7MHz)/2 'Add 10kHz step mode & TX freq. fix mode. $regfile = "m88def.dat" 'AVRの品種設定 $crystal = 128000 '内部128kHzで使用 '--- config port --- ポート入出力設定 (1=out,0=in) Config Portb = &H00 Config Portc = &B0111000 'C0=VRin,C3-5=DDSout,C6=Reset Config Portd = &H00 'D0=PTTin,D1=Step,D2=TX-fix '--- port pullup --- ポートプルアップ設定 Portb = &HFF Portc = &B1111110 Portd = &HFF '--- debounce set --- Config Debounce = 1 '接点デバウンス設定 1mS 'ADC mode setting & start ADC設定・開始 Config Adc = Single , Prescaler = Auto Start Adc '---Define Variables--- Dim R As Word 'VR ADC値 Dim R1 As Integer 'VR ADC前回値 Dim R2 As Long '周波数計算用 Dim Rd As Integer '周波数計算用 Dim Rm As Integer 'ADC値記憶用 Dim I As Long 'IF周波数 Dim F0 As Long '運用周波数下限値 Dim F As Long '運用周波数 Dim Ff As Single 'DDSデータ計算用 Dim Fa As Long 'DDSデータ計算用 Dim Fb As Long 'DDSデータ計算用 Dim Fc As Long 'DDSデータ計算用 Dim Fm As Long 'TX Freq.記憶用 Dim Fw As Word 'DDSデータ Dim Lk As Bit '不感帯設定フラグ Dim Md As Bit 'ダイアルモードフラグ Dim Rs As Bit 'DDS周波数レジスタフラグ Dim Ri As Bit 'TX Freq.固定モードフラグ Dim Tr As Bit '送受信フラグ (TX=1) '---Variables initialize--- I = 10700000 'IF周波数設定[Hz] 'Lk = 0 '不感帯設定(明示的初期化廃止) F0 = 50472000 '下限周波数設定 R1 = 1026 '初期ADC前回値 'Rs = 0 'DDSレジスタ選択(明示的初期化廃止) Md = PIND.1 'ダイアルモード読込 '---Send control word to DDS--- Fw = &H2000 'DDS転送モード設定 Gosub Dsd '*** Main loop *** ここからメインループ Do R = Getadc(0) 'ADC読込 Rd = R - R1 'ADC値変化幅計算 Rd = Abs(rd) '変化幅を絶対値化 If Lk = 0 Then '不感帯設定状態でなく If Rd > 1 Then 'ADC値が前回より2以上変化したら R1 = R '現在値を(前回値として)記憶 If Md = 0 Then 'Md値が0(=0.5kHz/stepモード)なら Shift R , Right , 1 ' ADC値÷2(ADC値9ビット化) R2 = R * 500 ' 1stepに500Hzを割付け Else 'Md値が1(=10kHz/stepモード)で If Ri = 0 Or Tr = 1 Then '送信時またはTX-freq. 非固定の場合 R = R \ 40 ' 25ステップ化 R2 = R * 10000 ' 1stepに10kHzを割付け R2 = R2 + 5000 ' 周波数下限値の5kHzを加算し解消 Else 'Tx-freq.固定の受信時 Shift R , Right , 1 ' ADC値÷2(ADC値9ビット化) R2 = R * 500 '1stepに500Hzを割付け End If End If F = F0 + R2 '運用周波数=下限値+加算値 Gosub Dds 'Ddsサブに飛びDDSに周波数書込み End If End If If Rd >= 12 Then Lk = 0 '不感帯設定中にADC値が ' 12以上(=±3kHz)変動すれば解除 ' Check PTT & Tx fix SW If Tr = 0 Then '受信時 Debounce Pind.0 , 0 , Tx , Sub 'PTT-ONのチェック Txサブへ End If If Tr = 1 Then '送信時 Debounce Pind.0 , 1 , Rx , Sub 'PTT-OFFのチェック Rxサブへ End If If Ri = 0 Then '送信周波数非固定時 Debounce Pind.2 , 1 , Fxon , Sub '固定開始検出 Fxonサブへ End If If Ri = 1 Then '送信周波数固定時 Debounce Pind.2 , 0 , Fxoff , Sub '固定解除検出 Fxoffサブへ End If Loop '= End main loop = メインループ終わり '*** DDS data calc *** DDS値計算サブルーチン Dds: 'Freq.calc If Ri = 1 And Tr = 1 Then '送信固定で送信時 Fa = Fm - I ' 記憶した周波数-IF周波数 Else '送信非固定または受信時 Fa = F - I ' ダイアル周波数-IF周波数 End If Shift Fa , Right , 1 '÷2 Ff = Fa * 4.02655800 'DDSデータに変換 Fb = Ff '整数化 Fc = Fb And &H3FFF 'MSB 2bitをマスク If Rs = 0 Then 'フラグ0ならDDSのF-Reg1へ書込み 'F-reg.1下位データ生成 Fw = Fc Or &H8000 '制御ビット付加 Gosub Dsd '転送サブ呼出 '上位データ生成 Shift Fb , Right , 14 '上位データを下位へ移動 Fw = Fb Or &H8000 '制御ビット付加 Gosub Dsd '転送サブ呼出 Fw = &H2800 'F-reg1選択コマンド設定 Gosub Dsd '転送サブ呼出 End If If Rs = 1 Then 'フラグ1ならDDSのF-Reg0へ書込み 'F-reg.0下位データ生成 Fw = Fc Or &H4000 '制御ビット付加 Gosub Dsd '転送サブ呼出 '上位データ生成 Shift Fb , Right , 14 '上位データを転送位置へ移動 Fw = Fb Or &H4000 '制御ビット付加 Gosub Dsd '転送サブ呼出 Fw = &H2000 'F-reg0選択コマンド設定 Gosub Dsd '転送サブ呼出 End If Toggle Rs 'F-reg.フラグ反転 Return '= End DDS Sub = '*** DDS send sub *** 転送サブルーチン Dsd: Reset Portc.5 'Fsync→L Shiftout Portc.3 , Portc.4 , Fw , 0 'DDSデータ・Sクロック出力 Set Portc.5 'Fsync→H Return '*** Tx sub *** Tx: If Ri = 0 Then Lk = 1 '送信非固定時は不感帯設定フラグをセット Tr = 1 '送受信フラグをセット(送信) Gosub Dds 'Ddsサブに飛びDDSに周波数書込み Return '*** Rx sub *** Rx: Tr = 0 '送受信フラグをリセット(受信) Gosub Dds 'Ddsサブに飛びDDSに周波数書込み Return '*** fix on sub *** Fxon: Fm = F 'ダイアル周波数直前値記憶 Rm = R 'ADC直前値記憶 Lk = 0 '不感帯設定フラグをリセット Ri = 1 '送信固定フラグをセット Return '*** fix off sub *** Fxoff: Ri = 0 '送信固定フラグをリセット R1 = Rm '送信固定直前ADC値をADC比較値に書き戻し Rd = R - Rm '固定直前のADC値と現在値の差分計算 Rd = Abs(rd) If Rd <= 12 Then '差が12(±3kHz)以内なら F = Fm '周波数を固定直前の値に戻す Lk = 1 '不感帯設定フラグをセット End If Return