#include"2407.h"
int ADRESULT[16];
volatile unsigned int *j; //定义一个指针变量J;
int i=0x00,cesi;
// 屏蔽中断子程序
void inline disable()
{
asm(" setc INTM ");
}
//开总中断子程序
void inline enable()
{
asm(" clrc INTM ");
}
void initial()
{
asm(" setc SXM "); //抑制符号位扩展
asm(" clrc OVM "); //累加器中结果正常溢出
asm(" clrc CNF "); //B0被配置为数据存储空间
*SCSR1=0X81FE; //CLKIN=6M,CLKOUT=4*CLKIN=24M
*WDCR=0X0E8; //不使能看门狗,因为SCSR2中的WDOVERRIDE *IMR=0X0000; //禁止所有中断
*IFR=0X0FFFF; //清楚全部中断标志,"写1清0"
}
void ADINIT()
{
*T4CNT=0x0000; //T4计数器清0
*T4CON=0x170c; //T4为连续增计数模式。128分频,且选用内部时钟源
*T4PER=0X75; //设置T4的周期寄存器
*GPTCONB=0X400; //T4周期中断标志触发AD中断
*EVBIFRB=0X0FFFF; //清楚EVB中断标志,"写1清0"
*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;
}
//启动AD转换子程序(通过启动定时器4的方式间接启动)
void ADSOC()
{
*T4CON=*T4CON|0X40;
}
//若是其他中断则直接返还子程序
void interrupt nothing()
{
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; //复位SQE1,且清楚INT FLAG SQE1标志"写1清0"
enable(); //开总中断,因为一进入中断总中断就自动关闭了
}
void main()
{
disable();
initial();
ADINIT();
enable();
ADSOC(); //启动AD转换
while(1)
{
if(i==0x10) break; //如果已发生中断,则停止等待(发生中断后,i=0x10)
}
*T4CON=*T4CON&0xFFBF; //停止定时器,即间接停止A/D转换
while(1)
{
;
}
}
|