'SterowanieSyntezyMC145151_04

Bascom

Synteza częstotliwości w urządzeniu odbiorczym na pasmo 2m współpracująca z odbiornikiem CB-radio. W tym przykładzie występuje zarówno przeszukiwanie pasma przy pomocy skanera, jak i możliwość wybierania kanału z klawiatury AT. Wprowadzono krótkie procedury. O kroku decyduje tu Timer1. Krok przeszukiwania 12,5KHz. Uzyskano zaoszczędzenie pamięci aż o 47%. 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_04.bas

'Wybieranie kanału ręczne lub skaner.

'Tutaj Timer1 decyduje o kroku skanera. Zaoszczędzono 47% pamięci.

'Przciśnij P5, a potem F2. Uruchomiłeś Skaner.

'Przyciśnij P4, wybierz z klawiatury częstotliwość, a potem naciśnij F1. Kanał został uruchomiony.

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

'Częstotliwość wpisujemy z klawiatury AT.

'Patrz schemat blokowy SterowanieSyntezyMC145151.png.

'Patrz schemat, zeszyt 260607.

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

'Aby pozbyć się przecinków, wszystkie częstotliwości pomnożono przez 1000.

'Krok syntezy 12,5KHz.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 51%.

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

                                       'Led wskazującą pracę urządzenia można dołączyć do Prtc.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                                                        '

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

'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

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

 Config Pinb.4 = Output                                     'Przycisk P4, gdy wybierzemy ręczne ustawianie kanału.

 Config Pinb.5 = Output                                     'Przycisk P5, gdy wybierzemy Skaner.

 Set Portb.5                                                '

 Set Portb.4                                                '

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

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

 Deflcdchar 4 , 32 , 32 , 30 , 18 , 30 , 16 , 30 , 4        'Narysowano ę.

 

   Config Timer1 = Timer , Prescale = 8                     'Konfiguruj Timer1 jako czasomierz z podziałem wstępnym przez 8.

   On Timer1 Czas                                           'Włącz podprogram Czas.

   Stop Timer1                                              'Zatrzymaj Timer1.

   Enable Interrupts                                        'Włącz odblokowania.

   Enable Timer1                                            'Odblokuj Timer1.

 

Dim Q As Byte                                               'Deklaracja zmiennej do liczenia przepełnień Timera1.

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

Dim Bity As Long                                            'Deklaracja zmiennej, zawierającej bity portów BCD.

Dim Wynik As Long                                           'Wynik zawiera liczbę podziału w syntezie.

Dim Policzlcd As Byte                                       'Deklaracja zmiennej zawierającej ilość naciśniętych klawiszów.

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

Dim Cb As Word                                              'Tu będzie częstotliwość kanału CB-radia jako pośredniej.

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                                           'Tu będzie słowo z Zapis zamienione na cyfrę.

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

Dim A2 As String * 2                                        'Drugi, naciśnięty klawisz.

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.

   Bity = 225                                               'Liczba podziału dla syntezy, początek skanowania 143,875MHz.

 

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

 Lcd "Nacisnij P4"                                          'Komunikat na Lcd.

 Lowerline                                                  'W drugiej linii Lcd.

 Lcd "  lub P5   "                                          'Komunikat na Lcd.

 Wait 2                                                     'Trzymaj komunikat 2 sek.

 Cls                                                        'Czść Lcd.

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

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

'Pierwsza pętla do ustalenia ręcznego wybierania f lub skanera.

'Przycisk P5 = skaner.

'Przycisk P4 = ręczne wybieranie.

 Do                                                         'Pierwsza pętla. Sprawdza, który przycisk wybraliśmy.

 If Pinb.5 = 0 Then                                         'Jeśli P5, to...

 Lcd "Skaner"                                               'Komunikat.

 Lowerline                                                  '

 Lcd "F2"                                                   '

 Wait 1                                                     'Trzymaj komunikat 1 sek.

 Cls                                                        'Następnie usuń go.

 Gosub B                                                    'Skocz do pdprogramu B (skanowanie).

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

 

 If Pinb.4 = 0 Then                                         'Jeśli P4, to...

 Lcd "R" ; Chr(4) ; "czne"                                  'Komunikat.

 Lowerline                                                  '

 Lcd "wybieranie f "                                        '

 Wait 1                                                     'Trzymaj komunikat 1 sek.

 Cls                                                        'Następnie usuń go.

  Gosub A                                                   'Skocz do podprogramu A (ręczne wybieranie).

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

 Loop                                                       'Powtarzaj pętlę.

 End                                                        'Koniec tej pętli.

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

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

'Podprogram A.

A:                                                          'Podprogram, pętla ręcznego wybierania f.

 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 (pierwsze 3 klawisze).

  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                                     'Po naciśnięciu szóstego klawisza.

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

   Zapis = Zapis + Chr(kodklaw)                             '

   A7 = A6 + Chr(kodklaw)                                   '

   Writeeeprom A7 , 8                                       'Ostatnie trzy klawisze.

  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, adres 1.

   Readeeprom A7 , 8                                        '

   Readeeprom A4 , 12                                       'Przecinek.

   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.

 

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

   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.

 Return                                                     'Wróć do programu (do pierwszej pętli).

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

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

'Podprogram B.

B:                                                          'Podprogram skanowania.

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

 Do                                                         'Pętla.

  If Kodklaw < 6 Then                                       'Jeśli naciśnięto klawisz < F2...

  Lcd "B" ; Chr(0) ; Chr(4) ; "dny klawisz"                 'Pokaż komunikat.

  Locate 2 , 1                                              '

  Lcd "Reset"                                               '

 Else                                                       'W przeciwnym razie...

  If Kodklaw > 6 Then                                       'Jeśli naciśnięto klawisz > F2...

  Lcd "B" ; Chr(0) ; Chr(4) ; "dny klawisz"                 'Pokaż komunikat.

  Locate 2 , 1                                              '

  Lcd "Reset"                                               '

End If                                                      'Koniec warunku.

End If                                                      '

 Waitms 200                                                 'Powtarzaj komunikat co 200mS.

 Cls                                                        'Czyść.

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

 If Kodklaw = 6 Then                                        'Jeśli naciśnięto klawisz F2.

 Start Timer1                                               '

 Locate 1 , 1                                               '

 Lcd "Skaner"                                               'Komunikat.

 Locate 2 , 1                                               '

 

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

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

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

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

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

   Portd.3 = Bity.5                                         'F. Szósta wartość binarnej zmiennej Bity.

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

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

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

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

   Portd.7 = Bity.10                                        'K. Jedenasta wartość binarnej zmiennej Bity.

                                                                                    '

 Select Case Bity                                           'Sprawdzanie zawartości Bity, która zmienia się w podprogramie Czas.

 Case 225 : Lcd "143,875 MHz"                               'Jeśli zawiera liczbę 225 pokaż częstotliwość.

 Case 226 : Lcd "144,000 MHz"                               '

 Case 227 : Lcd "144,125 MHz"                               '

 Case 228 : Lcd "144,250 MHz"                               '

 Case 229 : Lcd "144,375 MHz"                               '

 Case 230 : Lcd "144,500 MHz"                               '

 Case 231 : Lcd "144,625 MHz"                               '

 Case 232 : Lcd "144,750 MHz"                               '

 Case 233 : Lcd "144,875 MHz"                               '

 Case 234 : Lcd "145,000 MHz"                               '

 Case 235 : Lcd "145,125 MHz"                               '

 Case 236 : Lcd "145,250 MHz"                               '

 Case 237 : Lcd "145,375 MHz"                               '

 Case 238 : Lcd "145,500 MHz"                               '

 Case 239 : Lcd "145,625 MHz"                               '

 Case 240 : Lcd "145,750 MHz"                               '

 Case 241 : Lcd "145,875 MHz"                               '

 Case 242 : Lcd "146,000 MHz"                               '

 Case 243 : Lcd "146,125 MHz"                               '

 End Select                                                 'Koniec sprawdzania.

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

 Loop                                                       'Powtażaj pętlę.

 End                                                        'Koniec tej pętli.

 Return                                                     'Wracaj do programu.

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

'Kroki.

Czas:                                                       'Podprogram Timera1 (przepełnienie po zliczeniu 65536).

 Incr Q                                                     'Powiększaj zmienną Q zliczającą przepełnienia Timera1.

 If Q = 30 Then                                             'Jeśli przepełnień będzie 30 (szybkość kroku)...

 Q = 0                                                      'Zeruj zmienną.

 Incr Bity                                                  'Powiększaj zawartość zmiennej Bity (od zawartości 225).

 If Bity = 244 Then                                         'Jeśli zawartość dojdzie do 244 (liczba podziału w syntezie)...

 Bity = 225                                                 'Ponownie załaduj 225 (skanowanie od początku).

 End If                                                     'Koniec warunku.

 End If                                                     '

 Return                                                     'Wróć do programu.

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

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

  '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