Problém s kompiláciou v C - neznáma chybové hlásenia

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

:arrow_right: 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

AVR Memory Usage

Device: at90s2313

Program: 902 bytes (44.0% Full)
(.text + .data + .bootloader)

Data: 48 bytes (37.5% Full)
(.data + .bss + .noinit)

Build succeeded with 6 Warnings…
ota.hex (2.5 KB)
otackomer.c (8.26 KB)

Podle “PIND.6” taky myslím, že CodeVision nebo něco jinýho, GCC tohle nezná.

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.

Dakujem za pomoc, este mam problem ze mi program nereaguje na vstup PIND6

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.

Máš tu proměnnou “volatile”? Když je měněná externí událostí(přerušení), je to nezbytné.

je menena v obsluhe prerusenia:

interrupt [TIM1_CAPT] void timer1_capt_isr(void)

{

if (ucOutputOutOfRange < 16) ucOutputOutOfRange+=4;

:arrow_right: administrator: příspěvek byl upraven

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.