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

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

...przede wszystkim nie zakłócać...
16-03-2013 2:19
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Synteza na AD9851 a Bascom AVR - SQ9MDD - 16-03-2013 2:19

Skocz do:


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