Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odbiornik morsa, zewnętrzny kwarc atmega8, BASCOM.

ardnet 21 Sty 2011 13:24 3056 8
  • #1 21 Sty 2011 13:24
    ardnet
    Poziom 14  

    Mam taki problem, że zrobiłem projekt Odbiornika Morsa na ATmedze8. W oryginalnym projekcie jest kwarc 10 MHz, a ja użyłem 10.240 MHz gdyż taki miałem w domu, a sklepu elektronicznego w mojej okolicy nie ma.
    Jak podłącze ten odbiornik do komputera i z programu morsik coś wysyłam to np. "adrian" dekoduje poprawnie, a "jarek" już nie, tylko na LCD pojawia się "wtarek".
    Pisałem do autora projektu i powiedział mi, że najprawdopodobniej problem leży w Baskomie, coś z czasami. Strona projektu http://www.henwyd.republika.pl/TekstyHTML/Atmega8OdbText.htm Oto kod:

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

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



    Config Lcd = 16 * 1a

    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.


    Cursor Off
    Cls
    Lcd "  Odbiornik CW"
    Wait 4


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



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


    Ktoś widzi co tu jest nie tak, zmieniłem LCD z 2x16 na 1ax16 i czestotliwość kwarcy, fusbity to low 0xee high 0xd9

    Dodano po 3 [minuty]:

    A i dodałem to z "Odbiornik CW" na LCD z opóźnieniem czasowym.

    0 8
  • #2 06 Lut 2013 00:09
    sp3ots
    Poziom 36  

    Witam !
    Czy uruchomiłeś już ten odbiornik CW ?
    Prawdopodobnie częstotliwość rezonatora nie ma tu większego znaczenia gdyż ja znalazłem ten sam schemat na innej stronie:
    http://henwyd.republika.pl/TekstyHTML/OdbMorsa.html
    z kwarcem 8MHz.
    Też mam problemy z uruchomieniem tego dekodera CW.
    Pozdrawiam. Stefan
    ps. Ciekaw jestem czy oprócz autora Ktoś jeszcze uruchomił ten projekt ?

    0
  • #3 06 Lut 2013 19:45
    ardnet
    Poziom 14  

    No niestety, odbiornik uruchomiłem tylko elektronicznie, natomiast dekodowanie CW niewycjodziło mu zbyt dobrze.

    0
  • #4 06 Lut 2013 20:00
    sp3ots
    Poziom 36  

    Witam !
    Dzisiaj udało mi się uruchomić ten dekoder, wgrałem program ( nazwę go 8MHz ze względu na użyty w nim rezonator ). Nie wykonałem całego układu ( brak LMa ).
    Patrząc na schemat, zwłaszcza na opis TTL myślałem że wystarczy podłączyć w to miejsce sygnał TTL, np. z ATtiny13, nic z tego.
    Dopiero wgranie do ATtiny13 programu ( jako nadajnik ) z generowanymi odpowiednio dźwiękami załatwiło sprawę że dekoder CW 8MHz zaczął odbierać.
    Za godzinę wkleję kod programu.

    0
  • #5 06 Lut 2013 20:27
    ardnet
    Poziom 14  

    Jak możesz to popraw schemat na taki jak ty masz i też go wklej.
    A co do kodu to OK.
    Czy odbirnik odbiera cw z radia np. na 80m?Czywiscie czy poprawnie odbiera.

    0
  • #6 06 Lut 2013 20:51
    sp3ots
    Poziom 36  

    Schematu nie będę poprawiał, bo nie ma co poprawiać.
    To jest program nadajnika CW:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Program nadaje na przemian dwie litery, S O.
    Portb.4 Attiny13 podłączony jest bezpośrednio do punktu TTL, na obu schematach jest ten punkt.
    Nie wiem czy układ odbiera sygnały CW np. z 80tki bo nie mam całego układu zmontowanego, nie posiadam LM338.
    Program jaki wgrałem do ATmega8 jest w linku: #2 06 Lut 2013 00:09
    Znalazłem C358C, zmontowałem brakującą część układu, podłączyłem do Taurusa80.
    Oto efekty:
    2013.02.06 około godziny 23:30
    Odbiornik morsa, zewnętrzny kwarc atmega8, BASCOM. Odbiornik morsa, zewnętrzny kwarc atmega8, BASCOM. Odbiornik morsa, zewnętrzny kwarc atmega8, BASCOM. Odbiornik morsa, zewnętrzny kwarc atmega8, BASCOM.
    Uwagi !
    Odbierany sygnał musi być silny, czysty i nadawany w odpowiednim tempie.
    Wszystkich sygnałów nie da się rozkodować.
    Pozdrawiam. Stefan

    0
  • #7 18 Sty 2019 18:11
    komnetsuwalki
    Poziom 12  

    Poproszę o link do projektu lub zipa najlepiej eagle ponieważ ten wyżej nie działa brak strony brak schematu

    0
  • #9 18 Sty 2019 23:08
    LChucki
    Poziom 25  

    Zaciekawił mnie ten temat. Mam pomysł na algorytm aby zrealizować w miarę skuteczne dekodowanie znaków. Sposób dekodowania z pierwszego postu jest kiepski. Nadawcza musi "wcelować" z długością czasów. W miarę skuteczny program powinien dynamicznie dostosowywać się do tempa nadawania. W tym celu należy zapisywać czasy sygnałów i przerw w tablicy. Po zebraniu minimalnej wymaganej liczby elementów trzeba je posortować. Następne przeszukać tablicę i określić minimalny czas kreski. Dalej już prosto. Przeszukując tablicę decydować czy jest to kropka, kreska, odstęp pomiędzy znakami czy wyrazami.
    Może napisze coś takiego na jakieś NUCLEO?

    [EDIT 2018-01-19]
    Napisałem prosty program (8h roboty) dekodujący znaki nadawane alfabetem Morse'a. Program na KA-NUCLEO F411. Można oczywiście uruchomić na innych płytkach z F411. Używam wewnętrznego RC więc uC prawie nie wymaga elementów zewnętrznych. Na razie prosta wersja. Klucz (przekaźnik, wyjście komparatora) należy podłączyć pod przycisk USER (zrobię wersję z dodatkowym wejście na PB3). Zwarcie z masą jest sygnałem aktywnym. Dane wysyłane są na UART2 z prędkością 115200 do programu terminala ANSI VT100 (np TeraTerm).
    Program, przez 30 znaków, uczy się długości kresek i kropek. Do tego czasu przyjmuje się 150/450ms. Co kolejne 30 znaków wykonywane są kolejne obliczenia. Wynik jest wyświetlany w terminalu. Na razie, za czas pomiędzy znakami, przyjęto czas kreski * 1,5, pomiędzy wyrazami czas kreski * 3. W kolejnej wersji zrealizuję naukę czasu przerwy. Przewiduję tez możliwość ręcznego wpisana czasów oraz zapisu ich w pamięci FLASH. To czy powstaną kolejne wersje zależy od forumowiczów.

    Program napisany jest w C i łatwo go przenieść na inne uC, np AVR.


    [EDIT 2019-01-20]
    Kolejne wersje softu i opisy programu można znaleźć na https://www.elektroda.pl/rtvforum/viewtopic.php?t=3543349&highlight=

    0
    Załączniki: