Board logo

标题: [求助]帮忙看看这个2407的A/D程序 [打印本页]

作者: snoopopy415    时间: 2006-8-3 21:07     标题: [求助]帮忙看看这个2407的A/D程序

我着个程序总是进不了中断,大家看看是那错了


#include "register.h"
int ADRESULT[16];       // 定义一个数组用于保存AD转换的结果
volatile unsigned int  *j;     // 定义一个指针变量j
int i=0x00,cesi,k=0;


void inline disable()
{
 asm(" setc INTM");
}


void inline enable()
{
 asm(" clrc INTM");
}


initial()
{
 asm(" setc SXM");    // 符号位扩展有效
 asm(" clrc OVM");    // 累加器中结果正常溢出
 asm(" clrc CNF");    // B0被配置为数据存储空间
 *SCSR1=0x81FE;      // CLKIN=6M,CLKOUT=4*CLKIN=24M
    *WDCR=0x0E8;  // 不使能看门狗,因为SCSR2中的WDOVERRIDE
    // 即WD保护位复位后的缺省值为1,故可以用
           // 软件禁止看门狗


 *IMR=0x0001;       // 允许INT1中断
 *IFR=0x0FFFF;
    WSGR=0X00;      // 清除全部中断标志,"写1清0"
}
// AD初始化子程序
void ADINIT()
{
 *T4CNT=0x0000;      // T4计数器清0
 *T4CON=0x1704;      // T4为连续增计数模式,128分频,且选用内部时钟源
 *T4PER=0x75;       // 设置T4的周期寄存器
 *GPTCONB=0x400;      // T4周期中断标志触发AD转换
    *EVBIFRB=0x0FFFF;   // 清除EVB中断标志,写"1"清0
    *EVBIMRB=0x0000;
    *ADCTRL1=0x10;    // 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
     // 转换时间预定标位CPS为0,AD为启动/停止模式,排
         // 序器为级连工作方式,且禁止特殊的两种工作模式
    *ADCTRL2=0x8404;  // 可以用EVB的一个事件信号触发AD转换,
         // 且用中断模式1
 *MAXCONV=0x0F;      // 16通道
 *CHSELSEQ1=0x3210;
 *CHSELSEQ2=0x7654;
 *CHSELSEQ3=0x0BA98;
 *CHSELSEQ4=0x0FEDC;     // 转换通道是0和1
}



// 若是其它中断则直接返回子程序
void interrupt nothing()
{
 enable();
 return;
}
// AD中断服务子程序
void interrupt adint()
{
     asm(" clrc SXM");    // 抑制符号位扩展
    j=RESULT0;       // 取得RESULT0的地址
 for(i=0;i<=15;i++,j++)
 {
 ADRESULT=*j>>6;     // 把AD转换的结果左移6位后存入规定的数组
 
 cesi=ADRESULT;                 // 检验每个A/D转换的结果
 }
 *ADCTRL2=*ADCTRL2|0x4200;   // 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
 ++k;
 enable();      // 开总中断,因为一进入中断总中断就自动关闭了
}


main()
{
 disable();       // 禁止总中断
 initial();       // 系统初始化
 ADINIT();       // AD初始化子程序
 enable();       // 开总中断
 *T4CON=*T4CON|0x40;       // 启动AD转换
 /*while(1)
 {
  if(i==0x10)
  break;      // 如果已发生中断,则停止等待(发生中断后,i=0x10)
 }        // 等待中断发生
 *T4CON=*T4CON&0x0FFBF; */   // 停止定时器4,即间接停止A/D转换
 while(1)
 {
 ;
 }        // 死循环,在实际的工程应用中在此可以利用A/D转换的
// 结果用于一些运算
}



中断向量表


 .title "vectors.asm"
  
  .ref   _nothing
  .ref   _c_int0
  .ref   _adint
  .sect ".vectors"   
REVECT   B   _c_int0   
INT1     B   _adint   
INT2         B   _nothing 
INT3     B   _nothing  
INT4     B   _nothing  
INT5     B   _nothing 
INT6     B   _nothing  
        


作者: hop    时间: 2006-11-30 15:14

这是刘和平那本书上的,那本书错误太多




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0