GPS-Zeit in HC12 einlesen

OP #1180457
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
#1180528
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.
OP #1180682
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?
OP #1203100
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
#1203167
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?
Gast #1203286
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
OP #1204091
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...
OP #1205566
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren