AVR 中的 EEPROM 不工作

EEPROM in AVR doesn't work

我是C语言初学者。我正在尝试在我的 ATmega 8 和 ATtiny2313 中操作 EEPROM 内存。 基于 this tutorial 我创建了以下代码:

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 毫秒)

这是初学者每次都会遇到的失败之一:-)

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

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

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

下一个陷阱:你设置了什么保险丝?你是运行预期的时钟频率?也许您已经对内部时钟进行了编程,而您的外部 crystal 似乎以错误的速度工作?

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

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