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
unsignedcharbuf[64];
4
intpos=0;
5
intled=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
So, inzwischen habe ich meine Initialisierung mal manuell nach
Datenblatt gemacht:
1
voidinit_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.
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
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