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


Synteza na AD9851 a Bascom AVR - SQ9GAC - 27-01-2013 8:58

Witam,

poszukuje jakiegoś przykładowego programu w bascomie do obsługi samej kostki dds np. AD9851 lub podobnych


RE: Synteza na AD9851 a Bascom AVR - SQ5KHA - 27-01-2013 13:16

Witam,
patrzył kolega na ten wątek ? http://www.elektroda.pl/rtvforum/topic436241.html np.
na posty kolegi Jarka SP3SWJ.

73 Darek


RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 16-03-2013 2:19

Proszę bardzo:

Tak działa:




A tak jest napisane:

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.
'
'
'-----------------------------------------------------------------
'inicjalizacja procesora wstępna konfiguracja
Const Firmwareversion = "1.4.2"
$regfile = M8def.dat
$crystal = 4000000
'$baud = 9600
$hwstack = 64
$swstack = 10
$framesize = 40


'-----------------------------------------------------------------
'konfiguracja wyświetlacza
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portc.0 , Db6 = Portc.1 , Db7 = Portc.2 , E = Portd.1 , Rs = Portd.2

'-----------------------------------------------------------------
'konfiguracja pozostałych portów
Config Portc = Output
Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Input
Config Portb.3 = Input
Config Portb.4 = Input
Config Portd.7 = Input
Portb = &B00111111
Portd = &B11111111
'-----------------------------------------------------------------
'konfiguracja ADC   dla s-metra
'Config Adc = Single , Prescaler = Auto

'-----------------------------------------------------------------
'aliasy dla portow
'Dds_reset Alias Portd.5
Dds_fq_ud Alias Portc.4
Dds_w_clk Alias Portc.5
Dds_data Alias Portc.3


'-----------------------------------------------------------------
'konfiguracja portu szeregowego
'Config Serialin = Buffered , Size = 24                      'bufor ma być na tyle duży by nie było błedów w odbiorze ramek.
'Config Input = Crlf , Echo = Crlf

'-----------------------------------------------------------------
'definicje zmiennych
Dim Freq As Long
Dim Freq_z_posrednia 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 Ptt As Bit
Dim Konfig_bit As Bit
'zmienne dla posredniej
Dim Posrednia As Long
Dim Posredniaeram As Eram Long
Dim Posrednia_kierunek As Byte
Dim Posrednia_kierunekeram As Eram Byte
'zmienne dla ddsa
Dim Init As Byte
Dim Freqtodds As Single
Dim Freqtoddsready As Long
Dim Przelicznik As Single
Dim Przelicznik_eram As Eram Single

'-----------------------------------------------------------------
'trzeba pomyslec o s-metrze
Deflcdchar 0 , 32 , 32 , 32 , 4 , 4 , 32 , 32 , 32          ' replace ? with number (0-7)
Deflcdchar 0 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 31        ' replace ? with number (0-7)
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 3 , 32 , 32 , 32 , 32 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 4 , 32 , 32 , 32 , 31 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 5 , 32 , 32 , 31 , 31 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 6 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)
Deflcdchar 7 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31        ' replace ? with number (0-7)

'-----------------------------------------------------------------
'
Declare Sub Wyslij_f_do_dds

'-----------------------------------------------------------------
'ustawienia poczatkowe, uruchamiamy procesor
'Enable Interrupts
'Start Adc
Cursor Off
Echo Off

'-----------------------------------------------------------------
'w zasadzie juz mozemy pracowac, ale wyswietlmy reklamy
Cls
Lcd Firmwareversion
Locate 2 , 1
Lcd "booting "
Wait 1
Lcd "."
Wait 1
Lcd "."
Wait 1
Lcd "."

'-----------------------------------------------------------------
' AD9850 Initialize
'Set Dds_reset : Waitus 10 : Reset Dds_reset : Waitus 10     ' Reset
Set Dds_w_clk : Waitus 10 : Reset Dds_w_clk : Waitus 10     ' W_CLK
Set Dds_fq_ud : Waitus 10 : Reset Dds_fq_ud : Waitus 10     ' FQ_UD
Init = &H00

'ladujemy ustawienia domyslne lub jesli sa to zapisane nastawy
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
   Posrednia = Posredniaeram
   Posrednia_kierunek = Posrednia_kierunekeram              'posrednia kierunek 0-minus, 1-plus, 2-nic
   Przelicznik = Przelicznik_eram
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
   Posrednia = 800000
   Posrednia_kierunek = 2
   Przelicznik = 343.603                                    'wymagana delikatna korekta w zależności od egzemplarza syntezy
End If
If Pind.6 = 0 Then
  Konfig_bit = 1
End If
Wait 1
Cls
Gosub Wyswietlacz
If Konfig_bit = 0 Then
'-----------------------------------------------------------------
'pętla główna
Do
   If Lock_bit <> 1 Then
      Debounce Pinb.2 , 0 , Modechange , Sub
      Debounce Pind.7 , 0 , Vfo , Sub
      Debounce Pind.6 , 0 , Band , Sub
      Debounce Pinb.5 , 0 , Zmianakroku , Sub
      'Debounce Pinb.3 , 0 , Splitfunc , Sub
      If Pinb.3 = 0 Then
         Ptt = 1
         Gosub Slupek_ptt
      Else
         Ptt = 0
         Gosub Slupek_ptt
      End If
      Enc = Encoder(pinb.0 , Pinb.1 , Lewo , Prawo , 0)
   End If
   Debounce Pinb.4 , 0 , Lock , Sub
Loop
Else
Locate 1 , 1
Lcd "SETUP"
   Do
   Enc = Encoder(pinb.0 , Pinb.1 , Lewo , Prawo , 0)
      Debounce Pinb.5 , 0 , Zmianakroku , Sub
      Debounce Pind.7 , 0 , Zapis , Sub
      Debounce Pinb.4 , 0 , Offset , Sub
      Debounce Pinb.3 , 0 , Plus_przelicznik , Sub
      Debounce Pinb.2 , 0 , Minus_przelicznik , Sub
   Loop
End If
'-------------------------------------------------------------------------------
'koniec programu
End

'-------------------------------------------------------------------------------
' wszystkie sub-programs tutaj

Plus_przelicznik:
    Przelicznik = Przelicznik + 0.0001
    Gosub Wyswietlacz
Return

Minus_przelicznik:
    Przelicznik = Przelicznik - 0.0001
    Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'offset posredniej
Offset:
  If Posrednia_kierunek = 0 Then
      Posrednia_kierunek = 1
  Elseif Posrednia_kierunek = 1 Then
      Posrednia_kierunek = 2
  Elseif Posrednia_kierunek = 2 Then
      Posrednia_kierunek = 0
  End If
  Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'zapis
Zapis:
Locate 1 , 1
Lcd "SAVE "
   Posredniaeram = Posrednia
   Posrednia_kierunekeram = Posrednia_kierunek
   Freq_aeram = Freq_a
   Freq_beram = Freq_b
   Krok_beram = Krok_b
   Krok_aeram = Krok_a
   Modulacja_beram = Modulacja_b
   Modulacja_aeram = Modulacja_a
   Przelicznik_eram = Przelicznik
   Wait 1
   Goto _reset
Return

'-------------------------------------------------------------------------------
'blokowanie syntezy
Lock:
  If Lock_bit = 0 Then
   Lock_bit = 1
  Else
   Lock_bit = 0
  End If
  Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'galka w lewo
Lewo:
If Kierunek = 1 Then                                        'zabezpieczenie przeciwko przeskakiwaniu o dwa przy zmianie kierunku
   Kierunek = 0
   Return
End If                                                      'galka w lewo
If Enc = 2 Or Enc = 1 Then
   If Konfig_bit = 0 Then
      Freq = Freq - Krok
   Else
      Posrednia = Posrednia - Krok
   End If
End If
If Freq < 100000 And Konfig_bit = 0 Then
   Freq = 3000000
End If
Gosub Freq_update
Return

'-------------------------------------------------------------------------------
'galka w prawo
Prawo:
If Kierunek = 0 Then
   Kierunek = 1
   Return
End If                                                      'galka w prawo
If Enc = 3 Or Enc = 0 Then
   If Konfig_bit = 0 Then
      Freq = Freq + Krok
   Else
      Posrednia = Posrednia + Krok
   End If
End If
If Freq > 3000000 And Konfig_bit = 0 Then
   Freq = 100000
End If
Gosub Freq_update
Return

'split
Splitfunc:

Return

'-------------------------------------------------------------------------------
'zmiana kroku syntezy
Zmianakroku:                                                'zmiana kroku syntezy
If Krok = 1000 Then
   Krok = 100
Elseif Krok = 100 Then
   Krok = 10
Elseif Krok = 10 Then
   Krok = 1
Elseif Krok = 1 Then
   Krok = 1000
