BASCOM


Odbiornik alfabetu Morsa.



Odbiornik Morsa tłumaczy tekst telegraficzny na język polski. Tekst w zdaniach z kropkami, przecinkami i innymi znakami oglądamy

   na Lcd, albo na ekranie komputera. Wyświetlany na Lcd, co dwie linie zostaje wykasowany. Na miejsce wykasowanego wchodzi dalszy tekst.

   W tej sytuacji, należy relację zapamiętać. Inna sprawa jest z odczytem na ekranie komputera. Przychodząca relacja jest zapisywana na ekranie

   i nie ginie. Można ją także zapisać do folderu. Do odczytu tekstu na komputerze, do odbiornika dołączony jest program Odczyt.exe<br>

   Przychodzący tekst telegraficzny możemy czytać w postaci języka polskiego, jak również w postaci alfabetu Morsa.

   Jeśli czytamy w postaci kresek i kropek, to każdy znak oddzielony jest pionową kreską, co zapobiega błędnemu odczytowi.<br>

   Odbiornik może być połączony bezpośrednio z nadajnikiem, albo dołączony do radiostacji odbierającej telegrafię.

   Odbiornik radiostacji może być typu: AM, FM lub SSB. Jeśli SSB, to należy tak ustawić BFO, aby uzyskać opowiednią wysokość tonu znaków.
  Jedno z wejść odbiornika przystosowane jest do odbioru małych poziomów analogowych, drugie do poziomów TTL.

  



Program procesorowy

'OdbMorsa-iRS232_13_PTT.bas

'Odbiór znaków Morsa.

'Prgram tłumaczy telegrafię na litery, cyfry i inne znaki oraz pokazuje kropki i kreski.

'Kreski-kropki, cyfry-litery będą wyświetlone na LCD oraz na ekranie interfejsu (dołączony do programu, nazwa: Odbior.exe).

'Okno interfejsu możemy powiększać przez rozciągnięcie.

'Ledy w Portc.0 i Portc.1 pokazują początek i koniec znaku.

'Wejście kodu (tonu Morsa) Portd.5.

'Portd.7 otrzymuje poziomy niskie w momentach pojawiających się kropek i kresek.

'Wyłącznikiem W1 w Portc.5 decydujemy, czy ma być wyświetlana kreska pionowa między literami.

'Wyłącznikiem W2 w Portc.3 decydujemy, czy mają być wyświetlane cyfry-litery-inne znaki czy kreski-kropki.

'Przyciskiem Reset resetujemy, gdy przechodzimy z odbioru kresek-kropek na cyfry-litery-inne znaki.

'Licznikiem impulsów w kropce i kresce będzie Timer1.

'Timer0 zlicza czas pomiędzy znakami i słowami oraz wyświetla pionową kreskę.

'Zmienna Policzlcd pilnuje, aby znaki nie wychodziły poza zakres Lcd.

'Po za Lcd, można czytać tekst na ekranie PC, wprowadzając na ekran Pc-ta interfejs: Odbior.exe.

'Procesor: ATMEGA8.

'Fusebit ustawiony na kwarc zewnętrzny: External XTAL 1110 (klawisz F4).

'Opracował Henryk Wydmuch

'Patrz sch. OdbMorsaRS232_13_PTT.png.

'Pamięć zajęta w 47%.

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

$crystal = 8000000                                          'Częstotliwość kwarcu zewnętrznego.

$baud = 9600                                                'Szybkość transferu do interfejsu (przez RS232).

Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portb.1 , Rs = Portb.0

Cls

Config Timer0 = Timer , Prescale = 1                        'Timer0 jako czasomierz, bez podziału wstępnego.

Config Timer1 = Counter , Edge = Falling                    'Timer1 jako licznik, od zbocza opadającego.

Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32       'Kreska (Rysujemy tutaj: Ctrl+L i LCD Designer).

Deflcdchar 1 , 32 , 32 , 32 , 12 , 12 , 32 , 32 , 32       'Kropka

Deflcdchar 2 , 4 , 4 , 6 , 12 , 4 , 4 , 14 , 32            'ł. Konstrujemy tu: Ctrl+L.

Dim Licz As Word                                            'Zmienna Licz, pamięta czas kresek, kropek i przerw.

Dim Tmp As Long                                             'Tmp, zmienna pomocnicza w algorytmie liczenia ilości kresek i kropek.

Dim Pozycja As Long                                         'Pozycja, to samo.

Dim Znak As Long                                            'Znak, zmienna zapamiętująca ilość kresek i kropek.

Dim Policzlcd As Word                                       '1 bajt zmiennej zawierającej piksele Lcd, aby napis nie wyszedł poza Lcd.

On Timer0 Zlicz                                             'Podprogram Timer0, wykonuje liczenie czasu trwania liter, cyfr i przerw.

Cursor Off                                                  '

Config Pind.5 = Input                                       'Ustawiamy Pind.5 jako wejście sygnału Morsa.

Config Pind.7 = Input                                       'Ustawiamy Pind.7 jako wejście (z kol. tranz.).

Config Pinc.3 = Input                                       'Ustawiamy Pinc.3 jako wejście (W2).

Config Pinc.5 = Input                                       'Ustawiamy Pinc.5 jako wejście (W1).

Config Pinc.0 = Output                                      'Port dla Led.

Config Pinc.1 = Output                                      'Port dla Led.

Set Portc.5                                                 'Ustaw 1 w Portc.5.

Set Portc.3                                                 'Ustaw 1 w Portc.3.

Set Portc.0                                                 'Ustaw 1 w Portc.0.

Reset Portc.1                                               'Ustaw 0 w Portc.1.

Enable Interrupts                                           'Zezwolenie na wszystkie przerwania.

Enable Timer0                                               'Odblokuj przerwania Timera0.

Cls                                                         'Czyść LCD.

Lcd "Oczekiwanie na"                                        'Pokaż komunikat.

Lowerline                                                   '

Lcd "sygna" ; Chr(2)                                        '

Wait 1                                                      'Trzymaj komunikat 1sek.

Cls                                                         'Czyść Lcd.

Counter1 = 0                                                '

Start Timer1                                                '

Stop Timer0                                                 '

'--------------------------------------------------------------------------------------------------------------

'Pierwsza pętla. Decyduje: kreski-kropki czy litery-cyfry.

Do                                                         '

If Pinc.3 = 0 Then                                         'Jeśli W1 włączony. Portc.3 do masy, to...

Gosub Literycyfry                                          'skocz do programu Literycyfry.

Else                                                       'W przeciwnym razie...

Gosub Kreskikropki                                         'Skocz do programu Kreskikropki.

End If                                                     'Koniec warunku.

Loop                                                       'Zamknij pętlę.

End                                                        'Koniec tej pętli.

'------------------------------------------------------------------------------------------------------------

Literycyfry:                                                '

Do                                                         'Pętla (pierwsze instrukcje, gdy nie odbieramy jeszcze telegrafii).

Bitwait Pind.7 , Set                                       'Poczekaj, aż Pind.7 będzie miał 1. Właśnie jest 1.(Taka sytuacja jest, gdy nie ma odbioru Morsa).

Start Timer0                                               'Start Timera0.

   If Counter1 > 140 Then                                  'Jeśli licznik zliczył więcej, niż 140 impulsów, to...(Teraz nie zliczy, nie ma odbioru).

    Tmp = 10 ^ Pozycja                                     'Wykonaj algorytm.

    Tmp = 2 * Tmp                                          '

    Znak = Znak + Tmp                                      '

    Incr Pozycja                                           '

   Else                                                    'W przeciwnym razie.

   If Counter1 > 40 Then                                   'Jeśli licznik zliczył więcej niż 40 impulsów, ale...

   If Counter1 < 80 Then                                   'mniej niż 80, to...

    Tmp = 10 ^ Pozycja                                     'Wykonaj algorytm.

    Znak = Znak + Tmp                                      '

   Incr Pozycja                                            '

   End If                                                  'Powiększ Pozycja o 1.

   End If                                                  '

   End If                                                  '

Stop Timer1                                                '

Counter1 = 0                                               '

Bitwait Pind.7 , Reset                                     'Poczekaj, aż Pind.7 osiągnie poziom niski (jest odbiór).

