1

我对 Atmegas ant AVR 编程非常陌生,所以我希望你能原谅我这个菜鸟问题:我有这个代码,它在 1MHZ 下完美运行,但是如果我将 Atmega 融合到内部 8 MHZ 同时将 F_CPU 频率更改为 8 MHZ同样,LED 快速闪烁,似乎 C 编译器忽略了我的新频率。有人可以帮助我;)?

#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>

int main(void)
{
  while(1)
  {
    //TODO:: Please write your application code
    /* set PC0 on PORTC (digital high) and delay for 500mS */
    PORTD &= ~_BV(PD5);
    _delay_ms(500);

    /*  PC0 on PORTC (digital 0) and delay for 500mS */
    PORTD |= _BV(PD5);
    _delay_ms(500);
  }
}

它使用以下命令编译:

avr-gcc -g -Os -mmcu=atmega8  -c test.c 
avr-gcc -g -mmcu=atmega8 -dF_CPU=8000000UL -o flash.elf test.o
avr-objcopy -j .text -j .data -O ihex flash.elf flash.hex

非常感谢您的时间和帮助;)Delay.h:http ://pastebin.com/wzppfma3

4

2 回答 2

3

问题是 _delay_ms 的最大 ms 值取决于您的 F_CPU 频率。根据文档,这个最大值是:

262.14 毫秒 / F_CPU 以 MHz 为单位

对于您的 8 MHz,最长可达 32 ms。因此,改为编写这样的循环以获得 500 毫秒的延迟:

for (uint8_t i=0; i<50; i++) _delay_ms(10);
于 2015-08-14T17:50:54.513 回答
-1

您应该将 AVR 的内部熔断器更改为 8MHz,仅将其写在代码上是不够的,将 lfuse 设置为 0xE4 以使 AVR 工作在 8MHz

于 2015-08-14T17:29:15.560 回答