|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
ATMEGA128外接调电不丢RAM解决方案 |
作者:yonghuang 栏目:单片机 |
近来做系统设计的时候发现:ATMEGA128内部带有4K的RAM,但是是掉电丢的;若外部扩展非易失性RAM(如HM62256),但AVR指令不支持直接寻址外部存储器(如:8051单片机的XDATA)。相对于51单片机来说很是麻烦。 解决办法:外部扩展一般的RAM,另外还需扩展大容量的FLASH用来存储数据 并口的有512K字节的W29C040,串口的有AT45D041等。 我在这里抛砖引玉,如果大家有什么好的意见,欢迎讨论! |
2楼: | >>参与讨论 |
作者: zsmbj 于 2006/4/30 16:33:00 发布:
不知所云 单片机内部的RAM都是调电丢失的,51也一样。 MEGA128是支持外部数据存储器的。扩展方法和51是一样的。 不知嫩抛的是什么砖?引的什么玉? |
3楼: | >>参与讨论 |
作者: kanprin 于 2006/4/30 17:02:00 发布:
呵呵,晕晕。 原来现在玉也不贵了。 |
4楼: | >>参与讨论 |
作者: yonghuang 于 2006/5/1 12:30:00 发布:
to zsmbj 可能zsmbj还没有理解我的意思。在51里面我们可以直接用XBYTE访问外部存储器。而在ATMEGA128中虽然可以访问外部存储器,但是内部存储器和外部存储器是没法分开的(至少程序里面),你能知道所存的数据是放到内部呢,还是外部呢?就此事我曾专门打电话给双龙公司,他们的工程师也告诉我说没有好办法,除非你指定具体的地址才行,或者先把内部的4K空间给耗尽了,然后才能保证存到外部。 |
5楼: | >>参与讨论 |
作者: zhermit 于 2006/5/1 13:45:00 发布:
呵呵 不是很清楚yonghuang 的意思. 51里使用XBYTE访问外部存储器,也不是一个确定地址的过程吗?如果不需要指定外部和内部,51有必要加个XBYTE?不如直接用mov好了. 到了AVR,不是一样的道理?只不过换了个方式,先指定外部地址,有多大区别? 另外,你既然选了avr,死抱着51设计编程方式干什么? 祝 好运 |
6楼: | >>参与讨论 |
作者: avrx007 于 2006/5/1 14:45:00 发布:
把破烂当成宝了。 M128超出内部4KB SRAM的地址就属于外部SRAM了 在AVR中,你可以自己指定数据的地址。51 XDATA也是指定地址区域 LZ好像搞错了 非易失性RAM HM62256?? 非易失性RAM(NVRAM)价格可不便宜。 HM62256+锂电池也行。 |
7楼: | >>参与讨论 |
作者: erkin 于 2006/5/1 15:46:00 发布:
乱说 谁说AVR不支持外部SRAM了,我现在外边用了2M的RAM。 如果不丢失,那你加一个电池就可以了,另外在初始化的时候不要把RAM清零就可以了。建议用GCC,用ICC我还真不太清楚。 在不行就把数据存在内部EEPROM中,128的EEPROM很好用的。 |
8楼: | >>参与讨论 |
作者: mxh0506 于 2006/5/1 20:59:00 发布:
指定数据段放在外部SRAM中 我就是这么做的 4K以下全作为堆栈;4K以上是数据.可以保证堆栈和数据不冲突 那种类似XBYTE的方法只有在访问固定地址的外设时比较合适,要是用来声明变量就不高明了 |
9楼: | >>参与讨论 |
作者: yonghuang 于 2006/5/2 16:54:00 发布:
不好意思,把XDATA搞成XBYTE了 请问avrx007,怎样自己指定数据的地址?这点真是不是很清楚,可能是我没有弄明白的关键所在,请不吝赐教。 51中有如下例子: float xdata today[5][31];如果接了外部RAM,我们可以不去管它到底分配到哪个具体的地址,由编译器自动指定。如果是NVRAM,下次开机时数据还保存着。 在AVR中我们只能用float today[5][31]来声明;而AVR中编译器的分配原则好像是先内部,然后外部。如果声明的变量多了,就不知它存在内部的RAM里面还是外部的RAM里面。 erkin的用内部EEPROM的方法很好,但是4K的空间对我的系统来说小了点。 我还是倾向与mxh0506 的4K以下全作为堆栈;4K以上是数据这种方法,但不知怎么实现的。 |
10楼: | >>参与讨论 |
作者: erkin 于 2006/5/3 22:43:00 发布:
问题是这样的,你可以指定你声明的东西的首地址。 这样就解决了你的问题,另外如果有什么问题的化,加我QQ:1567494。 建议你不要用数组,这个东西我实在是觉得不好,不如用结构体来的方便。 |
11楼: | >>参与讨论 |
作者: xiaoIIhei 于 2006/5/30 12:25:00 发布:
可以用指针 #define today[5][31](*(volatile float *) 0x3008) 这样不知道行不行 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |