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
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
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
'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.
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.
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/
$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
ich benutze übrigens diesen gps-empfänger http://www.ddcom24.de/shop/artikel_artikel_53_name_Navilock-NL-303P-GPS-Empfaenger-Sirf3-PDA.html
Hi Du hast aber gelesen, das der nur 2,85V an der Schnittstelle ausgibt? MfG Spess
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.
$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?
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.
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....
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.