Moin,
von meinem 552ETTL GPS Modul bekomme ich eine seltsame Ausgabe. Ich muss
gestehen das es das erste mal das ich mit UART arbeite.
Leider zeigt die Ausgabe des Moduls nicht das gewünschte Ergebniss an
(siehe Bilder).
Vergleich NMEA 0183 und mein Ergebniss nach ca. 10 minuten:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
$GPGGA,192457.250,53,E,1,07,1.3,33.6,M,438.1021,N,01005.58165.0,M,,0000*
64
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
$GPRMC,192455.250,A,16,E,0.00,0.00,260515338.1021,N,01005.582,,,A*64
1) Hat jemand eine Idee warum das Ergebniss nicht konform ist?
2) Kann das an der Ausgabe zum LCD Display liegen?
3) TX GPS (ca. 0V-3,3V) kann ich doch direkt mit RX Mega16 verbinden,
oder? (Zum Aufbau mit einem MAX3232 habe ich dann später auch noch eine
Frage). (Lesbare Zeichen kommen ja an)
4) GPS Modul defekt?
Anbei sind Bilder der Ergebnisse (Draussen - 5m Abstand zur Hauswand)
und des Aufbaus (Im Gebäude).
CODE:
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include "lcd-routines.c"
|
5 | #include <util/delay.h>
|
6 | #include <stdlib.h>
|
7 | #include <string.h>
|
8 |
|
9 | static void uart_init(void){
|
10 | #undef BAUD // avoid compiler warning
|
11 | #define BAUD 38400UL
|
12 | #include <util/setbaud.h>
|
13 | UBRRH = UBRRH_VALUE;
|
14 | UBRRL = UBRRL_VALUE;
|
15 | #if USE_2X
|
16 | UCSRA |= (1 << U2X);
|
17 | #else
|
18 | UCSRA &= ~(1 << U2X);
|
19 | #endif
|
20 | //UCSRB |= (1<<TXEN)|(1<<RXEN);
|
21 | UCSRB |= (1<<RXEN);
|
22 |
|
23 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
|
24 | }
|
25 |
|
26 | uint8_t uart_getc(void){
|
27 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar
|
28 | ;
|
29 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
|
30 | }
|
31 |
|
32 | void uart_gets( char* Buffer, uint8_t MaxLen ){
|
33 | uint8_t NextChar;
|
34 | uint8_t StringLen = 0;
|
35 |
|
36 | do{
|
37 | NextChar = uart_getc();
|
38 | }while(NextChar != '$'); // Warte auf erstes Zeichen
|
39 |
|
40 | while(NextChar != '\n' && StringLen < MaxLen - 1){
|
41 | *Buffer++ = NextChar;
|
42 | StringLen++;
|
43 | NextChar = uart_getc();
|
44 | }
|
45 |
|
46 | *Buffer = '\0'; // Noch ein '\0' anhängen um einen Standard C-String daraus zu machen
|
47 | }
|
48 |
|
49 | void lcd_string_int(uint16_t tmp_int){
|
50 | char buffer[20];
|
51 | utoa(tmp_int, buffer, 10);
|
52 | lcd_string(buffer);
|
53 | }
|
54 |
|
55 | int main(void){
|
56 | char gps_data[128];
|
57 | char* strpos;
|
58 | uint8_t myswitch = 0;
|
59 |
|
60 | lcd_init();
|
61 | uart_init();
|
62 |
|
63 | while(1){
|
64 | uart_gets(gps_data, sizeof(gps_data)); //Read Navilock 552ETTL
|
65 | if(myswitch == 0){
|
66 | strpos = strstr(gps_data, "GPGGA");
|
67 | }
|
68 | else{
|
69 | strpos = strstr(gps_data, "GPRMC");
|
70 | }
|
71 | if(strpos != NULL){
|
72 | if(myswitch == 0){
|
73 | myswitch = 1;
|
74 | }
|
75 | else{
|
76 | myswitch = 0;
|
77 | }
|
78 | lcd_clear();
|
79 | lcd_string(gps_data);
|
80 | _delay_ms(2000);
|
81 | }
|
82 | }
|
83 | }
|