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