Forum: Mikrocontroller und Digitale Elektronik UART an GPS Empfänder


von Tim F. (Gast)


Lesenswert?

Hallo,

ich habe hier ein Navilock NL-507ETTL GPS Empfänger Modul 
(http://www.navilock.de/view/Dokumente_SLASH_Sonstiges/60415_-_Datenblatt_u-blox_GPS_Module/481)


Ein ATmega32 (@ 16 Mhz) ist mit dem Modul verbunden und gibt die 
empfangenen Daten auf einem Display aus. Ich empfange zwar ein Zeichen 
nach dem anderen, diese bestehen aber weniger aus Zahlen oder unserem 
Alphabet sondern überwiegend.... andere Zeichen.


Interessanterweise wiederholt das LDC mehrere Zeichenketten immer mal 
wieder. (alle 400 ms wird das Lesen und Ausgeben auf dem LCD wiederholt)


Vielleicht hat ja jemand von euch eine Idee? Danke.

1
void USART_Init( unsigned int baud )
2
{
3
  /* Set baud rate */
4
  UBRRH = (unsigned char)(baud>>8);
5
  UBRRL = (unsigned char)baud;
6
  /* Enable receiver and transmitter */
7
  UCSRB = (1<<RXEN)|(1<<TXEN);
8
  /* Set frame format: 8data, 1stop bit, no parity */
9
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
10
}
11
12
uint8_t uart_getc(void)
13
{
14
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
15
        ;
16
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
17
}
18
19
int main()
20
{
21
  int i=0;
22
  unsigned char string[16];
23
  init_LCD();
24
  USART_Init(F_CPU/(16*9600)-1);
25
26
  while(1)
27
  {
28
    for(i=0;i<16;i++)
29
    {
30
      string[i]=uart_getc();
31
    }
32
    lcd_clear();
33
    for(i=0;i<16;i++)
34
    {
35
      lcd_data(string[i]);
36
    }
37
    wait_ms(400);      // Um die empfangenen Daten auf dem LCD lesen zu können
38
    
39
  }
40
  
41
  return 0;
42
}

von TestX .. (xaos)


Lesenswert?

1. funktioniert das lcd mit statischem text ?
2. stimmt die baudrate vom gps?

von Tim F. (Gast)


Lesenswert?

Hallo Andi, danke für deinen Support.


1. Ja, das Display funktioniert.
2. Ja, die Baudrate ist im Datenblatt mit 9600 bps angegeben.


Was ich ebenfalls beobachtet habe; obwohl die Wartefunktion 400 ms 
wartet aktualisiert sich das Display 1 mal pro Sekunde. Im Datenblatt 
des Empfängers steht auch, dass die Daten 1 mal pro Sekunde verschickt 
werden.

von Jean P. (fubu1000)


Lesenswert?

Hi,
nicht ausprobiert aber. Aber rate mal das das nit klappt.
>USART_Init(F_CPU/(16*9600)-1);
Ich vermute mal einfach wegen den 9600 nimmt er "int" an und läuft mit 
dem mal 16 über.

Ich würde mal probieren:
#define F_CPU    16000000UL
#define BAUD     9600UL
#define UBRRVAL (F_CPU/(BAUD*16)-1)

und dann aufruf der Funktion:
USART_Init(UBBRVAL);

Hoffe es klappt, wie gesagt nicht getestet.
Gruß

von Tim F. (Gast)


Lesenswert?

Jop, das wars.


Vielen Dank!!!!!!!!!!

von Tim F. (Gast)


Lesenswert?

Ich möchte jetzt die Updatefrequenz von 1 auf 4 Hz erhöhen.


Im Datenblatt findet man folgende "Anleitung":
1
unsigned char DiableGLL [] = {"$PUBX,40,GLL,0,0,0,0*5C\x0D\x0A"};
2
unsigned char DiableGSV [] = {"$PUBX,40,GSV,0,0,0,0*59\x0D\x0A"};
3
unsigned char DiableVTG [] = {"$PUBX,40,VTG,0,0,0,0*5E\x0D\x0A"};
4
unsigned char DiableZDA [] = {"$PUBX,40,ZDA,0,0,0,0*44\x0D\x0A"};
5
unsigned char SaveToSRAM [] =
6
{0xB5,0x62,0x06,0x09,0x0C,0x00,0x00,0x00,0x00,0x00,
7
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x17,0x75};


Da geh ich mal davon aus, dass man dies hintereinander an dem Empfänger 
verschicken soll.

Dies habe ich so gemacht;
1
void USART_Transmit( unsigned char data )
2
{
3
  /* Wait for empty transmit buffer */
4
  while ( !( UCSRA & (1<<UDRE)) )
5
  ;
6
  /* Put data into buffer, sends the data */
7
  UDR = data;
8
}
9
10
void uart_transmit_string(unsigned char *string)
11
{
12
  unsigned int i=0;
13
  while(string[i]!=0)
14
  {
15
    USART_Transmit(string[i]);
16
    i++;
17
  }
18
}


und in der main versende ich es nun:
1
  uart_transmit_string(DisableGLL);
2
  uart_transmit_string(DisableGSV);
3
  uart_transmit_string(DisableVTG);
4
  uart_transmit_string(DisableZDA);
5
  for(i=0;i<14;i++)
6
  {
7
    USART_Transmit(Rate4Hz[i]);
8
  }



Die Updatefrequenz ist jetzt leider immer noch auch 1 Hz. Kann mir 
jemand helfen? Danke.

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.