关于2407 定时启动AD中断问题

wcqu2005   2008-9-3 08:02 楼主
最近在用2407做AD采样,采样采用定时器启动AD模块,要求采样周期为8us.在程序调试过程中遇到时间提不上去的问题.反复修改定时周期,通过示波器观察采样周期最小都在16US.请高手帮我分析一下原因.
程序如下.
int *addr =(int  *)0x8000;
unsinged char t=0x8000;

main()
{  
         SystemInit();                 //系统初始化  
           MCRA=MCRA & 0x0000;               
         ADINIT();                          //定时器,AD初始化
         asm(\" CLRC INTM \";             
         while(1);
}

void SystemInit()
{  

        asm(\" SETC        INTM \";        /* 关闭总中断 */
        asm(\" CLRC          SXM  \";        /* 禁止符号位扩展 */
        asm(\" CLRC  CNF  \");    /* B0块映射为 on-chip DARAM*/
        asm(\" CLRC  OVM  \");    /* 累加器结果正常溢出*/
        SCSR1=0x83FE;                 /* 系统时钟CLKOUT=20*2=40M */        WDCR=0x006F;                        /* 禁止看门狗/
        KickDog();                            /* 初始化看门狗 */  
        IMR=0x0001;                                /* 打开中断1*/      
            IFR=0xFFFF;                                /* 清除中断标志 */
       MCRA=MCRA & 0x80FF;             //IOPB0-6设为IO口模式
           PBDATDIR=0x8000;                
}  

void ADINIT()           
{

    EVAIFRA=0xFFFF;                        // ad初始化      清除中断标志
    ADCTRL1=0x10;
    ADCTRL2=0x8504;                     
    MAXCONV=0x0000;
   CHSELSEQ1=0x0000;       //第0通道  
    GPTCONA=0x2100;                        //定时器初始化   
          T1PR=40;                                                       
        T1CNT=0;
        T1CON=0x144E;            
}

void interrupt c_int1()               /*定时器1中断服务程序*/
{
         t=t^0x0080;
         PBDATDIR=t;
        while( (ADCTRL2&0x1000)==0x1000);
        *addr=RESULT0>>8;
        addr++;                                
        ADCTRL2=ADCTRL2|0x4200;          
}  

void KickDog()                                /*踢除看门狗 */
{
        WDKEY=0x5555;
        WDKEY=0xAAAA;
}

回复评论 (9)

今天单独针对定时器1做了测试.基本可以确定是定时器问题.不管怎么修改周期寄存器,预定标系数,定时器周期始终改不小.甚至会进不了定时.不知道是什么原因. 望高手解惑.
点赞  2008-9-4 09:57
两天了都没人回帖..
今天尝试了将程序烧入片子跑.结果正常了.问题算是找到了.我想可能是由于仿真的时候程序是下入片外RAM中.影响了速度..要么就是仿真器的原因.可是片外RAM 读写速度很快.只要15ns.相比2407的指令周期25ns 已经很短了呀..    有知道的朋友来交流一下吧.
点赞  2008-9-5 06:54
想用定时器中断来依次启动AD时,时间误差是很大的.定时器中断入栈到再次设置定时器要20条指令左右,若采用片内FLASH 来跑程序,误差在25NS*20=0.5US;若用外部XRAM来跑程序;误差和我们普通的理解相差很多;在操作数和程序都位于XRAM的情况下,一条指令可以达到(2n+2+nd+2p)个指令周期,其中n为指令的重复次数(如:需要重复执行的指令;原因是外部XRAM无法实现流水线功能).d为数据存储器等待状态,p为程序存储器等待状态.这样以来,2三条指令就可能接近1US的时间,当你定时器为8US时,用外部存储器肯定是很大的.
                            --------------以上仅为本人理解,供兄弟参考!
点赞  2008-9-8 02:54
如果你的AD中断服务程序内容很少,可以采用定时器周期溢出但不中断的方法来完成功能,误差会小很多.
点赞  2008-9-8 02:56
谢谢您的回复.
我感觉好象不同的速度的计算机对仿真的速度影响也不相同.我在台试机和笔记本上调试速度是不一样的.
另外我想请教您所说的周期溢出但不中断的方法具体怎么操作.我没想明白.
点赞  2008-9-10 07:12
我的表述可能不贴切:例子如下:

;/----------------------定时器初始化--------------------------------/
        LDP        #DP_EVB
        SPLK        #0142H,GPTCONB                ;T3周期中断来启动ADC,允许比较输出,输出端口高有效

        ;SPLK        #012400,T3CMPR                ;装载T3的比较寄存器(约0.413MS)
        SPLK        #012000,T3CMPR
        SPLK        #012499,T3PR                ;装载T3的周期寄存器(约0.4166MS)
                                ;清定时器3,4的所有中断标志
      SPLK        #0FFFFH,02FH                ;EVAIFRA
      SPLK        #0FFFFH,030H                ;EVAIFRB
      SPLK        #0FFFFH,031H                ;EVAIFRC
                              ;禁止中断
      SPLK        #0,02CH                                ;EVAIMRA禁止所有EVB的中断
      SPLK        #0,02DH                                ;EVAIMRB
      SPLK        #0,02EH                                ;EVAIMRC
      SPLK        #0,T3CNT                        ;T3计数寄存器清0

        SPLK        #1005H,T3CON                ;仿真挂起立即停止,连续增计数模式,时钟定标X/1
                                                                ;使用自己的使能位,暂时不启动定时器,内部时钟
                                                                ;计数器等于0或周期寄存器数值时重载
                                                                ;禁止定时器比较操作,使用自己的周期寄存器
点赞  2008-9-11 12:52

...........................
ADC设置略:
ADC设置中要容许事件管理器来启动ADC
..........................

;启动ADC采样
        LDP         #DP_EVB
     
      LACC  T3CON

      OR    #42H
      SACL  T3CON
        LDP                #0E1H
        LACC        ADCCTRL2
        OR                #0200H
        SACL        ADCCTRL2
        CLRC        INTM  
点赞  2008-9-11 12:55
谢谢。您指的就是通过定时器周期益出来启动AD吧。
点赞  2008-9-18 02:32

请教问题

我最近在调2407的AD,但AD就是不工作,进不了中断,不知为什么,这个问题一直困扰我,如果你知道,请指导一下,我QQ:305259825
我程序如下:

#include   "lf2407reg.h"

int Data[20];              /* 定义一个数组,用于存放AD转换的结果*/
int i=0,k=0x00,j=0;

void  initalcpu()              /*系统初始化子程序*/
{
   asm(" setc SXM ");        /*符号位扩展有效*/
   asm(" clrc OVM ");        /*累加器中结果正常溢出*/
   asm(" clrc CNF ");        /*B0被配置为数据存储空间*/
   *SCSR1=0X00FD;            /*CLKIN=10M,CLKOUT=4*CLKIN=40M*/
   *WDCR=0XE8;              /*禁止看门狗*/
   *IMR=0X0005;              /*允许INT3 、INT1中断*/
   *IFR=0X003F;
               /*清除全部中断标志,"写1清0"*/
}

void timer4inital()
{
   *T4CNT=0X0000;           /*T4计数器清0*/
   *T4CON=0X110C;           /*T4为连续曾计数模式,4分频,且选用内部时钟源*/
   *T4PR=5;             /*500ns*/
   *GPTCONB=0X4400;
   *EVBIMRB=0X0001;         /*T4寄存器周期使能*/
   *EVBIFRB=0X003F;        /*清除EVB中断标志,写"1"清"0"*/
}

void ADCinital()
{
    *ADCTRL1=0X4910;         /*启动停止、级联模式、ADC高级优先,采样频率设定为2M*/
    *ADCTRL2=0X8400;
    *MAXCONV=0X0000;         /*选择0通道*/
    *CHSELSEQ1=0X0000;
    *CHSELSEQ2=0X0000;
    *CHSELSEQ3=0X0000;
    *CHSELSEQ4=0X0000;
}

void  timer4SOC()
{
   *T4CON=(*T4CON)|0X0040;      /*启动定时器4*/
}

void interrupt adint()
{
    asm(" setc INTM");  /* 关总中断*/
    asm(" CLRC SXM");

    Data=(*RESULT0)>>6;   /*取AD转换结果*/
    i++;
    *T4CNT=0X0000;      /*T4定时器清0*/
    *EVBIFRB|=0X0001;  /*定时器中断标志清0(写1清0)*/
    *ADCTRL2|=0X4200;  /*复位SEQ1,且清除ADC中断标志INTFLAGSEQ1,写1清0*/
    asm(" clrc INTM"); /*开总中断*/
}

void interrupt nothing()
{
   asm(" clrc INTM");    /*开总中断,因为一进中断,总中断就关掉了*/
   return;
}

void cleardata()         /*清存转换结果的数组*/
{
    for(k=0;k<20;k++)
     Data[k]=0;
}

main()
{
   asm(" setc INTM");
   initalcpu();
   ADCinital();
   timer4inital();
   cleardata();
   asm(" clrc INTM");
   timer4SOC();
   while(1)
     {      
             if(i==20)   /*输入的是100K的正弦波,采集完20个点就跳出*/
               break;
     
     }  
}
点赞  2010-2-14 13:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复