1

我是C语言的初学者。我正在尝试对我的 ATmega 8 和 ATtiny2313 中的 EEPROM 内存进行操作。基于本教程,我创建了以下代码:

1) 写入一个数字,将 5 放入 uC 的 eeprom

#define F_CPU 1000000UL
#include <avr/eeprom.h>


int main()
{
    number=5;

    eeprom_update_byte (( uint8_t *) 5, number );

    while (1);
    {
    }
}

2) LED 闪烁 n 次,其中 n 是从 eeprom 中第 5 位读取的数字

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


int main()
{
    DDRB=0xFF;
    _delay_ms(1000);

    int number;

    number=eeprom_read_byte (( uint8_t *) 5) ;

    for (int i=0; i<number; i++) //blinking  'number' times
    {
        PORTB |= (1<<PB3);
        _delay_ms(100);
        PORTB &= (0<<PB3);
        _delay_ms(400);
    }

    while (1);
    {
    }
}

第二个程序多次闪烁led,它从来不是eeprom中应该有的数量。有什么问题?这发生在 atmega8 和 attiny2313 中。

编辑:第一个程序编译后的控制台结果:

18:01:55 **** 项目 eeprom 配置发布的增量构建 **** 全部调用:打印大小 avr-size --format=avr --mcu=attiny2313 eeprom.elf

AVR 内存使用情况

设备:attiny2313

程序:102 字节(5.0% 已满)(.text + .data + .bootloader)

数据:0 字节(0.0% 已满)(.data + .bss + .noinit)

完成的建筑:sizedummy

18:01:56 构建完成(耗时 189 毫秒)

4

1 回答 1

2

这是初学者每次失败的原因之一:-)

如果你简单地编译avr-gcc <source> -o <out>你会在这里得到错误的结果,因为你需要优化!必须优化写过程以实现正确的写访问!所以请使用 '-Os' 或 '-O3' 与 avr-gcc 一起编译!

如果您不知道您的问题是来自读取还是写入 eeprom,请使用 avarice/avrdude 或类似工具读取您的 eeprom 数据。

下一个陷阱可能是,如果您对闪存进行编程,您会擦除 eeprom 部分。所以请看看你的程序员到底在做什么!完整的芯片擦除也会擦除 eeprom。

下一个陷阱:你设置了什么保险丝?您正在以预期的时钟速率运行?也许您已经编程了内部时钟并且您的外部晶体似乎以错误的速度工作?

另一个:再看看保险丝!JTAG 引脚关闭?也许您只看到 JTAG 闪烁 :-)

请将编译器和编程命令添加到您的问题中!

于 2015-05-21T15:27:13.047 回答