www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik GPS-Zeit in HC12 einlesen


Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe hier schon so viel über GPS gelesen, aber nirgendwo den 
richtigen Anstoß für mich gefunden, da ich den HC12 benutze und keinen 
ATMEGA.

Also zu dem was ich machen möchte:
Ich möchte "einfach" nur die Zeit aus den GPS-Daten in einer Variablen 
speichern. Ich habe ein Navilock NL-501TTL-Modul, kann es also direkt an 
den uC anschließen. Gesagt, getan. Habe also die RX/TX-Leitungen an den 
SCI-Port des HC12 gepint.

Den SCI-Port habe ich wie folgt initialisiert:
   SCIBD = 0x68;   //Baudrate=4800
   SCICR1= 0;
   SCICR2= 0b00001100;  //TX und RX enable
   SCISR2= 0;     //Standardbetrieb
   DDRS = 0x00;   //PortS -> Eingang

Nun zu meiner uC-Anfänger-Frage. Wie komme ich nun an die Zeitdaten z.B. 
die nach "RMC...."? Wenn ich den Inhalt des SCIDR-Registers 
(Datenregisters) ausgebe, kommt da nicht wirklich etwas Sinnvolles 
zustande.

Wäre schön, wenn jemand einen Tipp, Link o.Ä. hätte :)

Danke,
derLars

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liest du das ding Binär oder mit dem NMEA-Protokoll aus?

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ähm gute Frage. Weiß nicht genau was du damit meinst.

Also ich habe das Modul schon an den PC gehängt und mit einem 
Terminalprogramm nachgesehen, ob es funktioniert. Da erschienen dann die 
NMEA-Daten.

Hilft das weiter? :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Lars wrote:
> Ja ähm gute Frage. Weiß nicht genau was du damit meinst.
>
> Also ich habe das Modul schon an den PC gehängt und mit einem
> Terminalprogramm nachgesehen, ob es funktioniert. Da erschienen dann die
> NMEA-Daten.

Dan wird das wohl so sein.

Also wird dein erstes Ziel mal sein, ein Programm zu schreiben, welches 
ein komplette Zeile empfangen kann. Dazu brauchst du noch nicht mal den 
GPS Empfänger. Es reicht schon, wenn dein Programm von deinem 
Terminalprogramm eine Zeile empfangen kann und wieder zurückschickt.

Wenn du dann soweit bist, dass dein Programm eine komplette Zeile 
empfangen kann (Hinweis: Der Zugriff auf das SCIDR Register ist nur Teil 
der Lösung), dann ist der Rest reine Stringverarbeitung um den dich 
interessierenden Teil aus einem Datensatz herauszuholen.

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um ein Zeichen einzulesen, habe ich folgendes geschrieben.
#define RDRF 0x20 // Receive Data Register Full Flag

char SCI_InChar(void){

  while((SCISR1 & RDRF) == 0){};
  
  return(SCIDRL);

}

Beim Debuggen bleibt er genau in der while-Schleife hängen. Anscheinend 
kommen die Daten nicht an?

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich jetzt wieder etwas Zeit habe, habe ich mich nochmal daran 
gesetzt, das Einlesen zu realisieren.

Ich habe folgende Zeilen geschrieben:
//Port S (GPS)
  DDRS &= ~0b00000100;  // Port S -> Eingang (PS2 -> RX1)

  //SCI initialisieren
  
  SCI1CR1 = 0b00000000; // Normaler Mode (8 Bit)
  SCI1CR2 |= 0b00000100; // RX enable
  SCI1BD = 0x34; // 9600 Baud
 
 // Einlesen    
  while (1)
  {
    for (lf=0; lf<100; lf++)
    {
       while((SCI1SR1 & RDRF) == 0){} <---------Hier bleibt er stehen!!!
       GPS[lf] = SCI1DRL;           //Daten in Feld einlesen
       if (GPS[lf] == 0x0A) break;    
    }

An der markierten Stelle bleibt das Programm stehen. Laut meinem 
Verständnis kommen erkennt er gar kein Zeichen, richtig?

Sieht vielleicht jemand einen generellen Fehler? Hab alles mögliche 
versucht, es ändert sich aber nichts. Die Baudrate müsste auch stimmen, 
wenn ich das GPS-Modul an den PC mit einer Anzeigesoftware hänge, wird 
die Baudrate von 9600 erkannt.

Vielen Dank schon mal für eure Mühe!
derLars

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie "hängst" du den das Modul an den PC und wie an den MC?
Möglichkeiten:
- Falsche Belegung (kannst du an den PC senden/empfangen)?
- Fehlender Pegelwandler
- "flascher" Takt...

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An den PC über einen MAX232 und an den MC über einen Pegelwandler(von 
3,3V auf 5V). Das Ausgangssignal ist auch groß genug, um als Highpegel 
erkannt zu werden.

Der PC empfängt die GPS-Daten korrekt. Das Modul funktioniert also. Ich 
denke, dass die Pinbelegung auch richtig ist. Bin im Moment etwas 
ratlos.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Lars wrote:
> An den PC über einen MAX232 und an den MC über einen Pegelwandler(von
> 3,3V auf 5V). Das Ausgangssignal ist auch groß genug, um als Highpegel
> erkannt zu werden.
>
> Der PC empfängt die GPS-Daten korrekt. Das Modul funktioniert also. Ich
> denke, dass die Pinbelegung auch richtig ist. Bin im Moment etwas
> ratlos.

Kannst du vom PC aus Kontakt mit dem HC12 herstellen?

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Kannst du vom PC aus Kontakt mit dem HC12 herstellen?

Das funktioniert einwandfrei. Habe das Board CardS12 und einen P&E-BDM.

Habe auch schon einige Sachen damit gemacht, nur noch nie etwas mit dem 
SCI.

Autor: TommyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne mich mit den Details des HC12 auseinandergesetzt zu haben:

Könnte es sein, daß die Zeile
       while((SCI1SR1 & RDRF) == 0){} <---------Hier bleibt er stehen!!!

eigentlich
       while((SCI1SR1 && RDRF) == 0){} <---------Hier bleibt er stehen!!!

heißen müsste?

Grüße,
TommyS

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Hat das Ding nur eine SCI? (genauer Typ nicht genannt)Nicht das du am 
falschen Port bist.

Viel Erfolg, Uwe

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TommyS wrote:
> Könnte es sein, daß die Zeile
>
>
>        while((SCI1SR1 & RDRF) == 0){} <---------Hier bleibt er stehen!!!
> 
>
> eigentlich
>
>
>        while((SCI1SR1 && RDRF) == 0){} <---------Hier bleibt er
> stehen!!!
> 

Da ich das SCI1SR1-Register ja nur maskieren will, dürfte die erste 
Variante stimmen.

Der HC12 hat 2 SCI-Schnittstellen, habe alles auf SCI1 gemünzt. Hmmm, 
ich werde jetzt nochmal alles durchgehen...

Autor: Der Lars (vhdl-neuling)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Langsam glaube ich, dass die SCI-Schnittstellen im Eimer sind :D

Aber leider habe ich die Erfahrung gemacht, dass 95% der Fehler doch an 
demjenigen liegen, der vor der Kiste sitzt.

Habe aber noch eine Frage, habe zwar schon beides ausprobiert, aber es 
interessiert mich dennoch:

Muss ich im Data Direction Register eigentlich den RX-Pin als Eingang 
konfigurieren? Oder muss ich Widerstände(Pull-up, Pull-down) schalten? 
Wenn der Pin als RX vorgesehen ist, müsste das doch nicht so sein, oder?

Der lernbereite Lars

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.