| RE: Synteza na AD9851 a Bascom AVR 
 
				Witam,
 Ostatnio zdobyłem scalaki AD9834 i znalazłem program do jego obsługi lecz z ograniczeniem do pasma 40M , nie wiem jak obliczyć dzielnik przy generatorze 75Mhz,80Mhz oraz dodać pełny zakres 1 do 40 Mhz  , program poniżej
 
 '********************************************************
 'AD9834 DDS VFO program
 '
 '     7.000Mhz to 7.200Mhz Limitted!
 '     (VFO frequency = IF frequency + Frequency)
 '                                       2014/01/07
 '                                           JA2GQP
 ' BASCOM AVR 2.0.7.5(DEMO version) Compiled
 '--------------------------------------------------------
 '  Function
 '
 '     1.Upper heterodyne
 '     2.RIT operation(-10khz to +10khz)
 '     3.STEP(10000,1000,100,10)
 '     4.Memory operation is push RIT
 '       (Frequency and Step)
 '     5. Protection operation at the time of transmission
 '********************************************************
 
 $regfile = "m88adef.dat"
 $crystal = 800000                                           '0.8Mhz clock
 
 '--- config port ---
 Config Portb = &B00000000                                   '0=TX,1-6=none
 Config Portd = &B00001111                                   '0=FSYNC,1=SCLK,2=SDATA,3=none
 '4=ENC B,5=ENC A,6=STEP,7=RIT
 '--- port pullup ---
 Portb = &B11111111                                          'All
 Portd = &B11110000                                          'RIT,STEP,ENC A,ENC B
 
 '--- debounce set ---
 Config Debounce = 1
 
 '---LCD port assign ---
 Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1
 Config Lcdpin = Pin , Db5 = Portc.2 , Db4 = Portc.3
 Config Lcdpin = Pin , E = Portc.4 , Rs = Portc.5
 Config Lcd = 16 * 2
 
 '--- constant data ---
 Const If_frq = 8468500                                      'IF frequency(LSB carrier point)
 Const Lw_frq = 7000000                                      'Lower limit operation frequency
 Const Hi_frq = 7200000                                      'Upper limit operation frequency
 Const Def_frq = 7050000                                     'Operation frequency(initial)
 Const Lw_vfo = If_frq + Lw_frq                              'VFO lower limit
 Const Hi_vfo = If_frq + Hi_frq                              'VFO upper limit
 Const Def_vfo = If_frq + Def_frq                            'VFO operation frequency(initial)
 Const Lw_rit = -10000                                       'RIT lower limit
 Const Hi_rit = 10000                                        'RIT upper limit
 'Const Scal = 4.00000                                       '2^28/2^26  2^26(X'tal 67.108864Mhz)
 Const Scal = 5.36870912                                     '2^28/50000000 (X'tal 50.000Mhz)
 
 '--- define subrutine ---
 Declare Sub Enc_sub                                         'Encorder
 Declare Sub Dds_sub                                         'DDS
 Declare Sub Lcd_sub                                         'LCD
 Declare Sub Stp_sub                                         'STEP
 Declare Sub Rit_sub                                         'RIT
 Declare Sub Rx_sub                                          'RX
 Declare Sub Tx_sub                                          'TX
 
 '--- define memory ---
 Dim Vfo_dat As Long                                         'VFO freqency data
 Dim Dds_dat As Long                                         'DDS frequency data
 Dim Str_frq As String * 10                                  'String frequency
 Dim Dsp_frq As String * 10                                  'Display frequency
 Dim Sng_wrk As Single                                       'main channel
 Dim Lng_wk1 As Long                                         'Long work1
 Dim Lng_wk2 As Long                                         'Long work2
 Dim Wrd_wk1 As Word                                         'Word work1
 Dim Wrd_wk2 As Word                                         'Word work2
 Dim Wrd_wk3 As Word                                         'Word work3
 Dim Enc_stp As Integer                                      'Encorder step
 Dim Rit_dat As Integer                                      'RIT data
 Dim Int_wrk As Integer                                      'Integer work
 Dim Flg_rit As Byte                                         'RIT flag
 Dim Flg_tx As Byte                                          'TX flag
 Dim Frq_eep As Eram Long                                    'power off frequency A
 Dim Stp_eep As Eram Integer                                 'EEP STEP data
 
 '--------------
 'Main roution
 '--------------
 
 Main:
 Flg_tx = 0
 Flg_rit = 0                                              'RIT flag
 
 If Frq_eep =< 0 Then                                     'EEP VFO data check
 Vfo_dat = Def_vfo                                     'Initialize VFO data
 Frq_eep = Vfo_dat
 Else
 Vfo_dat = Frq_eep                                  'Restore VFO data
 End If
 
 If Stp_eep =< 0 Then                                     'EEP STEP data check
 Enc_stp = 1000
 Stp_eep = Enc_stp                                     'Initialize STEP data
 Else
 Enc_stp = Stp_eep
 End If                                             'Restore STEP data
 
 Cursor Off
 Cls
 Call Lcd_sub                                             'LCD
 
 Do
 If Flg_tx = 0 Then
 Debounce Pind.5 , 0 , Enc_sub , Sub                'Encorder
 Debounce Pind.6 , 0 , Stp_sub , Sub                'Step
 Debounce Pind.7 , 0 , Rit_sub , Sub                'RIT
 End If
 
 Debounce Pinb.0 , 1 , Rx_sub , Sub                 'RX
 Debounce Pinb.0 , 0 , Tx_sub , Sub                 'TX
 
 If Flg_rit = 1 Then
 Dds_dat = Vfo_dat + Rit_dat
 Else
 Dds_dat = Vfo_dat
 End If
 
 If Flg_tx = 1 Then
 Dds_dat = Vfo_dat
 End If
 
 Call Dds_sub
 
 Loop
 End
 
 '-----------------------------
 'Encoder check,Create DDS data
 '-----------------------------
 
 Sub Enc_sub
 Int_wrk = Enc_stp
 If Pind.4 = 1 Then                                       'Up
 Lng_wk1 = Vfo_dat + Int_wrk
 Lng_wk2 = Rit_dat + Enc_stp
 Else
 Lng_wk1 = Vfo_dat - Int_wrk                        'down
 Lng_wk2 = Rit_dat - Enc_stp
 End If
 
 
 If Flg_rit = 1 Then
 Rit_dat = Lng_wk2
 Else
 Vfo_dat = Lng_wk1
 Rit_dat = 0
 End If
 
 If Vfo_dat < Lw_vfo Then                                 'VFO lower limit check
 Vfo_dat = Lw_vfo
 End If
 
 If Vfo_dat > Hi_vfo Then                                 'VFO upper limit check
 Vfo_dat = Hi_vfo
 End If
 
 If Rit_dat < Lw_rit Then                                 'RIT lower limit check
 Rit_dat = Lw_rit
 End If
 
 If Rit_dat > Hi_rit Then                                 'RIT upper limit check
 Rit_dat = Hi_rit
 End If
 
 Call Lcd_sub
 End Sub
 
 '-----------------------------
 'AD9834(DDS) Data write
 '-----------------------------
 
 Sub Dds_sub
 Sng_wrk = Dds_dat * Scal
 Lng_wk1 = Sng_wrk
 Wrd_wk1 = Lng_wk1 And &H3FFF
 Wrd_wk2 = Wrd_wk1 Or &H4000
 
 Shift Lng_wk1 , Right , 14
 Wrd_wk3 = Lng_wk1 Or &H4000
 
 Wrd_wk1 = &H2000
 
 Reset Portd.2
 Shiftout Portd.0 , Portd.1 , Wrd_wk1 , 0
 Shiftout Portd.0 , Portd.1 , Wrd_wk2 , 0
 Shiftout Portd.0 , Portd.1 , Wrd_wk3 , 0
 Set Portd.2
 End Sub
 
 '-----------------------------
 'LCD Data write
 '-----------------------------
 
 Sub Lcd_sub
 Cls
 Locate 1 , 1
 Lng_wk1 = If_frq
 Lng_wk1 = Vfo_dat - If_frq
 Str_frq = Str(lng_wk1)
 Str_frq = Format(str_frq , "00.000000")
 Dsp_frq = Left(str_frq , 3) + Mid(str_frq , 4 , 3) + "." + Mid(str_frq , 7 , 3)
 Lcd "F:" ; Dsp_frq ; "MHz"
 Locate 2 , 1
 Lcd "S:    "
 Locate 2 , 3
 
 If Enc_stp < 1000 Then
 Lcd Enc_stp
 Elseif Enc_stp = 10000 Then
 Lcd "10k  "
 Else
 Lcd "1k   "
 End If
 
 If Flg_rit = 1 Then
 Locate 2 , 8
 Lcd "R:"
 Str_frq = Str(rit_dat)
 Str_frq = Format(str_frq , "00.000")
 Locate 2 , 10
 Lcd Str_frq
 Else
 Locate 2 , 8
 Lcd "   JA2GQP"
 End If
 End Sub
 
 '-----------------------------
 'Step
 '-----------------------------
 
 Sub Stp_sub
 Select Case Enc_stp
 Case 10000:
 Enc_stp = 1000                                     '1000
 Case 1000:
 Enc_stp = 100                                      '100
 Case 100:
 Enc_stp = 10                                       '10
 Case 10:
 Enc_stp = 10000                                    '10000
 Case Else:
 Enc_stp = 1000                                     '1000(initial)
 End Select
 
 Call Lcd_sub
 End Sub
 
 '-----------------------------
 'RIT
 '-----------------------------
 
 Sub Rit_sub
 If Flg_rit = 0 Then
 Rit_dat = 0
 Flg_rit = 1
 Frq_eep = Vfo_dat                                     'Save VFO data
 Stp_eep = Enc_stp                                     'Save STEP data
 Else
 Flg_rit = 0
 End If
 Call Lcd_sub
 End Sub
 
 '-----------------------------
 'RX
 '-----------------------------
 
 Sub Rx_sub
 If Flg_tx = 1 Then
 Flg_tx = 0                                            'TX flag rest
 Locate 1 , 1
 Lcd "F"
 End If
 End Sub
 
 '-----------------------------
 'TX
 '-----------------------------
 
 Sub Tx_sub
 If Flg_tx = 0 Then
 Flg_tx = 1                                            'TX flag set
 Locate 1 , 1
 Lcd "T"
 End If
 End Sub
 
				
(Ten post był ostatnio modyfikowany: 30-11-2014 10:37 przez SQ9GAC.)
 |