Arkadaşlar Merhabalar
GPS Neo-M7 serisi GPS kullanıyorum CCS C de derliyorum fakat verdiği hatayı çözemedim daha önce karşılaşanlar yardımcı olabilir mi ?
// GPS Library for CCS PIC C compiler
// http://simple-circuit.com/
#define _GPRMC_ 1
#define _GPGGA_ 2
#define _OTHER_ 3
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int1 GPRMC_ok = 0, GPGGA_ok = 0;
uint8_t char_number = 0, SentenceType = 0, Term;
char sentence[6], rawTime[11], rawDate[7], rawSpeed[6], rawCourse[6], rawSatellites[3],
rawLatitude[13], rawLongitude[13], rawAltitude[7], buffer[12];
void stringcpy(char *str1, char *str2, int1 dir = 0) {
uint8_t chr = 0;
do {
str2[chr + dir] = str1[chr];
} while(str1[chr++] != '\0');
}
int1 GPSRead() {
uint8_t c = getc();
switch(c) {
case '\r': // sentence end
if(SentenceType == _GPRMC_)
GPRMC_ok = 1;
if(SentenceType == _GPGGA_)
GPGGA_ok = 1;
if(GPRMC_ok && GPGGA_ok) {
GPRMC_ok = GPGGA_ok = 0;
return 1;
}
break;
case '$': // sentence start
Term = char_number = 0;
break;
case ',': // term end (new term start)
buffer[char_number] = '\0';
if(Term == 0) {
stringcpy(buffer, sentence);
if(strcmp(sentence, "GPRMC") == 0)
SentenceType = _GPRMC_;
else if(strcmp(sentence, "GPGGA") == 0)
SentenceType = _GPGGA_;
else
SentenceType = _OTHER_;
}
// Time
if(Term == 1 && SentenceType == _GPRMC_) {
stringcpy(buffer, rawTime);
}
// Latitude
if((Term == 3) && (SentenceType == _GPRMC_)) {
stringcpy(buffer, rawLatitude, 1);
}
// Latitude N/S
if((Term == 4) && (SentenceType == _GPRMC_)) {
if(buffer[0] == 'N')
rawLatitude[0] = '0';
else
rawLatitude[0] = '-';
}
// Longitude
if((Term == 5) && (SentenceType == _GPRMC_)) {
stringcpy(buffer, rawLongitude, 1);
}
// Longitude E/W
if((Term == 6) && (SentenceType == _GPRMC_)) {
if(buffer[0] == 'E')
rawLongitude[0] = '0';
else
rawLongitude[0] = '-';
}
// Speed
if((Term == 7) && (SentenceType == _GPRMC_)) {
stringcpy(buffer, rawSpeed);
}
// Course
if((Term == 8) && (SentenceType == _GPRMC_)) {
stringcpy(buffer, rawCourse);
}
// Date
if(Term == 9 && SentenceType == _GPRMC_) {
stringcpy(buffer, rawDate);
}
// Satellites
if((Term == 7) && (SentenceType == _GPGGA_)) {
stringcpy(buffer, rawSatellites);
}
// Altitude
if((Term == 9) && (SentenceType == _GPGGA_)) {
stringcpy(buffer, rawAltitude);
}
Term++;
char_number = 0;
break;
default:
buffer[char_number++] = c;
break;
}
return 0;
}
uint8_t GPSSecond() {
return ((rawTime[4] - '0') * 10 + (rawTime[5] - '0'));
}
uint8_t GPSMinute() {
return ((rawTime[2] - '0') * 10 + (rawTime[3] - '0'));
}
uint8_t GPSHour() {
return ((rawTime[0] - '0') * 10 + (rawTime[1] - '0'));
}
uint8_t GPSDay() {
return ((rawDate[0] - '0') * 10 + (rawDate[1] - '0'));
}
uint8_t GPSMonth() {
return ((rawDate[2] - '0') * 10 + (rawDate[3] - '0'));
}
uint8_t GPSyear() {
return ((rawDate[4] - '0') * 10 + (rawDate[5] - '0'));
}
float parse_rawDegree(char *term_) {
float term_value = atof(term_)/100;
int16_t term_dec = term_value;
term_value -= term_dec;
term_value = term_value * 5/3 + term_dec;
return term_value;
}
float Latitude() {
return parse_rawDegree(rawLatitude);
}
float Longitude() {
return parse_rawDegree(rawLongitude);
}
float Altitude() {
return atof(rawAltitude);
}
uint8_t Satellites() {
return atoi(rawSatellites);
}
float Speed() {
return (atof(rawSpeed) * 1.852);
}
float Course() {
return atof(rawCourse);
}
aldığım hata ise şu şekilde;
(https://i.ibb.co/GChP2cf/Ekran-Al-nt-s.png) (https://ibb.co/GChP2cf)
evet aynı sorunu bende almıştım yardımcı olacak yok mu arkadaşlar.
arkadaşlar yok mu gerçekten daha önce bu sorunla karşılaşan ?
Getc string tipinde bir karakter veri alır. Tanımlamaya yukarı alıp ilk önce karakteri alıyor mu ona bakın, sonra unsigned int tipine dönüştürürsünüz.
Programın tamamını çalıştırmak yerine parça parça ve ne yapıldığını anlamaya çalışarak ilerleyin.
@fide Ama zaten Getc() CCS C nin bir fonksiyonu neden bunu ben tekrar tanımlayayım ki
Aldığı veriyi aynı yerde tip değişimi yapıyor
yanlış olan ne?
Casting olayı c'de yapılıyor ama ccs c bazı yönleriyle c dilinde farklı. Mesela case sensitive değil.
Diğer bir nokta işleminiz ve seri port ayarlarına dair tanımlama yok.
Kullandığınız kütüphaneyi import ettiğiniz satırlar da...
Getc, getch ve getchar fonksiyonları aynı fonksiyonlar. Tavsiyem seri port ayarlarında seri porta gps, comm vb bir isim verip c=fgetc(gps) gibi bir tanımlama ile tekrar deneyin.
Ccs c'de seri port en kolay okunan port olmakla birlikte belki de en çok sıkıntı çıkaran port olabilir.
Gpsten veri alma kısmını çözmeden bir karakter üzerinden işlem yapmanız zor.
Alıntı yapılan: samedkutuk - 26 Aralık 2019, 22:51:17Arkadaşlar Merhabalar
GPS Neo-M7 serisi GPS kullanıyorum CCS C de derliyorum fakat verdiği hatayı çözemedim daha önce karşılaşanlar yardımcı olabilir mi ?
Sitede verilen ve buraya yapıştırdığınız "GPS_Lib.c" yine aynı sitede verilen .c dosyası ile hatasız derleniyor. Include tanımlarında eksik olabilir.
(https://i.ibb.co/mCZnsr1/gdf.jpg) (https://ibb.co/mCZnsr1)
.
Alıntı yapılan: fide - 27 Aralık 2019, 15:00:15Casting olayı c'de yapılıyor ama ccs c bazı yönleriyle c dilinde farklı. Mesela case sensitive değil.
Diğer bir nokta işleminiz ve seri port ayarlarına dair tanımlama yok.
Kullandığınız kütüphaneyi import ettiğiniz satırlar da...
Getc, getch ve getchar fonksiyonları aynı fonksiyonlar. Tavsiyem seri port ayarlarında seri porta gps, comm vb bir isim verip c=fgetc(gps) gibi bir tanımlama ile tekrar deneyin.
Ccs c'de seri port en kolay okunan port olmakla birlikte belki de en çok sıkıntı çıkaran port olabilir.
Gpsten veri alma kısmını çözmeden bir karakter üzerinden işlem yapmanız zor.
#include <gps.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <gps_lib.c>
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,parity=N,stop=1)
char gelen_bilgi=0;
#int_rda
void kesme(void)
{
output_toggle(pin_b7);
gelen_bilgi=getchar();
printf(gelen_bilgi);
}
void main()
{
enable_interrupts(int_rda);
enable_interrupts(global);
printf("******GPS BİLGİ EKRANINA HOŞGELDİNİZ*******");
while(TRUE)
{
//TODO: User Code
}
}
Seri haberleşme ayarlarını yaptım başka ne ayar yapmam gerekiyor ki ?
Alıntı yapılan: tyildizak - 28 Aralık 2019, 03:06:58Sitede verilen ve buraya yapıştırdığınız "GPS_Lib.c" yine aynı sitede verilen .c dosyası ile hatasız derleniyor. Include tanımlarında eksik olabilir.
(https://i.ibb.co/mCZnsr1/gdf.jpg) (https://ibb.co/mCZnsr1)
.
kütüphane tanımlamalarım sizinki ile aynı evet sizde derlemiş ama bende neden derlemiyor anlamadım
Mutlaka küçük bir noktayı atlıyorum ama nereyi
@fide @tyildizak 1 numaradaki gibi seri haberleşme tanımlayınca hata sayısı 2 ye düşüyor o da sanırım pointer adreisini bulamıyor
2 numaradaki gibi tanımlama yapınca haya çoğalıyor Uart1 diye tanııtılmasının ne gibi bir avantajı var zaten 1 tane uart var bu pıc de?
(https://i.ibb.co/GFM90ty/HATA-CCC.png) (https://ibb.co/GFM90ty)
(https://i.ibb.co/k6MzgMJ/HATA.png) (https://ibb.co/k6MzgMJ)
Alıntı yapılan: samedkutuk - 28 Aralık 2019, 20:31:42kütüphane tanımlamalarım sizinki ile aynı evet sizde derlemiş ama bende neden derlemiyor anlamadım
Mutlaka küçük bir noktayı atlıyorum ama nereyi
Şu sayfanın sonlarına doğru 16F877A için verilmiş dosya ile derledim : https://simple-circuit.com/pic16f877a-gps-clock-neo-6m-ccs-c/
Bu kodla mid range pic'lerde sorunsuz derlenir diye düşünüyorum. gps.h dosyanızı eklemediğiniz için kullandığınız seriyi bilemiyoruz, 18 ya da 24 serisi kullanıyorsanız bazı değişiklikler mutlaka gerekecektir.
16f877A kullanıyorum onunla derleyemedim
Formda başka bir kütüphane buldum 18F serisi bir pıc ile derledim çözüldü sorun
Siz bu kütüphaneyi, kullandınız mı daha önce?
#include <string.h>
#include <stdlib.h>
typedef struct _DateTimeInfo
{
int Day;
int Month;
int Year;
int Hour;
int Minute;
int Second;
} DateTimeInfo;
typedef struct _GPRMCInfo
{
char Valid;
DateTimeInfo DT;
float Latitude;
char N_S;
float Longitude;
char E_W;
float Speed;
} GPRMCInfo;
char* StrnmCpy(char *s1, char *s2, size_t n, size_t m)
{
int i;
char *s;
for (s=s1, i=n, s2+=n; i<=m; i++)
*s++ = *s2++;
*s = '\0';
return s1;
}
int StrFnd(char *s, char c, size_t st)
{
int l;
for (l=st, s+=st ; *s != '\0' ; l++, s++)
if (*s == c)
return l;
return -1;
}
void GPRMC_decode(char *GPRMCStr, GPRMCInfo *RMCInfo)
{
int p1, p2;
char TempStr[16];
p1 = StrFnd(GPRMCStr, ',', 0); //find first comma
if (p1 == 6)
{
//check for valid packet:
if ( (StrFnd(GPRMCStr, 'A', p1+1) == 18) && (GPRMCStr[0]=='$')) //valid?
{
RMCInfo->Valid = 'A';
//Get time
p1 = StrFnd(GPRMCStr, ',', 0); //find first comma
p2 = StrFnd(GPRMCStr, ',', p1+1); //find next comma
RMCInfo->DT.Hour = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2)); //hour
RMCInfo->DT.Minute = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4)); //min
RMCInfo->DT.Second = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //sec
//Get latitude & direction
p1 = StrFnd(GPRMCStr, ',', p2+1); //find next comma
p2 = StrFnd(GPRMCStr, ',', p1+1); //find next comma
RMCInfo->Latitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
RMCInfo->N_S = GPRMCStr[p2+1];
//Get longitude & direction
p1 = StrFnd(GPRMCStr, ',', p2+1); //find next comma
p2 = StrFnd(GPRMCStr, ',', p1+1); //find next comma
RMCInfo->Longitude = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
RMCInfo->E_W = GPRMCStr[p2+1];
//Get speed
p1 = StrFnd(GPRMCStr, ',', p2+1); //find next comma
p2 = StrFnd(GPRMCStr, ',', p1+1); //find next comma
RMCInfo->Speed = atof(StrnmCpy(TempStr, GPRMCStr, p1+1, p2-1));
//Get date
p1 = StrFnd(GPRMCStr, ',', p2+1); //find next comma
p2 = StrFnd(GPRMCStr, ',', p1+1); //find next comma
RMCInfo->DT.Day = atoi(StrnmCpy(TempStr, GPRMCStr, p1+1, p1+2)); //dd
RMCInfo->DT.Month = atoi(StrnmCpy(TempStr, GPRMCStr, p1+3, p1+4));//mm
RMCInfo->DT.Year = atoi(StrnmCpy(TempStr, GPRMCStr, p1+5, p1+6)); //yy
}
else //not valid
{
RMCInfo->Valid = 'V';
}
}
}