HomeMade

Pełna wersja: Monitor ramek APRS
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam, po miesiącach obijania się w temacie hobby (praca mnie zaabsorbowała), postanowiłem powalczyć z programowaniem AVR-ów w Bascomie.
To moje pierwsze podejście do programowania AVR, napisałem monitor ramek do ARPS. Urządzenie ma za zadanie wyświetlać na panelu lcd 20x4 ramki które wyrzuca MiniTNC za pomocą łącza szeregowego.
Jako środowisko testowe użyłem kitu AVT 3500 i procesora 2313. Oczywiście 2kb miejsca na procesorze i kod w baskomie to straszna bieda. Ale na początek wystarcza.

Może koledzy podzielą się jakimiś ciekawymi programami (własnego autorstwa). Gdzie na przykładzie będzie można się czegoś nauczyć.

Środowisko testowe na zdjęciu.


A tutaj kod.

Kod:
'      SQ9MDD <rlabus@luxmat.com> 2010
'
'      This program is free software; you can redistribute it and/or modify
'      it under the terms of the GNU General Public License as published by
'      the Free Software Foundation; either version 2 of the License, or
'      (at your option) any later version.
'
'      This program is distributed in the hope that it will be useful,
'      but WITHOUT ANY WARRANTY; without even the implied warranty of
'      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'      GNU General Public License for more details.
'
'      You should have received a copy of the GNU General Public License
'      along with this program; if not, write to the Free Software
'      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
'      MA 02110-1301, USA.
Config Serialin = Buffered , Size = 15

Dim Na As String * 15
Dim Nb As String * 9
Dim Nc As String * 9
Dim Nd As String * 9
Dim Ma As String * 7
Dim Mb As String * 7
Dim Mc As String * 7
Dim Md As String * 7
Dim Whereis As Integer
Dim Zstart As Bit
Enable Interrupts
Cursor Off
'-----------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "APRS MONITOR.v.0.02a"
Locate 2 , 1
Lcd "-------SQ9MDD-------"
Wait 5
Locate 4 , 1
Lcd "waiting for data..."
'-----------------------------------------------------------------
Do

  If Ischarwaiting() = 1 Then                               'jesli bufor nie jest pusty

    Input Na Noecho                                         'wczytuje dane z bufora znak stacji

                                                          ' jesli bufor dluzszy niz 14 znakow to!
      If Len(na) > 14 And Zstart = 1 Then
         Whereis = Instr(na , ">" )                         ' tutaj sprawdzam gdzie jest znak ">"
         Whereis = Whereis + 1                              'gmeranie kursorem na prawo i lewo
         Ma = Mid(na , Whereis , 4)                         'co ramke sprodukowalo wyciagam tu
         Whereis = Whereis - 3                              'wywalam jakies smieci z poczatku stringa nie wiem jak sie tam znalazly
         Na = Mid(na , 2 , Whereis)                         ' a tutaj wycinam caly znak bo wiem gdzie jest >
                                                               'obsluga typu trakera
         If Ma = "APK1" Then
            Ma = "TM-D700"
         Elseif Ma = "APND" Then
            Ma = "DIGINed"
         Elseif Ma = "APNU" Then
            Ma = "UIDigi"
         Elseif Ma = "APOT" Then
            Ma = "OT"
         Elseif Ma = "APNX" Then
            Ma = "TNC-X"
         Elseif Ma = "APU2" Then
            Ma = "UiView"
         Elseif Ma = "URQU" Then
            Ma = "VX-8"
         Elseif Ma = "APJI" Then
            Ma = "jAPRSI"
         Elseif Ma = "APJS" Then
            Ma = "javAPR"
         Elseif Ma = "APZW" Then
            Ma = "MAP27"
         Elseif Ma = "APN3" Then
            Ma = "KPC-3"
         Elseif Ma = "APK0" Then
            Ma = "TH-D7"
         Elseif Ma = "APTT" Then
            Ma = "TT.v.1"
         End If

         If Nb <> Na And Nb <> Na And Nc <> Na And Nd <> Na Then       ' jesli string dla drugiej lini inny niz dla pierwszej dodaj na szczyt listy zabezpieczenie przed wyswietlaniem tych samych powtorzonych ramek
            Cls                                             'czysc wyswietlacz
            Locate 1 , 1                                    'kursr do gory
            Lcd Na
               Locate 1 , 11                                'przesuwamy kursor o 6 znakow prze koniec lcd w pierwszym wierszu
               Lcd Ma                                       'Wyswietl Biezacy Znak Stacji
            Locate 2 , 1                                    'ustawianie kursora
            Lcd Nb ;
               Locate 2 , 11
               Lcd Mb    
            Locate 3 , 1
            Lcd Nc
               Locate 3 , 11
               Lcd Mc
            Locate 4 , 1
            Lcd Nd
               Locate 4 , 11
               Lcd Md

            Nd = Nc
            Nc = Nb
            Nb = Na

            Md = Mc
            Mc = Mb
            Mb = Ma
                                                   'przepisz biezacy znak do drogiej zmiennej
          End If
      End If
      Zstart = 1
  End If

