Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

WinAVR - problemy z kompilacją (długie)

Piotrek_P 25 Lut 2008 09:33 1979 1
  • #1 25 Lut 2008 09:33
    Piotrek_P
    Poziom 18  

    Witam,

    Przepisuję właśnie swój projekt z Bascom'a na C, a właściwie jestem na etapie rozbudowywania programu i mam ostatnio problem ze skompilowaniem kodu. Cały układ to ATMega32 + ADC ADS1100 + LCD NOKIA3310 + MMC Card (na razie tyle ;-)). Jeszcze kilka dni temu program kompilował się prawidłowo (z kilkoma warnning'ami), więc postanowiłem wgrać hex'a do procka. Układ pięknie ruszył. Przetwornik mierzy, procek liczy, LCD wyświetla wyniki. Niestety, moja radość nie trwała długo. Zmobilizowany do dalszego działania dodałem jeszcze jakieś dwie linijki kodu, aby na wyświetlaczu pojawiła się wartość dodatkowej zmiennej. Od tego momentu zaczęły się problemy. Kompilator wywalił warnningi dotyczące instrukcji wypisujących tekst na LCD, a na koniec zgłosił Error = 2 (ogólny błąd kompilacji, jak rozumiem). Wykomentowałem więc wszystkie instrukcje związane z LCD i ponowna kompilacja. Niestety tym razem przyczepił się do pętli "for" w procedurze obsługi ADC. Przejrzałem cały kod pod kątem "nawiasów, średników itp. i wyglądało że jest ok, ale program nie daje się skompilować. Przeinstalowałem WinAVR z wersji z Maja 2007 na najnowszą 20071221 i teraz dostaję jeszcze error'y związane z "math.h" (używam tego do obliczeń). Aby nie być gołosłownym, zamieszczam poniżej wynik kompilacji oraz fragmenty kodu którego czepia się kompilator:

    Wynik kompilacji:

    Code:

    > "make.exe" all
    avr-gcc -Wall -pedantic -mmcu=atmega32 -std=c99 -g -Os -DF_CPU=8000000UL -c -o drm3310.o drm3310.c
    avr-gcc -Wall -pedantic -mmcu=atmega32 -std=c99 -g -Os -DF_CPU=8000000UL -c -o fat16.o fat16.c
    fat16.c:2115: warning: 'fat16_set_file_modification_date' defined but not used
    fat16.c:2139: warning: 'fat16_set_file_modification_time' defined but not used
    avr-gcc -Wall -pedantic -mmcu=atmega32 -std=c99 -g -Os -DF_CPU=8000000UL -c -o loger.o loger.c
    In file included from loger.c:7:
    c:/winavr-20071221/bin/../avr/include/math.h: In function 'copysign':
    c:/winavr-20071221/bin/../avr/include/math.h:336: error: expected ')' before ':' token
    c:/winavr-20071221/bin/../avr/include/math.h: In function 'isfinite':
    c:/winavr-20071221/bin/../avr/include/math.h:413: error: expected ')' before ':' token
    loger.c: In function 'calc_pressure':
    loger.c:200: warning: implicit declaration of function 'i2c_readAck'
    loger.c:201: warning: implicit declaration of function 'i2c_readNoAck'
    loger.c: In function 'main':
    loger.c:382: warning: pointer targets in passing argument 1 of 'glcdn_PutStrXLine' differ in signedness
    loger.c:384: warning: pointer targets in passing argument 1 of 'glcdn_PutStrXLine' differ in signedness




    loger.c:386: warning: pointer targets in passing argument 1 of 'glcdn_PutStrXLine' differ in signedness
    make.exe: *** [loger.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:04


    Pętla główna programu:
    Code:

    int main()
    {
       ....
       while(1)
       {
       ....
       ....
       ....
       dtostrf(P,4,2,buff);   buff zadeklarowany jako char[16]
       glcdn_PutStrXLine(buff,0,1); // to mu się nie podoba
       dtostrf(Alt,4,2,buff);
       glcdn_PutStrXLine(buff,0,2); // to też
       dtostrf(Max_Alt,4,2,buff);         
       glcdn_PutStrXLine(buff,0,3); // i oczywiście to też
       }
       return 0;
    }


    Math.h:
    Code:

    extern double square(double __x) __ATTR_CONST__;

      /**
         \ingroup avr_math

         The copysign() function returns \a __x but with the sign of \a __y.
         They work even if \a __x or \a __y are NaN or zero.
     */
    __ATTR_CONST__ extern inline double copysign (double __x, double __y)
    {
        asm (
       "bst   %D2, 7   \n\t"
       "bld   %D0, 7   "
       : "=r" (__x)         //<-- tu zgłasza brak nawiasu
       : "0" (__x), "r" (__y) );
        return __x;
    }

    ////////////////////////////////////////////////////////////////////////

    extern double trunc (double __x) __ATTR_CONST__;

      /**
         \ingroup avr_math

         The isfinite() function returns a nonzero value if \a __x is finite:
         not plus or minus infinity, and not NaN.
      */
    __ATTR_CONST__ extern inline int isfinite (double __x)
    {
        unsigned char __exp;
        asm (
       "mov   %0, %C1      \n\t"
       "lsl   %0      \n\t"
       "mov   %0, %D1      \n\t"
       "rol   %0      "   
       : "=r" (__exp)         //<-- i tutaj ten sam error
       : "r" (__x)   );      
        return __exp != 0xff;
    }


    i na koniec procedura pisząca na LCD:
    Code:

    void glcdn_PutStrXLine(uint8_t *data, uint8_t x, uint8_t line)
    {
    uint8_t myPage = (line-1);
    uint8_t myXAddr = (x | GLCD_SETXADDR);
    uint8_t myPageAddr = (myPage | GLCD_SETYADDR);
    uint8_t myCount = 0;
       glcdn_WriteCommand(myXAddr);
       glcdn_WriteCommand(myPageAddr);
       while (*data)
       {
          for(uint8_t i=0; i<5; i++)
          {
          glcdCache[(GLCD_PIXELX*myPage)+x+myCount] = pgm_read_byte(&Font5x7[((*data - 0x20) * 5) + i]);         myCount++;
          if(i == 4)
          {
          glcdCache[(GLCD_PIXELX*myPage)+x+myCount] = 0x00;
          myCount++;
          }
          }
          data++;
       }   
       glcdn_WriteCache(x,myPage,myCount);
    }


    Nie wiem czy taki opis sytuacji wystarczy, ale proszę Was o pomoc i uwagi. Dopiero zaczynam pisać w C i niektóre problemy są dla mnie nie do przeskoczenia:cry:

    Pozdrawiam
    Piotrek

    0 1
  • #2 25 Lut 2008 11:45
    JacekCz
    Poziom 36  

    Mikroprocesor dość tak średnio się nadaje do nauki C. Osobiście bym ci sugerował ćwiczenie na normalnym pececie. Ludzie używają siostrzanego GCC jako Dev CCP, ja osobiście MS Visual C++ Express (darmocha).

    Niestety w środowisku uK pokutuje sporo niepoprawnych lub wręcz błędnych przykładów w C, które ludzie bez refleksji kopiują.

    C jest trudnym językiem, wystarczy nieostrożnie napisany #define, wystarczy użyć go w innym kontekscie, żebyś szukał wiatru w polu.

    Wstawki asemblerowe nie są objęte standardem C, tego dwukropka przyznam się z życiu nie używałem. Szukaj wiedzy tam, gdzie to znalazłeś.

    0
  Szukaj w 5mln produktów