CCS C Gps kütüphanesi derleme hatası neden oluyor?

Başlatan samedkutuk, 26 Aralık 2019, 22:51:17

samedkutuk

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;


samedkutuk

tunahanfıtlamak

evet aynı sorunu bende almıştım yardımcı olacak yok mu arkadaşlar.

samedkutuk

arkadaşlar yok mu gerçekten daha önce bu sorunla karşılaşan ?
samedkutuk

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

samedkutuk

@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?
samedkutuk

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

tyildizak

#6
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.




.

samedkutuk

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 ?
samedkutuk

samedkutuk

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.




.

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
samedkutuk

samedkutuk

@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?



samedkutuk

tyildizak

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.

samedkutuk

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'; 
      } 
   } 
}
samedkutuk