AVR使用范例EEPROM使用详解
AVR单片机内部EEPROM方法
uchar
DispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0
xC6,0xA1,0x86,0x8E,0xFF};uchar
BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};uchar DispBuf[6];//显示缓冲区
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
temp=eeprom_read_byte(Addr);DispBuf[5]=temp;if(++Count==1000){Count=0;
Counter++;eeprom_write_bytgt;=10)Counter=0;//计数
值在0~9之间循环disp(); //调用显示程序}}
intmain(void){unsignedintCount=0;unsignedcharAddr=1;//向地址1里面写数
字uint8_ttemp=0;io_init();DispBuf[0]=Hidden;DispBuf[1]=Hidden;DispBuf[2]
=Hidden;DispBuf[3]=Hidden;DispBuf[4]=0;//次低位显示0while(1){
voidmDelay(uintDelayTim){uinti;for(;DelayTim>0;DelayTim--){for(i=0;ivoid
disp(){uchari;uchartmp;if(++i>=6)i=0;PORTC=0xff;//关闭显示tmp=DispBuf[i];
PORTA=DispTab[tmp];tmp=BitTab[i];PORTC=tmp;mDelay(1); //延时1ms}
eeprom
}
在这种方式下变量在EEPROM 存储器内的具体地址由编译器自动分配。相对方式一,数据在EEPROM 中的具体位置是不透明的。
为EEPROM 变量赋的初始值,编译时被分配到.EEPROM 段中,可用avr-objcopy 工具从.elf文件中提取并产生ihex 或binary 等格式的文件。
段.initN 和段.finiN 是个程序块,它不会象函数那样返回,所以汇编或C 程序不能调用。
const char flash_str1[] PROGMEM = “全局定义字符串”;
int main(void)
{
int I;
char *flash_str2=PSTR(“函数内定义字符串”);
while(1)
{
scanf(“%d”,&I);
printf_P(flash_str1);
int main(void)
{
unsigned char val2;
EEPROM_busy_wait();
EEPROM_write_byte (&val1, 0xAA); /* 写 val1 */
EEPROM_busy_wait();
val2 = EEPROM_read_byte(&val1); /* 读 val1 */
2.2 I/O 寄存器操作
I/O 专用寄存器(SFR)被编址到与内部SRAM 同一个地址空间,为此对它的操作和SRAM 变量操作类似。
SFR 定义文件的包含:
#include
io.h 文件在编译器包含路径下的avr 目录下,由于AVR 各器件间存在同名寄存器地址有不同的问题,io.h 文件不直接定义SFR 寄存器宏,它根据在命令行给出的 –mmcu 选项再包含合适的 ioxxxx.h 文件。
AVR单片机教程19—第十九课 ATMEAG16L的内部EEPROM读写编程
——————————————————————————第十九课ATMEAG16L的内部EEPROM读写编程本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!11.1 ATMEAG16L的内部EEPROMATmegal6L单片机片内有512个字节的EEPROM,它作为一个独立的数据空间存在。
ATmegal6L的EEPROM采用独立线性编址,其地址范围为0~511。
ATmegal6L通过对相关单片机培训寄存器的操作实现对EEPROM按字节进行读写。
ATmegal6L的EEPROM至少可以擦写100000次。
ATmegal6L的EEPROM的写入时间约花数毫秒,取决于VCC的电压。
电源电压越低,写周期越长。
11.2 与EEPROM相关的寄存器——————————————————————————l.EEPROM地址寄存器—EEARH、EEARLEEPROM地址寄存器EEARH、EEARL用于指定某个EEPROM单元的地址。
512个字节的EEPROM线性编址为0~511。
地址寄存器EEARH、EEARL可读可写,初始值没有定义,访问前必须赋予正确的地址。
2.EEPROM数据寄存器—EEDREEPROM数据寄存器EEDR用于存放即将写入EEPROM或者从EEPROM读出的某个单元的数据。
写入或者读出的地址由EEPROM的地址寄存器EEARH、EEARL给出。
EEPROM按字节进行读写。
EEPROM数据寄存器EEDR可读可写,初始值为0x00。
3.EEPROM控制寄存器—EECR——————————————————————————EEPROM控制寄存器EECR用于控制单片机对EEPROM的操作。
位7~4:保留位。
读这些位时总为0。
位3:EERIE位为EEPROM中断准备好使能位。
AVR常用操作
IAR编译器配置(AVR )一、EEPROM 区域数据存储:__eeprom unsigned char a;//定义一个变量存放在EEPROM空间__eeprom unsigned char a @ 0x8;//定义一个变量存放在EEPROM空间0X08单元__eeprom unsigned char p[] @ 0x22//定义一个数组存放在EEPROM空间,开始地址为0X22单元__eeprom unsigned char a @ 0x08=9;//定义一个常数存放在EEPROM空间0X08单元__eeprom unsigned char p[] @0x22={1,2,3,4,5,6,7,8};EEPROM操作宏取函数:在comp_a90.h intrinsics.h头文件里有详细说明。
自动生成.eep文件置:在Project->Options->linker->config>的linker command line中观察该Project使用了哪个XCL文件。
本文使用M8编译,使用文件是”TOOLKIT_DIR$\src\template\cfgm8.xcl”-Ointel-extended,(CODE)=.hex-Ointel-extended,(XDATA)=.eep二、FLASH 区域数据存储:用关键字__flash 控制来存放,__ flash 关键字写在数据类型前后效果一样__flash unsigned char a @ 0x8;//定义变量存放在flash 空间0X08单元__flashunsigned char p[] @ 0x22//定义数组存放在flash 空间,开始地址为0X22单元__flash unsigned char a @ 0x08=9;//定义常数存放在flash 空间0X08单元__flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8};unsigned int __flash * p;//定义个指向flash 空间地址的指针,16位。
AVR片内EEPROM模拟FLASH的优化方法
AVR片内EEPROM模拟FLASH的优化方法概述在AVR片内(内置)的EEPROM模拟FLASH存储的过程中,我们需要考虑如何优化代码以提高性能和效率。
本文档将介绍一些简单的优化方法,以确保良好的性能和稳定的EEPROM模拟FLASH储存过程。
优化方法1. 合理使用EEPROM和FLASH存储根据实际需求,合理使用EEPROM和FLASH存储。
EEPROM 存储器可以用于存储需要频繁修改的数据,而FLASH存储器则适合存储不频繁修改的数据。
2. 使用EEPROM指针使用EEPROM指针来快速访问EEPROM存储器中的数据。
通过使用指针来读取和写入EEPROM存储器中的数据,可以提高读写速度和效率。
3. 批量读写操作在进行EEPROM模拟FLASH储存时,尽可能使用批量读写操作,而不是逐个读写。
这样可以减少读写次数,提高存储过程的效率。
4. 数据压缩对需要存储的数据进行压缩可以减少存储空间,提高存储效率。
使用有效的压缩算法可以将数据压缩到最小的空间,同时保证数据的完整性。
5. 数据校验在进行数据读取和写入时,使用合适的校验算法来保证数据的完整性和准确性。
可以使用CRC或校验和等算法对数据进行校验,以确保存储过程的可靠性。
结论通过合理使用EEPROM和FLASH存储、使用EEPROM指针、批量读写操作、数据压缩和数据校验等优化方法,我们可以提高AVR片内EEPROM模拟FLASH存储的性能和效率。
在实际应用中,根据具体需求和场景选择合适的优化方法,将有助于提升系统的稳定性和性能。
(Word count: 201)。
AVR单片机内部EEPROM应用方法
AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。
在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。
困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。
操作EEPROM 对时序的要求较高。
更加Datasheet 里的写操作范例程序:while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR & (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。
AVR单片机内部EEPROM方法
AVR单片机内部EEPROM方法/**************************************************************;eeprom.c 在AVR单片机中可以用在ATMEGA16和ATMEGA8中都可以用,在GCC下;编译通过。
09年11月1号! 陈永飞已测试过!;读/写atmega8515内部EEPROM的例子;将数据0....9写入eeprom中,再读出用数码管显示出来***************************************************************/#include ;#include ;#define uchar unsigned char#define uint unsigned int#define Hidden 16ucharDispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; uchar BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};uchar DispBuf[6]; //显示缓冲区 unsigned char Counter=0; void io_init(void){// PortAPORTA = 0xff;DDRA = 0xff;// PortBPORTB = 0x0;DDRB = 0x0;// PortCPORTC = 0xfc;DDRC = 0xfc;// PortDPORTD = 0x0;DDRD = 0x0;}void mDelay(uint DelayTim) {uint i;for(;DelayTim>;0;DelayTim--) {for(i=0;i;=6)i=0;PORTC=0xff; //关闭显示tmp=DispBuf[i];PORTA=DispTab[tmp];tmp=BitTab[i];PORTC=tmp;mDelay(1); //延时1ms}int main(void){unsigned int Count=0;unsigned char Addr=1; //向地址1里面写数字uint8_t temp=0;io_init();DispBuf[0]=Hidden;DispBuf[1]=Hidden;DispBuf[2]=Hidden;DispBuf[3]=Hidden;DispBuf[4]=0; //次低位显示0while(1){temp=eeprom_read_byte (Addr);DispBuf[5]=temp;if(++Count==1000){Count=0;Counter++;eeprom_write_byte(Addr,Counter); }if(Counter>;=10)Counter=0; //计数值在0~9之间循环disp(); //调用显示程序}}。
AVR104 缓存和中断方式EEPROM写入
AVR104: 缓存和中断方式EEPROM写入翻译:邵子扬 2006年8月18日shaoziyang@1特点●多字节 EEPROM 缓存●高效 EEPROM 访问●缓存访问控制●EEPROM 缓存重写2介绍许多应用中使用了 AVR 单片机内置的 EEPROM 来保存和恢复参数。
存放单个字节到 EEPROM 的编程时间在 3 到 8.5 ms 左右,在这个写入时间里写入访问被禁止。
传统上是使用查询法来判断 EEPROM 写入是否完成的,这篇应用笔记介绍一种使用缓存和中断方法,明显的提高了程序的性能,和查询法相比还减少了电源的功耗(在等待期间可以进入休眠模式)。
提高性能和降低功耗直接关系到系统。
当执行 EEPROM 写访问查询时,所有资源(除了中断)都被查询所占用,而中断法在“等待” EEPROM 写入完成中断时,可以将单片机释放出来去执行其它代码。
与查询法相比,中断驱动写每字节的 EEPROM 最多可以释放 8.5 ms 时间–依赖于芯片编程时间和系统时钟频率。
3理论AVR 单片机既可以通过中断方式也可以通过查询方式写内部的 EEPROM,两种方法有各自的优点,但是从执行性能看要选择中断方式。
3.1 轮询法轮询就是在读写时,查询 EEWE 状态标志位来保证写周期已经完成。
如果写周期还在进行中,单片机将等待并不停检查标志位,直到标志位被清楚后才继续进行。
检查自编程是否被激活也是必要的,在需要时,要等待 SPM 操作完成。
如果不使用自编程,可以忽略这个步骤。
一旦标志位被清除,就可以启动下一个 EEPROM 操作了。
轮询法的优点是代码紧凑,主要缺点是单片机在等待 EEPROM 写入时浪费了很多时间。
一个典型的单字节写子程序如下:EEPROM_WR: ;EEPROM Write Sub-Routinesbic EECR, EEWE ;If EEWE Not Clearrjmp EEPROM_WR ;Wait LongerSPM_BUSY: ;(Omit if Self-Programming is Not Used) sbic SPMCR, SPMEN ;If SPMEN Not Clearrjmp SPM_BUSY ;Wait Longerout EEARH, r16 ;Output Address Byte (High)out EEARL, r17 ;Output Address Byte (Low)out EEDR, r18 ;Output Data Bytecli ;Disable Global Interruptssbi EECR, EEMWE ;Set Master Write Enablesbi EECR, EEWE ;Set EEPROM Write Strobe;This instruction takes four clock;cycles.sei ;Enable Global Interruptsret ;Return From Sub-Routine3.2 中断法在中断驱动法,不需要查询 EEWE 状态位确定 EEPROM 写入完成,EEPROM 就绪中断是 EEWE 状态位被清除时触发的。
最新AVR单片机EEPROM寄存器汇总
A V R单片机E E P R O M寄存器ATmega88包含512字节的EEPROM数据存储器。
它是作为一个独立的数据EEPROM 的寿命至少为 100,000 次擦除周期。
EEPROM 的访问由地址寄存器,数据寄存器和控制寄存器决定。
具体的 SPI 及并行下载 EEPROM 数据请参见P254“存储器编程”。
EEPROM 读/ 写访问EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。
EEPROM的写访问时间由Table 3给出。
自定时功能可以让用户软件监测何时可以开始写下一字节。
用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。
此时CPU 可能工作于低于晶振所要求的电源电压。
请参见P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。
为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。
具体参看EEPROM控制寄存器的内容。
执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。
EEPROM 地址寄存器- EEARH和EEARL· Bits 15..9 – Res: 保留保留位,读操作返回值为零。
· Bits 8..0 – EEAR8..0: EEPROM 地址EEPROM 地址寄存器– EEARH和EEARL指定了 512 字节的EEPROM。
EEPROM 地址是线性的,从 0 到 511 。
EEAR 的初始值没有定义。
在访问EEPROM 之前必须为其赋予正确的数据。
EEAR8 在 ATmega48 中为无效位,必须始终将其赋值为”0”。
EEPROM 数据寄存器- EEDR· Bits 7..0 – EEDR7.0: EEPROM 数据对于EEPROM 写操作, EEDR 是需要写到EEAR 单元的数据;对于读操作,EEDR 是从地址EEAR 读取的数据。
AVR单片机EEPROM的读写
AVR单片机EEPROM的读写
一AVR 存储类型不要外挂方便使用
1.FLASH 存储程序代码
2.EEPROM 运行的数据掉电不丢失的数据存储分页的数据
3.SRAM 运行的临时数据
EEPROM:读写以字节为单位通过专用指令或SPI、JTAG 直接读写
使用RC 震荡作为时钟,典型值为8.5ms
有时数据丢失的原因:刚上电电压不稳就操作、读写时被中断打断、程序跑飞了
怎样预防:
熔丝位的电压检测设置:低于电压就停止
熔丝位系统时钟的设置:设置上电暂停时间长一点
双字节存储,或加校验位
操作时尽量关中断
二相关寄存器
存储器需要数据和地址来操作以及相应的控制寄存器
地址寄存器EEARH EEARL
数据寄存器EEDR
控制寄存器EECR
* ** * EERIE EEMWE EEWE EERE
以一个实例示范下即可。
eeprom使用方法
eeprom使用方法EEPROM(电可擦可编程只读存储器)使用起来还挺有趣的呢!EEPROM就像是一个小仓库,用来存放数据。
它的好处是数据不会因为断电就消失哦。
那怎么往这个小仓库里放东西呢?这得看你用的是什么设备或者开发板啦。
一般来说,你得先在你的编程环境里找到对应的库或者函数。
比如说,在Arduino里使用EEPROM就超级简单。
你只要包含EEPROM库,然后就可以像给小盒子贴标签放东西一样,用函数来指定地址,再把你想要存的数据放进去。
就好像你把小宝贝放进一个个小格子里,每个格子都有自己的编号,这个编号就是地址啦。
从EEPROM里取数据也不难。
还是按照那个地址,用对应的函数把数据拿出来就好啦。
不过要小心哦,如果你取数据的时候地址弄错了,那就可能拿到错误的东西,就像你本来想拿糖果,结果拿到了小石子一样。
在使用EEPROM的时候,还有个要注意的点就是它的寿命。
它虽然能擦写很多次,但也不是无限的。
所以不要没事就一直擦了写、写了擦,要像爱护小宠物一样爱护它呢。
如果你是在做一些小项目,比如自制一个小的温度记录器。
你就可以把每次测量到的温度数据存到EEPROM里。
这样,就算突然断电了,之前的数据也还在,等来电了还能接着记录或者查看历史数据呢。
还有哦,不同的EEPROM芯片可能会有一些细微的差别。
有的可能存储容量大一点,有的可能读写速度快一点。
你在选择的时候,就像挑选小鞋子一样,要根据自己的“脚”(也就是项目需求)来选合适的。
要是你只是简单存几个小参数,那就不需要特别大存储容量的EEPROM啦。
总之呢,EEPROM就像是一个贴心的小助手,只要你按照它的规则来使用,就能很好地在你的小发明、小制作里发挥大作用啦。
第十二章AVR看门狗及EEPROM
寄存器EEAR。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
AVR 内置EEPROM
n EEPROM 数据寄存器 - EEDR
n 对于EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;
n 对于读操作, EEDR 是从地址EEAR 读取的 数据。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n 从EEPROM 指定位置处开始写"size"个字节写的内容由"ptr."指向 的缓冲区提供
第十二章AVR看门狗及EEPROM
ICC读写EEPROM内置函数原型
unsigned char EEPROMread( int location) {
EEAR = location;
EECR |= 0x01; strobe
n EERIE: 使能EEPROM 准备好中断
n 当EEWE 清零时EEPROM 准备好中断即可发 生。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n EEMWE: EEPROM 主机写使能
n EEMWE决定了EEWE置位是否可以启动EEPROM写 操作。
n 当EEMWE为“1”时,在4个时钟周期内置位EEWE 将把数据写入EEPROM 的指定地址;
基于AVR单片机中的EEPROM和FLASH的区别及使用方法解析
extern uint8_t eeprom_read_byte (const uint8_t *addr);//读取指定地址的 一个字节 8bit 的 EEPROM 数据 extern uint16_t eeprom_read_word (const uint16_t *addr);//读取指定地址 的一个字 16bit 的 EEPROM 数据 extern void eeprom_read_block (void *buf, const void *addr, size_t n); //读取由指定地址开始的指定长度的 EEPROM 数据 extern void eeprom_write_byte (uint8_t *addr, uint8_t val);//向指定地 址写入一个字节 8bit 的 EEPROM 数据 extern void eeprom_write_word (uint16_t *addr, uint16_t val);//向指定 地址写入一个字 16bit 的 EEPROM 数据 通过串口向单片机发送配置命令,单片机收到指令后,利用函数 write_EEPROM_config()将相应的配置信息存放于 EEPROM 中。系统初始 化时,利用函数 read_EEPROM_config()从 EEPROM 中取出相应的数据,
RAM 用作程序运行时的数据存储器; EEPROM 用于存放数据,是用来保存掉电后用户不希望丢的数据,开机 时用到的参数。运行过程中可以改变。 FLASH 是用于存储程序代码的,有些场合也可能用它来保存数据,当然 前提是该单片机的 FLASH 工艺是可以自写的(运行中可擦写),但要注意 FLASH 的擦写次数通常小于一万次,而且通常 FLASH 只能按块擦除。 EEPROM 不能用来存程序,通常单片机的指令寻址不能到这个区域。 EEPROM 的擦写次数应有百万次,而且可以按字节擦写。EEPROM 在一个 PAGE 内是可以任意写的,FLSAH 则必须先擦除成 BLANK,然后再写入, 而一般没有单字节擦除的功能,至少一个扇区擦除。 2.2 结构上的区别 EEPROM 和 FLASH 都是非易失性存储器。 FLASH 的全称是 FLASH EEPROM,但跟常规 EEPROM 的操作方法不同。
AVR内部EEPROM使用
AVR單片機內部EEPROM詳解使用EEPROM倒是挺簡單的,無非是讀和寫操作,首先需要判斷是否在讀寫中,判斷讀寫忙標志,然後要保證讀寫時不能被打斷即要關中斷,接著要寫入到寫數據的地址,接著寫數據,再將地址和數據控制位置位下,數據就寫進了,最後別忘了開中斷。
讀數據時,只要寫入地址,然後將讀控制位置位,再從寄存器EEDR中讀出數據即可。
以上用法是簡單用法,當然這種用法不能用在實際工程應用中的,因爲寫數據需要8ms的時間,系統當然不允許一直等待這8ms的,在本文下面介紹了一種比較好的方式,來安排系統工作的時間。
當然前提是要理解清楚最簡單的工作模式。
一、簡單的工作模式void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //寫入地址EEDR = ucData; //送入數據EECR |=(1<<EEMWE); //地址和寫控制位鎖存,即可EECR |=(1<<EEWE);SEI();}unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //送入地址EECR |=(1<<EERE); //讀位置位SEI();return EEDR; //返回數據}讀和寫的操作如下面所示讀寫數據時要從0x01開始,00地址有bug(數據手冊上講的)temp=EEPROM_read(0x01);EEPROM_write(0x01,temp);二、提升篇-使用緩衝機構的操作思路是這樣的:首先建立讀寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀\寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數據都寫完了。
avr操作eeprom
AVR如何将数据写入EEPROM用ICCAVR编译程序,对EEPROM的操作很简单,只要在头文件中包含eeprom.h文件即可。
读取数据调用EEPROMread(addr) 函数,用addr指明读取的地址,该地址的数据在返回值中;写入数据调用EEPROMwrite(addr,x),即将x写入地址addr中。
以上是大前提。
面向具体应用,由于我们想做密码锁,密码锁的初始密码与修改密码都需要保存到EEPROM中,否则,每次上电的密码都会是初始密码。
而数据保存在EEPROM中,依然需要先写再读,若写函数与读函数都写在flash主函数中,像下面的写法,那么依然解决不了“上电变初始”的问题。
uchar pw[]={1,2,3,4,5,6};void writeROM(void){ EEPROMwrite(0x20,pw[0]);EEPROMwrite(0x21,pw[1]);EEPROMwrite(0x22,pw[2]);EEPROMwrite(0x23,pw[3]);EEPROMwrite(0x24,pw[4]);EEPROMwrite(0x25,pw[5]);}void readROM(void){ pw[0]=EEPROMread(0x20);pw[1]=EEPROMread(0x21);pw[2]=EEPROMread(0x22);pw[3]=EEPROMread(0x23);pw[4]=EEPROMread(0x24);pw[5]=EEPROMread(0x25);}void main(){……writeROM();readROM();……}遇到这个困惑后,求助,得到这样的一个回答:编程器就支持直接对EEPROM的编程的,建个Bin或Hex文件,烧录进去就行了。
恍然大悟,于是这样解决的。
先保留着pw[]的赋值语句和writeROM()语句,烧写flash。
然后AVRfighter中有个“读EEPROM”按钮,点击,就可以在“EEPROM内容”中看到EEPROM 中的数据,然后点击右边的“保存”按钮,可以将EEPROM中的数据保存为bin或hex格式。
AVR内部EEPROM读写实验
A VR内部EEPROM读写实验片内EEPROM读写实险。
1、用内部EEPROM记录CPU启动次数,并在PB 口上显示出来。
2、内部1 M晶振,程序采用单任务方式,软件延时。
3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)短路块。
4、通过此实验,可以对对内部EEPROM 有个初步认识,了解EEPROM函数的操作。
5、可过复位键让系统重启,这样就可以更新显示了。
*/#include iom16v.h/*延时函数*/void delay_ms(unsigned char i) {unsigned char a, b;for (a = 1; a i; a++) { for (b = 1; b; b++) { ; } }}/*EEPROM读取函数*//*addr:地址;number:长度;p_buff:读出数据存放指针*/void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {while(EECR (1 EEWE));EEARH = 0x00;while(number --) { EEARL = addr ++; EECR |= (1 EERE); *p_buff++ = EEDR; }}/*EEPROM写入函数*//*addr:地址;number:长度;p_buff:写入数据存放指针*/void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {EEARH = 0x00;while(number --) { while(EECR (1 EEWE)); EEARL = addr ++; EEDR = *p_buff ++; EECR |= (1 EEMWE); EECR |= (1 EEWE); }}/*主函数*/void main(void) {unsigned char temp;DDRA = 0x00; /*方向输入*/PORTA = 0xFF; /*打开上拉*/DDRB = 0xFF; /*方向输出*/PORTB = 0xFF; /*电平设置*/DDRC = 0x00;PORTC = 0xFF;DDRD = 0x00;PORTD = 0xFF;delay_ms(250); /*启动延时*/eprom_read(0x10, 0x01, temp); /*读出记录*/PORTB = ~temp; /*显示记录*/temp ++; /*刷新记录*/eprom_write(0x10, 0x01, temp); /*写入记录*/while (1) { ; }}。
单片机avr EEPROM 读写
单片机avr EEPROM 读写
2011-08-22 9:12
EEPROM: 单片机内部可用软件读写的数据存储空间,掉电后数据不丢失,可擦写10万次。
ATmega16 内部有512字节的EEPROM数据空间,地址空间由0-511,由EEPROM 地址寄存器EEAR指定,数据寄存器EEDR用于存储要读写的数据。
写操作步骤:
一、查询上一个数据是否写完: while (EECR&(1<<EEWE)) ; //如果EEWE位为1,就在原地等待
二、将要写如数据的地址送到EEAR: EEAR=address(范围0-0x1ff) ;
三、把要写入的数据送到EEDR: EEDR=data;
四、主机写入允许: EECR|=(1<<EEMWE);
五、启动写入: EECR|=(1<<EEWE);
读操作步骤:
一、等待上一个数据写完: while(EECR&(1<<EEWE));
二、指定要读出数据的地址: EEAR=adress;
三、使能读: EECR|=(1<<EERE);
四、从EEDR中读取数据: data=EEDR;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。
程序代码:下载相关文件
∙void main(void)
∙{
∙ unsigned char temp1,temp2; /*定义变量*/∙ unsigned char buffer[10]; /*定义数组*/∙ unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/∙ EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/
∙ temp1 = EEPROMread(0x10); /*读一个字符到temp1*/
∙ EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/
∙ EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/
∙ EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */
∙ EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/
∙ while(1)
∙ ;
∙}
调试后的效果:
调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。
如下图:
打开调试选项:
钩选保护eeprom数据选项:
打开相关观测窗口:
按F10逐条语句运行,查看运行结果。
1. 地址10上的值被改写为“a”
2. temp1的值变为a,及读取了地址0x10的值a:
3. abcdefg写入20开始的地址:
4. temp2的变为地址20的值a:
5. 以0x20开始的值都读入buffer数组中:
6. 预定义的数组中的值写到EEPROM中:
7. 设置不保护EEPROM的值之后,停止调试再开始调试,EEPROM中的值改为0XFF:。