Forum: Mikrocontroller und Digitale Elektronik Uart und Quectel L80 GPS


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kevin M. (1kevin_m1)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche im Moment das L80 GPS von Quectel auszulesen.
Mein Aufbau soll periodisch einen NMEA Satz empfangen und dann für eine 
bestimmte Zeit in den Sleep-Modus gehen.
Mein Aufbau besteht aus einem Atmega328, dem oben genannten L80 und 
einem Display zur Überprüfung.
In meinem Programm wecke ich zuerst das GPS-Modul auf, warte dann auf 
ein Interrupt an INT0, welches am PPS vom GPS hängt. Dann wird ein 
einziger Datensatz ausgelesen, an das Display weitergeleitet und dann 
wird das GPS und der Mikrocontroller in den Sleepmodus versetzt.

Nun zu meinen zwei Problemen(Wobei das erste nicht so schwerwiegend 
ist):
1)Ich verwende für den Uart keinen Puffer. Ich warte einfach bis ein 
$-Zeichen empfangen wird und speichere dann alle weiteren Zeichen bis 
'\n'.
Ich brauche ja nur einen Datensatz alle paar Minuten. Jedoch empfange 
ich nach dem aufwachen des L80 immer noch die Bestätigung, das er 
aufgewachen ist(PMTK-Satz) obwohl ich ja erst warte bis dieser ein 
3D-Fix hat, bevor ich Uart einlese. Ich habe extra keinen Puffer 
verwendet um diese PMTK-Sätze zu überspringen. Deshalb mein Dummy-Array 
:) Aber es müsste doch auch ohne gehen? Warum "Verliere" ich diese PMTK 
Sätze nicht, obwohl ich Uart erst viel später auslese?
2)Ich habe das Problem, dass das PPS Signal nach dem ersten Interrupt 
komischerweise fix auf "1" bleibt. Versetze ich das GPS jedoch nie in 
den Sleep-Mode, habe ich dieses Problem nicht.

Ich hoffe ich habe alle relevanten Infos angegeben. Falls nicht, fragt 
nach :)
Mfg Kevin

Hier meine Main. Habe Initialisierungen die nicht relevant sind 
weggelassen. Da programmtechnisch ja eigentlich alles funktioniert bis 
auf UART.
1
int main(void)
2
{
3
  uint8_t data[51];
4
  uint8_t Dummy[51];
5
  
6
  InitUART(UBRR_VAL);
7
  Display_init(LCD_DISP_ON);
8
  Display_home();
9
  
10
  send_Uart(PMTK314); //Nur GPGLL Satz
11
  get_Uart(Dummy); //Bestätigung empfangen
12
13
  DDRD &= ~(1 << DDD2); //PD2 als Eingang
14
  PORTD &= ~(1<<PORTD2); //Pull-up an PD2 deaktivieren
15
  
16
  EICRA |= (1<<ISC01)|(1<<ISC00); //Interrupt auf steigende Flanke
17
  EIMSK |= (1 << INT0); //Interrupt aktivieren
18
19
  watchdogInit(); // Watchdog initialisieren.
20
  Display_puts("START");
21
22
  while (1) 
23
    {
24
    send_Uart(PMTK101); //L80 Hot-Start
25
    get_Uart(Dummy); 
26
    while(!GPS_Signal); //Warte auf 3D_Fix
27
    get_Uart(data); //GPGLL-Satz empfangen
28
    send_Uart(PMTK161); //Sleep Mode
29
    get_Uart(Dummy);
30
    Display_clrscr(); 
31
    Display_puts(data); //GPGLL ausgeben
32
    GPS_Signal=0;
33
    EIMSK |= (1 << INT0); //Interrupt wieder aktivieren
34
    Sleep(2); //Für 2*8s mit Watchdog-Timer schlafen
35
    }
36
}
37
38
ISR(INT0_vect)
39
{
40
  GPS_Signal=1;
41
  EIMSK &= ~(1 << INT0); //Interrupt deaktiviern, damit nich jede sek wieder in die ISR gesprungen wird.
42
}

Meine Uart Funktionen:
1
void get_Uart(uint8_t* Buffer)
2
{
3
  uint8_t c;
4
  while(ReceiveByte()!='$');
5
  *Buffer++='$';
6
  c=ReceiveByte();
7
  while(c!='\n'){
8
    *Buffer++=c;
9
    c=ReceiveByte();
10
  }
11
  *Buffer='\n';
12
}
13
14
uint8_t ReceiveByte(void)
15
{
16
  while (!(UCSR0A & (1<<RXC0)));
17
  return UDR0;
18
}

von Robert K. (robert_k752)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Kevin,

schau mal in den Specs des L80, ob dieser einen internen Puffer hat 
(nennt sich bei Quectel LOCUS) und abgeschaltet werden kann.

Schönen Gruß!

von guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kevin M. schrieb:
> 2)Ich habe das Problem, dass das PPS Signal nach dem ersten Interrupt
> komischerweise fix auf "1" bleibt.

Der Puls hat eine Länge von 100ms. Je nach µC, Taktfrequenz und Baudrate 
schickst Du Dein GPS eventuell zu schnell schlafen. Du könntest nach der 
Displayausgabe einfach warten bis der Pin wieder 0 und das GPS erst dann 
stoppen.

von guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Robert K. schrieb:
> schau mal in den Specs des L80, ob dieser einen internen Puffer hat
> (nennt sich bei Quectel LOCUS) und abgeschaltet werden kann.

Hat es, muß man aber explizit einschalten und die Daten da drin werden 
auch nicht von allein gesendet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.