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:
Pętla główna programu:
Math.h:
i na koniec procedura pisząca na LCD:
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
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
Wynik kompilacji:
> "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:
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:
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:
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