Forum: Mikrocontroller und Digitale Elektronik EM-408 GPS-Modul/SIRF III von Binary nach NMEA umstellen


von Mike (Gast)


Lesenswert?

Hallo zusammen,

betreibe das oben genannte Modul an einem ATmega128.

http://www.lipoly.de/index.php?main_page=product_info&cPath=880_883_1336_1338&products_id=104204

Das Modul scheint aber im Binary Modus zu sein. Am angeschlossenen 
Display werden als Ausgabe des Moduls die Zeichen o und das Leerzeich in 
beliebiger Kombination angezeigt.

Ich krieg es leider nicht hin, dass Modula auf NMEA umzuschalten.

Laut Manual sollte es mit folgendem Befehl gehen:

A0A20018 —Start Sequence and Payload Length
810201010001010105010101000100010001000100012580 —Payload
013AB0B3 —Message Checksum and End Sequence

Ich habe dies als Code so umgesetzt:
1
  uart_putc('\xA0');
2
  uart_putc('\xA2');
3
  uart_putc('\x00');
4
  uart_putc('\x18');
5
6
7
  
8
  uart_putc('\x81');
9
  uart_putc('\x02');
10
  uart_putc('\x01');
11
  uart_putc('\x01');
12
  uart_putc('\x00');
13
  uart_putc('\x01');
14
  uart_putc('\x01');
15
  uart_putc('\x01');
16
  uart_putc('\x05');
17
  uart_putc('\x01');
18
  uart_putc('\x01');
19
  uart_putc('\x01');
20
  uart_putc('\x00');
21
  uart_putc('\x01');
22
  uart_putc('\x00');
23
  uart_putc('\x01');
24
  uart_putc('\x00');
25
  uart_putc('\x01');
26
  uart_putc('\x00');
27
  uart_putc('\x01');
28
  uart_putc('\x00');
29
  uart_putc('\x01');
30
  uart_putc('\x25');
31
  uart_putc('\x80');
32
33
  
34
35
  uart_putc('\x01');
36
  uart_putc('\x3A');
37
  uart_putc('\xB0');
38
  uart_putc('\xB3');


Dies führt aber zu keiner Veränderung. Kennt sich jemand mit der 
Thematik aus und könnte mir weiterhelfen?


Gruß
Mike

: Verschoben durch User
von Paul (Gast)


Lesenswert?

Hallo,

Daten schon mal als string gesendet?

Gruß Gast

von holger (Gast)


Lesenswert?

>Ich krieg es leider nicht hin, dass Modula auf NMEA umzuschalten.

Such nach dem Programm Sirfdemo.exe. Damit geht das.

von Mark (Gast)


Lesenswert?

lang ist es her, aber das Problem besteht immer noch. :-(

Danke, Sirfdemo.exe kenne ich. Das ganz sollte aber mit dem µC 
konfiguriert werden. Vielleicht hat noch jemand einen Idee.

von Purzel H. (hacky)


Lesenswert?

Dann koennte man mal abhorchen was das Sirfdemo so sendet ...

von holger (Gast)


Lesenswert?

>Danke, Sirfdemo.exe kenne ich. Das ganz sollte aber mit dem µC
>konfiguriert werden. Vielleicht hat noch jemand einen Idee.

Das brauchst du nicht mit dem uC machen. Wenn du mit
sirfdemo auf NMEA umgeschaltet hast, dann bleibt das
GPS auf NMEA.

von Mark (Gast)


Lesenswert?

hmmm ... es gibt ja einen Manual zum SIRF III Binary Protocol:
http://www.usglobalsat.com/downloads/SiRF_Binary_Protocol.pdf

Auf Seite 2-6 ist der Befehl zum umschalten beschrieben, aber bei mir 
klappt das nicht.

von Mark (Gast)


Lesenswert?

@Holger
Sicher? Bei mir wird nach längerer Zeit ohne Spannungsversorgung wieder 
auf Binary umgeschaltet.

von holger (Gast)


Lesenswert?

>@Holger
>Sicher? Bei mir wird nach längerer Zeit ohne Spannungsversorgung wieder
>auf Binary umgeschaltet.

Hmmm, bei mir war es jedenfalls bisher so. Falls dein GPS
sich die Daten irgendwo in einem per Goldcap oder Akku
gepufferten RAM merkt könnte es natürlich sein das die
Einstellung wieder verloren geht. Eventuell lohnt sich
ein Batteriewechsel;)

von Mike (Gast)


Lesenswert?

Das Gerät wird nicht per Batterie betrieb und es ist unvermeidlich das 
es mal eine zeitlang nicht mit Spannung versorgt wird.

Deshalb wäre es klasse,das Ganze per µC konfigurieren zu können.
Leider klappt es bis jetzt nicht ....

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

um das ganze noch einmal aufzugreifen:

Ich habe den µC nun mit RS232-Schnittstelle eines PCs verbunden und lese 
nun ein was der µC sendet. Komischer weise gibt es unterschiede zwischen 
dem gesendeten Code und was am PC eingelesen wird.

Der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <stdlib.h>
5
#include <string.h>
6
#include <util/delay.h>
7
#include "uart.h"
8
9
10
11
12
13
int main (void) {
14
15
16
17
  sei();
18
  uart_init(UART_BAUD_SELECT(9600,1000000L));
19
  
20
  
21
22
23
24
  uart_putc('\xA0'); _delay_ms(10); 
25
  uart_putc('\xA2'); _delay_ms(10);
26
  uart_putc('\x00'); _delay_ms(10);
27
  uart_putc('\x18'); _delay_ms(10);
28
29
30
  
31
  uart_putc('\x81'); _delay_ms(10);
32
  uart_putc('\x02'); _delay_ms(10);
33
  uart_putc('\x01'); _delay_ms(10);
34
  uart_putc('\x01'); _delay_ms(10);
35
  uart_putc('\x00'); _delay_ms(10);
36
  uart_putc('\x01'); _delay_ms(10);
37
  uart_putc('\x01'); _delay_ms(10);
38
  uart_putc('\x01'); _delay_ms(10);
39
  uart_putc('\x05'); _delay_ms(10);
40
  uart_putc('\x01'); _delay_ms(10);
41
  uart_putc('\x01'); _delay_ms(10);
42
  uart_putc('\x01'); _delay_ms(10);
43
  uart_putc('\x00'); _delay_ms(10);
44
  uart_putc('\x01'); _delay_ms(10);
45
  uart_putc('\x00'); _delay_ms(10);
46
  uart_putc('\x01'); _delay_ms(10);
47
  uart_putc('\x00'); _delay_ms(10);
48
  uart_putc('\x01'); _delay_ms(10);
49
  uart_putc('\x00'); _delay_ms(10);
50
  uart_putc('\x01'); _delay_ms(10);
51
  uart_putc('\x00'); _delay_ms(10);
52
  uart_putc('\x01'); _delay_ms(10);
53
  uart_putc('\x25'); _delay_ms(10);
54
  uart_putc('\x80'); _delay_ms(10);
55
56
  
57
58
  uart_putc('\x01'); _delay_ms(10);
59
  uart_putc('\x3A'); _delay_ms(10);
60
  uart_putc('\xB0'); _delay_ms(10);
61
  uart_putc('\xB3'); _delay_ms(10);
62
63
  uart_putc('\r'); _delay_ms(10);
64
  
65
do{
66
  _delay_ms(500);
67
68
69
70
} while (1);
71
72
return 0;
73
}


Im Anhang ein Screenshot des Terminal-Programms mit den empfangenen 
Daten.

Kann sich jeman die Unterschiede erklären?

Gruß
Mike

von holger (Gast)


Lesenswert?

>Kann sich jeman die Unterschiede erklären?

Wenn vorne eine 0 steht wird von putc scheinbar das höchste
Bit gesetzt. Keine Ahnung wo das herkommt.
Warum machst du das nicht so?:

  uart_putc(0xA0); _delay_ms(10);
  uart_putc(0xA2); _delay_ms(10);
  uart_putc(0x00); _delay_ms(10);
  uart_putc(0x18); _delay_ms(10);

von spess53 (Gast)


Lesenswert?

Hi

>Wenn vorne eine 0 steht wird von putc scheinbar das höchste
>Bit gesetzt. Keine Ahnung wo das herkommt.

Vielleicht auch wenn keine 0 davor steht. Nur dann merkt man es nicht. 
Im Programm wird nur die Baudrate initialisiert. Was ist z.B. mit der 
Anzahl der Datenbits? Für mich sieht das so aus, als wenn das Stopbit 
als Bit7 gewertet wird.

MfG Spess

von Mike (Gast)


Lesenswert?

>Was ist z.B. mit der
>Anzahl der Datenbits? Für mich sieht das so aus, als wenn das Stopbit
>als Bit7 gewertet wird.


Ich benutze die Lib von Peter Fleury. Ich habe dort gar keine Möglickeit 
gefunden, die Anzahl der Datenbits usw. einzustellen.

Gibt es diese Möglichkeit?


Gruß
David

von Mike (Gast)


Lesenswert?

Data 8 ; Stop 1 ; Parity None;

ist doch die Standardeinstellung bei einen ATmega32. Man muss doch in 
den entsprechenden Registern keinen Änderungen vornehmen, oder?




1
uart_putc('\xA0');

und
1
uart_putc(0xA0);

führen zum gleichen (falschen) Ergebnis.

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Komisch ist auch, das bei mehrmaligen senden nicht immer das gleich 
ankommt (Anhang).

von holger (Gast)


Lesenswert?

>  uart_init(UART_BAUD_SELECT(9600,1000000L));

Dann nimm mal einen Quarz. Der interne RC Osci könnte schuld daran
sein das du nicht richtig sendest.

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.