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


von Der L. (vhdl-neuling)


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:
1
   SCIBD = 0x68;   //Baudrate=4800
2
   SCICR1= 0;
3
   SCICR2= 0b00001100;  //TX und RX enable
4
   SCISR2= 0;     //Standardbetrieb
5
   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

von Timmo H. (masterfx)


Lesenswert?

Liest du das ding Binär oder mit dem NMEA-Protokoll aus?

von Der L. (vhdl-neuling)


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? :)

von Karl H. (kbuchegg)


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.

von Der L. (vhdl-neuling)


Lesenswert?

Um ein Zeichen einzulesen, habe ich folgendes geschrieben.
1
#define RDRF 0x20 // Receive Data Register Full Flag
2
3
char SCI_InChar(void){
4
5
  while((SCISR1 & RDRF) == 0){};
6
  
7
  return(SCIDRL);
8
9
}

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

von Der L. (vhdl-neuling)


Lesenswert?

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

Ich habe folgende Zeilen geschrieben:
1
//Port S (GPS)
2
  DDRS &= ~0b00000100;  // Port S -> Eingang (PS2 -> RX1)
3
4
  //SCI initialisieren
5
  
6
  SCI1CR1 = 0b00000000; // Normaler Mode (8 Bit)
7
  SCI1CR2 |= 0b00000100; // RX enable
8
  SCI1BD = 0x34; // 9600 Baud
9
 
10
 // Einlesen    
11
  while (1)
12
  {
13
    for (lf=0; lf<100; lf++)
14
    {
15
       while((SCI1SR1 & RDRF) == 0){} <---------Hier bleibt er stehen!!!
16
       GPS[lf] = SCI1DRL;           //Daten in Feld einlesen
17
       if (GPS[lf] == 0x0A) break;    
18
    }

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

von Läubi .. (laeubi) Benutzerseite


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...

von Der L. (vhdl-neuling)


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.

von Karl H. (kbuchegg)


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?

von Der L. (vhdl-neuling)


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.

von TommyS (Gast)


Lesenswert?

Ohne mich mit den Details des HC12 auseinandergesetzt zu haben:

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

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

heißen müsste?

Grüße,
TommyS

von Uwe (Gast)


Lesenswert?

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

Viel Erfolg, Uwe

von Der L. (vhdl-neuling)


Lesenswert?

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

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...

von Der L. (vhdl-neuling)


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

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.