Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Synteza na AD9851 a Bascom AVR
SP6-11003 Offline
Andrzej
**

Liczba postów: 63
Dołączył: 24-06-2012
Post: #11
RE: Synteza na AD9851 a Bascom AVR
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ęć.
(Ten post był ostatnio modyfikowany: 06-06-2013 8:31 przez SP6-11003.)
06-06-2013 8:17
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9GAC Offline
Sławek
***

Liczba postów: 120
Dołączył: 23-03-2010
Post: #12
RE: Synteza na AD9851 a Bascom AVR
mam jeszcze jedno pytanie czy moduły http://ja9ttt.blogspot.de/2012/01/ad9850...part2.html będą pracować prawidłowo przy napięciu 3 V ?
06-06-2013 17:06
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP6-11003 Offline
Andrzej
**

Liczba postów: 63
Dołączył: 24-06-2012
Post: #13
RE: Synteza na AD9851 a Bascom AVR
Sam układ AD9850 powinien pracować przy 3,3V zasilania ale nie wiem jak wygląda sprawa z generatorem kwarcowym zawartym w tym module.
06-06-2013 17:43
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9GAC Offline
Sławek
***

Liczba postów: 120
Dołączył: 23-03-2010
Post: #14
RE: Synteza na AD9851 a Bascom AVR
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ł
06-06-2013 17:52
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP6-11003 Offline
Andrzej
**

Liczba postów: 63
Dołączył: 24-06-2012
Post: #15
RE: Synteza na AD9851 a Bascom AVR
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"
06-06-2013 18:12
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9GAC Offline
Sławek
***

Liczba postów: 120
Dołączył: 23-03-2010
Post: #16
RE: Synteza na AD9851 a Bascom AVR
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
08-06-2013 17:29
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #17
RE: Synteza na AD9851 a Bascom AVR
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:
.bas  rtty-generator-balonowy-test.bas (Rozmiar: 8.74 KB / Pobrań: 1387) 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...


Załączone pliki
.bas  ad9850-dds.bas (Rozmiar: 2.2 KB / Pobrań: 1999)
.bas  rtty-generator-alpha.bas (Rozmiar: 8.7 KB / Pobrań: 1461)
.bas  syntezer-1.0.bas (Rozmiar: 9.67 KB / Pobrań: 1443)
.bas  syntezer-1.1.bas (Rozmiar: 10.43 KB / Pobrań: 1508)
.bas  syntezer-1.2.bas (Rozmiar: 10.86 KB / Pobrań: 1570)
.bas  syntezer-taurus-all-fork-1.4.2.bas (Rozmiar: 14.71 KB / Pobrań: 1551)
.bas  syntezer-taurus-fork-1.3.1.bas (Rozmiar: 13.63 KB / Pobrań: 1479)
.bas  syntezer-taurus-fork-1.3.2.bas (Rozmiar: 14.24 KB / Pobrań: 1597)
.lay  syntezer.LAY (Rozmiar: 267.97 KB / Pobrań: 1703)

...przede wszystkim nie zakłócać...
12-06-2013 18:26
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9GAC Offline
Sławek
***

Liczba postów: 120
Dołączył: 23-03-2010
Post: #18
RE: Synteza na AD9851 a Bascom AVR
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
(Ten post był ostatnio modyfikowany: 16-06-2013 8:34 przez SQ9GAC.)
16-06-2013 8:33
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 380
Dołączył: 01-02-2009
Post: #19
RE: Synteza na AD9851 a Bascom AVR
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.

...przede wszystkim nie zakłócać...
16-06-2013 23:34
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP9MRN Offline
MAc
*****

Liczba postów: 817
Dołączył: 29-08-2009
Post: #20
RE: Synteza na AD9851 a Bascom AVR
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...
17-06-2013 0:19
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości