1

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

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

我的 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
}
4

2 回答 2

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 的数据表。

于 2013-02-19T13:13:37.333 回答
1

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

所以。首次对微控制器进行编程时,avrdude 无法识别该芯片,-F应在芯片名称后添加密钥:

DEVICE = attiny2313 -F

但是,在芯片第一次烧写后,该-F密钥必须被移除,否则将无法再次烧写芯片。

于 2013-02-19T09:30:09.937 回答