Code::blocks problem sprintf __mulhi3

Zkoušel jsem ve svým projektu použít funkci sprintf() kvůli práci s LCD a narazil jsem na problém při kompilaci.
Problém dělá řádek sprintf( buffer, “%d”, temp) ;
Kód vypadá takhle:

[code]#include <avr/io.h>
#include <stdio.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include “lcd.h”

int main(void) {
char buffer[10];
unsigned int temp;

DDRA = 0x00;
PORTA = 0xFF;
DDRD = 0b00110000;  //povoleni OC1A/B piny PD4 PD5
ICR1=40000; //ICR1=> dosahnu f=50Hz pøi 16Mhz
TCCR1A|=(0<<COM1A0)|(1<<COM1A1)|(0<<COM1B0)|(1<<COM1B1)|
        (0<<FOC1A)|(0<<FOC1B)|(1<<WGM11)|(0<<WGM10);
TCCR1B|=(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|
        (0<<CS12)|(1<<CS11)|(0<<CS10);
OCR1A=2000;
OCR1B=2000;

temp=OCR1A;
lcd_init(LCD_DISP_ON);
lcd_clrscr();
sprintf( buffer, "%d", temp) ;
lcd_puts(buffer);

while(1) ;
return 0;

}[/code]

Build log:

Build messagess:

Googloval jsem a vypadá to na problém právě tohodle vývojového prostředí viz.
avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=768320
forums.codeblocks.org/index.php/topic,17418.0.html

Pokud to kompiluju ručně přes vlastní Makefile, tak se vše v pohodě zkompiluje a program funguje.
V těch linkách byl jeden post s částečným řešením, ale týkalo se to zabordelení nastavení linkeru Code::blocksu a mám z toho trošku strach. Prosím vyřešil někdo tento problém? Vím, že tu spoustu lidí code::blocks používá, je to fajn IDEčko, ale nerad bych rezignoval na notepad a příkazový řádek.

Ahoj.
Pouzivam Code::Block for arduino.sourceforge.net/projects/arduinodev/
Zkusil jsem tam dat

[code]
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void) {
char buffer[10];
unsigned int temp;
sprintf( buffer, “%d”, temp) ;
lcd_puts(buffer);

while(1) ; 
return 0; 

} [/code]
a bez problemu to prelozi. Pouzivam standartni nastaveni a zabudovany prekladac

Ahoj.
Pouzivam Code::Block for arduino.sourceforge.net/projects/arduinodev/
Zkusil jsem tam dat

[code]
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void) {
char buffer[10];
unsigned int temp;
sprintf( buffer, “%d”, temp) ;

while(1) ; 
return 0; 

} [/code]
a bez problemu to prelozi. Pouzivam standartni nastaveni a zabudovany prekladac

Omlouvam se za 2x vlozeny prispevek

cože? :open_mouth:
Já myslel, že tenhle projekt je jenom pro ty Arduino projekty.
Vyzkouším…

Nene, lze tam zalozit AVR projekt a podporuje to mnoho CPU. Nektere veci jsou lepsi nez AvrStudio, ale nektere mi tam chybi. Jako nahravani do CPU musim pouzivat AVRDude a neni tam to konfortni naklikavani fusez a lockbitu, tak tam mam na to udelany tooly.

Takže je tam i poslední verze AVR GCC toolchainů a knihovny libc? To co je ve WinAVR je asi dost zastaralé…
Upravuje to nějak nastavení systémové PATH nebo to funguje samostatně od sebe bez zásahu do okolí?

Bohuzel nejsem tak zkuseny abych zjistil, co to pouziva za verzi kompilatoru, nicmene jsem zkusil kompilovat s WinAVR, AvrToolchan a v CodeBlock a v Codeblock to ma nejmensi velikost. Je to stahovaci program, ktery nepotrebuje instalaci, pouze se spusti a do PATH nezasahuje co vim. Funguje to bez zasahu okoli

no až mě zabanují z code::blocks fóra, že nevím jak si nastavit Linker v jejích C::B (což není přece vyšší dívčí že?), tak to vyzkouším.
Prozatím jsem to vyřešil externím Makefilem.
Dík za upozornění

Je to jeste aktualni?
V project build options si dej do “Other linker options”:

-Wl,-u,vprintf

a do “Link libraries” si dej:

printf_flt

A zkus to tak. Urcite to nebude problem C::B. Pokud ti to jde s Makefile, tak to musi jit i tady. Koukni se jak vypada prikazovej radek linkeru a nastav ho v C::B stejne jako se pouziva v Makefile.

Pokud jde o verzi kompilatoru. Pouzit tam muzes jakykoliv. C::B je jen IDE. Koukni se do Settings/Compiler Settings, vyber GNU AVR GCC compiler a na karte Toolchain se koukni kde je kompilator, kterej pouziva. Pak staci vlezt do te slozky a na prikazovem radku zadat prikaz (slozka bin tooolchainu)

avr-gcc --version

Me to vypise:

avr-gcc (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Uprava PATH promenne neni potreba.
cb.jpg

díky kuto…tohle určitě pomůže, až budu zas používat full Code::blocks a ne ten doporučovaný a upravaný pro AVR/Arduino, na kterým je právě zastaralý WinAVR.

Akorát teď sem narazil na jinej problém a to je generování .eep hexáče. Když opět to kompiluju přes svůj Makefile (který ale dělá asi o 60 B víc jak Codeblocks, stejný nastavení, nechápu proč), tak mi to eep soubor vytvoří, ale jakmile to dělám přes IDE, tak ten soubor má pořád 13 B a je prázdný.
Přitom podle build logu, by mělo bejt vše ok

avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin\Debug\Jednotka.elf bin\Debug\Jednotka.eep

mohl by někdo poradit?

Do post build steps si dej

avr-objcopy.exe -O ihex -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex avr-objcopy.exe -O binary -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.bin
To prvni udela intel hex a druhy cistej bin. Ten tvuj by ale mel asi fungovat taky.

Cely post build mam takhle:

avr-objcopy.exe -O binary -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).bin
avr-objcopy.exe -O ihex -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex
avr-objcopy.exe -O binary -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.bin
avr-objcopy.exe -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.hex
cmd /c avr-objdump.exe -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_NAME).lst
cmd /c avr-nm.exe -n $(TARGET_OUTPUT_FILE) > $(TARGET_NAME).sym
avr-size.exe -B $(TARGET_OUTPUT_FILE)
avr-size.exe -C --mcu=$(MCU) $(TARGET_OUTPUT_FILE)

přepsal jsem to na

avr-objcopy -O ihex -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex avr-objcopy -O binary -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.bin

a stále stejnej problém…ten čistej bin má dokonce 0 B

A mas v tom programu vubec neco deklarovane jako EEMEM?

Ano mám.

EEMEM char text] = "nejakej mrtgjfopsdfjsdfposdfj sdop jsdpo josd fsoosd posd s do";

Psal jsem, že pokud to kompiluju přes externí Makefile, tak to eep správně vytvoří. Program programátoru mi i správně přečte hodnoty z toho souboru.
Kdyžtak se na to vykašli.
Mohl bys prosím naprintscreenovat nastavení kompilátoru (Global compiler settings). Si zkusím až bude čas nakonfigurovat C::B na poslední AVR-GCCčko s libc.

Jestli mam posledni nevim, ale ty toolchainy se v nastaveni nelisej.
Ja mam to nastaveni kompilatoru trochu jinak. V Global compiler settings nemam skoro nic. Nastavuju to v sablone projektu. V Global mam jen toto:

  • Search directories/Compiler: D:\AVR\avr\include
  • Search directories/Linker: D:\AVR\avr\lib, D:\AVR\lib\gcc\avr\4.6.2
  • Other Settings/Compiler logging: Full command line
    Pak jen nastavene cesty v Toolchain executables.
    Tady mas vytah z CBP souboru projektu. Screenovat se mi to nechce. Samozrejme si musis nastavit spravne cesty na disku podle toho kde mas toolchain. F_CPU a typ MCU si nastavuju pres Custom variables, nechce se mi to vzdycky lovit v tom mnozstvi fajfek v nastaveni.
		<Build>
			<Target title="Debug">
				<Option output="bin/Debug/project.elf" prefix_auto="1" extension_auto="0" />
				<Option object_output="obj/Debug/" />
				<Option type="1" />
				<Option compiler="avrgcc" />
				<Compiler>
					<Add option="-D__DEBUG__" />
				</Compiler>
			</Target>
			<Target title="Release">
				<Option output="bin/Release/project.elf" prefix_auto="1" extension_auto="0" />
				<Option object_output="obj/Release/" />
				<Option type="1" />
				<Option compiler="avrgcc" />
			</Target>
			<Environment>
				<Variable name="F_CPU" value="7372800" />
				<Variable name="MCU" value="atmega32" />
			</Environment>
		</Build>
		<Compiler>
			<Add option="-Os" />
			<Add option="-Wall" />
			<Add option="-mmcu=$(MCU)" />
			<Add option="-gstabs" />
			<Add option="-funsigned-char" />
			<Add option="-funsigned-bitfields" />
			<Add option="-fpack-struct" />
			<Add option="-fshort-enums" />
			<Add option="-std=gnu99" />
			<Add option="-DF_CPU=$(F_CPU)UL" />
			<Add directory="D:/AVR/avr/include" />
		</Compiler>
		<Linker>
			<Add option="-Wl,-Map=$(TARGET_NAME).map,--cref" />
			<Add option="-Wl,-u,vfprintf" />
			<Add option="-mmcu=$(MCU)" />
			<Add library="printf_flt" />
			<Add library="m" />
			<Add directory="D:/AVR/avr/lib/avr5" />
		</Linker>
		<ExtraCommands>
			<Add after="avr-objcopy.exe -O binary -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).bin" />
			<Add after="avr-objcopy.exe -O ihex -R .eeprom $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex" />
			<Add after='avr-objcopy.exe -O binary -j .eeprom --set-section-flags=.eeprom=&quot;alloc,load&quot; --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.bin' />
			<Add after='avr-objcopy.exe -O ihex -j .eeprom --set-section-flags=.eeprom=&quot;alloc,load&quot; --change-section-lma .eeprom=0 $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep.hex' />
			<Add after="cmd /c avr-objdump.exe -h -S $(TARGET_OUTPUT_FILE) &gt; $(TARGET_NAME).lst" />
			<Add after="cmd /c avr-nm.exe -n $(TARGET_OUTPUT_FILE) &gt; $(TARGET_NAME).sym" />
			<Add after="avr-size.exe -B $(TARGET_OUTPUT_FILE)" />
			<Add after="avr-size.exe -C --mcu=$(MCU) $(TARGET_OUTPUT_FILE)" />
		</ExtraCommands>

dík