GPS vevők és használatuk

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

GPS vevők és használatuk

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

Sziasztok!
Tegnap estére el kellett volna készülnöm egy GPS alapú sebesség mérővel.
Sajnos idő hiány miatt nem sikerült de kaptam lehetőséget hétvégéig. Viszont olyan problémákba ütköztem amit nem biztos hogy meg tudok oldani. A gond hogy nem találok a karakterláncban W-t nem lehet hogy nekem E-t kellene keresni? ez nem a szélességi kör jelölése? A minta szerint a sebesség adat ezt követi. A kijelzéssel is vannak még gondok sajnos de azzal még küzdök csak ezt nem tudom hogy mit tudnék csinálni vele.
A vevő adatlapja: http://tetye.hu/bascom/gps
Előre is köszi a segítségeteket.
Íme a kód:

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

'*********************************************
'* About:      TavIR 7segment program DEMO   *
'* Title:      7segment LED                  *
'* Filename:   7s-2.bas                      *
'* Compiler:   Bascom-AVR 1.11.9.8 Demo      *
'*                                           *
'* Author:     Robert Cseh                   *
'* E-mail:     avr /kukac/ tavir /pont/ hu   *
'* Homepage:   http://avr.tavir.hu           *
'*********************************************
'7segment*6 LED display

'--- Alapadatok ---
$crystal = 8000000                                          'Sebesseg
$regfile = "M8def.dat"                                      'Chip
$baud = 4800
$swstack = 128
$hwstack = 128
$framesize = 128

Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp1s As Single
Dim Temp1string As String * 8
Dim Temp2string As String * 1
Dim Gpsst As String * 80
Dim Speed As Integer
Dim Asd As Integer

'7segment
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                                          '3
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                                          '5
Config 7s_p = 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

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

Reset 7s_1
Reset 7s_2
Reset 7s_3

Dim 7s_segment(11) As Byte
7s_segment(11) = &B00000000                                 'blank
7s_segment(10) = &B00111111
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
Do
Input Gpsst
'Gpsst = "$GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70"
If Instr(gpsst , "W") > 0 Then
Asd = Instr(gpsst , "W")                                    'gpsst="W,173.8,231.8,130694,004.2,W*70"
Asd = Asd + 2                                               'w és , levág
Gpsst = Mid(gpsst , Asd , 3)                                'gpsst=173
Speed = Val(gpsst)
Print Speed
  Temp1s = Speed
Else
End If
   Temp1string = Fusing(temp1s , "#.")

   For Temp2b = 1 To 3
      Waitms 100                                            '1 szegmens vilagitasi ideje / valami időigényes
      Temp2string = Mid(temp1string , Temp2b , 1)
         Reset 7s_1
         Reset 7s_2
         Reset 7s_3
         Waitus 100                                         'szegmensek kozti kioltas
         Select Case Temp2b                                 'melyik pixel vilagitson?
            Case 1 : Set 7s_1
            Case 2 : Set 7s_2
            Case 3 : Set 7s_3
         End Select

        Temp1b = Val(temp2string)
         If Temp1b = 0 Then Temp1b = 10
            7s_a = 7s_segment(temp1b).0
            7s_b = 7s_segment(temp1b).1
            7s_c = 7s_segment(temp1b).2
            7s_d = 7s_segment(temp1b).3
            7s_e = 7s_segment(temp1b).4
            7s_f = 7s_segment(temp1b).5
            7s_g = 7s_segment(temp1b).6
            7s_p = 7s_segment(temp1b).7
   Next Temp2b
Loop
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Szerintem mi Keletre vagyunk Grinicstöl ezért „E=east” keressél!
Én teszt célból ki íratnám az egész „Gpsst String-et” a terminálra!

Én kivenném a feltétel vizsgálatból ezt:

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

 Input Gpsst
 'Gpsst = "$GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70"
 Asd = Instr(gpsst , "E")                                   'gpsst="W,173.8,231.8,130694,004.2,W*70"
 If Asd > 0 Then
...

A bascom régi hibája, hogy nem jól fordítja!

:idea:
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Hogy érted hogy nem jól fordítja?
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Át írtam a kódot, most így néz ki de ki be kapcsolásnál a kijelző 1-2 s-ig 000-át ír utána pedig random helyre tesz egy 0-t.

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

'*********************************************
'* About:      TavIR 7segment program DEMO   *
'* Title:      7segment LED                  *
'* Filename:   7s-2.bas                      *
'* Compiler:   Bascom-AVR 1.11.9.8 Demo      *
'*                                           *
'* Author:     Robert Cseh                   *
'* E-mail:     avr /kukac/ tavir /pont/ hu   *
'* Homepage:   http://avr.tavir.hu           *
'*********************************************
'7segment*6 LED display

'--- Alapadatok ---
$crystal = 8000000                                          'Sebesseg
$regfile = "M8def.dat"                                      'Chip
$baud = 4800
$swstack = 128
$hwstack = 128
$framesize = 128

Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp1s As Single
Dim Temp1string As String * 8
Dim Temp2string As String * 1
Dim Gpsst As String * 80
Dim Speed As Integer
Dim Asd As Integer
Dim Dsa As Integer

'SERIAL
On Urxc Rsolvas
Enable Interrupts
Enable Urxc


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

Reset 7s_a
Reset 7s_b
Reset 7s_c
Reset 7s_d
Reset 7s_e
Reset 7s_f
Reset 7s_g
Reset 7s_p

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

Reset 7s_1
Reset 7s_2
Reset 7s_3

Dim 7s_segment(11) As Byte
7s_segment(11) = &B00000000                                 'blank
7s_segment(10) = &B00111111
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
Do

   For Temp2b = 1 To 3
      Waitus 400                                            '1 szegmens vilagitasi ideje / valami időigényes
      Temp2string = Mid(temp1string , Temp2b , 1)
         Reset 7s_1
         Reset 7s_2
         Reset 7s_3
         Waitus 40                                          'szegmensek kozti kioltas
         Select Case Temp2b                                 'melyik pixel vilagitson?
            Case 1 : Set 7s_1
            Case 2 : Set 7s_2
            Case 3 : Set 7s_3
         End Select

        Temp1b = Val(temp2string)
         If Temp1b = 0 Then Temp1b = 10
            7s_a = 7s_segment(temp1b).0
            7s_b = 7s_segment(temp1b).1
            7s_c = 7s_segment(temp1b).2
            7s_d = 7s_segment(temp1b).3
            7s_e = 7s_segment(temp1b).4
            7s_f = 7s_segment(temp1b).5
            7s_g = 7s_segment(temp1b).6
            7s_p = 7s_segment(temp1b).7
   Next Temp2b
Loop

End

Rsolvas:
Input Gpsst
'Gpsst = "$GPGGA,000235.990,0000.0000,N,00000.0000,E,231,00,50.0,0.0,M,0.0,M,0.0,0000*72"
'Gpsst = "$GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70"
Print Gpsst
'Wait 1

If Instr(gpsst , "E") > 0 Then

'Print "if then:van E"
'Wait 1

   Asd = Instr(gpsst , "E")                                 'gpsst="W,173.8,231.8,130694,004.2,W*70"
   'Print "asd ami az E helye:" ; Asd
   'Wait 1

      Dsa = Len(gpsst)
      Dsa = Dsa - Asd
      Dsa = Dsa - 1

         Gpsst = Right(gpsst , Dsa)
         'Print "new gpsst: " ; Gpsst
         'Wait 1

            Dsa = Instr(gpsst , ",")
            'Print "itt van a  ,: " ; Dsa
            Dsa = Dsa - 1
           ' Wait 1

               Gpsst = Mid(gpsst , 1 , Dsa)
               'Print "gpsst speed: " ; Gpsst
               'Wait 1

                  Temp1string = Gpsst
                  'Print "Temp1string: " ; Temp1string
                  'Wait 1
   Else
   'Print "if else:nincs E "
   End If
Return






Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Hát itt valami nem oké. E után nem km/h adat érkezik.
Mentem kb 20-30-40km/h-val és ezt írta:
$GPGGA,130319.949,4735.5982,N,01845.3256,E,1,08,1.4,270.3,M,41.3,M,0.0,0000*7
De nem is $GPRMC, jön hanem ami fentebb van.
Kijelzőn is alig látni valamit csak vibrál halványan rajta a szám az is csak össze vissza.
Az a baj így is 2-3-4 mp-ként jön adat(attól függetlenül hogy még az sem jó), ilyenkor a kijelzőn egy pillanatra normális fényerővel világít az egyik szám, a többi sehogy. utána megint halványan vibrál.
Most a gps modul kb 4-5 féle formában küldi ezért nem jo az adat az első amit küld mindig a $GPGGA. de valahol küldi azt is amiben benne vagy a sebesség .



Ez a jelenlegi kód:

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

$crystal = 8000000                                          'Sebesseg
$regfile = "M8def.dat"                                      'Chip
$baud = 4800
$swstack = 128
$hwstack = 128
$framesize = 128

Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp1s As Single
Dim Temp1string As String * 8
Dim Temp2string As String * 1
Dim Gpsst As String * 80
Dim Speed As Integer
Dim Asd As Integer
Dim Dsa As Integer
Dim Lofasz As Single

'SERIAL
Config Timer1 = Timer , Prescale = 256
On Timer1 Rsolvas
Enable Interrupts
Enable Timer1


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

Reset 7s_a
Reset 7s_b
Reset 7s_c
Reset 7s_d
Reset 7s_e
Reset 7s_f
Reset 7s_g
Reset 7s_p

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

Reset 7s_1
Reset 7s_2
Reset 7s_3

Dim 7s_segment(11) As Byte
7s_segment(11) = &B00000000                                 'blank
7s_segment(10) = &B00111111
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

Do

   For Temp2b = 1 To 3
      Waitms 9                                              '1 szegmens vilagitasi ideje / valami időigényes
      Temp2string = Mid(temp1string , Temp2b , 1)
         Reset 7s_1
         Reset 7s_2
         Reset 7s_3
         Waitus 3                                           'szegmensek kozti kioltas
         Select Case Temp2b                                 'melyik pixel vilagitson?
            Case 1 : Set 7s_1
            Case 2 : Set 7s_2
            Case 3 : Set 7s_3
         End Select

        Temp1b = Val(temp2string)
   '     Print Temp1b
         If Temp1b = 0 Then Temp1b = 10
            7s_a = 7s_segment(temp1b).0
            7s_b = 7s_segment(temp1b).1
            7s_c = 7s_segment(temp1b).2
            7s_d = 7s_segment(temp1b).3
            7s_e = 7s_segment(temp1b).4
            7s_f = 7s_segment(temp1b).5
            7s_g = 7s_segment(temp1b).6
            7s_p = 7s_segment(temp1b).7
   Next Temp2b

Loop

End

Rsolvas:

Input Gpsst
'Gpsst = "$GPRMC,220516,A,5133.82,N,00042.24,W,173.8,231.8,130694,004.2,W*70"
Print Gpsst
'Wait 1

If Instr(gpsst , "E") > 0 Then

'Print "if then:van E"
'Wait 1

   Asd = Instr(gpsst , "E")                                 'gpsst="W,173.8,231.8,130694,004.2,W*70"
   'Print "asd ami az E helye:" ; Asd
   'Wait 1

      Dsa = Len(gpsst)
      Dsa = Dsa - Asd
      Dsa = Dsa - 1

         Gpsst = Right(gpsst , Dsa)
         'Print "new gpsst: " ; Gpsst
         'Wait 1

            Dsa = Instr(gpsst , ",")
            'Print "itt van a  ,: " ; Dsa
            Dsa = Dsa - 1
           ' Wait 1

               Gpsst = Mid(gpsst , 1 , Dsa)
               'Print "gpsst speed: " ; Gpsst
               'Wait 1

                  Print Gpsst
                  Lofasz = Val(gpsst)
                  Temp1string = "6"
                  Temp1string = Gpsst

                             Print Temp1string
                  'Temp1string = "234"
                  'Print "Temp1string: " ; Temp1string
                  'Wait 1
   Else
   'Print "if else:nincs E "
   End If
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 »

Én még a HW-det sem értem!
Hova mi van kötve?
Pl.: „Input Gpsst” Itt a GPST olvasod a soros portón?
„Print Gpsst” Itt pedig ugyan arra a soros portra visszaíród a kapott értéket!
Ugyan azon a soros vonalon van a GPS és a TERMINÁL?

Más.
Ha multiplexelt a 7 szegmenszes kijelződ, a vezérlését megszakításba kellene tenni.
Ami folyamatosan küldené az utolsónak beolvasott helyes értéket.
Különben nem fogsz látni rajta semmit!

Adatlap szerint 7 sorozatot kapsz:
Table 4-1 NMEA-0183 Output Messages
NMEA Record Description
GPGGA Global positioning system fixed data
GPGLL Geographic position- latitude/longitude
GPGSA GNSS DOP and active satellites
GPGSV GNSS satellites in view
GPRMC Recommended minimum specific GNSS data
GPVTG Course over ground and ground speed
GPMSS Radio-beacon Signal-to-noise ratio, signal strength, frequency, etc.

Először azt kellene vizsgálni a programban, hogy melyiket is kaptad ezek közül?
Szerintem itt kapod a sebbesség adatot:
"$GPVTG” pálya föld és föld feletti sebesség.


Kb.: Így látatlanba, ennyi észrevételem lenne!

8)
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Hova mi van kötve?
Atmega Rx- re a GPS Tx-e.
Atmega Tx megy a PC re debug.
PortB. 0-1-2 a három tranzisztor ami a kijelzőknek a gnd-t kapcsolja.
PortC.0 - A
PortC.1 - B
PortC.2 - C
PortC.5 - D
PortC.4 - E
PortB.5 - F
PortB.3 - G
PortC.3 - DP
Táp: 12Vdc->470uf puffer-> 1,5A-es 7805->100uf-> Atmega lábainál 100nf.
Amit kapok soros porton debug célból adtam is tovább PCre.

És itt hiba :
"Ha multiplexelt a 7 szegmenszes kijelződ, a vezérlését megszakításba kellene tenni.
Ami folyamatosan küldené az utolsónak beolvasott helyes értéket.
Különben nem fogsz látni rajta semmit!"
Ebben szeretnék segítséget kérni.
Lentebb látszik meddig jutottam, mellesleg ez az első ilyen projektem.

Először azt kellene vizsgálni a programban, hogy melyiket is kaptad ezek közül? - Most már szétszedtem simán PC-re kötöttem a vevőt és beállítottam hogy csak a GPRMC sor küldje el és 1 másodpercenként.(Én ebben láttam sebesség adatot, de ma megyek vele egy kört és kipróbálom ha a kijelzőn fogom látni.)

Itt az új letisztult kód:

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

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

'Változók_______________________________________________________________________
Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp1s As Single
Dim Temp1string As String * 8
Dim Temp2string As String * 1
Dim Gpsst As String * 80
Dim Speed As Integer
Dim Asd As Integer
Dim Dsa As Integer
Dim Lofasz As Single
Dim 7s_segment(11) As Byte
7s_segment(11) = &B00000000
7s_segment(10) = &B00111111
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

'Timer__________________________________________________________________________
Config Timer1 = Timer , Prescale = 64
On Timer1 Rsolvas
Enable Interrupts
Enable Timer1

'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

'MAIN___________________________________________________________________________

Do
   For Temp2b = 1 To 3
      Waitms 9
      Temp2string = Mid(temp1string , Temp2b , 1)
         Reset 7s_1
         Reset 7s_2
         Reset 7s_3
         Waitus 2
         Select Case Temp2b
            Case 1 : Set 7s_1
            Case 2 : Set 7s_2
            Case 3 : Set 7s_3
         End Select
         Temp1b = Val(temp2string)
         If Temp1b = 0 Then Temp1b = 10
            7s_a = 7s_segment(temp1b).0
            7s_b = 7s_segment(temp1b).1
            7s_c = 7s_segment(temp1b).2
            7s_d = 7s_segment(temp1b).3
            7s_e = 7s_segment(temp1b).4
            7s_f = 7s_segment(temp1b).5
            7s_g = 7s_segment(temp1b).6
            7s_p = 7s_segment(temp1b).7
   Next Temp2b
Loop
End

'_______________________________________________________________________________
Rsolvas:

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)
                     Speed = Val(gpsst)
                     Temp1string = Fusing(lofasz , "ccc." )
                     Asd = Instr(temp1string , ".")
                     Asd = Asd - 1
                     Temp1string = Left(temp1string , Asd)
   Else
   End If
Else
End If
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 »

Alakul a programod!

Bár pont fordítva oldottad meg.
Így ha a megszakításba sokáig vár az IPUTRA akkor villogni fog a kijelződ.


Még szinkronizálni kellene az Inputot az adóhoz.
Vagy pufferelni a vételt! Pl.:

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

Config Serialin = Buffered , Size = 80
8)
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Köszi! Ezt beletettem.
De van egy olyan gondom hogy ha a timer-t 64-en hajtom akkor 1mp-nél sűrűbben várja az inputot és mivel 1mp 1 input így ott lesz holt idő amíg nem hajtódik a kijelző ill. csak egy szám marad világítva.
Ha 256 ra állítom akkor meg kb 2-3mp mire lekérdezni, és így km órának kicsit lassú lenne a frissítés.
Erre esetleg ötlet?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Megszakításban levő kijelzőre itt 1 példa:
http://avr.tavir.hu/images/contents/36/ ... ment-2.bas
Ez megszünteti a villogást!

A GPS beolvasását pedig a fő ciklusba tenném.
A szinkronizálásra pedig ez a vizsgálat való:

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

'get a char from the UART
   If Ischarwaiting() = 1 Then                             'was there a char?
    Input Na     
     Print Na                                           'print it
  End If
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. május 21. hétfő, 13:35-kor.
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Igen ezt én is láttam de ebbe nem igazán tudtam beleintegrálni a gps-es adatvételt. Neki futottam 2-3x de bele bonyolódtam csak ezért maradt a másik.
:(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Akkor még 1*:
Do
'get a char from the UART
Ha üres a puffer át ugorjuk a vételt csináljuk a többi feladatot
If Ischarwaiting() = 1 Then 'was there a char?
Val
Ha érkezett adat. Itt van a GPS olvasás
Input Na
Itt pedig a feldolgozása
Print Na 'print it
End If
Itt csinálhatunk mást is, mert nem várakozunk az INPUTra feleslegesen
Loop
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Siker!
Így egész jó lett, annyi van még hogy kicsit halvány, a "sötét" kijelzőkön néha be-be villan az "a" szegmens, és hogy balra igazít.
a kód:

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

'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 Speed As Integer
Dim Asd As Integer
Dim Dsa As Integer
Dim Lofasz As Single

      Start Timer0
      Enable Timer0
      Enable Interrupts
     '7s_ertek = -112.403
      'Input "Number (ex.-112.403):" , 7s_ertek
      '7s_kiiras = Fusing(7s_ertek , "#.##")
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
                     Speed = Val(gpsst)
                     Temp1string = Fusing(lofasz , "ccc." )
                     Asd = Instr(temp1string , ".")
                     Asd = Asd - 1
                     7s_kiiras = Left(temp1string , Asd)


   Else
   End If
Else
End If
Print 7s_kiiras                                             'print it
End If

Loop
      Kijelzes:                                             '~1050 clock
         Incr 7s_szamjegy
         If 7s_dot = 0 Then
            If 7s_szamjegy > 3 Then
               7s_szamjegy = 0
               7s_dot = 0
            End If
            Else
            If 7s_szamjegy > 4 Then
               7s_szamjegy = 0
               7s_dot = 0
            End If
         End If
         7s_kiir_szamjegy = Mid(7s_kiiras , 7s_szamjegy , 1)       'kiirandó számjegy
         Reset 7s_1
         Reset 7s_2
         Reset 7s_3
         7s_temp1b = Val(7s_kiir_szamjegy)
         If 7s_kiir_szamjegy = "0" Then 7s_temp1b = 10      ' 0 character
            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
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 »

Az nmea mondat a sebességet tengeri csomóban adja meg (knot), ahhoz hogy km/h-t kapj 1,852-vel kell szorozni, bár úgy látom hogy 2-vel szoroztál:
Lofasz = Lofasz * 2
Ez így nem valami pontos, de lehet így is:
Lofasz = Lofasz * 1.852
Lofasz = round(Lofasz)
A hozzászólást 1 alkalommal szerkesztették, utoljára GPeti 2012. május 21. hétfő, 20:26-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Igy jobb lenne:

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

Kijelzes:                                                   '~1050 clock
   Incr 7s_szamjegy
' a  (Select Case 7s_szamjegy)  1 - 3. számol
   If 7s_szamjegy > 3 Then
      7s_szamjegy = 1
   End If

    7s_kiir_szamjegy = Mid(7s_kiiras , 7s_szamjegy , 1)     'kiirandó számjegy
    7s_temp1b = Val(7s_kiir_szamjegy)
    If 7s_kiir_szamjegy = "0" Then 7s_temp1b = 10           ' 0 character

    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
8)
Válasz küldése