Sida 1 av 1

Pic läser inte av gps korrekt

Postat: 27 juli 2010, 23:57:38
av Christian
Hej! Försöker på min PIC 16f690 att ta emot bytes från en gps mottagare (em406). PIC:en lagrar 16 bytes i en array och stänger sedan av mottagningen från gps:en för att skriva tecknen på en display. Jag använder HITEC:s kompilator och den inbyggda oscillatorn i PIC:en med 4MHz. Gps:en "outputtar" data med 4800 bps och USART:en på PIC:en är konfigurerad därefter.

När jag kör igång det hela så skrivs det ut "rätt information" lite då och då, men mestadels bara en massa skräp. Jag undrar om det är tänkbart att den interna oscillatorn är för onogrann för en sån här applikation? För ibland så dyker det upp relevant data på displayen men som sagt för det mesta inte..

Sen undrar jag om det räcker att stänga av mottagningen på USART:en (CREN = 0;) när jag är klar med lagringen av mina 16 tecken och vill skriva dem till LCD:n? Eller måste jag stänga av interrupts också medans jag behandlar datan?
Jag skulle uppskatta om jag kunde få lite tips på hur jag gör detta på bästa sätt!

mvh / Christian


här är koden jag använder:

Kod: Markera allt

#include <pic.h>
#include <htc.h>
#include "lcd.h"
#include "delay.h"


__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
char buffer[52];	//Databuffer
int index = 0; 

void usart(void){
	TRISB = 0XFF;
	TRISC = 0X00;	//Just for debug
	PORTC = 0;		//-||-
	ANSELH = 0x00; 	//All pins digital
	SPBRG = 52;		//4800 bps
	BRGH = 1;
	TXEN = 1; 		//Allows sending
	SYNC = 0; 		//The SYNC bit should be cleared to select asynchronous operation.
	SPEN = 1; 		//SPEN bit is used to enable the entire serial port
	CREN = 0;
	CREN = 1; 		//Allows receiving
	
	GIE = 1;  		//*Interrupts
	PEIE = 1;
	TXIE = 0; 		//Disable transmit interrupt
	RCIE = 1; 		//Enable receive interrupt

}

static void interrupt isr(void){	
	if((RCIE)&&(RCIF)){

		if(OERR){       // If overun-error has occured                  
			CREN=0;     // Re-enable receiving           
			CREN=1;     
        }  
		 
		char r = RCREG;
		
		
			buffer[index] = r;  //Place received byte in buffer
			index++;			//Increment index
		
	}       

}

void main(void){
 	lcd_init();
	lcd_clear();
	lcd_posyx(0,0);
	usart();							//Initialize USART
	while(1){							//Do forever
		if(index>=15){		
			CREN = 0;				//Stop receiving 
			
			for(int i = 0; i <= index-1; i++){  //Print buffer
		
				lcd_data(buffer[i]);
	
			}
			DelayMs(1000);
			lcd_clear();
			lcd_posyx(0,0);
			index = 0;							
			CREN = 1;			//Start receiving again
		
		}
	}
}






Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 00:01:40
av Swech
På AVR finns en kalibreringsbyte för intern oscillator. gissar att det finns något liknande även på PIC.
Du bör isåfall kunna trimma in oscillatorn.

Har du verifierat med t.ex. en RS232 omvandlare och en PC att det som kommer ut från GPSen är vad du
antar att det är?

Swech

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 00:03:57
av sodjan
Prova att justera SPBRG lite för att se om du ligger på kanten.
52 kanske är det teoretiskt korrekta värdet, men prova med t.ex
50, 51, 52, 53, 54. Eller prova fler värden för att hitta gränserna
där det lägger av helt. Rätt bör vara ungeför i mitten. Sen finns det
ett separat justeringsregister också.

Jag *tror* inte att det är det, interna osc bör fungera bra, men
man vet ju inte hur "fel" GPS'en ligger i hastighet. Har du kört
GPS'en mot något annat ? T.ex en PC ?

Det här med "en massa skräp", det är inte bara så att du hamnar ur
synk på något sätt ? Och kommer in fel i sekvensen ?

Sänder GPS'en kontinuerligt ?
Hur gör du i så fall för att veta var en ny sekvens börjar ?

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 00:19:03
av Christian
Tack för snabbt svar!
Jag *tror* inte att det är det, interna osc bör fungera bra, men
man vet ju inte hur "fel" GPS'en ligger i hastighet. Har du kört
GPS'en mot något annat ? T.ex en PC ?
Jag har kört den mot Hyperterminalen med max232 och det fungerar bra.
Det här med "en massa skräp", det är inte bara så att du hamnar ur
synk på något sätt ? Och kommer in fel i sekvensen ?

Sänder GPS'en kontinuerligt ?
Hur gör du i så fall för att veta var en ny sekvens börjar ?
Med den här koden har jag bara varit ute efter att kunna läsa det som gps:en skickar och se så att den biten fungerar, för att senare kunna välja ut tex long och lat endast. Men även om jag kommer in fel i sekvensen så borde den ju visa sånt som Nmea strängarna innehåller.. för den skriver ut tecken som inte alls påminner om det..

Jag ska prova med andra värden på SPBRG och se om det ger bättre lycka, för som sagt ibland blixtrar den till och visar tecken som finns i Nmea strängarna..

Hur är det med att disabla USART mottagningen när jag behandlar data? Räcker det med CREN = 0; eller kan interrupten störa om jag inte stänger av dem?

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 01:05:43
av Icecap
Varför "stänga av" UART'en? Varför inte bara kasta det som är ointressant under tiden?

Jag har dåliga erfarenheter med att stänga av hårdvara när allting kör, det ger en massa konstigheter och tecknen kommer oftast ur synk.

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 01:40:07
av Swech
Om du trycker in data från hyperterminal till din PIC, blir det tok då också?

Swech

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 01:54:51
av ToPNoTCH
SPBRG skall nog hellre vara 51 än 52.

52 = 4,716.98 = 1.8% off
51 = 4,807.69 = 0.1% off

Jag är lite nyfiken på varför du inte kör 8 MHz. Spara på strömmen eller ??

Re: Pic läser inte av gps korrekt

Postat: 28 juli 2010, 12:09:02
av vfr
Om du trycker in data från hyperterminal till din PIC, blir det tok då också?

Precis! Testa motsatsen. Att se om det är PIC:en som har generellt svårt att kommunicera med den hastigheten med någonting annat.