'SterowanieSyntezyMC145151_01

Bascom

Przykład zastosowania syntezy częstotliwości w urządzeniu odbiorczym na pasmo 2m współpracującym z odbiornikiem CB-radio. W tym przykładzie do sterowania syntezy zastosowano procesor Atmega8 sterujący bezpośrednio, bez liczników szeregowych. Można wybrać kanał z klawiatury AT, bez skanera. Wszystkie czynności obserwowane są na wyświetlaczu Lcd.
Uwaga! Zamiast na 12,5KHz, napisałem program na programowanie kanałów i kroki co 125KHz.


'SterowanieSyntezyMC145151_01.bas

'Tutaj, synteza sterowana jest bezpośrednio z procesora bez liczników rewersyjnych, bez skanera.

'Częstotliwość wpisujemy z klawiatury AT.

'Patrz schemat blokowy SterowanieSyntezyMC145151.png.

'Przykład: częstotliwość 145,125 MHz wpisujemy jednym ciągiem: 145125.

'Ze schematu blokowego wynika jaki musi być podział w syntezie dla uzyskania wpisanej częstotliwości.

'Wykonane zostanie działanie matematyczne celem uzyskania liczby podziału.

'Liczba podziału zostanie wpisana do zmiennej Wynik i do Bity.

'Po wciśnięciu F1 na wyjściach BCD pojawi się liczba podziału dla syntezy w kodzie binarnym.

'Liczba podziału zostanie wpisana do syntezy i otrzymamy wpisaną z klawiatury częstotliwość.

'Vco ustawi się na częstotliwość potrzebną do otrzymania f wprowadzonej z klawiatury.

'Krok syntezy 12,5KHz.

'Opracował Henryk Wydmuch.

'Patrz zeszyt 260607.

'Pamięć zajęta w 33%.

'Procesor Atmega8.

'Zastosujemy oscylator RC wewnętrzny 8MHz, Fusebit ustawiony na 0100.

 

 $regfile = "m8def.dat"                                     'Dyrektyway dla kompilatora.

 $crystal = 8000000                                         'Zastosujemy generator wewnętrzny 8MHz.

Config Lcd = 16 * 2                                         'Konfigurujemy Lcd.

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

                                       'LCD dłączony do Port 2, 3, 4, 6, 1, 0.

Config Keyboard = Pinb.1 , Data = Pinb.2 , Keydata = Keydata       'Keyboard=klawiatura, podłączona do Pinc.2 i 3.

 Display Off                                                'Wyłącz Lcd.

 Waitms 300                                                 'Czekaj 300mS.

 Display On                                                 'Załącz Lcd.

 Cls                                                        'Czyść Lcd.

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Wyjścia BCD.

 Config Pind.0 = Output                                     'A

 Config Pind.1 = Output                                     'B

 Config Pind.2 = Output                                     'C

 Config Pind.3 = Output                                     'D

 Config Pind.4 = Output                                     'E

 Config Pinb.6 = Output                                     'F

 Config Pinb.7 = Output                                     'G

 Config Pind.5 = Output                                     'H

 Config Pind.6 = Output                                     'I

 Config Pind.7 = Output                                     'J

 Config Pinb.0 = Output                                     'K

 Config Pinb.3 = Output                                     'L

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

 Deflcdchar 0 , 32 , 16 , 20 , 24 , 16 , 16 , 30 , 32       'Narysowano ł. (Rysujemy tutaj: Ctrl+L i LCD Designer).

 Deflcdchar 1 , 32 , 32 , 28 , 2 , 30 , 18 , 30 , 1         'Narysowano ą.

 Deflcdchar 2 , 1 , 2 , 15 , 8 , 6 , 1 , 15 , 32            'Narysowano ś.

 Deflcdchar 3 , 2 , 4 , 30 , 18 , 16 , 16 , 30 , 32         'Narysowano ć.

 

Dim Kodklaw As Byte                                         'Deklarujemy zmienną Kodklaw, tu będzie umieszczany kod naciśniętego klawisza.

Dim Bity As Long                                            'Zmienna zawierać będzie bity kodu BCD w trzech bajtach.

Dim Wynik As Long                                           'Deklarujemy 4 Bajty pamięci dla zmiennej.

Dim Policzlcd As Byte                                       'Zmienna powiększa się po każdym naciśnięciu klawisza.

Dim Zapis As String * 7                                     'Tu będzie słowo z sześciu przyciśnięć klawisza AT.

Dim Cb As Word                                              'Deklarujemy 2 Bajty pamięci dla zmiennej.

Dim Mix As Word                                             'Deklarujemy 2 Bajty pamięci dla zmiennej.

Dim Vco As Word                                             'Deklarujemy 2 Bajty pamięci dla zmiennej.

Dim Kwarc As Long                                           'Deklarujemy 4 Bajty pamięci dla zmiennej.

Dim Frekw As Word                                           'Deklarujemy 2 Bajty pamięci dla zmiennej.

Dim A1 As String * 1                                        'A1 jako zmienna tekstowa z jedną komórką pamięci.

Dim A2 As String * 2                                        '

Dim A3 As String * 3                                        '

Dim A4 As String * 1                                        '

Dim A5 As String * 1                                        '

Dim A6 As String * 2                                        '

Dim A7 As String * 3                                        '

 

   Kwarc = 88700                                            'Kwarc 17.734 x 5 = 88.7MHz (wpisujemy 88700).

   Cb = 27050                                               'CB jako pośrednia na kanale 27.05MHz (wpisujemy 27050).

   A4 = ","                                                 'W zmiennej A4 umieszczamy przecinek.

   Writeeeprom A4 , 12                                      'Wpisz zmienną A4 do Eprom, adres 12.

 

 Locate 1 , 1                                               'Pierwsza linia Lcd, od początku.

 Lcd "Wybierz frekw."                                       'Komunikat na Lcd.

 Lowerline                                                  'W drugiej linii Lcd.

 Lcd "Sze" ; Chr(2) ; Chr(3) ; " cyfr..."                   'Komunikat na Lcd.

 Wait 3                                                     'Trzymaj komunikat 3 sek.

 Cls                                                        'Czść Lcd.

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Do                                                         'Start pętli.

   Kodklaw = Getatkbd()                                     'Odczytywanie kodu klawiatury do zmiennej Kodklaw.                                  '

  If Kodklaw > 0 And Kodklaw < 127 Then                     'Jeśli naciśnięto klawisz, a liczba ASCI jest od 0 do 127...

  Incr Policzlcd                                            'Po naciśnięciu klawisza powiększaj Policzlcd o jeden.

 

  Select Case Policzlcd                                     'Sprawdzaj zawartość Policzlcd...

  Case 1 : Locate 2 , 1                                     'Jeśli naciśnięto klawisz ustaw kursor w drugiej linii, pozycja 1.

  Lcd Chr(kodklaw)                                          'Zamień numer ASCI klawisza na kod klawisza i pokaż.

   Zapis = Chr(kodklaw)                                     'Kod klawisza zapisz do zmiennej Zapis.

   A1 = Chr(kodklaw)                                        'Ten sam kod klawisza zapisz do zmiennej A1.

  Case 2 : Locate 2 , 2                                     '

  Lcd Chr(kodklaw)                                          '

   Zapis = Zapis + Chr(kodklaw)                             'Do zmiennej Zapis zapisz to co już miała i dodaj następny kod klwisza.

   A2 = A1 + Chr(kodklaw)                                   '

  Case 3 : Locate 2 , 3                                     '

  Lcd Chr(kodklaw) ; ","                                    'Pokaż na Lcd przecinek.

   Zapis = Zapis + Chr(kodklaw)                             '

   A3 = A2 + Chr(kodklaw)                                   '

   Writeeeprom A3 , 1                                       'Zapisz do Eprom zmienną A3, adres 1.

  Case 4 : Locate 2 , 5                                     '

  Lcd Chr(kodklaw)                                          '

   Zapis = Zapis + Chr(kodklaw)                             '

   A5 = Chr(kodklaw)                                        '

  Case 5 : Locate 2 , 6                                     '

  Lcd Chr(kodklaw)                                          '

   Zapis = Zapis + Chr(kodklaw)                             '

   A6 = A5 + Chr(kodklaw)                                   '

  Case 6 : Locate 2 , 7                                     '

  Lcd Chr(kodklaw) ; "   (i F1)"                            'Druga linia, pozycja 7 pokaż komunikat.

   Zapis = Zapis + Chr(kodklaw)                             '

   A7 = A6 + Chr(kodklaw)                                   '

   Writeeeprom A7 , 8                                       '

  Policzlcd = 0                                             '

   Frekw = Val(zapis)                                       'Zawartość zmiennej słownej zamień na cyfrową i zapisz do Frekw.

  End Select                                                'Koniec sprawdzania Policzlcd.

  Locate 1 , 1                                              'W pierwszej linii Lcd, pozycja 1...

  Lcd "Wybierasz f(MHz)"                                    'Pokaż komunikat.