'   Freq = Freq / 100 'kasowanie reszty przy zmianie kroku wycofalem
'   Freq = Freq * 100
End If
Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'zmiana modulacji (dodac sterowanie pilotami)
Modechange:
  If Modulacja = 1 Then
   Modulacja = 2
  Elseif Modulacja = 2 Then
   Modulacja = 3
  Elseif Modulacja = 3 Then
   Modulacja = 1
  End If
Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'sterowanie VFO
Vfo:                                                        'zmiana vfo z A na B i modulacji
   If Vfo = 1 Then
      Freq_b = Freq
      Freq_beram = Freq_b                                   'zapis ustawien do eram  przeniesc do osobnej funkcji przy poweroff !!!!!!!!!!!!!!!!!!!!!!!!!!!
      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
   Posredniaeram = Posrednia
   Posrednia_kierunekeram = Posrednia_kierunek
   Przelicznik_eram = Przelicznik
Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'zmiana pasm klawiszem band
'pasma ogarniete 15.11.2012
Band:
   If Freq < 370000 Then
      Freq = 370000
      Modulacja = 2
   Elseif Freq < 700000 Then
      Freq = 700000
      Modulacja = 2
   Elseif Freq < 1010000 Then
      Freq = 1010000
      Modulacja = 1
   Elseif Freq < 1400000 Then
      Freq = 1400000
      Modulacja = 3
   Elseif Freq < 1800000 Then
      Freq = 1806800
      Modulacja = 3
   Elseif Freq < 2100000 Then
      Freq = 2100000
      Modulacja = 3
   Elseif Freq < 2480000 Then
      Freq = 2489000
      Modulacja = 3
   Elseif Freq < 2800000 Then
      Freq = 2800000
      Modulacja = 3
   Elseif Freq >= 2800000 Then
      Freq = 181000
      Modulacja = 2
   End If
      Gosub Wyswietlacz
Return

'-------------------------------------------------------------------------------
'obsluga zmiany czestotliwosci na wyswietlaczu
'zmienilem z przeliczania f na rzecz wyswietlania ze stringu oszczednosc kodu okolo 5%
Freq_update:
Locate 2 , 6
If Konfig_bit = 0 Then
   Freqtolcd = Str(freq)
Else
   Freqtolcd = Str(posrednia)
End If
   If Len(freqtolcd) <= 6 Then
      Freqtolcd = " " + Freqtolcd
   End If
      Lcd Left(freqtolcd , 2)
      Lcd "."
      Lcd Mid(freqtolcd , 3 , 3)
      Lcd "."
      Lcd Right(freqtolcd , 2)
      Call Wyslij_f_do_dds                                  'po kazdej zmianie czestotliwosci wysylamy komende do DDS'a
Return

'-------------------------------------------------------------------------------
'obsluga zmiany wszystkiego innego na wyswietlaczu
Wyswietlacz:
Gosub Freq_update
If Konfig_bit = 0 Then
Locate 1 , 1
   Lcd "VFO-"
   If Vfo = 1 Then
      Lcd "B"
   Elseif Vfo = 0 Then
      Lcd "A"
   End If
Locate 2 , 1
   If Modulacja = 1 Then
      Lcd "CW "
   Elseif Modulacja = 2 Then
      Lcd "LSB"
   Elseif Modulacja = 3 Then
      Lcd "USB"
   End If
Locate 2 , 17
   If Lock_bit = 1 Then
      Lcd "Lock"
   Else
      Lcd "    "
   End If
Else
   Locate 2 , 1
   If Posrednia_kierunek = 0 Then                           'posrednia kierunek 0-minus, 1-plus, 2-nic
      Lcd "MINUS"
   Elseif Posrednia_kierunek = 1 Then
      Lcd "PLUS "
   Elseif Posrednia_kierunek = 2 Then
      Lcd "NONE "
   End If
   Locate 1 , 7
   Lcd Przelicznik
End If
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"
End If
Return

'-------------------------------------------------------------------------------
Slupek_ptt:

If Ptt = 1 Then
      'a tutaj bedzie smetr z ładnymi słupkami
      Locate 1 , 6
      Lcd Chr(0)
      Lcd Chr(0)
      Lcd Chr(1)
      Lcd Chr(2)
      Lcd Chr(3)
      Lcd Chr(4)
      Lcd Chr(5)
      Lcd Chr(6)
      Lcd Chr(7)
      Locate 2 , 19
      Lcd "TX"
Else
      Locate 1 , 6
      Lcd "         "
      Locate 2 , 19
      Lcd "RX"
End If
Return

'-------------------------------------------------------------------------------
'sterowanie DDS-em
Sub Wyslij_f_do_dds                                         'posrednia kierunek 0-minus, 1-plus, 2-nic
   If Posrednia_kierunek = 0 Then
      Freq_z_posrednia = Posrednia - Freq
   Elseif Posrednia_kierunek = 1 Then
      Freq_z_posrednia = Posrednia + Freq
   Elseif Posrednia_kierunek = 2 Then
      Freq_z_posrednia = Freq
   End If
   Freqtodds = Freq_z_posrednia * Przelicznik               'przelicznik ze zmiennej ladowanej z eepromu dla roznych syntez
   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

Kod nie jest oczyszczony ze śmieci z poprzedniego projektu niemniej jednak działa...


RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 20-03-2013 7:02

Ryśku możesz wrzucić na forum schemat syntezy , jak rozwiązałeś przełączanie przekaźników pasm ?


RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 15-04-2013 10:46

Szczerze to nie mam czasu by posiedzieć i dokończyć konstrukcję, za dużo się w moim życiu prywatnym i zawodowym dzieje. Napisz na pw podrzucę Ci linka do wszystkich materiałów to zobaczysz czy można to rozwinąć.


RE: Synteza na AD9851 a Bascom AVR - SP6-11003 - 16-04-2013 23:39

Rysiek jeśli pozwolisz to ja się "dokleję" do Twojej konstrukcji Wink Potrzebowałem syntezę DDS do świeżo zakupionej płytki Piligrim SMD z DW_Radio ( choć jeszcze do mnie nie dotarła ). Początkowo pomyślałem sobie, że zrobię to SI570 ale potem sobie pomyślałem, że wykorzystam jeszcze jeden wolny moduł DDS AD9850 plus mnożnik na ICS502. Synteza którą miałem z projektu Leszka SP6FRE już dawno siedzi w innym radiu to musiałem sobie sklecić coś sam i wtedy bardzo mi się przydał Twój projekt Ryśku.

Kolego free . Ten kod który podał Rysiek nie ma obsługi przełącznika pasm. Steruje tylko samym generatorem i resztą funkcji które widzisz na LCD. Ja właśnie potrzebowałem takie sterowanie to dopisałem kilka zdań do kodu. Sterowanie pasmami jest wykonane kodem BCD ( użyty w przełączniku pasm dekoder 4028 " dekoder BCD na 1 z 10 " ) . Prototyp jak na razie wygląda tak :

İmage

Pinologia użyta przez Ryśka w programie się całkowicie zmieniła ( piny indywidualnie ustawiasz sobie w programie ). Nawet sam wyświetlacz, u Ryśka jest 2 x 20 a u mnie 2 x 16. U siebie oczyściłem kod z funkcji s-metr. Tam gdzie był s-metr programowy u mnie jest napis RX lub TX. W moim Piligrim jako wskaźnik s-metr będzie zwykły wychyłowy ustrój .

Sterownik DDS w czasie normalnej pracy w czasie "odbioru" wygląda tak u mnie:

İmage

A w czasie nadawania tak:

İmage

Mój kod jeszcze nie jest całkowicie ukończony tak że nie przedstawię go teraz tutaj. Ale myślę, że do weekendu będzie już jako stabilny.


Co do samej elektroniki. projekt płytki, schemat umieszczę jak poprawię PCB. Już mam kilka błędów, które jeszcze muszę poprawić.

Powielanie jest wykonane wg. schematu Rafała SQ4AVS LINK . Generator DDS jak i powielanie jest u mnie wykonane jako osobny moduł wpinany w główne PBC.

Jeśli tylko Rysiek się zgodzi na publikację zmienionego przez moją osobę kodu do procesora to go tutaj umieszczę w wersji już dopracowanej.

Pozdrawiam Serdecznie. Andrzej SP611003


RE: Synteza na AD9851 a Bascom AVR - SQ5RWU - 17-04-2013 1:46

(16-04-2013 23:39)SP6-11003 napisał(a):  Jeśli tylko Rysiek się zgodzi na publikację zmienionego przez moją osobę kodu do procesora to go tutaj umieszczę w wersji już dopracowanej.

W sumie, to już się zgodził, jeśli zachowasz licencję, nie mniej zapytać/dać znać pewnie nie zawadzi.
(16-03-2013 2:19)SQ9MDD napisał(a):  
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.
'
'
'-----------------------------------------------------------------



RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 17-04-2013 19:44

Witam,

Ja do programu dorzuciłem funkcję scan i teraz pracuję nad przełączaniem pasm z us PCF 8574 a wyświetlacz graficzny 128x64 chce jeszcze dorzucić obsługę pamięci


RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 26-05-2013 9:40

Cytat:Jeśli tylko Rysiek się zgodzi na publikację zmienionego przez moją osobę kodu do procesora to go tutaj umieszczę w wersji już dopracowanej.

Hej ja tutaj nie mam już nic do zgadzania się lub nie, wszystkie zmiany poprawki i kolejne wersje to twoja praca Smile

Ja się tylko cieszę że tak może to funkcjonować jedna osoba coś zacznie ale niema czau projektu ukończyć. Wystawiając co ma daje szanse inym bo rozwijali własne wersje i by nie musieli odkrywać ameryki od nowa.
Świetna robota Andrzej, jak już skończysz wrzuć może jakiś film jak to działa.


RE: Synteza na AD9851 a Bascom AVR - SQ9GAC - 05-06-2013 18:41

Mam szybkie pytanie co mam zmienić w programie aby sterować AD9850 takie dostałem moduły ?