5410|9

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于2407 定时启动AD中断问题 [复制链接]

最近在用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;
}

最新回复

我最近在调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
 
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
今天单独针对定时器1做了测试.基本可以确定是定时器问题.不管怎么修改周期寄存器,预定标系数,定时器周期始终改不小.甚至会进不了定时.不知道是什么原因. 望高手解惑.
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
两天了都没人回帖..
今天尝试了将程序烧入片子跑.结果正常了.问题算是找到了.我想可能是由于仿真的时候程序是下入片外RAM中.影响了速度..要么就是仿真器的原因.可是片外RAM 读写速度很快.只要15ns.相比2407的指令周期25ns 已经很短了呀..    有知道的朋友来交流一下吧.
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 
想用定时器中断来依次启动AD时,时间误差是很大的.定时器中断入栈到再次设置定时器要20条指令左右,若采用片内FLASH 来跑程序,误差在25NS*20=0.5US;若用外部XRAM来跑程序;误差和我们普通的理解相差很多;在操作数和程序都位于XRAM的情况下,一条指令可以达到(2n+2+nd+2p)个指令周期,其中n为指令的重复次数(如:需要重复执行的指令;原因是外部XRAM无法实现流水线功能).d为数据存储器等待状态,p为程序存储器等待状态.这样以来,2三条指令就可能接近1US的时间,当你定时器为8US时,用外部存储器肯定是很大的.
                            --------------以上仅为本人理解,供兄弟参考!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果你的AD中断服务程序内容很少,可以采用定时器周期溢出但不中断的方法来完成功能,误差会小很多.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢您的回复.
我感觉好象不同的速度的计算机对仿真的速度影响也不相同.我在台试机和笔记本上调试速度是不一样的.
另外我想请教您所说的周期溢出但不中断的方法具体怎么操作.我没想明白.
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的表述可能不贴切:例子如下:

;/----------------------定时器初始化--------------------------------/
        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或周期寄存器数值时重载
                                                                ;禁止定时器比较操作,使用自己的周期寄存器
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 

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

;启动ADC采样
        LDP         #DP_EVB
     
      LACC  T3CON

      OR    #42H
      SACL  T3CON
        LDP                #0E1H
        LACC        ADCCTRL2
        OR                #0200H
        SACL        ADCCTRL2
        CLRC        INTM  
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
谢谢。您指的就是通过定时器周期益出来启动AD吧。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 

请教问题

我最近在调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;
     
     }  
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表