'''''''''''''''''''''''''''''''''''''''''''''''

'Działanie matematyczne (patrz sch. blok.):

  Mix = Frekw - Cb                                          'Częstotliwość wprowadzona z klawiatury(Frekw) - pośrednia (CB) = Mix.

  Vco = Mix - Kwarc                                         'Mix - częstotliwość kwarcowa (88.7MHz) = VCO.

  Wynik = Vco / 125                                         'VCO / 125 (czyli przez 12.5KHz, skok kanałowy) = Wynik (cyfra podziału w syntezie).

  Bity = Wynik                                              'Zmienna Bity przyjmuje wartość zmiennej Wynik.

''''''''''''''''''''''''''''''''''''''''''''''

 If Kodklaw = 5 Then                                        'Jeli naciśnięto F1...

   Cls                                                      'Czyść Lcd.

   Readeeprom A3 , 1                                        'Odczytaj zmienną A3 z Eprom, pozycja 1.

   Readeeprom A7 , 8                                        'A3, to pierwsze 3 cyfry, A7 następne 3 i A4 to przecinek.

   Readeeprom A4 , 12                                       'Przykład: 145(A3),(A4)125(A7), czyli 145,125MHz.

   Lcd "Frekw.: " ; A3 ; A4 ; A7                            'Pokaż komunikat i zawartość A3, A4, A7.

   Lowerline                                                'Druga linia Lcd.

   Lcd "Podzia" ; Chr(0) ; ": " ; Wynik                     'Pokaż komunikat i zawartoś Wynik.

''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Portb.3 przyjmie poziom bitu 11 zmiennej Bity, itd.

 Portb.3 = Bity.11                                          'L. Dwunasta wartość binarnej zmiennej Bity.

 Portb.0 = Bity.10                                          'K. Jedenasta wartość binarnej zmiennej Bity.

 Portd.7 = Bity.9                                           'J. Dziesiąta wartość binarnej zmiennej Bity.

 Portd.6 = Bity.8                                           'I. Dziewiąta wartość binarnej zmiennej Bity.

 Portd.5 = Bity.7                                           'H. Ósma wartość binarnej zmiennej Bity.

 Portb.7 = Bity.6                                           'G. Siódma wartość binarnej zmiennej Bity.

 Portb.6 = Bity.5                                           'F. Szósta wartość binarnej zmiennej Bity.

 Portd.4 = Bity.4                                           'E. Piąta wartość binarnej zmiennej Bity.

 Portd.3 = Bity.3                                           'D. Czwarta wartość binarnej zmiennej Bity.

 Portd.2 = Bity.2                                           'C. Trzecia wartość binarnej zmiennej Bity.

 Portd.1 = Bity.1                                           'B. Druga wartość binarnej zmiennej Bity.

 Portd.0 = Bity.0                                           'A. Pierwsza wartość binarnej zmiennej Bity.

 

   'Lcd Portb.3   'To, jeśli chcesz zobaczyć jakie poziomy przyjmą Porty.

   'Lcd Portb.0   '

   'Lcd Portd.7   '

   'Lcd Portd.6   '

   'Lcd Portd.5   '

   'Lcd Portb.7   '

   'Lcd Portb.6   '

   'Lcd Portd.4   '

   'Lcd Portd.3   '

   'Lcd Portd.2   '

   'Lcd Portd.1   '

   'Lcd Portd.0   '

   'Lcd " " ; Bity

   'Lowerline                                                'Druga linia Lcd.

   'Lcd Bin(bity) ; " Zmienna"                               'Taką wartość ma zmienna Bity.

   End If                                                   'Koniec warunku gdy naciśnięto klawisz.

   End If                                                   'Koniec warunku gdy naciśnięto F1.

 Loop                                                       'Powtarzaj pętlę.

 End                                                        'Koniec pętli.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

  'Tablica numerów przycisków klawiatury AT w kodzie ASCI:

Keydata:                                                    'Podprogram tablicy.

     'Małe litery

   Data 0 , 5 , 0 , 3 , 4 , 5 , 6 , &H07 , 5 , 5 , 5 , &H0B , &H0C , 0,       ''''''''''''A

   Data 63 , 63 , 63 , 63 , 63 , 63 , 63 , 113 , 49 , 63 , 63 , 63 , 122,       ''''''''''B

   Data 115 , 97 , 119 , 50 , 63 , 63 , 99 , 120 , 100 , 101 , 52 ,       ''''''''''''''''C

   Data 51 , 63 , 63 , 32 , 118 , 102 , 116 , 114 , 53 , 63 , 63 , 110 ,       '''''''''''D

   Data 98 , 104 , 103 , 121 , 54 , 63 , 63 , 63 , 109 , 106 , 117 , 55 ,       ''''''''''E

   Data 56 , 63 , 63 , 44 , 107 , 105 , 111 , 48 , 57 , 63 , 63 , 46 , 47 ,       ''''''''F

   Data 108 , 59 , 112 , 95 , 63 , 63 , 63 , 63 , 63 , 63 , 61 , 63 , 63 , 63 ,       ''''G

   Data 63 , 13 , 63 , 63 , 124 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63,       'H

   Data 63 , 49 , 63 , 52 , 55 , 63 , 63 , 63 , 48 , 127 , 50 , 53 , 54 , 56,       ''''''I

   Data 1 , 63 , 5 , 43 , 51 , 45 , 42 , 57 , 63 , 63       ''''''''''''''''''''''''''''''J

 

    'Duże litery

  Data 0 , 0 , 0 , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,       ''''''''''K

  Data 0 , 0 , 0 , 0 , 0 , 0 , 81 , 33 , 03 , 0 , 0 , 90 , 83 , 65,       ''''''''L

  Data 87 , 64 , 0 , 0 , 67 , 88 , 68 , 69 , 36 , 35 , 0 , 0 , 0 , 86,       '''''M

  Data 70 , 84 , 82 , 37 , 0 , 0 , 78 , 66 , 72 , 71 , 89 , 94 , 0,       ''''''''N

  Data 0 , 0 , 77 , 74 , 85 , 38 , 42 , 0 , 0 , 60 , 75 , 73 , 79,       '''''''''O

  Data 41 , 40 , 0 , 0 , 62 , 63 , 76 , 58 , 80 , 0 , 0 , 0 , 0 , 0,       '''''''P

  Data 0 , 123 , 43 , 0 , 0 , 0 , 0 , 0 , 125 , 0 , 0 , 0 , 0 , 0 , 0,       '''''Q

  Data 0 , 0 , 0 , 0 , 0 , 0 , 49 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 48,       '''''R

  Data 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0       'S