- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: gps datensätze auswerten wie macht ihr das

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2006
    Beiträge
    16

    gps datensätze auswerten wie macht ihr das

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo

    Habe noch folgendes Problem

    die Daten kommen so rein es sieht so aus als ob der Atmega nicht
    hinterher kommt

    GPGGA,235947.000,0000.0000,N,0000.0000,E,017*00
    ,071000,,*1C
    ,M,,N,,K*4E
    GPGGA,235947.000,0000.0000,N,0000.0000,E,0170
    ,,,071000,,*1C
    ,,N,,K*4E
    GPGGA,235947.000,0000.0000,N,0000.0000,E,01700
    ,,071000,,*1C
    M,,N,,K*4E
    GPGGA,235947.000,0000.0000,N,0000.0000,E,017038,M ,,,,0000*00
    000,*4C
    C,235947.000,V,0000.0000,N,0000.0000,E,,,017*1C
    GPGGA,235947.000,0000.0000,N,0000.0000,E,017038
    ,071000,,*1C
    ,M,,N,,K*4E
    GPGGA,235947.000,0000.0000,N,0000.0000,E,01703800 0*00
    0,,*1C
    TG,,T,,M,,N,,K*4E

    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 4800
    $baud1 = 4800

    On Urxc Onrxd 'InterruptRoutine setzen
    Enable Urxc 'Interupt URXC einschalten
    Enable Interrupts


    Dim Buffer As Byte
    Dim Str1 As String * 30
    Dim Counter As Byte

    Open "COM1:" For Binary As #1
    Open "COM2:" For Binary As #2

    Do
    Loop


    Onrxd:
    Buffer = Udr


    Select Case Buffer
    Case Asc( "$")
    Str1 = ""
    Case 13
    Counter = 1
    Case Else
    Str1 = Str1 + Chr(buffer)
    End Select

    If Counter = 1 Then

    Print #2 , Str1
    Str1 = ""
    Buffer = ""
    Counter = 0
    End If
    Return



    sollte aber mit anfang $ und ende line feed das scheint ja zu klappen
    aber das $ nicht.

    hat jemand eine idee mit Bascom


    vielen dank

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Zitat:
    sollte aber mit anfang $ und ende line feed das scheint ja zu klappen
    aber das $ nicht.

    Verstehe nicht was du willst, was willst du wissen?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2005
    Ort
    Stuttgart
    Beiträge
    260
    Hio.
    Mit Bascom kenne ich mich nicht aus. Ich könnte dir aber meine kleine opensource Bibliothek schicken, bei der das alles implementiert ist. Die Bib ist aber in Java geschrieben, wobei ich mir denken kann, dass es nicht sonderlich schwer für dich ist, die paar relevanten Codezeilen zu lesen.

    Was genau da oben in dem Code für ein Problem vorliegt kann ich dir nicht sagen. Hab halt GPS im Titel des Themas gesehen und sofort drauf geklickt.

    Gruß
    Lutz

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    ich vermute mal ganz stark, daß deine ISR zu lang ist.
    es wäre sicherlich günstiger einen Weg zu suchen, die Auswertung der empfangenen Bytes im Hauptprogramm durchzuführen. Dazu wirst du ein oder mehrere Hilfsvariablen benötigen...
    wenn der Datensatz vom GPS immer gleich lang ist (in diesem Beispielcode 40 Stellen incl Startbyte und Line Feed), kannst das ganze sehr einfach in ein Array von Bytes schieben.

    Code:
    Dim Buffer(40) as Byte at &H60
    Dim Gps as String * 40 at &H60
    Dim a as Byte
    Dim b as Byte
    
    do 
      if a = 41  or b = 13 then
           Print #2 , Gps
           Gps = ""
      end if
    loop
    
    onrxd:
      b = udr
      if b = asc("$") then 
         a = 1
      end if
      if a < 41 then
        Buffer(a) = B
        incr a
      end if
    return
    die ISR in diesem Beispiel prüft das Startbyte und beginnt die Zuweisung dann erneut beim 1. Byte (das Startbyte wird mit in den String übernommen - ansonsten Dim Gps as String * 39 at &H61).
    Wenn der String komplett empfangen wurde, oder vorzeitig das Line Feed empfangen wurde, wird der String vom Hauptprogramm ausgegeben. Das nachfolgende $ startet die Zuweisung dann erneut...

    PS: hab das jetzt in Adaption meiner Programme mal eben schnell eingetippt - kann nicht garantieren, daß es so zu 100% funzt - mußt mal etwas probieren - allerdings die ISR hab ich bei meinen Progs fast genau so, und das funzt sogar mit Baudraten um die 19200 einwandfrei - sogar wenn der Chip dabei nur mit 7,3728 MHz taktet...
    MfG Dani.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2006
    Beiträge
    16
    beim kompilieren kommt fehler adress out of bounds bei derclaration buffer und gps


    was bedeutet es at $H60 ???

    Habe einen mega 128

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    ähm OK - das &H60 ist die Position im Speicher, wo die Variable abgelegt wird - beim Mega8 beginnt das eben bei &H60 - darum hatte ich gehofft, daß es beim Mega128 auch so wäre...

    Edit: so, ich habe mal verschiedene Werte ausprobiert - jedesmal ohne Erfolg - bin da jetzt auch etwas ratlos...

    Edit2:
    so habs jetzt doch hinbekommen... probier mal das - wird jetzt ohne Fehler compiliert...
    Code:
    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 4800
    $baud1 = 4800
    
    On Urxc Onrxd 'InterruptRoutine setzen
    Enable Urxc 'Interupt URXC einschalten
    Enable Interrupts
    
    Open "COM1:" For Binary As #1
    Open "COM2:" For Binary As #2
    
    Dim Buffer(40) As Byte At &H0110
    Dim Gps As String * 40 At &H0110 Overlay
    Dim a as Byte
    Dim b as Byte
    
    
    do
      if a = 41  or b = 13 then
           Print #2 , Gps
           Gps = ""
      End If
    Loop
    
    onrxd:
      b = udr
      if b = asc("$") then
         a = 1
      end if
      if a < 41 then
        Buffer(a) = B
        incr a
      end if
    Return
    MfG Dani.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Du kannst solche Stolperfallen umgehen mit:
    Code:
    Dim Buffer(40) As Byte
    Dim Gps As String * 40 At Buffer Overlay

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Du hast str1, wo du den GPS String hineinschreibst auf 30 Zeichen Länge dimensioniert. Ich vermute mal, dass der GPS String länger ist als 30 Zeichen ist und du überschreibst dann die nachfolgenden Variablen.

    Mach str1 mindestens so groß wie der längste GPS String plus einige Zeichen dazu zur Sicherheit.
    Natürlich muss auch der HW-Stack entsprechend groß genug sein, um im ISR die Rettung der Register aufnehmen zu können, für diese Test-Stellung würde ich mal mindestens 48 Bytes vorschlagen.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    Naja, das mit den 40 Stellen Länge war ja nur ein Schätzwert - ich habe noch nicht mit GPS rumgespielt, und daher weiß ich nicht wie lang da so ein Datensatz wirklich ist... aber das kann man ja leicht anpassen - sollte außerdem auch nur ein Beispiel sein, wie es hoffentlich funzen tut, die empfangenen Bytes schnell einem String zuzuordnen... - und es gibt da mit Sicherheit auch noch andere und bessere Möglichkeiten dazu, die mir als Anfänger für AVRs, auch noch nicht bekannt sind ...
    MfG Dani.

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Crazy Harry
    Registriert seit
    15.01.2006
    Ort
    Raum Augsburg - Ulm
    Beiträge
    1.308
    ist zwar nicht bascom, aber vielleicht hilft dir das was

    Code:
    Process ReadGPS(20,20:iData);
      Begin
        WaitPipe(RXBuffer);                         // Warte auf Daten im Puffer
        Read(SerInp, Temp);                         // Puffer lesen
    
        If Temp='$'                                 // Wenn Puffer='$' (Datensatzanfang)
          then
            Read(SerInp, Temp6);
            If Temp6 = 'GPRMC,'
              then
                Read(SerInp, NMEA.Time_UTC, ',');   // GSP Time in UTC
                Read(SerInp, NMEA.Status, ',');     // A=data valid or V=data not valid
                Read(SerInp, NMEA.Latitude, ',');   // ddmm.mmmm
                Read(SerInp, NMEA.Lat_Ind, ',');    // N=north or S=south
                Read(SerInp, NMEA.Longitude, ',');  // dddmm.mmmm
                Read(SerInp, NMEA.Log_Ind, ',');    // E=east or W=west
                Read(SerInp, NMEA.Speed, ',');      // variable speed in knots
                Read(SerInp, NMEA.Angle, ',');      // variable lenght in degrees
                Read(SerInp, NMEA.Date, ',');       // GPS Date ddmmyy
                //Read(SerInp, NMEA.Magnetic, ',');   // Magnetic declinason
                //Read(SerInp, NMEA.Checksum, ',');
              EndIf;
    
            If Temp6 = 'GPGGA,'
              then
                Read(SerInp, NMEA.Time_UTC, ',');   // GSP Time in UTC hhmmss.sss
                Read(SerInp, NMEA.Latitude, ',');   // ddmm.mmmm
                Read(SerInp, NMEA.Lat_Ind, ',');    // N=north or S=south
                Read(SerInp, NMEA.Longitude, ',');  // dddmm.mmmm
                Read(SerInp, NMEA.Log_Ind, ',');    // E=east or W=west
                Read(SerInp, NMEA.Status, ',');     // 0=Invalid, 1=Valid SPS, 2=Valid DGPS, 3=Valid PPS
                Read(SerInp, NMEA.Sat_Track, ',');  // Number of sat in view and used in solution
                Read(SerInp, NMEA.H_Dilution, ','); // dilution error
                Read(SerInp, NMEA.Height, ',');     // height over see
                //Read(SerInp, NMEA.Height_Unit, ',');
                //Read(SerInp, NMEA.DGPS_Time, ',');
                //Read(SerInp, NMEA.DGPS_ID, ',');
                //Read(SerInp, NMEA.Checksum, ',');
              EndIf;
          EndIf;
      End ReadGPS;

    die variablen sind so deklariert:
    Code:
    Temp                 : String[1];
    Temp6                : String[6];
    NMEA                 : Record
             Message_ID    : String[6];  // RMC protocol header
             Time_UTC      : String[9];  // hhmmss.sss
             Status        : String[1];  // A=data valid or V=data not valid
             Latitude      : String[9];  // ddmm.mmmm
             Lat_Ind       : String[1];  // N=north or S=south
             Longitude     : String[10]; // dddmm.mmmm
             Log_Ind       : String[1];  // E=east or W=west
             Speed         : String[6];  // variable lenght in knots
             Angle         : String[6];  // variable lenght in degrees
             Date          : String[6];  // ddmmyy
             Magnetic      : String[5];  // trash this one ..... not suported on SiRF GPS
             Sat_Track     : String[2];  // Number of sat in view and used in solution
             H_Dilution    : String[6];  // dilution error
             Height        : String[7];  // height over see
             //Height_Unit   : String[1];  // height-unit
             //DGPS_time     : String[6];  // trash this one
             //DGPS_ID       : String[6];  // trash this one
             //Checksum      : String[2];  // *10
             End;
    die RS232 hat einen eingangspuffer von 128 Byte. das prog läuft auf einem mega32 @ 16MHz

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen