mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom GPS-Signal einlesen


Autor: Patrick Ulrich (simpleman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe ein kleines problem, da ich anfänger bin und kaum ahnung habe. 
ich habe ein atmega 32, ein pollin evaluationsboard und ein 
GPS-empfänger. mein ziel ist es über bascom ein programm zu schreiben, 
dass mir die geschwindigkeit des GPS-empfängers ausgibt. ich habe leider 
nur wenig erfahrung mit bascom und mein größtes problem ist wie ich die 
signale des GPS-empfängers in meinen microcontroller über rs232 einlese. 
ich weiß nicht was für einen befehl ich benutzen soll.

ich wär froh wenn mir jmd schnell helfen könnte, denn es eilt bisschen.

danke schon im vorraus

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo patrick

davon mal abgesehen das dein vorhaben für einen anfänger etwas hoch 
gegriffen ist, empfehle ich dir das roboternetz forum, oder das etwas 
bunte bascom-forum. dort findest du bestimmt genug infos.

aber lasse dir gesagt sein, das ist nicht trivial was du vorhast.

gruß thomas

Autor: Micha B. (chameo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne BASCOM nicht aber Infos zur seriellen Übertragung findest Du 
hier: http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm

Die Geschwindigkeitsinfo aus einem NMEA String rauszupfrimeln sollte 
nicht große Herausforderung darstellen. Siehe: 
http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm

Autor: Patrick Ulrich (simpleman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'004.BAS:   UART-Empfänger ohne Interrupt
'Hardware:  MAX232 an PD0/PD1, Nullmodemkabel zum PC
'---------------------------------------------------
$Regfile  = "2313def.dat" 'AT90S2313-Deklarationen
$Crystal  = 3686400     'Quarz: 3.6864 MHz
$Baud     = 9600        'Baudrate der UART: 9600 Baud

Dim i As Byte

Do
  If USR.RXC = 1 Then  'Wenn Byte empfangen...
    i = UDR            'Byte aus UART auslesen
    Select Case i
    Case "H"
      Print "Hallo AVR"
    Case "h"
      Print "hallo avr"
    Case Else
      Print "Unbekannter Befehl"
    End Select
  End If
Loop
End


also mit diesem i = UDR kann ich den UART auslesen aber ich bekomm dann 
nur einzelne bytes mit denen ich nix anfangen kann. ich bräuchte doch 
nen string. ist das die einzige möglichkeit die daten des gps-empfängers 
zu erhalten bzw wie kann ich die einzelnen bytes die ich durch die obere 
methode erhalte in einen string umwandeln?

bin für jede hilfe dankbar.

Autor: Patrick Ulrich (simpleman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
niemand? :-/

Autor: nix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaue mal bei http://www.comwebnet.de vorbei oder im Forum 
http://www.comwebnet.de/forum dort gibt es genug Programme die man 
angucken kann und hilfe bekommt.

In der Hilfe von Bascom gibt es Erklärungen und Beispiele.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je nach GPS-Empfänger ist das leicht oder schwer. Leicht ist es bei 
einem GPS-Empfänger, der Nachrichten als Textzeilen im NMEA-Format 
sendet. Manche "schwierige" GPS-Emfänger kann man in den NMEA-Modus 
umschalten. Viele GPS-Emfänger haben eine feste Baudrate (g#mgig: 4800 
Baud) und Frameformat (gängig: 8N1). Bei manchen kann man Baudrate 
und/oder Frameformat umschalten.

Manche GPS-Emfänger geben TTL-Signale aus, und dabei entweder 5V TTL 
oder "Low Voltage" LVTTL bei 3,3V, und manche geben RS232 Pegel aus. 
Je nachdem ist die Hardwareverbindung zwischen µC und GPS-Emfänger zu 
bauen.

OK. Angenommen das Ausgabeformat ist geklärt und die Hardwareverbindung 
ist richtig aufgebaut. Jetzt zum Einlesen der Daten auf dem µC...

Schau dir folgende Erklärungen in der BASCOM AVR Hilfe (#1) oder einem 
BASCOM Tutorial (#2) an:

Dim
String
Config Serialin
Input

#1 http://avrhelp.mcselec.com/index.html
#2 http://halvar.at/elektronik/kleiner_bascom_avr_kurs/

Autor: Patrick Ulrich (simpleman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 4800


Echo Off

Declare Sub Serial0bytereceived()

Config Serialin = Buffered , Size = 30 , Bytematch = 13

Enable Interrupts


Do
   !NOP
Loop
End


Sub Serial0bytereceived()

   Local Incoming_data As String * 30
   Input Incoming_data Noecho
   Print Incoming_data

End Sub



hier mal ein programm von uns das eigentlich die gps-signale einlesen 
sollte und dann gleich wieder rausschickt aber wir konnten mit hilfe 
eines oszilloskop keine ausgehenden signale erkennen. kann mir jmd 
helfen wo die fehler liegen? ich wäre euch sehr dankbar.

gruß patrick

Autor: Patrick Ulrich (simpleman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutze übrigens diesen gps-empfänger

http://www.ddcom24.de/shop/artikel_artikel_53_name...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du hast aber gelesen, das der nur 2,85V an der Schnittstelle ausgibt?

MfG Spess

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angenommen der Einwand von Spess ist abgeklärt und ggf. mit Hilfe eines 
Pegelwandlers behoben...

Eine NMEA Zeile ist i.A. deutlich länger als 30 Zeichen. Die Puffer sind 
daher grösser einzurichten.

In deinem Programm fehlte noch das Label, das bei einem Bytematch 
angesprungen wird und das Auslösen der gewünschten Aktion bewirkt 
(Puffer = GPS-Telegramm auslesen und Ausgeben = an PC senden).

So könnte es aussehen (syntaxgeprüft, nicht simuliert, nicht auf 
Hardware getestet):

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 4800

Echo Off
Declare Sub Serial0bytereceived()
' Config Serialin = Buffered , Size = 30 , Bytematch = 13
Config Serialin = Buffered , Size = 90 , Bytematch = 13
Enable Interrupts ' Bin nicht sicher ob das benötigt wird

'Hauptprogramm:
  Do
  ' Nop
  Loop
End

Serial0charmatch:
  ' CR (13) empfangen => Puffer auslesen und ausgeben
  Gosub Serial0bytereceived
Return

Sub Serial0bytereceived()
  ' Local Incoming_data As String * 30
  Local Incoming_data As String * 90
  Input Incoming_data Noecho    ' TXD des GPS-Empf. über ??? an RXD des µCs
  Print Incoming_data           ' TXD des µCs über MAX232 an RXD des PCs
End Sub

Das könnte funktionieren, wenn der Serialin Puffer solange erhalten 
bleibt bis ein Input ihn ausliest und zurücksetzt ("nacheilendes 
INPUT").

Es würde schief gehen, wenn ein zutreffendes Bytematch den Puffer 
zurücksetzt, weil erwartet wird, dass ab dann INPUT zuständig ist 
("voreilendes INPUT"). Dieser Fall wäre IMHO aber unwahrscheinlich.

Solche Fragen sind halt nur durch Trial und Error zu klären, weil die 
Doku dünn ist und man nicht in die BASCOM Sourcen reinschauen kann.

Autor: Patrick Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 8
$framesize = 32

Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.0 = Input
Dim S As String * 82
Dim G As String * 6
Dim T As String * 2
Dim Geschw As Integer

On Urxc Onrxd
Enable Urxc
Enable Interrupts

Main:

Print "$PSRF103,05,00,01,01*25<CR> <LF>"
Print "$PSRF103,00,00,00,01*25<CR> <LF>"
Print "$PSRF103,01,00,00,01*25<CR> <LF>"
Print "$PSRF103,02,00,00,01*25<CR> <LF>"
Print "$PSRF103,03,00,00,01*25<CR> <LF>"
Print "$PSRF103,04,00,00,01*25<CR> <LF>"
Print "$PSRF103,06,00,00,01*25<CR> <LF>"
Print "$PSRF103,07,00,00,01*25<CR> <LF>"
Print "$PSRF103,08,00,00,01*25<CR> <LF>"
Print "$PSRF103,09,00,00,01*25<CR> <LF>"

If S = "K" Then
G = Right(s , 6 )
T = Left(g , 2)
Geschw = Val(t)

If Geschw < 1 Then Portd.5 = 1 Else Portd.5 = 0
If Geschw >= 1 Then Portd.6 = 1 Else Portd.6 = 0
S = ""
G = ""
T = ""
Geschw = 0

End If
Goto Main

Onrxd:
S = S + Chr(udr)
Return

Portd.5 und Portd.6 sind jeweils mit einer LED verbunden aber keine LED 
fängt an zu leuchten? sieht jmd nen fehler?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Teil wird wohl nie ausgeführt, weil String S nie exakt gleich 
string "K" ist.

G = Right(s , 6 )
T = Left(g , 2)
Geschw = Val(t)

If Geschw < 1 Then Portd.5 = 1 Else Portd.5 = 0
If Geschw >= 1 Then Portd.6 = 1 Else Portd.6 = 0
S = ""
G = ""
T = ""
Geschw = 0

Tipp: Du möchtest wahrscheinlich das erste Zeichen von S mit dem 
Buchstaben K vergleichen. Und du möchtest wahrscheinlich den Vergleich 
nur machen, wenn du eine vollständige Zeile empfangen hast.

Autor: jasmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
imme wieder erstaunlich wie schwer sich manche menschen mit 
systematischer fehlersuch tun ......;-).

Schließ doch bitte erst einmal ein dummes terminal (hyperterm) an den 
empfänger an.

ggf. einer res232 maxim für die pegelanpassung.

und dann weiter step bei step.

ind bascom eine isr welche einen string via interrupt füllt, so das 
prinzip.
schlaue machen das mit overlays und detektieren dir terminierung des 
nmea stings, aber vielleicht liefert dein empfänger den ja momentan gar 
nicht  ?

Daher fang erst mal an wie beschrieben....

Autor: ibilzh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Jasmin hat den entscheidenden Wink mit der Zaunlatte gegeben.
Erstmal am PC zum Laufen bringen und dann weiter.
V O R S I C H T  da brauchst du einen Pegelwandler.
Ich denke dass du bisher noch gar nicht weisst, was an der Schnittstelle 
ankommt.Du filterst hier schon lustig obwohl du noch kein Bit vom 
Empfänger eingelesen hast.
Lt. Datenblatt hat die RS232 4800 Baud, nicht 9600 wie in deinem
Programm. Ausgangsspannung: 0V~2.85V verlangt einen Pegelwandler
für PC. (z.B. MAX 232) Am MEGA32 passt die Schnittstelle. Da sind
auch TTL Pegel.
Lt. Datenblatt kann das Teil NMEA.
Zieh dir zuersteinmal Sirfdemo von Falcom.de. Wenn du dann an den
Empfänger ran kommst, dann sieh mal was das Mäuslein kann.
Wichtig zu allererst ist die Kommunikation. Am besten nachlesen, wie
die Baudrate bei leerer Batterie ist und mit dieser Baud arbeiten. Dann
kommst du wenigstens immer ran. Wenn du raus hast, wie der Empfänger
funktioniert, dann kannst du umschwenken und programmieren.
Wenn du NMEA Strings angesehen hast, dann siehst du, dass je nach
Konfiguration eine oder mehrere Zeilen kommen, die immer mit $GP 
anfangen.
Und da gibt es wieder Regeln, wie jeder String aufgebaut ist.
Weiter oben ist ein Link zu einer guter Infoseite.
Aus dem "Verhau" musst du dann die entsprechende Zeile filtern, in der
die Info ist, die du haben willst. Dann kannst du nach den Kommatrennern
die eigentliche Info filtern.

Autor: Niels Keller (niels-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist zwar schon ein älterer Beitrag. Ich hatte genau das Problem und habe 
das fürs NMEA-Protokoll in Bascom gelöst. Einfach die 
Zusammenstellung.zip herunterkopieren, den Quelltext öffnen und dann 
nach NMEA suchen. Ich zähle die Anzahl der Kommas und schließe daraufhin 
auf den darin enthaltenen Wert.

Beitrag "GPS Datenlogger Eigenbau"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.