打印

菜鸟请教,如何才能提高51单片机访问外部SRAM的速度?

[复制链接]
4820|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxq1234508|  楼主 | 2008-2-1 08:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做一个东西,是将采样到的周期信号存储到外部SRAM中,用的是6264,思路是这样的,当AD转换结束一次则把采样到的结果存储一次(外部SRAM).存储程序如下:
         uchar xdata *add_ad_h;
    *add_ad_h=AD_H;
    add_ad_h++;
    *add_ad_h=AD_L;
    add_ad_h++;

采用指针移动外部SRAM的地址,AD转换结束标志接的是外部中断0,为了提高采样率,采用的是查询方式.现在发现的是,在存储数据的时候,速度太慢了.也就是数据还没有完全存到外部SRAM的时候,AD就转换完成了.这样的话就限制了采样速度了.不知道如何编写程序才能提高对外部SRAM的访问速度.请高手指点.非常感谢.

相关帖子

沙发
zlgmcuCHTZ| | 2008-2-1 08:46 | 只看该作者

movx也就是2个时钟周期呀!

SRAM又不是FLASH和EEPROM,如果说因为代码的效率不高,可内嵌汇编了

使用特权

评论回复
板凳
mohanwei| | 2008-2-1 08:56 | 只看该作者

汇编不意味着代码效率就高……

贴出你的汇编代码看看、算一算,还有,说出AD的参数。

使用特权

评论回复
地板
xwj| | 2008-2-1 09:14 | 只看该作者

编不意味着代码效率就高…但是,要想代码效率搞,必须的

使用特权

评论回复
5
chunyang| | 2008-2-1 09:34 | 只看该作者

关键是优化程序结构

同时尽量采用较高的工作时钟频率。

使用特权

评论回复
6
农民讲习所| | 2008-2-1 09:35 | 只看该作者

6264都已经停产了。

市面上的都是旧货、拆机货、翻新货。而且还很贵。
至少用62256,便宜。

uint xdata *add_ad_h;
*add_ad_h++ = (AD_H<<8) | AD_L;

使用特权

评论回复
7
农民讲习所| | 2008-2-1 09:36 | 只看该作者

想C优化,就在一条语句中完成

使用特权

评论回复
8
zxq1234508|  楼主 | 2008-2-1 09:46 | 只看该作者

谢谢,LS的回答

补充一下,AD采样率是100K,转换周期是6us.单片机晶振是12M,现在我采样的是两路5OHz信号,通过多路开关切换,定时器定时20ms,即采样一个周期.采样到的点数总共只有不到300个点,一路信号也就最多150个点.这样算来的话也就是差不多66us一个点.现在我想的是能再提高点,能采样400个点.不知道该如何提高.请高手指点一下.现在把中断程序贴一下:
while(ad_end!=1)        //等待定时标志,定时20ms;                
   {
      if(IE0==1)           //查询外部中断0标志;
    {
      ET1=0;
      sp++;
      RD=0;
      P0=0xff;     
      AD_L=P0;       //AD转换低位;
      AD_H=P1;       //AD转换高四位;
      RD=1;
      if(HB==0)                //存储UH信号;
        {
          *add_ad_h=AD_H;            //uchar xdata *add_ad_h;
          add_ad_h++;
          *add_ad_h=AD_L;
          add_ad_h++;
          P2=gain_UB;
        }
    else                    //存储UB信号;
       {
          *add_ad_b=AD_H;
          add_ad_b++;
          *add_ad_b=AD_L;
          add_ad_b++;
          P2=gain_UH;        
       }
    MUL^=1;                      //信号选择;
    HB=MUL;
    *add_ad=0x48;                //启动AD转换;
    ET1=1;
    }
}

我把  
               *add_ad_h=AD_H;            //uchar xdata *add_ad_h;
          add_ad_h++;
          *add_ad_h=AD_L;
          add_ad_h++;
这部分编译的结果贴出来大家看看,是否还有精简的余地
   957:                 *add_ad_h=AD_H; 
C:0x08B8    852B82   MOV      DPL(0x82),0x2B
C:0x08BB    852A83   MOV      DPH(0x83),add_ad_h(0x2A)
C:0x08BE    E532     MOV      A,AD_H(0x32)
C:0x08C0    F0       MOVX     @DPTR,A
   958:                 add_ad_h++; 
C:0x08C1    052B     INC      0x2B
C:0x08C3    E52B     MOV      A,0x2B
C:0x08C5    7002     JNZ      C:08C9
C:0x08C7    052A     INC      add_ad_h(0x2A)
   959:                 *add_ad_h=AD_L; 
C:0x08C9    F582     MOV      DPL(0x82),A
C:0x08CB    852A83   MOV      DPH(0x83),add_ad_h(0x2A)
C:0x08CE    E534     MOV      A,AD_L(0x34)
C:0x08D0    F0       MOVX     @DPTR,A
   960:                 add_ad_h++; 
C:0x08D1    052B     INC      0x2B
C:0x08D3    E52B     MOV      A,0x2B
C:0x08D5    7002     JNZ      C:08D9
C:0x08D7    052A     INC      add_ad_h(0x2A)

使用特权

评论回复
9
xwj| | 2008-2-1 10:00 | 只看该作者

这个编译结果明显不对,里换个写法试试吧

使用特权

评论回复
10
农民讲习所| | 2008-2-1 10:12 | 只看该作者

想快,首先把AD改成总线方式,不要使用IO模拟。

使用特权

评论回复
11
zxq1234508|  楼主 | 2008-2-1 10:19 | 只看该作者

请教6楼一个问题

6楼的建议是改为
uint xdata *add_ad_h;
*add_ad_h++ = (AD_H<<8) | AD_L;
之前我也是这么用的,但是前段时间在一本书上看到,在对外部SRAM操作的时候最好不要用整型数据类型,这样会降低访问速度.现在都还不是很明白原因是什么。
刚才也修改了一下,如果用上面的程序的话,确实会慢一点.
请指教,谢谢.

使用特权

评论回复
12
xuyaqi| | 2008-2-1 10:20 | 只看该作者

关键是要用高速单片机(如c8051f120等)及高速SRAM,软件优化“油水”不大。

使用特权

评论回复
13
xwj| | 2008-2-1 11:38 | 只看该作者

LS错!软件优化“油水”相当的大!

再好的CPU,如果软件做的不好,都可能变得慢如蜗牛

使用特权

评论回复
14
后学| | 2008-2-1 11:53 | 只看该作者

re

1、用更快的频率或处理器(增强型51);比如Winbond W77系列,40M晶振。。。
2、实在不行可以加个CPLD做简单的总线模拟;
3、代码确实可以优化;

使用特权

评论回复
15
mohanwei| | 2008-2-1 13:29 | 只看该作者

果不其然……把主采集循环部分划分为一个函数再优化吧

最主要是把
while(1)
{
}
这一段封装为一个函数,然后放到一个单独的C文件里,把这个C文件编译成SRC(汇编源代码),优化之。根据单片机的指令手册,算一下是否符合要求。

使用特权

评论回复
16
why_buaa| | 2008-2-1 14:05 | 只看该作者

还是直接操作DPTR吧

  看你的汇编,每次是先增加了指针变量,再把指针变量写到DPTR,你干脆直接操作DPTR算了。
  不知道这样的写法能不能通过 
  DPTR=add_ad_h;
  *DPTR++=AD_H;
  *DPTR++=AD_L;
  add_ad_h=DPTR;

 要是不能这样写的话,你直接嵌汇编吧.

使用特权

评论回复
17
xuyaqi| | 2008-2-1 14:27 | 只看该作者

回13楼:

我不是指所有的软件优化,只是指楼主的问题而言,因软件只是将读到的AD值存入SRAM,所以我说“软件优化“油水”不大”。因我有类似的实践,弄不好还得“DMA”。

使用特权

评论回复
18
xhtxzxw| | 2008-2-2 00:06 | 只看该作者

嘿嘿

感觉也是“油水不大”,即使直接用汇编也还是“油水不大”,换具有双DPTR的51,可能有一点点油水,但依然属于虾米腿榨油的那么点油水。

使用特权

评论回复
19
soso| | 2008-2-2 01:10 | 只看该作者

这个AD 速度够快的

一种方法是可以用快一些的 MCU, 比如 C8051 等,价格会贵一些。

再一种方法是 DMA,就是把 AD 的输出直接送到 SRAM,MCU 只需要控制总线信号就可以了。

使用特权

评论回复
20
ayb_ice| | 2008-2-2 13:40 | 只看该作者

就是普通的51移动一个数据才2uS啊

MOV @DPTR,A;   ;// 才2uS啊,难道还不快吗
是你的思路不对吧,要快就用中断嘛。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

486

帖子

0

粉丝