'SterowanieSyntezyMC145151

Bascom

Przedstawiam 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 poprzez liczniki seregowe 40193. Sterowanie odbywa się z klawiatury AT poprzez wpisywanie częstotliwości kanału odbieranego. 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.bas

'Tutaj procesor współpracuje z trzema licznikami 40193, 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.

'Timer0 jest oscylatorem.

'Impulsy z Timer0 zostaną skierowane z Portb.0 do wejścia Portd.5.

'Zawartość zmiennej Wynik zostanie wpisana do rejestru Comparea1 Timera1.

'Po wciśnięciu F1 wystartują Timer0 i Timer1. Timer1 odliczy tyle impulsów, ile jest w zmiennej Wynik.

'Odliczone impulsy zostaną wysłane do trzech szeregowych liczników rewersyjnych 40193 przez bramkę 4001.

'Liczba z Wynik pojawi się na wyjściach liczników w postaci binarnej.

'Wyjścia liczników połączone są z wejściami ustawiającymi syntezy.

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

'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 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portc.1 , Rs = Portb.2

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

 Display Off                                                'Wyłącz Lcd.

 Config Pind.7 = Output                                     'Sterowanie liczników rewersyjnych.

   Reset Portd.7                                            'Poziom niski.

 Config Pinb.0 = Output                                     'Konfigurujemy wyjście częst. Tim0.

   Reset Portb.0                                            'Poziom niski.

 Config Pinb.1 = Output                                     'Konfigurujemy wyjście jako OC1.

   Reset Portb.1                                            'Poziom niski

Config Timer0 = Timer , Prescale = 1                        'Timer0 jako czasomierz.

On Timer0 Ton                                               'Podprogram Ton dla Timer0.

 

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

 

Config Timer1 = Counter , Edge = Rising , Compare A = Set   'Timer1 jako licznik, od zbocza narastającego,

                                                            'Compare A = rejestr porównujący, Set = na wyjściu OC1A pojawi się 1.

Config Pind.5 = Input                                       'Wejście impulsów do Timer1.

 

Dim Czas As Byte                                            'Deklaracja zmiennej Czas. Będzie zawierać przepełnienie Timer0.

Czas = 0                                                    'Zerujemy zmienną.

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

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

Dim Policzlcd As Byte                                       'Tu będzie ilość naciśniętych klawiszy.

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                                        '

 

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

Writeeeprom A4 , 12                                         'Zapisujemy A4 do Eprom, adres 12.

 

 Enable Interrupts                                          'Zgoda na wszystkie odblokowania.

 Enable Timer0                                              'Odblokuj przerwanie od przepełnienia Timer0.

 Enable Timer1                                              'Odblokuj przerwanie od przepełnienia Timer1.

 

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

 Waitms 300                                                 'Czekaj 300mS.

 Display On                                                 'Załącz Lcd.

 Cls                                                        'Czyść Lcd.

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

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

 Counter1 = 0                                               'Zerujemy Counter1.

 Stop Timer0                                                '

 Stop Timer1                                                '

 Lcd "Wybierz frekw."                                       'Komunikat na Lcd.

 Lowerline                                                  'W drugiej linii Lcd.

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

 Wait 4                                                     'Trzymaj komunikat 4 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).

  Compare1a = Wynik                                         '

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

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

   Start Timer0                                             '                                        '

   Start Timer1                                             '

   Set Portd.7                                              'Ustaw poziom wysoki w Portd.7 (odblokuj liczniki rewersyjne 40193).

   Cls                                                      'Czyść Lcd.

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

   Readeeprom A7 , 8                                        '

   Readeeprom A4 , 12                                       '

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

   A1 = ""                                                  'Czyść zmienną A1.

   A2 = ""                                                  '

   A3 = ""                                                  '

   A5 = ""                                                  '

   A6 = ""                                                  '

   A7 = ""                                                  '

   Lowerline                                                'Druga linia Lcd.

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

   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.

 

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

'Timer0 jako oscylator ok. 16000 Hz.

Ton:                                                        'Podprogram dla Timer0 (częstotliwość oscylacji).

   Incr Czas                                                'Po zliczeniu 256 impulsów załaduj 1 do Czas.

   If Czas = 1 Then                                         'Jeśli liczba przepełnień jest równa 1, to...

   Czas = 0                                                 'Wyzeruj zmienną.

   Toggle Portb.0                                           'Zmień stan wyjścia Portd.0 na przeciwny.

   End If                                                   'Koniec warunku.

   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