编译.c到.hex - cc1.exe:错误:avr25:没有这样的文件或目录

时间:2013-02-18 12:21:57

标签: microcontroller avr avr-gcc winavr

今天我终于通过Arduino Uno设法对attiny2313a进行了编程。这是一个测试闪烁计划。上传之后,我看到LED闪烁了8秒延迟而不是1秒,所以我决定更改Makefile和main.c中的时钟设置并再次刻录芯片。 所以,我只在Makefile和main.c中更改了8000000到1000000,并在cmd(windows shell)中运行make flash。以下是输出:

avr-gcc -Wall -Os -DF_CPU=1000000 -mmcu=attiny2313 -F -c main.c -o main.o
cc1.exe: error: avr25: No such file or directory
make: *** [main.o] Error 1

为什么我收到此错误?为什么我只能编译和刻录程序一次? 我没有删除也没有添加任何新内容。实际上除了那些时钟设置我什么都没碰。但即使我回到原始设置(8000000),我仍然遇到同样的错误。

我的Makefile

DEVICE     = attiny2313 -F
CLOCK      = 1000000
PROGRAMMER = -c arduino -P COM5 -b 19200 
OBJECTS    = main.o
FUSES      = -U lfuse:w:0x5e:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m


######################################################################
######################################################################

# Tune the lines below only if you know what you are doing:

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

# symbolic targets:
all:    main.hex

.c.o:
    $(COMPILE) -c $< -o $@

.S.o:
    $(COMPILE) -x assembler-with-cpp -c $< -o $@
# "-x assembler-with-cpp" should not be necessary since this is the default
# file type for the .S (with capital S) extension. However, upper case
# characters are not always preserved on Windows. To ensure WinAVR
# compatibility define the file type manually.

.c.s:
    $(COMPILE) -S $< -o $@

flash:  all
    $(AVRDUDE) -U flash:w:main.hex:i

fuse:
    $(AVRDUDE) $(FUSES)

install: flash fuse

# if you use a bootloader, change the command below appropriately:
load: all
    bootloadHID main.hex

clean:
    rm -f main.hex main.elf $(OBJECTS)

# file targets:
main.elf: $(OBJECTS)
    $(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
    rm -f main.hex
    avr-objcopy -j .text -j .data -O ihex main.elf main.hex
# If you have an EEPROM section, you must also create a hex file for the
# EEPROM and add it to the "flash" target.

# Targets for code debugging and analysis:
disasm: main.elf
    avr-objdump -d main.elf

cpp:
    $(COMPILE) -E main.c

my main.c

#define F_CPU 1000000  // CPU frequency for proper time calculation in delay function

#include <avr/io.h>
#include <util/delay.h>

int main (void){
    DDRD |= (1 << PD6);  // make PD6 an output

    for(;;){
        PORTD ^= (1 << PD6);  // toggle PD6
        _delay_ms(1000);  // delay for a second
    }

    return 0;  // the program executed successfully
}

2 个答案:

答案 0 :(得分:1)

请为了芯片的好处,请不要在avrdude上使用-F。

您在编写tinyAVR时遇到问题的原因是因为您正在使用错误的部件编号。编程ATtiny2313的正确参数是-pt2313 [或只使用部分t2313]。使用-F可以继续使用你的芯片,特别是因为你正在给它提供保险丝[在某些情况下可以通过使用高压编程器来恢复砖块芯片,具体取决于投入的保险丝设置]。

有关avrdude的更多信息,请阅读其手册页

       -p partno
               This is the only option that is mandatory for every invocation of avrdude.  It specifies the type of the MCU connected to the program‐
               mer.  These are read from the config file.  If avrdude does not know about a part that you have, simply add it to the config file (be
               sure and submit a patch back to the author so that it can be incorporated for the next version).  See the sample config file for the
               format.  Currently, the following MCU types are understood:

               Option tag   Official part name
               ...snip...
               t2313        ATtiny2313
               ...snip...

ATtiny2313和ATtiny2313A的设备签名是相同的,但avrdude声称不与2313A交谈。如果您不需要,请禁用熔丝编程,并在没有-F选项的情况下进行测试。欢呼声。

PS。 gcc对你造成错误的原因是因为

   -Fdir
       Add the framework directory dir to the head of the list of directories to be searched for header files.  These directories are interleaved with
       those specified by -I options and are scanned in a left-to-right order.

你正在传递一个它不知道如何处理的论据。要解决这个问题,请在Makefile上添加

PROGDEV=t2313

并将您的avrdude调用更改为使用PROGDEV而不是DEVICE

另外,正如之前的回答所述

PORTD ^= (1 << PD6);

可以替换为

PIND = (1 << PD6);

后者只编译一条指令,而不是两条三条指令。这节省了芯片上的代码空间,使代码运行得更快。有关详细信息,请参阅Atmel的数据表。

答案 1 :(得分:0)

事实证明,原因是在Makefile中添加了“-F”键以使avrdude认为attiny2313a实际上是一个attiny2313(重写签名检查)。奇怪的是,在第一次编程芯片后必须删除“-F”键。 我想这也适用于AVR芯片的其他新修改,这些修改与它们的基本(父母?)修改相同,但在其名称上添加了各种后缀(如'attiny2313a'或'atmega168p')

因此。当第一次对微控制器进行编程,并且avrdude无法识别芯片时,应在芯片名称后添加-F密钥:

DEVICE = attiny2313 -F

但是,首次编程芯片后,必须删除-F,否则将无法再次对芯片进行编程。