GPS vevők és használatuk

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

config serialin=buffered, size=sok, bytematch=13 'az ENTERre jelezzen be! sok= minimum a karakterlanc hossza!+2 chr (10,13 karakter)

dim enterjott as bit

if enterjott=1 then
  beolvasni az adatot es a kiertekelest megtenni
   enterjott=0
endif


serial0bytematch:
enterjott=1
return
Ha nem igy teszel, akkor az input sorra ugorva (mert a bufferben van valami) vegig kell varni a bejovo karaktereket (4800 bps eseten 2msec/karakter!)
Bytematch eseten a bufferben ott a teljes karakterlanc mar...
De a programkba kell egy olyan, hogy mi van, ha tulmeretes a karakterlancod es a bufferben nincs enter :)
A buffertelitettseget figyeld a foprogramban. Es ha tele, akkor clear serialin... Buffermeret nagyobb legyen mint a varhato karakterlanchossz...

Mondjuk pazarolja a memoriat ez a megoldas... :)
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

Hát felkötöm magam.
Tegnap este még átírtam a szorzót 2 ről 1.852 re, le is fordult, teszt, eredmény: "0 ".
Vissza írtam 2 re eredmény: "0 ". Kivettem a szorzást eredmény :"0 " akár mennyivel megyek. Ha már egyszer működött most miért nem adja?! Kiborít. Fel le rohangáltam tegnap emelet- udvar közt a panellal a kezemben, mentem pár próbakört, csöpögő esőben és nem értem hol a hiba.
Robi: Az volt az első amit próbáltam (bytematch), de hiába vártam a &h13 vagy az &h10 et soha nem generálódott megszakítás. URCX pedig majdnem folyton megszakította.

Azóta még ennyit változtattam rajta:

Kód: Egész kijelölése

'Chip___________________________________________________________________________
$crystal = 8000000
$regfile = "M8def.dat"
$swstack = 128
$hwstack = 128
$framesize = 128

'Serial_________________________________________________________________________
$baud = 4800
Config Serialin = Buffered , Size = 80
Echo Off

'Timer__________________________________________________________________________
Config Timer0 = Timer , Prescale = 64                       '256:4.096 msec ~ 244 Hz
On Timer0 Kijelzes
Enable Timer0
Start Timer0
Enable Interrupts

'Kijelző________________________________________________________________________
7s_a Alias Portc.0
Config 7s_a = Output
7s_b Alias Portc.1
Config 7s_b = Output
7s_c Alias Portc.2
Config 7s_c = Output
7s_d Alias Portc.5
Config 7s_d = Output
7s_e Alias Portc.4
Config 7s_e = Output
7s_f Alias Portb.5
Config 7s_f = Output
7s_g Alias Portb.3
Config 7s_g = Output
7s_p Alias Portc.3
Config 7s_p = Output

'x
'888
7s_1 Alias Portb.0
Config 7s_1 = Output
' x
'888
7s_2 Alias Portb.2
Config 7s_2 = Output
'  x
'888
7s_3 Alias Portb.1
Config 7s_3 = Output

Reset 7s_a
Reset 7s_b
Reset 7s_c
Reset 7s_d
Reset 7s_e
Reset 7s_f
Reset 7s_g
Reset 7s_p
Reset 7s_1
Reset 7s_2
Reset 7s_3

Dim 7s_segment(12) As Byte                                  'szamjegy kodok
      7s_segment(12) = &B01000000                           'minuszjel
      7s_segment(11) = &B00000000                           'blank
      7s_segment(10) = &B00111111                           'nulla
      7s_segment(1) = &B00000110
      7s_segment(2) = &B01011011
      7s_segment(3) = &B01001111
      7s_segment(4) = &B01100110
      7s_segment(5) = &B01101101
      7s_segment(6) = &B01111101
      7s_segment(7) = &B00000111
      7s_segment(8) = &B01111111
      7s_segment(9) = &B01100111

Dim 7s_szamjegy As Byte
Dim 7s_dot As Bit                                           'ennyiedik irodik ki
Dim 7s_ertek As Single
Dim 7s_kiiras As String * 7
Dim 7s_temp1b As Byte
Dim 7s_kiir_szamjegy As String * 1
Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp1string As String * 7
Dim Gpsst As String * 80
Dim Asd As Integer
Dim Dsa As Integer
Dim Lofasz As Single

Do
If Ischarwaiting() = 1 Then
Input Gpsst
'Gpsst = "$GPRMC,220516,A,5133.82,N,00042.24,E,173.8,231.8,130694,004.2,W*70"
'Print Gpsst
   If Instr(gpsst , "$GPRMC") > 0 Then
      If Instr(gpsst , "E") > 0 Then
            Asd = Instr(gpsst , "E")
            Dsa = Len(gpsst)
            Dsa = Dsa - Asd
            Dsa = Dsa - 1
               Gpsst = Right(gpsst , Dsa)
                  Dsa = Instr(gpsst , ",")
                  Dsa = Dsa - 1
                     Gpsst = Mid(gpsst , 1 , Dsa)
                     Lofasz = Val(gpsst)
                     Lofasz = Lofasz * 2
                     Temp1string = Fusing(lofasz , "ccc." )
                        Asd = Instr(temp1string , ".")
                        Asd = Asd - 1
                        7s_kiiras = Left(temp1string , Asd)
                        Print 7s_kiiras
      Else
      End If
   Else
   End If
End If

Loop
Kijelzes:
    Incr 7s_szamjegy
       If 7s_szamjegy > 3 Then
           7s_szamjegy = 1
       End If
    7s_kiir_szamjegy = Mid(7s_kiiras , 7s_szamjegy , 1)
    7s_temp1b = Val(7s_kiir_szamjegy)
    If 7s_kiir_szamjegy = "0" Then 7s_temp1b = 10
    Reset 7s_1
    Reset 7s_2
    Reset 7s_3
    7s_a = 7s_segment(7s_temp1b).0
    7s_b = 7s_segment(7s_temp1b).1
    7s_c = 7s_segment(7s_temp1b).2
    7s_d = 7s_segment(7s_temp1b).3
    7s_e = 7s_segment(7s_temp1b).4
    7s_f = 7s_segment(7s_temp1b).5
    7s_g = 7s_segment(7s_temp1b).6
    7s_p = 7s_segment(7s_temp1b).7
    Select Case 7s_szamjegy                                 'melyik pixel vilagitson?
        Case 1 : Set 7s_1
        Case 2 : Set 7s_2
        Case 3 : Set 7s_3
    End Select
Return
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Hali Robert!
A tanácsod helytálló, de nem tudjuk még, hogy mit kapunk az üzenet végén.
Meg kellene nézni valami Hexa szerkesztőben. Lehet, hogy csak „0”-át?
A bejövő karakterek száma pedig kb.: 65+2 De ez is változhat, hiszen mozgás közben változnak az értékek.
Viszont mivel „E”-re várunk, mert utána jön a számunkra érdekes érték, lehetne bytematch=69 (E)
Így kevesebbet töltene az inputba.

Ami számomra nem egészen világos, hogy a bufferelés közben meddig van megszakításban a program?
Mert közben a timer megszakításnak élnie kel, hogy a kijelző multiplexelése folyamatos legyen.

Tetye!
Lehet, hogy valami érintkezés hiba keletkezet a sok hurcolás közben?
8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Akkor: AVR Resetve és Tx-Rx láb összeköt és PC-n Bray terminállal figyelni az eredményt...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

URX alatt beugrik, HWBuffer kiolvas, sramba átmásol, kiugrik....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Én is írtam egy gagyi programot gps modulhoz, írok ki belőle részletet:

Kód: Egész kijelölése


Dim Gps As Byte , X As Byte , Y As Byte
Dim D(80) As Byte , D1(80) As Byte
Dim Speeds As Single , Speed As Long
Dim Knot As Long , Knott As Word , Knote As Word , Jn As Byte 

Do
Startloop:
Gps = Waitkey()
If Gps <> "$" Then Goto Startloop

Gps = Waitkey()
If Gps <> "G" Then Goto Startloop

Gps = Waitkey()
If Gps <> "P" Then Goto Startloop

Gps = Waitkey(#1)
If Gps <> "G" Then Goto Startloop

Gps = Waitkey()
If Gps <> "G" Then Goto Startloop

Gps = Waitkey()
If Gps <> "A" Then Goto Startloop


For Y = 1 To 80
Gps = Waitkey()
If Gps = 13 Then Goto Next1
D1(y) = Gps
Next Y

Next1:

Startloop1:
Gps = Waitkey()
If Gps <> "$" Then Goto Startloop1

Gps = Waitkey()
If Gps <> "G" Then Goto Startloop1

Gps = Waitkey()
If Gps <> "P" Then Goto Startloop1

Gps = Waitkey()
If Gps <> "R" Then Goto Startloop1

Gps = Waitkey(#1)
If Gps <> "M" Then Goto Startloop1

Gps = Waitkey()
If Gps <> "C" Then Goto Startloop1

For X = 1 To 80
Gps = Waitkey()
If Gps = 13 Then Goto Next2
D(x) = Gps
Next X
Next2:

If D(41) = "." Then
Jn = 0
Goto Jump
End If

If D(42) = "." Then
Jn = 1
End If

If D(43) = "." Then
Jn = 2
End If

Jump:
Select Case Jn
Case 0:
Knote = D(40) - 48
Knot = Knote

Case 1:
Knott = D(40) - 48
Knott = Knott * 10

Knote = D(41) - 48
Knot = Knott + Knote

Case 2:
Knoth = D(40) - 48
Knoth = Knoth * 100

Knott = D(41) - 48
Knott = Knott * 10

Knote = D(42) - 48

Knot = Knott + Knote
Knot = Knot + Knoth

End Select

Speeds = Knot * 1.852
Speeds = Round(speeds)

loop

end




Ez az nmea mondat egy átok, de van olyan gps modulom is ami jrc bináris formátumban ad adatokat, ez fix 72byte adatot küld, van benne start byte és stop byte, a sebességet 10* km/h-ban, 2 byte-on (word)
egyből megkapod.
A programot hozzá urxc megszakítással írtam meg így a led kijelző is mehet vele multiplexelve, ha érdekel a modul írj mailt.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A gps-nek TE mondod meg, hogy milyen formában kéred az adatot...
SIRFstarIII esetén beállítószoftverrel mondod meg...
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Amiről írtam azt csak a "szigeten" használják, nem a SIRF bináris gps-ről van szó.
Ez egy régebbi verzió formátuma. Egyszerű nem?
http://dl4aas.de/jrc-protocol.htm
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: doncarlos »

Sziasztok!

Kísérletezgetek egy gps vevővel, MTK3339 chip a lelke. Jönnek is az NMEA mondatok belőle szépen. Szobába is hamar talál vételt uh. megérte az árát. A kérdésem a feldolgozással kapcsolatos. Sok megoldást kipróbáltam már, sajátot, másét de még semmi nem adott teljesen hibátlan megoldást. A jelenlegi kód, ami a "legstabilabb" (kevés hibával dolgozik) a következő:

Kód: Egész kijelölése

$regfile = "m128def.dat"
$crystal = 11059200
$hwstack = 256
$swstack = 256
$framesize = 256
$lib "lcd-pcf8833BR2.lbx"                                   'special color display support
$lib "GetToken.Lib"
$external Gettoken

Config Graphlcd = Color , Controlport = Portc , Cs = 1 , Rs = 0 , Scl = 3 , Sda = 2

'######################## Színek definiálása ###################################
Const Blue = &B00000011
Const Yellow = &B11111100
Const Red = &B11100000
Const Green = &B00011100
Const Black = &B00000000
Const White = &B11111111
Const Brightgreen = &B00111110
Const Darkgreen = &B00010100
Const Darkred = &B10100000
Const Darkblue = &B00000010
Const Brightblue = &B00011111
Const Orange = &B11111000
'###############################################################################

Dim Strbytes(109) As Byte
Dim Gpsline As String * 108 At Strbytes(1) Overlay          ' NMEA mondat tároló
Dim Strlen As Byte
Dim Index As Byte
Dim Chksum As Byte

Dim Gps_head As String * 5
Dim Gps_chksum As String * 2
Dim Gps_chksum_b As Byte

Dim Gps_data_flag As Byte                                   ' GPS adat jelző
Dim Ch As String * 1
Dim X As Byte
Dim Z As Byte
Dim Z_s As String * 1

Dim Gpstime_s As String * 10
Dim Gpslat_s As String * 10
Dim Gpslon_s As String * 10

Dim We As String * 1
Dim Ns As String * 1


Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Serialin = Buffered , Size = 200 , Bytematch = 13    ' GPS Buffer

Declare Function Gettoken(strinput As String , Byval Bseparator As Byte , Byval Bcount As Byte ) As String
'######################### LCD Init ############################################
Glcdcmd &H21
Glcdcmd &H36
Glcddata &H48                                               '40 = RGB vagy 48 = BGR
'###############################################################################


Open "Com2:" For Binary As #2
Enable Interrupts

Print "Serial1 init"
Print #2 , "Serial2 init"

Cls
Setfont Color8x8
Lcdat 1 , 1 , "GPS Teszt" , Black , White
Wait 2
Cls

Lcdat 4 , 2 , "GPS Ido:" , Black , White
Lcdat 24 , 2 , "Szelesseg:" , Black , White
Lcdat 44 , 2 , "Hosszusag:" , Black , White:

do
   If Gps_data_flag > 0 Then Gosub Processgps

   Lcdat 14 , 2 , Gpstime_s , Black , White
   Lcdat 34 , 2 , We ; " " ; Gpslon_s , Black , White
   Lcdat 54 , 2 , Ns ; " " ; Gpslat_s , Black , White
loop


'=====[ Charage Return Detected ]==============================================
Serial0charmatch:
   pushall
   incr GPS_Data_Flag    ' increment for each new GPS sentance.
   popall
return
'------------------------------------------------------------------------------

'=====[ Process GPS ]==========================================================
Processgps:
Decr Gps_data_flag                                          ' decriment for the line we are working on
Do                                                          ' look for start char "$" then continue.
Ch = Inkey()                                                ' if not found in buffer then return.
   If Ch = "" Then Return                                   ' this will clear any bad chars.
Loop Until Ch = "$"                                         ' once we see the '$' then continue.

Input Gpsline Noecho

Strlen = Len(gpsline)
Chksum = 0
Gps_chksum_b = 0
Strlen = Strlen - 3

For Index = 1 To Strlen
   Chksum = Chksum Xor Strbytes(index)
Next Index

Gps_chksum = Right(gpsline , 2)

Gps_chksum_b = Hexval(gps_chksum)

If Chksum <> Gps_chksum_b Then
   Print #2 , "{027}[16;1H" ; "Checksum error!" ; " " ; Gps_chksum ; "<>" ; Chksum ; "{027}[K"
   Return
End If

Print #2 , "{027}[16;1H" ; "                           " ; "{027}[K"

Gps_head = Gettoken(gpsline , 44 , 1)

Select Case Gps_head
   Case "GPGGA"
      Print #2 , "{027}[17;1H" ; Gpsline ; "{027}[K"

   Case "GPRMC"
      Print #2 , "{027}[18;1H" ; Gpsline ; "{027}[K"
      Gpstime_s = Gettoken(gpsline , 44 , 2)
      Gpslon_s = Gettoken(gpsline , 44 , 4)
      Gpslat_s = Gettoken(gpsline , 44 , 6)
      We = Gettoken(gpsline , 44 , 7)
      Ns = Gettoken(gpsline , 44 , 5)

   Case "GPGSA"
      Print #2 , "{027}[19;1H" ; Gpsline ; "{027}[K"

   Case "GPVTG"
      Print #2 , "{027}[20;1H" ; Gpsline ; "{027}[K"

   Case "GPGSV"
      Z_s = Gettoken(gpsline , 44 , 3)
      Z = Val(z_s) + 20
      Print #2 , "{027}[" ; Z ; ";1H" ; Gpsline ; "{027}[K"

   Case Else
      Print #2 , "{027}[24;1Helse :" ; Gpsline ; "{027}[K"

End Select

Return

Close #2

End

$include "color8x8.font"
$include "color16x16.font"
Jelenleg annyi történik, hogy az egyik soros porton van a gps modul a másikon soros porton meg kiírja az NMEA mondatokat, e mellett néhány adatot kiiratok a kijelzőre amiket az NMEA mondatból nyerek. Az eredeti az mcselec forumról való, megtoldottam még checksum ellenőrzéssel is, de így is van hogy hibás adat kerül a kijelzőre, és terminálba is látom hogy néha összeborulnak a sorok. Bár ezzel a gettoken asm-es cuccal eddig nagyon minimális hibát láttam. A fenti megoldás mellett próbáltam még főciklusba feldolgozni az adatokat de a jelenlegi jobban megfelel a későbbi céloknak, valamint úgy is voltak hibás adatok. Tehát tényleg nem lehet ezt a feladatot hiba nélkül megoldani vagy valamilyen teljesen más megközelítést kell alkalmazni?

Átlagos kimenet így néz ki:

Kód: Egész kijelölése

GPGGA,173240.000,4711.0000,N,01824.0000,E,1,6,1.39,116.7,M,41.2,M,,*5D
GPRMC,173239.000,A,4711.0000,N,01824.0000,E,0.37,140.24,210313,,,A*61
GPGSA,A,3,17,28,09,26,15,24,,,,,,,1.66,1.39,0.91*03
GPVTG,140.24,T,,M,0.37,N,0.69,K,A*35
GPGSV,4,1,14,24,68,306,12,15,48,201,15,09,47,106,40,17,47,072,35*77
GPGSV,4,2,14,12,37,247,16,37,35,175,,26,19,164,22,28,13,060,23*7A
GPGSV,4,3,14,18,12,277,,22,10,307,,25,05,246,,14,03,325,*76
Néha egy egy checksum error felvillan...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: Robert »

Tipp: nagyobb bejövő puffer?
Meglesném, hogy a buffer nincs e közel a telítettséghez és még a modulon visszábbvenném, hogy pl 1 adat jöjjön 1 sec alatt....
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: doncarlos »

Mekkora a max bejövő puffer?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: Robert »

Alapesetben (stringet fogadsz): 254 byte (255. a záró 0)

Tipp:

Kód: Egész kijelölése

The following internal variables will be generated for UART0:
_RS_HEAD_PTR0 , a byte counter that stores the head of the buffer
_RS_TAIL_PTR0 , a byte counter that stores the tail of the buffer.
_RS232INBUF0 , an array of bytes that serves as a ring buffer for the received characters.
_RS_BUFCOUNTR0, a byte that holds the number of bytes that are in the buffer.
_RS_BUFCOUNTR0 : nem közelíti meg a max értéket? Ezzel ellenőrzöd, hogy nem e buffer túltelítés/csordulás kavar e be....
Avatar
doncarlos
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2007. október 14. vasárnap, 6:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: doncarlos »

az _RS_BUFCOUNTR0 értéke max kb. 140.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: GPS vevők és használatuk

Hozzászólás Szerző: Robert »

Akkor buffered ok...

Mi van ha a gpsvevőt direktbe a PC-re kötöd? Ott is van hiba?
Válasz küldése