Odbiornik alfabetu Morsa

 

Odbiornik ten, odbiera alfabet z nadajnika, którego opis można znaleźć wyżej, bezpośrednio lub drogą radiową,
albo z radistacji. Radiostacja może być dowolnego typu: AM, FM lub SSB.
Jeśli SSB, to należy tylko dobrać wysokość tonu przy pomocy BFO.

Odbiornik alfabetu Morsa

(Opublikowany w Elektronice Praktycznej nr 8/2006))

 

Urządzenie przeznaczone jest do odbioru kodu alfabetu Morsa z nadajnika i przekształcania go na alfabet języka polskiego lub ponownie na alfabet Morsa oraz do odbioru alfabetu Morsa z radiostacji.

 

Opis schematu

Sercem urządzenia jest mikroprocesor Atmega8 oznaczony jako Us1, do którego napisałem program  w języku Bascom.  Sygnał alfabetu Morsa dociera do procesora poprzez port PD.5. Jeśli jest to sygnał o poziomie TTL, to odbierany jest  z gniazda oznaczonego jako We2. Jeśli sygnał pochodzi z radiostacji i ma przebieg sinusoidalny, a poziom amplitudy jest niski, kierujemy go do gniazda oznaczonego jako We1. Wzmacniacz operacyjny oznaczony jako Us2 wzmacnia sygnał do poziomu TTL i dalej przez przełącznik W3 ponownie do portu PD.5. Gniazdo SPI służy do zaprogramowania procesora programatorem, który można zobaczyć na mojej stronie internetowej: www.henwyd.republika.pl. Chciałbym  dodać, że nie możemy tu zastosować programu kompilującego BascomAVR demo, ponieważ kod programu jest większy od 2Kb i przekracza jego ograniczenia. Program kompilujący BascomAVRspec. dający możliwości kompilacji do 8Kb możemy kupić w sklepie internetowym AVT. Na schemacie widzimy jeszcze wyświetlacz Lcd typu 2X16. Jeśli mamy zamiar zasilać urządzenia prądem sieciowym, to znajduje tu zastosowanie również stabilizator 7805, czyli Us3. Natomiast, jeśli urządzenie ma być przenośne, to można je zasilać z baterii 4,5V, tzw. płaskiej. Przycisk Reset służy do ewentualnego z resetowania procesora, natomiast wyłącznik W1 decyduje, czy wyświetlać kreskę pionową oddzielającą od siebie znaki kresek i kropek, a W2 decyduje, czy odbierany alfabet ma być wyświetlany w postaci cyfr i liter, czy ponownie w postaci kresek i kropek. Tranzystor T1 wypracowuje poziom niski dla portu PD.7, w czasie trwania kreski lub kropki, potrzebny w czasie działania programu procesora. Dioda Led D3, miga w takt odbioru alfabetu.

 

Opis działania

Przed zaprogramowaniem procesora przystąpimy do ustawienia Fusebitów jako, że zegar procesora ustawimy na pracę kwarcową, z kwarcem zewnętrznym. Jeśli nie wszyscy pamiętają, przypominam, że Atmega8 może również pracować bez kwarcu, wykorzystując własny generator wewnętrzny RC, zawarty  w strukturze procesora. Jeśli ktoś ma problemy z ustawianiem Fusebitów, zapraszam na moją stronę internetową, adres j. w.. Program wykorzystuje dwa Timery procesora. Timer0 przeznaczony jest do sprawdzania czasów pomiędzy literami, cyframi i innymi znakami oraz do ustawiania pionowej kreski pomiędzy znakami Morsa, jeśli sobie tego życzymy. Timer1 natomiast liczy impulsy zawarte w kresce i kropce rozpoznając w ten sposób znaki. Tolerancja zawartości tych impulsów jest następująca: kreska musi zawierać więcej niż 140, a kropka nie mniej niż 40 i nie więcej niż 80. Tolerancja jest na tyle duża, że ustawiając w radiostacji ton odbieranego sygnału znajdziemy miejsce w którym odbiór zacznie być czytelny. Trzeba jednak zwrócić uwagę, że odbierany sygnał musi być nadawany płynnie ponieważ, jeśli nadający zacznie zastanawiać się, czy nadać jeszcze np. kropkę lub kreskę, czas będzie zbyt długi i zostanie z interpretowany jako koniec znaku. W tej sytuacji postawiona zostanie pionowa kreska i będzie to błąd znaku. Program napisany jest w ten sposób, że  jeśli np. odbieramy kropkę, Timer1 policzył impulsy w znaku, a ich wartość mieści się pomiędzy 40 a 80, to zostanie wpisana jedynka do zmiennej Znak. Jeśli to będzie kreska, to do zmiennej zostanie wpisana dwójka. Następnie zmienna Znak jest sprawdzana i w zależności od ilości jedynek i dwójek wyświetlacz Lcd wyświetla tyle samo kropek i kresek. Sprawdzanie odbywa się w podprogramie Zapisz instrukcją Select Case  Znak. Algorytm dla zmiennej Znak opracował Zbyszek Chrobot, student Poltechniki poznańskiej, któremu składam podziękowania.


Odbiornik

Wykaz elementów

 

Us1...................................................Atmega8-16PI

Us2....................................MC1558, LM338

Us3....................................7805

T1.....................................BC148 itp.

D1, D2................................SD101A Schotky

D3..........................................  Led

Q.............................................10MHz

LCD.........................................2X16

SPI..........................................gniazdo programowania

Reset..........................................przycisk zwierny

W1, W2, W3......................................miniaturowy przełącznik

P1.......................................................Prk 2 do 10 kom

R1, R2, R5, R6, R7, R8, R10............10 kom

R3, R4...............................................100 kom

R5......................................................1kom

R11....................................................39 kom

R12....................................................510om

C1......................................................470uF

C2.......................................................1000uF

C3, C4, C9.........................................100nF

C5, C6................................................27pF

C7.......................................................2,2uF

C8, C10..............................................1uF

C11.....................................................220nF


Kod w Bascom-ie dla procesora Atmega8.
Tak jak w nadajniku, z powodu dość dużego kodu, trudno go spisać z ekranu komputera.
W związku z tym można go ściągnąć z portalu Elektroniki Praktycznej, lub napisać do mnie.

'Odbiór znaków Morsa.

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

'Procesor: ATMEGA8.

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

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

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

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

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

'Kreski-kropki, cyfry-litery będą wyświetlone na LCD.

'Fusebit ustawiony na: External XTAL 1110.

'Opracował Henryk Wydmuch

'Patrz sch. 131205 oraz Atmega8.png.

'Programu nie można zaprogramować kompilatorem AVR Demo, gdyż przkracza 2KB.

'Pamięć zajęta w 35%.

 

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

$crystal = 10000000                                         'Też dla kompilatora,zastosujemy kwarc zewnętrzny 10MHz.

 

Config Lcd = 16 * 2

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

                                        'Informacja na jakich Pinach będzie Lcd.

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

 

Cls                                                         'Czyść LCD.

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 Byte                                       '1 bajt zmiennej zawierającej piksele Lcd, aby napis nie wyszedł poza Lcd.

 

On Timer0 Zlicz                                             'Podprogram Timer-a0, wykonuje liczenie czasu trwania litr, cyfr i przerw.

Cursor Off                                                  '

 

Config Pind.7 = Input                                       'Ustawiamy Pind.7 jako wejście.

Config Pind.5 = Input                                       'Ustawiamy Pind.5 jako wejście.

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

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

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

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

 

Enable Interrupts                                           'Zezwolenie na wszystkie przerwania.

Enable Timer0                                               'Odblokuj przerwania Timera0.

 

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                                                  '

    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.

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

 

Kreskikropki:                                               'Podprogram.

 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). Teraz nie wyświetli.

    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.

    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.

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

  Zlicz:                                                    'Podprogram Zlicz.

  Incr Licz                                                 'Powiększaj zawartość zmiennej o 1.

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

  Licz = 0                                                  'Zeruj zmienną.

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

     If Policzlcd = 16 Then                                 'Jeśli Policzlcd osiągnie 16 pól Lcd, to...

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

     Policzlcd = 0                                          'Wyzeruj zmienną.

     End If                                                 'Koniec warunku

  Stop Timer0                                               '

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

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

  End If                                                    'Koniec tego warunku.

    Gosub Zapisz                                            'Skocz do podprogramu Zapisz.

  Pozycja = 0                                               'Zeruj zmienną.

  Znak = 0                                                  'Zeruj zmienną.

  End If                                                    'Koniec warunku.

 Return                                                     'Wróć do programu.

 

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

Zapisz:                                                     'Podpogram podprogramu Zlicz.

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

Case 111 : Lcd "S"                                          '

Case 1221 : Lcd "P"                                         '

Case 22111 : Lcd "3"                                        '

Case 2221 : Lcd "J"                                         '

Case 1212 : Lcd "C"                                         '

Case 122 : Lcd "G"                                          '

Case 21 : Lcd "A"                                           '

Case 1112 : Lcd "B"                                         '

Case 112 : Lcd "D"                                          '

Case 1 : Lcd "E"                                            '

Case 1211 : Lcd "F"                                         '

Case 1111 : Lcd "H"                                         '

Case 11 : Lcd "I"                                           '

Case 212 : Lcd "K"                                          '

Case 1121 : Lcd "L"                                         '

Case 22 : Lcd "M"                                           '

Case 12 : Lcd "N"                                           '

Case 222 : Lcd "O"                                          '

Case 2122 : Lcd "Q"                                         '

Case 121 : Lcd "R"                                          '

Case 2 : Lcd "T"                                            '

Case 211 : Lcd "U"                                          '

Case 2111 : Lcd "V"                                         '

Case 221 : Lcd "W"                                          '

Case 2112 : Lcd "X"                                         '

Case 2212 : Lcd "Y"                                         '

Case 1122 : Lcd "Z"                                         '

Case 22221 : Lcd "1"                                        '

Case 22211 : Lcd "2"                                        '

Case 21111 : Lcd "4"                                        '

Case 11111 : Lcd "5"                                        '

Case 11112 : Lcd "6"                                        '

Case 11122 : Lcd "7"                                        '

Case 11222 : Lcd "8"                                        '

Case 12222 : Lcd "9"                                        '

Case 22222 : Lcd "0"                                        '

Case 212121 : Lcd "."                                       '

Case 221122 : Lcd ","                                       '

Case 212211 : Lcd "_"                                       '

Case 111222 : Lcd ":"                                       '

Case 112211 : Lcd "?"                                       '

Case 211112 : Lcd "-"                                       '

Case 12112 : Lcd "/"                                        '

Case 212212 : Lcd "()"                                      '

Case 21112 : Lcd "="                                        '

Case 121221 : Lcd "@"                                       '

Case 112211 : Lcd "POWTORZ"                                 '

Case 12111 : Lcd "ZROZUMIALEM"                              '

Case 21212 : Lcd "ZACZYNAMY"                                '

Case 12121 : Lcd "KONIEC"                                   '

Case 11111111 : Lcd "POMYLKA"                               '

Case 11122 : Lcd "CZEKAJ"                                   '

Case 111222111 : Lcd "SOS"                                  '

End Select                                                  'Koniec selekcji.

Return                                                      'Wróć do podprogramu Zlicz.