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 闪烁:-)
请将编译器和编程命令添加到您的问题中!
我是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 闪烁:-)
请将编译器和编程命令添加到您的问题中!