Start Timer1                                               'Wystartuj Timer1.

Stop Timer0                                                'Zatrzymaj Timer0..

Loop                                                       'Powtarzaj pętlę.

End                                                        'Koniec pętli.

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

'------------------------------------------------------------------------------------------------------------

Kreskikropki:                                               'Podprogram pierwszej pętli.

Do                                                         'Pętla (pierwsze instrukcje, gdy nie odbieramy jeszcze telegrafii).

Bitwait Pind.7 , Set                                       'Poczekaj, aż Pind.7 będzie miał 1. Właśnie jest 1.(Taka sytuacja jest, gdy nie ma jeszcze odbioru Morsa).

   Incr Policzlcd                                          'Jeśli Portd.7=1, zapełniaj zawartość zmiennej Policzlcd.

   If Policzlcd > 11 Then                                  'Jeśli Policzlcd przekroczy 11, a...

   If Licz = 0 Then                                        'Zmienna Licz będzie 0, to...

   Cls                                                     'Wyczyść Lcd i zacznij pisać od początku na Lcd (żeby napis nie wyszedł poza Lcd).

   Policzlcd = 0                                           'Wyzeruj zmienną.

   End If                                                  '

   End If                                                  'Koniec warunku.

Start Timer0                                               'Start Timera0.

   If Counter1 > 140 Then                                  'Jeśli licznik zliczył więcej, niż 140 impulsów, to...(Teraz nie zliczył, nie ma jeszcze odbioru).

   Lcd Chr(0)                                              'Wyświetl kreskę. Przygotowaliśmy jej konstrukcję (Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32). Teraz nie wyświetli.

   Print Chr(45);                                          'Pokaż kreskę na ekranie interfejsu.

   Else                                                    'W przeciwnym razie...(To znaczy: gdy Pind.7 reset)

   If Counter1 > 40 Then                                   'Jeśli licznik zliczył więcej niż 40 impulsów, ale...

   If Counter1 < 80 Then                                   'mniej, niż 80.

   Lcd Chr(1)                                              'Wyświetl kropkę. Przygotowaliśmy ją wcześniej: Deflcdchar 1 , 32 , 32 , 32 , 12 , 12 , 32 , 32 , 32.

   Print Chr(46);                                          'Pokaż na ekranie interfejsu kropkę.

   End If                                                  'Koniec warunków.

   End If                                                  '

   End If                                                  '

Stop Timer1                                                '

Counter1 = 0                                               '

Bitwait Pind.7 , Reset                                     'Poczekaj, aż Pind.7 osiągnie poziom niski (jest odbiór).

Start Timer1                                               'Wystartuj Timer1.

Stop Timer0                                                'Zatrzymaj Timer0..

Loop                                                       'Koniec pętli.

End                                                        '

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

'-------------------------------------------------------------------------------------------------------------

 Zlicz:                                                    'Podprogram Timera0 Zlicz. Liczy czas znaków i przerw.

 Incr Licz                                                 'Powiększaj zawartość zmiennej o 1 po każdym cyklu.

 If Licz > 6250 Then                                       'Jeśli osiągnie 6250, to...

 Licz = 0                                                  'Zeruj zmienną.

 Incr Policzlcd                                            'Zapełniaj zawartość zmiennej Policzlcd (ilością pól Lcd).

   Gosub Raz                                               'Skocz do podpr. Raz (aby znaki nie wychodziły poza Lcd).

 Stop Timer0                                               '

 If Pinc.5 = 0 Then                                        'Jeśli Portc.5 otrzymał masę wyłącznikiem W1, to...

 Lcd Chr(124)                                              'Wyświetlaj kreskę pionową.

 Print Chr(124);                                           'Pokazuj kreskę pionową na ekranie interfejsu.

   Gosub Dwa                                               'Skocz do podpr. Dwa (aby kreski nie wychodziły poza Lcd).

 End If                                                    'Koniec tego warunku.

   Gosub Zapisz                                            'Skocz do podprogramu Zapisz (rozpoznaj i pokaż znak).

 Pozycja = 0                                               'Zeruj zmienną.

 Znak = 0                                                  'Zeruj zmienną.

 Toggle Portc.0                                            'C.0 i C.1 pokazują początek kropki i kreski lub znaku.

 Toggle Portc.1                                            '

 End If                                                    'Koniec warunku > 6250.

Return                                                     'Wróć do programu.

'--------------------------------------------------------------------------------------------------------------

Raz:                                                        'Podprogram pilnujący mieszczenie się w Lcd, gdy wyświetlane są odbierane znaki.

  Select Case Policzlcd                                    'Sprawdź jaka jest liczba okienek Lcd w zmiennej Policzlcd.

      Case 19 :                                            'Jeśli zmienna zawiera 19 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 35 : Cls                                        'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 51 :                                            '

      Locate 2 , 1                                         '

      Case 67 : Cls                                        '

      Locate 1 , 1                                         '

      Case 83 :                                            'Jeśli zmienna zawiera 83 okienka.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 99 : Cls                                        'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 115 :                                           '

      Locate 2 , 1                                         '

      Case 131 : Cls                                       '

      Locate 1 , 1                                         '

      Case 147 :                                           'Jeśli zmienna zawiera 147 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 163 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 179 :                                           '

      Locate 2 , 1                                         '

      Case 195 : Cls                                       '

      Locate 1 , 1                                         '

      Case 211 :                                           'Jeśli zmienna zawiera 211 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 227 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 243 :                                           'Jeśli zmienna zawiera 243 okienka.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 259 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 275 :                                           '

      Locate 2 , 1                                         '

      Case 291 : Cls                                       '

      Locate 1 , 1                                         '

      Case 307 :                                           'Jeśli zmienna zawiera 307 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 323 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 339 :                                           '

      Locate 2 , 1                                         '

      Case 355 : Cls                                       '

      Locate 1 , 1                                         '

      Case 371 :                                           'Jeśli zmienna zawiera 371 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 387 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 403 :                                           '

      Locate 2 , 1                                         '

      Case 419 : Cls                                       '

      Locate 1 , 1                                         '

      Case 435 :                                           'Jeśli zmienna zawiera 435 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 451 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 467 :                                           '

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 483 : Cls                                       'Czyść.

      Locate 1 , 1                                         'Przejdź do pierwszej linii, 1 okienko Lcd.

      Case 499 :                                           '

      Locate 2 , 1                                         '

      Policzlcd = 0                                        'Zeruj zmienną.

    End Select                                             'Koniec selekcji Policzlcd.

  Return                                                   'Wróć do Zlicz.

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

Dwa:                                                        'Podprogram pilnujący Lcd, gdy używamy kreski pionowe.

  Select Case Policzlcd                                    'Sprawdź jaka jest liczba okienek Lcd w zmiennej Policzlcd.

      Case 8 :                                             'Jeśli zmienna zawiera 9 okienek.

      Locate 2 , 1                                         'Przejdź do drugiej linii, pierwsze okienko Lcd.

      Case 16 : Cls                                        'Czyść.

      Policzlcd = 0                                        'Zeruj zmienną.

      Cls                                                  'Czyść.

    End Select                                             'Koniec selekcji Policzlcd.

  Return

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

'1=kropka, 2=kreska.

'Procesor czyta od tyłu.

Zapisz:                                                     'Podpogram podprogramu Zlicz.

Select Case Znak                                            'Instrukcja wyboru jednego z wielu. Jeśli Znak przyjmie wartość, to...

  Case 111 : Lcd "S"                                       'Jeśli Znak zawiera trzy kropki, pokaż S na Lcd.

  Print Chr(83);                                           'Pokaż S na interfejsie.

  Case 1221 : Lcd "P"                                      '

  Print Chr(80);                                           'Uwaga, średnik (;) pozwala pisać w poziomie.

                                                             'Jeśli nie ma średnika, interfejs pisze z góry na dół.

  Case 22111 : Lcd "3"                                     '

  Print Chr(51);                                           '

  Case 2221 : Lcd "J"                                      '

  Print Chr(74);                                           '

  Case 1212 : Lcd "C"                                      '

  Print Chr(67);                                           '

  Case 122 : Lcd "G"                                       '

  Print Chr(71);                                           '

  Case 21 : Lcd "A"                                        '

  Print Chr(65);                                           '

  Case 1112 : Lcd "B"                                      '

  Print Chr(66);                                           '

  Case 112 : Lcd "D"                                       '

  Print Chr(68);                                           '

  Case 1 : Lcd "E"                                         '

  Print Chr(69);                                           '

  Case 1211 : Lcd "F"                                      '

  Print Chr(70);                                           '

  Case 1111 : Lcd "H"                                      '

  Print Chr(72);                                           '

  Case 11 : Lcd "I"                                        '

  Print Chr(73);                                           '

  Case 212 : Lcd "K"                                       '

  Print Chr(75);                                           '

  Case 1121 : Lcd "L"                                      '

  Print Chr(76);                                           '

  Case 22 : Lcd "M"                                        '

  Print Chr(77);                                           '

  Case 12 : Lcd "N"                                        '

  Print Chr(78);                                           '

  Case 222 : Lcd "O"                                       '

  Print Chr(79);                                           '

  Case 2122 : Lcd "Q"                                      '

  Print Chr(81);                                           '

  Case 121 : Lcd "R"                                       '

  Print Chr(82);                                           '

  Case 2 : Lcd "T"                                         '

  Print Chr(84);                                           '

  Case 211 : Lcd "U"                                       '

  Print Chr(85);                                           '

  Case 2111 : Lcd "V"                                      '

  Print Chr(86);                                           '

  Case 221 : Lcd "W"                                       '

  Print Chr(87);                                           '

  Case 2112 : Lcd "X"                                      '

  Print Chr(88);                                           '

  Case 2212 : Lcd "Y"                                      '

  Print Chr(89);                                           '

  Case 1122 : Lcd "Z"                                      '

  Print Chr(90);                                           '

  Case 22221 : Lcd "1"                                     '

  Print Chr(49);                                           '

  Case 22211 : Lcd "2"                                     '

  Print Chr(50);                                           '

  Case 21111 : Lcd "4"                                     '

  Print Chr(52);                                           '

  Case 11111 : Lcd "5"                                     '

  Print Chr(53);                                           '

  Case 11112 : Lcd "6"                                     '

  Print Chr(54);                                           '

  Case 11122 : Lcd "7"                                     '

  Print Chr(55);                                           '

  Case 11222 : Lcd "8"                                     '

  Print Chr(56);                                           '

  Case 12222 : Lcd "9"                                     '

  Print Chr(57);                                           '

  Case 22222 : Lcd "0"                                     '

  Print Chr(48);                                           '

  Case 212121 : Lcd "."                                    '

  Print Chr(46);                                           '

  Case 221122 : Lcd ","                                    '

  Print Chr(44);                                           '

  Case 211112 : Lcd "-"                                    'Myślnik

  Print Chr(45);                                           '

  Case 1212211 : Lcd " "                                   'Spacja

  Print Chr(32);                                           '

  Case 111222 : Lcd ":"                                    '

  Print Chr(58);                                           '

  Case 112211 : Lcd "?"                                    '

  Print Chr(63);                                           '

  Case 2122111 : Lcd "="                                   '

  Print Chr(61);                                           '

  Case 12112 : Lcd "/"                                     '

  Print Chr(47);                                           '

  Case 12212 : Lcd "("                                     '

  Print Chr(40);                                           '

  Case 212212 : Lcd ")"                                    '

  Print Chr(41);                                           '

  Case 21112 : Lcd "+"                                     'Plus

  Print Chr(43);                                           '

  Case 121221 : Lcd "@"                                    '

  Print Chr(64);                                           '

  Case 122221 : Lcd "'"                                    'Apostrof

  Print Chr(39);                                           '

  Case 1121221 : Lcd "$"                                   '

  Print Chr(64);                                           '

  Case 11121221 : Lcd "&"                                  '

  Print Chr(64);                                           '

  Case 111121221 : Lcd "*"                                 '

  Print Chr(64);                                           '

  Case 1111121221 : Lcd "#"                                '

  Print Chr(64);                                           '

  Case 2121221 : Lcd "%"                                   '

  Print Chr(64);                                           '

  End Select                                               'Koniec selekcji.

Return                                                      'Wróć do Zlicz.

ENDE