HomeMade
Synteza na AD9851 a Bascom AVR - Wersja do druku

+- HomeMade (http://sp-hm.pl)
+-- Dział: Urządzenia nadawczo odbiorcze KF (/forum-62.html)
+--- Dział: Syntezy częstotliwości i moduły DSP (/forum-74.html)
+--- Wątek: Synteza na AD9851 a Bascom AVR (/thread-1609.html)

Strony: 1 2 3 4 5 6


RE: Synteza na AD9851 a Bascom AVR - SP6-11003 - 06-06-2013 8:17

Kolego free , dokładnie nic. Program jest właśnie napisany pod układy AD9850.

Poniżej jest kod, który aktualnie steruje moją syntezą w Piligrim.

Kod:
'      Sterownik Syntezera
'      Copyright 2012 SQ9MDD <rlabus@luxmat.com>
'
'      This program is free software; you can redistribute it and/or modify
'      it under the terms of the GNU General Public License as published by
'      the Free Software Foundation; either version 2 of the License, or
'      (at your option) any later version.
'
'      This program is distributed in the hope that it will be useful,
'      but WITHOUT ANY WARRANTY; without even the implied warranty of
'      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'      GNU General Public License for more details.
'
'      You should have received a copy of the GNU General Public License
'      along with this program; if not, write to the Free Software
'      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
'      MA 02110-1301, USA.
'
'
'-----------------------------------------------------------------
Const Firmwareversion = "mod 1.2"
$regfile = "M8def.dat"
$crystal = 4000000
$hwstack = 64
$swstack = 10
$framesize = 40

Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Pind.1 , Db5 = Pind.2 , Db6 = Pind.0 , Db7 = Pind.3 , E = Pinc.4 , Rs = Pinc.5

  Cursor Off
Cls
Locate 1 , 1
Lcd "Syntezer DDS  AD9850"
Locate 2 , 5
Lcd "Piligrim SMD"
Wait 2

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portc.0 = Input
Config Portc.1 = Input
Config Portc.2 = Input
Config Portc.3 = Input
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portb.7 = 1
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1

Dds_fq_ud Alias Portb.4
Dds_w_clk Alias Portb.5
Dds_data Alias Portb.3

Dim Freq As Long
Dim Freq_a As Long
Dim Freq_b As Long
Dim Freqtolcd As String * 7
Dim Enc As Byte
Dim Vfo As Bit
Dim Krok As Integer
Dim Krok_a As Integer
Dim Krok_b As Integer
Dim Kierunek As Bit
Dim Modulacja As Byte
Dim Modulacja_a As Byte
Dim Modulacja_b As Byte
Dim Freq_beram As Eram Long
Dim Freq_aeram As Eram Long
Dim Krok_aeram As Eram Integer
Dim Krok_beram As Eram Integer
Dim Modulacja_aeram As Eram Byte
Dim Modulacja_beram As Eram Byte
Dim Lock_bit As Bit
Dim Antena As Byte
Dim Licznik As Bit
Dim Init As Byte
Dim Freqtodds As Single
Dim Freqtoddsready As Long

Declare Sub Wyslij_f_do_dds

Cursor Off
Echo Off

Set Dds_w_clk : Waitus 10 : Reset Dds_w_clk : Waitus 10
Set Dds_fq_ud : Waitus 10 : Reset Dds_fq_ud : Waitus 10
Init = &H00


If Freq_aeram > 1000 Then
   Freq = Freq_aeram
   Freq_a = Freq_aeram
   Freq_b = Freq_beram
   Krok = Krok_aeram
   Krok_a = Krok_aeram
   Krok_b = Krok_beram
   Modulacja = Modulacja_aeram
   Modulacja_a = Modulacja_aeram
   Modulacja_b = Modulacja_beram
   Antena = 1
Else
   Freq = 371500
   Freq_a = 371500
   Freq_b = 371500
   Krok = 100
   Krok_a = 100
   Krok_b = 100
   Modulacja = 2
   Modulacja_a = 2
   Modulacja_b = 2
   Antena = 1
End If

Wait 1
Cls
Gosub Wyswietlacz

  Do

   Debounce Pinc.1 , 0 , Modechange , Sub
   Debounce Pinc.3 , 0 , Gen , Sub
   Debounce Pinc.2 , 0 , Band , Sub
   Debounce Pinb.2 , 0 , Zmianakroku , Sub
   Debounce Pinc.0 , 0 , Ant , Sub
   Enc = Encoder(pinb.0 , Pinb.1 , Prawo , Lewo , 0)

Loop

End

Lewo:
If Kierunek = 1 Then
   Kierunek = 0
   Return
End If
If Enc = 2 Or Enc = 1 Then
   Freq = Freq - Krok
End If
If Freq < 100000 Then
   Freq = 3000000
End If
Gosub Freq_update
Return

Prawo:
If Kierunek = 0 Then
   Kierunek = 1
   Return
End If                                                      '
If Enc = 3 Or Enc = 0 Then
   Freq = Freq + Krok
End If
If Freq > 3000000 Then
   Freq = 100000
End If
Gosub Freq_update
Return

Ant:

If Antena = 1 Then
   Antena = 2
Elseif Antena = 2 Then
        Antena = 1

   End If
Gosub Wyswietlacz
Return

Zmianakroku:
If Krok = 10000 Then
   Krok = 1000
Elseif Krok = 1000 Then
   Krok = 100
Elseif Krok = 100 Then
   Krok = 10
Elseif Krok = 10 Then
   Krok = 1
Elseif Krok = 1 Then
   Krok = 10000

   End If
Gosub Wyswietlacz
Return

Modechange:
  If Modulacja = 1 Then
   Modulacja = 2
  Elseif Modulacja = 2 Then
   Modulacja = 3
  Elseif Modulacja = 3 Then
   Modulacja = 1
  End If
Gosub Wyswietlacz
Return

Gen:
   If Vfo = 1 Then
      Freq_b = Freq
      Freq_beram = Freq_b
      Freq = Freq_a
      Modulacja_b = Modulacja
      Modulacja_beram = Modulacja_b
      Modulacja = Modulacja_a
      Krok_b = Krok
      Krok_beram = Krok_b
      Krok = Krok_a
      Vfo = 0
   Elseif Vfo = 0 Then
      Freq_a = Freq
      Freq_aeram = Freq_a
      Freq = Freq_b
      Modulacja_a = Modulacja
      Modulacja_aeram = Modulacja_a
      Modulacja = Modulacja_b
      Krok_a = Krok
      Krok_aeram = Krok_a
      Krok = Krok_b
      Vfo = 1
   End If
Gosub Wyswietlacz
Return

Band:
   If Freq < 370000 Then
      Freq = 370000
      Locate 2 , 7
      Lcd "80m "
      Portd.4 = 0
      Portb.6 = 0
      Portb.7 = 1
      Portd.5 = 0
      Modulacja = 2
   Elseif Freq < 700000 Then
      Freq = 700000
      Locate 2 , 7
      Lcd "40m "
      Portd.4 = 0
      Portb.6 = 0
      Portb.7 = 1
      Portd.5 = 1
      Modulacja = 2
   Elseif Freq < 1010000 Then
      Freq = 1010000
      Locate 2 , 7
      Lcd "30m "
      Portd.4 = 0
      Portb.6 = 1
      Portb.7 = 0
      Portd.5 = 0
      Modulacja = 1
   Elseif Freq < 1400000 Then
      Freq = 1400000
      Locate 2 , 7
      Lcd "20m "
      Portd.4 = 0
      Portb.6 = 1
      Portb.7 = 0
      Portd.5 = 1
      Modulacja = 3
   Elseif Freq < 1800000 Then
      Freq = 1806800
      Locate 2 , 7
      Lcd "17m "
      Portd.4 = 0
      Portb.6 = 1
      Portb.7 = 1
      Portd.5 = 0
      Modulacja = 3
   Elseif Freq < 2100000 Then
      Freq = 2100000
      Locate 2 , 7
      Lcd "15m "
      Portd.4 = 0
      Portb.6 = 1
      Portb.7 = 1
      Portd.5 = 1
      Modulacja = 3
   Elseif Freq < 2480000 Then
      Freq = 2489000
      Locate 2 , 7
      Lcd "12m "
      Portd.4 = 1
      Portb.6 = 0
      Portb.7 = 0
      Portd.5 = 0
      Modulacja = 3
   Elseif Freq < 2800000 Then
      Freq = 2800000
      Locate 2 , 7
      Lcd "10m "
      Portd.4 = 1
      Portb.6 = 0
      Portb.7 = 0
      Portd.5 = 1
      Modulacja = 3
   Elseif Freq >= 2800000 Then
      Freq = 181000
      Locate 2 , 7
      Lcd "160m"
      Portd.4 = 0
      Portb.6 = 0
      Portb.7 = 0
      Portd.5 = 1
      Modulacja = 2
   End If
      Gosub Wyswietlacz
Return

Freq_update:
Locate 1 , 1
   Freqtolcd = Str(freq)
   If Len(freqtolcd) <= 6 Then
      Freqtolcd = " " + Freqtolcd
   End If
      Lcd Left(freqtolcd , 2)
      Lcd "."
      Lcd Mid(freqtolcd , 3 , 3)
      Lcd "."
      Lcd Right(freqtolcd , 2)
      Lcd "0 Hz"
      Call Wyslij_f_do_dds
Return

Wyswietlacz:
Gosub Freq_update
Locate 1 , 15
If Krok = 1 Then
      Lcd "  10Hz"
   Elseif Krok = 10 Then
      Lcd " 100Hz"
   Elseif Krok = 100 Then
      Lcd "  1kHz"
   Elseif Krok = 1000 Then
      Lcd " 10kHz"
   Elseif Krok = 10000 Then
      Lcd "100kHz"
End If
Locate 2 , 1
   Lcd "VFO-"
   If Vfo = 1 Then
      Lcd "B"
   Elseif Vfo = 0 Then
      Lcd "A"
   End If
Locate 2 , 13
   If Modulacja = 1 Then
      Lcd "CW "
      Portd.7 = 0
   Elseif Modulacja = 2 Then
      Lcd "LSB"
      Portd.7 = 0
   Elseif Modulacja = 3 Then
      Lcd "USB"
      Portd.7 = 1
   End If
Locate 2 , 18
   If Antena = 1 Then
      Lcd "A-1"
      Portd.6 = 0
   Elseif Antena = 2 Then
      Lcd "A-2"
      Portd.6 = 1
   End If

Return

Sub Wyslij_f_do_dds
   Freqtodds = Freq * 343.602
   Freqtoddsready = Freqtodds
   Shiftout Dds_data , Dds_w_clk , Freqtoddsready , 3 , 32
   Shiftout Dds_data , Dds_w_clk , Init , 3 , 8
   Set Dds_fq_ud : Waitus 10 : Reset Dds_fq_ud : Waitus 10
End Sub


" Na stole " aktualnie jest dalej rozwijany ten wsad ale ma jeszcze dużo nie dociągnięć.


RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 06-06-2013 17:06

mam jeszcze jedno pytanie czy moduły http://ja9ttt.blogspot.de/2012/01/ad985051-dds-control-part2.html będą pracować prawidłowo przy napięciu 3 V ?


RE: Synteza na AD9851 a Bascom AVR - SP6-11003 - 06-06-2013 17:43

Sam układ AD9850 powinien pracować przy 3,3V zasilania ale nie wiem jak wygląda sprawa z generatorem kwarcowym zawartym w tym module.


RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 06-06-2013 17:52

program Ryśka trochę zmieniłem , ale nie wiem jak ustawić pośrednią odsłuchuje generator na odbiorniku i częstotliwość mam taką jaką ustawie na syntezie np. 28 Mhz
włączam syntezę i słyszę sygnał


RE: Synteza na AD9851 a Bascom AVR - SP6-11003 - 06-06-2013 18:12

Ta moja modyfikacja nie obsługuje pośredniej.

W kodzie którym zamieścił Rysiek "klawiszem" odpowiedzialnym za wejście do menu ustawień pośredniej jest ten kawałek kodu :

Kod:
If Pind.6 = 0 Then
  Konfig_bit = 1

W czasie normalnej pracy programu temu klawiszowi przypisana jest funkcja "Band" :

Kod:
Debounce Pind.6 , 0 , Band , Sub

Samo wejście do Menu jest możliwe poprzez przytrzymanie klawisza w tym przypadku "Band" przy wyłączonej syntezie i trzymając go dalej należy ją włączyć aż do pojawienia się stosownego komunikatu " Setup " :

Kod:
Locate 1 , 1
Lcd "SETUP"



RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 08-06-2013 17:29

Mój kawałek kodu scanera

Kod:
Dim Scanstop As Long  
Debounce Pind.5 , 0 , Scan , Sub

Scan:
   If Pind.5 = 0 Then : Waitms 30
   Locate 1 , 7 : Lcd "Scan" :
   For Freq = Freq To Bandup Step Krok :
    If Krok = 1 Then Waitms 50                              '
    If Krok = 10 Then Waitms 100                            '                        
    If Krok = 100 Then Waitms 150                           '
    If Krok = 1000 Then Waitms 200                          '
    Gosub Freq_update :
    If Pind.5 = 0 Then : Waitms 30
     Scanstop = Freq :
    If Freq = Scanstop Then
    Exit For :
   End If : End If : End If :
   Next Freq :

   Locate 1 , 7 : Lcd "     "
Return



RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 12-06-2013 18:26

Wrzucam wszystkie pliki *.bas jakie miałem związane z tym tematem, są to kolejne etapy powstawania softu. Poza stricte syntezerami są tutaj jeszcze dwa pliki które generują Beacon RTTY, oczywiście łatwo można dodać odczyt parametrów z jakiegoś czujnika i i wstawiać wartość do strumienia danych (można sobie zrobić w radiu tryb beacon Wink ).

Ciekawy jest ten plik: [attachment=7078] generuje przykładową ramkę jaką używają "baloniarze" w swoich projektach liczy sume kontrolną takiej ramki itd... (8bit N 1)

Wszystko do dalszego wykorzystania, miłej zabawy...


RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 16-06-2013 8:33

Kod:
Readeeprom Adres_memory , 255
         If Pinb.6 = 0 Then

         Adres_memory = Adres_memory + 1
         Writeeeprom Freq , Adres_memory
          Writeeeprom Adres_memory , 255
          Wait 1 : Locate 1 , 8 : Lcd "M+" ; Adres_memory
          End If
Mam pytanie w jakiej części programu muszę umieścić kod do odczytywania freq z pamięci procka , na razie napisałem sam zapis .Odczytywanie też będzie sterowane przez przycisk


RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 16-06-2013 23:34

Odczytywanie, ja robię po starcie procesora, zanim wejdę do pętli głównej (ładują się wtedy ustawienia z przed wyłączenia radia). Natomiast z zapisami to musisz uważać, ja testowo robię to po zmianie VFO z A na B i odwrotnie. Tyle ze trzeba pamiętać ze eeprom nie lubi jak się do niego często pisze. Najlepiej było by opracować jakiś patent by zapis był robiony przy wyłaczeniu sprzętu.


RE: Synteza na AD9851 a Bascom AVR - SP9MRN - 17-06-2013 0:19

Była taka awaryjna sztuczka, że się czytało napięcie przed stabilizatorem a zapis robiło po zaniku tego napięcia na resztkach z kondensatora po stabilizatorze. Czasu wystarcza.

73
MAc

PS
nie pamiętam czy ktoś tego nie użył w pokazanym tu na forum sterowniku rotora. Ale może mi się zdaje...