Pri kompilacii programu pre 90s2312 mi prekladac oznami nasledovne chybove hlasky:
avr-gcc -g -mmcu=at90s2313 -Wall -Wstrict-prototypes -Os -mcall-prologues -c -o otackomer.o otackomer.c
otackomer.c:96: error: ‘TIM0_OVF’ undeclared here (not in a function)
otackomer.c:96: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘void’
otackomer.c:108: error: ‘TIM1_OVF’ undeclared here (not in a function)
otackomer.c:108: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘void’
otackomer.c:137: error: ‘TIM1_CAPT’ undeclared here (not in a function)
otackomer.c:137: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘void’
otackomer.c:160: warning: return type of ‘main’ is not ‘int’
otackomer.c:213:2: error: invalid preprocessing directive #asm
otackomer.c: In function ‘main’:
otackomer.c:222: warning: array subscript has type ‘char’
otackomer.c:241: warning: array subscript has type ‘char’
otackomer.c:242: warning: array subscript has type ‘char’
otackomer.c:247: warning: array subscript has type ‘char’
otackomer.c:247: warning: array subscript has type ‘char’
otackomer.c:250: error: expected ‘)’ before numeric constant
otackomer.c:254: error: expected ‘)’ before numeric constant
otackomer.c:258: warning: large integer implicitly truncated to unsigned type
otackomer.c:263: error: expected ‘)’ before numeric constant
make: *** [otackomer.o] Chyba 1
v programovani v c som zaciatocnik a nedari sa mi najst kde moze byt problem.
Dakujem za rady
administrator: přejmenováno z “Problem s kompilaciou” otackomer.c (8.21 KB)
To vypada, že to nebylo psany pod GCC jsou tam špatně vektory přesrušení a problém s proměnýma u polý (array) . Dále není jasné, které else ke kterému if někde tam chybí nebo přebývá závorka a PIND.6 je blbe u GCC if(PIND6 == 0) . Připadne mi to jako by to bylo psané v jiným IDE neř WinAvr nebo AVRstudio. V čem to bylo napsané tam překládej. Pokud to tedy bylo funkční. Připomíná mi to Codevision ale nejsem si jist.
Trošku jsem se s tim popral a opravil nejzávažnější chyby a AVRstudiu se mi to povedlo přeložit. Pořád je tam problém s proměnýma. Přikádám upravený zdroják a to co jsem přeložil.
Build started 14.11.2009 at 17:54:30
avr-gcc -mmcu=at90s2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT otackomer.o -MF dep/otackomer.o.d -c …/…/otackomer/otackomer.c
…/…/otackomer/otackomer.c: In function ‘main’:
…/…/otackomer/otackomer.c:222: warning: array subscript has type ‘char’
…/…/otackomer/otackomer.c:241: warning: array subscript has type ‘char’
…/…/otackomer/otackomer.c:242: warning: array subscript has type ‘char’
…/…/otackomer/otackomer.c:247: warning: array subscript has type ‘char’
…/…/otackomer/otackomer.c:247: warning: array subscript has type ‘char’
…/…/otackomer/otackomer.c:258: warning: large integer implicitly truncated to unsigned type
avr-gcc -mmcu=at90s2313 -Wl,-Map=ota.map otackomer.o -o ota.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature ota.elf ota.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom=“alloc,load” --change-section-lma .eeprom=0 --no-change-warnings -O ihex ota.elf ota.eep || exit 0
avr-objdump -h -S ota.elf > ota.lss
Jeto nějaký hybrid CVAVR/GCC kód je zcela určitě z Codevisionu, jen include soubory jsou z GCC.
Teoreticky by měl jít přeložit v Codevisionu za použití #include<avr_compiler.h> ovšem(jak už jsem psal jinde) za podmínky, že máš nainstalované oba compillery a v Configure projects/C compiler/Paths nastavíš cestu do knihoven WinAVR.
Na vývodu č.11 PD6 je alternativní použití ICP což je aktivace záchytu stavu časovače TCNT1 do ICR1A , je to zakázaný od Anal.komp což je dobře podle toho co je napsáno. Koukal jsem i na nastavení PORTU D a to mi nějak nesedí zkontroluj si to. Zkus simulaci v IDE jak se to chová. Tohle je hledání jehly v kupce sena.
Program som uz rozchodil, ale mam problem s podmienkou :
if (ucOutputOutOfRange>4) { // > 4 then Ok Else to many overfloads…
premenna ucOutputOutOfRange je stale nulova a tak podmienka neni splnena. Pritom v preruseni by mala byt naplnana hodnotou. Ked tu podmienku nahradim tak aby bola splnena tak program pokracuje a zobrazi namerane hodnoty.
To je asi jako kdybych se zeptal na barvu auta a ty mi řekl pátek…
Je ta proměnná deklarovaná jako volatile? Nejspíš je globální, tudíž je její deklarace někde na main, pak má nějaký datový typ např. unsigned char nebo uint8 a podobně. to “volatile” by bylo napsaný před tím datovým typem…
EDIT: tak jsem kouknul do toho zdrojáku a nemáš.
Řádek “unsigned char ucOutputOutOfRange;” uprav na “volatile unsigned char ucOutputOutOfRange;”
Tímto způsobem musí být v GCC ošetřeny všechny proměnné, se kterými se pracuje v přerušeních a zároveň mimo ně. Pokud totiž není ve funkci nic, co by mohlo proměnnou změnit, překladač k ní optimalizuje přístup a čte ji jen na začátku. Když pak proměnnou přerušení upraví, tak se to již daná funkce nedozví. S použitím volatile je proměnná kontrolována vždy.