Waitms 5                                                    '1,5msec potrzebuje wyswietlacz na realizacje $home
Loop

'-----------------------------------------------------------------
End
Ryszard, ciekawa konstrukcja, może udałoby się wspólnymi siłami ją rozwijać, narysować schemat, płytkę drukowaną no i oczywiście soft. Kilku kolegów programuje w Bascomie i zapewne chętnie podzielą się swoim doświadczeniem. Gdyby byli chętni do pracy zespołowej można by zbudować własny moduł trakera z wieloma ciekawymi funkcjami np obsługą ramek stacji meteo.

Wszystko zależy od zainteresowania projektem i chęci do współpracy.
Przy okazji mielibyśmy praktyczny kurs programowania w Bascomie.
Koledzy a może by tak napisać to oprogramowanie w C na AVR. Wiem, że Bascom jest popularny, jest pełno funkcji do obsługi "prawie wszystkiego" ale podobno ma też sporo wad i ogramiczeń. Dodatkową zaletą jest to, że C jest za free a za Bascoma trzeba płacić bo wersja demo to raczej do zabawy.
Myślę że i na C przyjdzie czas tym bardziej że C jest mi lepiej znane. Natomiast na początek by poznać budowę procesora i złapać o co tam chodzi, to bascom jest wystarczający. Minusem jest niewątpliwie mało oszczędny kod wynikowy.

Czy z tego urodzi się projekt? zobaczymy...

Wracając do tematu monitora aprs, urządzenie to podstawowa aplikacja procesora AT90S2313 lub ATTiny2313, składająca się z jednego portu szeregowego plus obsługę wyświetlacza.
Dzisiaj przepisałem cały kod od nowa. Zamiast ośmiu zmiennych do przechowywania znaków stacji i typów trakerów. zastosowałem dwie zmienne tablicowe i pętle do wyświetlania ich zawartości.

Poniżej kod:

Kod:
'      SQ9MDD <rlabus@luxmat.com> 2010
'
'      This program is free software; you can redistribute it and/or modify
'      it under the terms of the GNU General Public License as published by
'      the Free Software Foundation; either version 2 of the License, or
'      (at your option) any later version.
'
'      This program is distributed in the hope that it will be useful,
'      but WITHOUT ANY WARRANTY; without even the implied warranty of
'      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'      GNU General Public License for more details.
'
'      You should have received a copy of the GNU General Public License
'      along with this program; if not, write to the Free Software
'      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
'      MA 02110-1301, USA.
Config Serialin = Buffered , Size = 15

Config Lcdbus = 4
Config Lcd = 20 * 4

$crystal = 4000000
$baud = 9600
$hwstack = 16
$swstack = 0
$framesize = 15

Dim Na As String * 15
Dim Znak(4) As String * 9
Dim Traker(4) As String * 4
Dim Whereis As Byte
Dim A As Byte

Enable Interrupts
Cursor Off
'-----------------------------------------------------------------
Cls
Locate 1 , 1
Lcd "APRS MONITOR.v.0.04a"
Locate 2 , 1
Lcd "-------SQ9MDD-------"
Wait 5
Locate 4 , 1
Lcd "waiting for data..."
'-----------------------------------------------------------------
Do
  Echo Off
  If Ischarwaiting() = 1 Then                               'jesli bufor nie jest pusty

    Input Na Noecho                                         'wczytuje dane z bufora znak stacji

                                                          ' jesli bufor dluzszy niz 14 znakow to!
      If Len(na) > 13 Then
         Whereis = Instr(na , ">" )
         Whereis = Whereis + 1
         Traker(1) = Mid(na , Whereis , 4)
         Whereis = Whereis - 3
         Znak(1) = Mid(na , 2 , Whereis)

         Cls                                                'czysc wyswietlacz

         For A = 1 To 4 Step 1                              'petelka do wyswietlania zakow z tablicy
            Locate A , 1                                    'ustawiam kursor
            Lcd Znak(a)                                     'i drukuje znak jaki wpadł do bufora
            Locate A , 11
               If Traker(a) = "APU1" Then                   'uiview 16
                  Lcd Lookupstr(0 , Trakerki)
               Elseif Traker(a) = "APU2" Then               'uiview 32
                  Lcd Lookupstr(1 , Trakerki)
               Elseif Traker(a) = "URQU" Then               'vx8
                  Lcd Lookupstr(2 , Trakerki)
               Elseif Traker(a) = "APK1" Then               'tmd700
                  Lcd Lookupstr(3 , Trakerki)
               Elseif Traker(a) = "APNU" Then               'uidigi
                  Lcd Lookupstr(4 , Trakerki)
               Elseif Traker(a) = "APN3" Or Traker(a) = "APNX" Then       'tnc-x
                  Lcd Lookupstr(5 , Trakerki)
               Elseif Traker(a) = "APND" Then               'digined
                  Lcd Lookupstr(6 , Trakerki)
               Else
                  Lcd Traker(a)
               End If
         Next A

            Znak(4) = Znak(3)                               'a tutaj przesuwanie zmienych z komorki do komorki co petelke
            Znak(3) = Znak(2)
            Znak(2) = Znak(1)

            Traker(4) = Traker(3)                           'a tutaj przesuwanie zmienych z komorki do komorki co petelke
            Traker(3) = Traker(2)
            Traker(2) = Traker(1)

      End If

  End If

Waitms 5                                                    '1,5msec potrzebuje wyswietlacz na realizacje $home
Loop

'-----------------------------------------------------------------
End

Trakerki:
Data "UiView 16"                                            '0 APU1
Data "UiView 32"                                            '1 APU2
Data "VX-8R"                                                '2 URQU
Data "TM-D700"                                              '3 APK1
Data "UiDigi"                                               '4 APNU
Data "TNC-X"                                                '5 APN3 APNX                                               '
Data "Digi_NED"                                             '6 APND
Ryszard, wybacz ale nie rozumiem skąd kompilator wie na których pinach procka wisi LCD, czy to się ustawia w innym pliku czy w samym Bascomie. Sorry, nigdy nie pisałem w Bascomie a chciałem zrozumieć jak działa ten program.
Druga prośba to zamieść proszę w programie przykładową ramkę jaka wchodzi na kanał szeregowy procesora, znając format ramki łatwiej analizować kod programu.
Tak to moje niedopatrzenie, przepraszam, nie ma tego w kodzie ale jest w ustawieniach kompilatora środowiska Bascom-AVR oczywiście te opcje można też ustawić w kodzie programu.

W helpie piszą tak (to tylko przykład) :
Kod:
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6

Poniżej przykładowe ramki które generuje MiniTNC:

Kod:
SQ9MDD-7>URQU03,WIDE1-1,WIDE2-2,NOGATE :`0SXl [/`op.Rysiek _
OK4FD-9>UR5S30,SR5NWR,WIDE1,SR5NRV*,WIDE2-1 :`2[/]"55}438.825MHz Frankie on tour TM-D710 VA =
SQ5BLK-1>APU25N,SR5NRV*,WIDE2-1 :=5222.74NI02055.29E&PHG2280 I-Gate Jablonna
Jednak polecam ASM.
W 2kB pozwala na bardzo wiele - a i proca poznaje się do kości.
Tak - wymaga nieco więcej niż CTRL+C / CTRL+V Wink
No jasne Wink

Napisz czy masz już wizję jak co ma wyglądać na LCD - jakie dane będą prezentowane itd. Z tych wpisów widzę że znak stacji i rodzaj urządzenia z którego pochodzi pakiet.
Ryszard dzięki za ramki i sposób konfiguracji LCD, teraz wszystko jest jasne. Nigdy nie przepadałem za Basic-iem ale łatwość robienia prostych projektów oraz oszczędność czasu na pisanie własnych funkcji jest jego wielką zaletą. Stosowanie asseblera wymaga większego doświadczenia, lepszej znajomości procesora oraz posiadania własnych procedur do obsługi urządzeń.
Na wyświetlaczu 4x20 znaków zmieści się dość dużo informacji, trzeba tylko dodać kilka klawiszy sterujących i zmieniać rodzaj wyświetlanej informacji np. wybieramy znak stacji, naciskamy [KEY-info] i mamy na LCD wszystkie dane o stacji: znak, termin ostatniej ramki, położenie, itd.
Większy problem aby dobrze znać co "siedzi w tych ramkach" i zaproponować ciekawy interfejs pokazywania tej treści.
No właśnie o tę łatwość chyba chodzi bo tutaj naprawdę można szybko zrobić użyteczne urządzenie.
Co do ramek APRS , same jako takie są mało interesujące (i kiepsko się mieszczą na lcd-ku 4x20). Dopiero ich analiza i wyświetlanie informacji było by Ciekawe.

Przydatna jest lista stacji, z czasem wysyłania ramek i ew jakaś informacja o typie stacji (mobilna, stała, obiekt). Jak najbardziej interesujące są szczegóły każdej z tych stacji. Czyli wybieramy stacje z listy i pobieramy dodatkowe informacje, czyli Znak, ikona, typ stacji, lokator odległość od naszej pozycji i kurs, pole komentarza.
Ostatnia funkcjonalność to wyświetlanie ramek w czasie rzeczywistym, czasami się przydaje podczas uruchamiania digi czy analizy problemów z siecią.

Oczywiście to wykracza już poza możliwości 2313 (jeśli piszemy w Bascomie).
Przy okazji piszę prosty sterownik przemiennika pod ATTiny2313, jeśli ktoś jest zainteresowany to wkleję tutaj kod źródłowy...

I zachęcam kolegów pokażcie co napisaliście i wyjaśnijcie jak i dlaczego.
Ja bardzo chętnie się nauczę czegoś nowego.
Stron: 1 2
Przekierowanie