Forum: Mikrocontroller und Digitale Elektronik Bascom GPS-Signal einlesen


von Patrick U. (simpleman)


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

von thomas (Gast)


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

von Micha B. (chameo)


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

von Patrick U. (simpleman)


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.

von Patrick U. (simpleman)


Lesenswert?

niemand? :-/

von nix (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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/

von Patrick U. (simpleman)


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

von Patrick U. (simpleman)


Lesenswert?


von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Stefan B. (stefan) Benutzerseite


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):
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 16000000
6
$baud = 4800
7
8
Echo Off
9
Declare Sub Serial0bytereceived()
10
' Config Serialin = Buffered , Size = 30 , Bytematch = 13
11
Config Serialin = Buffered , Size = 90 , Bytematch = 13
12
Enable Interrupts ' Bin nicht sicher ob das benötigt wird
13
14
'Hauptprogramm:
15
  Do
16
  ' Nop
17
  Loop
18
End
19
20
Serial0charmatch:
21
  ' CR (13) empfangen => Puffer auslesen und ausgeben
22
  Gosub Serial0bytereceived
23
Return
24
25
Sub Serial0bytereceived()
26
  ' Local Incoming_data As String * 30
27
  Local Incoming_data As String * 90
28
  Input Incoming_data Noecho    ' TXD des GPS-Empf. über ??? an RXD des µCs
29
  Print Incoming_data           ' TXD des µCs über MAX232 an RXD des PCs
30
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.

von Patrick Ulrich (Gast)


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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Dieser Teil wird wohl nie ausgeführt, weil String S nie exakt gleich 
string "K" ist.
1
G = Right(s , 6 )
2
T = Left(g , 2)
3
Geschw = Val(t)
4
5
If Geschw < 1 Then Portd.5 = 1 Else Portd.5 = 0
6
If Geschw >= 1 Then Portd.6 = 1 Else Portd.6 = 0
7
S = ""
8
G = ""
9
T = ""
10
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.

von jasmin (Gast)


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....

von ibilzh (Gast)


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.

von Niels K. (niels-k)


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"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.