Forum: Mikrocontroller und Digitale Elektronik Navilock NL-552 (ublox5) an PIC16F87x


von Matthias P. (matze_p)


Lesenswert?

Hallo zusammen,

nachdem ich nun meinen PIC16F870 am Laufen habe und auch mein Display 
ansteuern kann, bin ich bei der letzten "Hürde" angekommen: der Anschluß 
des Navilock NL-552ETTL GPS-Moduls...

Ich gehe hoffentlich richtig in der Annahme, daß ich das Modul aufgrund 
der TTL-Pegel direkt an die USART-Pins des PIC anschließen kann... (???)

Ich habe zunächst Plus an Plus, Minus an Minus, TTL-TX an Pin 18 (RX), 
TTL-RX and Pin 17 (TX) angeschlossen und die Abschirmung erstmal offen 
gelassen. Sollte ich letztere an Minus anschließen oder wann braucht man 
die wirklich?

So, dann habe ich erstmal den Code aus dem USART-Sample des Hitech-PICC 
9.81 genommen, um die Schnittstelle des PIC zu initialisieren mit den 
entsprechenden Anpassungen wegen meines 4 MHz OSC:
1
#define BAUD 38400      
2
#define FOSC 4000000L
3
#define NINE 0     /* Use 9bit communication? FALSE=8bit */
4
5
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
6
#define HIGH_SPEED 1
7
8
...
9
10
#define init_comms()\
11
  RX_PIN = 1;  \
12
  TX_PIN = 1;      \
13
  SPBRG = DIVIDER;       \
14
  RCSTA = (NINE_BITS|0x90);  \
15
  TXSTA = (SPEED|NINE_BITS|0x20)

Mein MAIN-Loop sieht erstmal so aus:
1
main(void)
2
{
3
  unsigned char buf[64];
4
  int pos = 0;
5
  int led = 1;
6
7
  INTCON=0;  // purpose of disabling the interrupts.
8
  ADCON1 = 7; // make port A digital
9
  TRISA = 0; // port A all outputs
10
  TRISB = 0; // port B all outputs
11
12
  PORTA = 0;
13
  PORTB = 0xff;
14
15
  init_comms();  // set up the USART - settings defined in usart.h
16
17
  display_test();
18
  
19
  /*  MAIN LOOP  */
20
  RA4 = 1;
21
  for(;;)
22
  {
23
    buf[pos] = getch();
24
    pos = (pos+1) % 64;
25
    if ( pos == 0 )
26
      led *= -1;
27
    RA4 = (led > 0);
28
  }
29
}

Jetzt würde ich gerne wissen, ob denn nun Daten kommen - d.h., daß der 
Buffer gefüllt wird und jedesmal wenn er voll ist, die LED ungeschaltet 
wird.

Nur passiert leider nix... kann ich mit dem Pickit2 irgendwie live ins 
RAM gucken?

Muß ich den ublox doch noch initialisieren? Ich dachte bisher, daß er 
mit den Default-Einstellungen erstmal bei 38400 baud losläuft...

Für Tips wäre ich sehr dankbar!

Schönen Vatertag!
Matthias

von Matthias P. (matze_p)


Lesenswert?

So, inzwischen habe ich meine Initialisierung mal manuell nach 
Datenblatt gemacht:
1
void init_usart(void)
2
{
3
    TRISC7 = 1; // RX pin
4
    TRISC6 = 1; // TX pin
5
    //SPBRG = ((int)(_XTAL_FREQ/(16UL * BAUD) + 1));
6
    SPBRG = 6; // for 38400 baud, also tested value 7
7
8
    RCSTA = 0x90; // SPEN | CREN
9
    TXSTA = 0x24; // TXEN | BRGH
10
    PIR1 &= ~0x80; // always clear PSPIF on 16F870
11
    PIE1 &= ~0x80; // always clear PSPIE on 16F870
12
}

Direkt nach dem Aufruf der Funktion lese ich folgendes aus:


SPBRG ist 0x6, OK
RCSTA ist 0x96, also OERR und FERR wurden gesetzt
TXSTA ist 0x26, also TRMT wurde gesetzt

Frage: was bedeutet das nun?

Das GPS-Modul soll per default auf 38400 baud laufen. Die Werte 6 und 7 
für SPBRG sind also beide ziemlich schlecht, da genau 6.5 optimal wäre 
bei 4 MHz Takt.

Nur wie bekomme ich die Baudrate des GPS umgestellt? Muß ich das erstmal 
an einem PC bspw. auf 9600 umstellen, um weiterzukommen?

Oder einen 8 MHz Quarz kaufen, damit ich 13 als Divider in SPBRG 
schreiben kann?

VG
M.

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Matthias P.,

> Muß ich das erstmal an einem PC bspw. auf 9600 umstellen,
> um weiterzukommen?

Der GPS-Empfänger kann auf mehrere Baudraten eingestellt werden.
Ich meine, er behält diese Einstellung sogar nach Power Down. Wenn dem 
so sein kann, dann weißt Du nie, mit welcher Baudrate ein unbekannter 
Empfänger gerade sendet.

Abhilfe:
1. Oszilloskop, ob überhaupt was gesendet wird.
2. Terminalprogramm im PC, Empfänger über Pegelwandler anschließen, 
verschiedene Baudzahlen probieren. uBlox bietet ja auch selbst ein 
Steuerungsprogramm "u-Center" (oder so) zum kostenlosen Runterladen.
3. Baudratenerkennung in Deiner PIC-Schnittstelle. Aber erst, wenn Du 
die grundsätzliche Sendetätigkeit von 2. geprüft hast.

Das Manual mit den Einstellbefehlen für den uBlox (meine Referenz: NMEA, 
UBX Protocol Specification, 12. August 2008) ist ziemlich umfangreich. 
Ausgeliefert werden die Dinger in einem guten "jungfräulichen" Zustand 
für direkten Anschluss von Terminal oder uC.
Aber wenn irgendwer schon mal dran gespielt hat, dann such mal nach dem 
RESET-Befehl. Ich habe es zur Zeit nicht im Kopf.

> Das GPS-Modul soll per default auf 38400 baud laufen.
Genau

> Nur wie bekomme ich die Baudrate des GPS umgestellt?
Mit diesem u-Center. Du wählst die Baudrate, u-Center schickt dann den 
Kommandostring dazu.


> Oder einen 8 MHz Quarz kaufen, damit ich 13 als Divider in SPBRG
> schreiben kann?
Nimm lieber einen, mit dem sich die gerade richtige Baudzahl für Befehle 
passend einstellen lässt.

Ciao
Wolfgang Horn

von Matthias P. (matze_p)


Lesenswert?

Sooo,

ich habe jetzt einen 8 MHz Quarz-Oszillator eingebaut. Mit einem Divider 
von 12 komme ich nach Rechnung also auf

8000000 / (16*(12+1)) = 38461.5 Baud

D.h. 0.16 % genau zu 38400 Baud.

Des weiteren habe ich den GPS-Empfänger sowohl am Oszilloskop gemessen 
(26 usec Takt, also genau 38461.5 Baud (also perfekt zu dem Wert oben)), 
als auch über einen MAX232-Wandler an einen PC angeschlossen, wo ich 
saubere NMEA-Sentences lese:

$GPVTG,0.00,T,,M,0.00,N,0.0,K,N*02
$GPGGA,005813.750,0000.0000,N,00000.0000,E,0,00,99.9,-17.0,M,17.0,M,,000 
0*74
$GPGSA,A,1,,,,,,,,,,,,,99.9,99.9,99.9*09
$GPGSV,1,1,00*79
$GPGLL,0000.0000,N,00000.0000,E,005813.750,V,N*4C
$GPRMC,005814.000,V,0000.0000,N,00000.0000,E,0.00,0.00,060180,,,N*71

Habe zwar keinen Fix, aber das liegt daran, daß ich "indoor" bin.

Nichts desto trotz läuft mein PIC nicht so wie erwartet.

Es ist auch immer OERR gesetzt. Wo kommt der Overflow denn her? Wie kann 
ich das debuggen?

Gibt's vielleicht noch ein elektrisches Problem? Kann ich den 
GPS-Empfänger nicht direkt an die Rx/Tx-Pins des PIC anschließen?

VG
Matthias

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.