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 ).
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...
|