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