出现错误的程序
.title \"vectors.asm\"
.ref _c_int0,_nothing,_adint
.sect \".vectors\"
reset: b _c_int0 // 复位向量
int1: b _adint // A/D中断向量
int2: b _nothing
int3: b _nothing
int4: b _nothing
int5: b _nothing
int6: b _nothing
// 该程序用于进行A/D转换的演示,A/D转换的结果存于数足ADRESULT[16]中,
// 寄存器cesi用于测试每个A/D转换的结果
#include \"register.h\"
int ADRESULT[16];// 定义一个数组用于保存AD转换的结果
volatile unsigned int *j; // 定义一个指针变量j
int i=0X00,ces;
// 屏蔽中断子程序
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
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0001; // 允许INT1中断
*IFR=0x0FFFF; // 清除全部中断标志,\"写1清0\"
}
// AD初始化子程序
void ADINIT()
{
*T4CNT=0X0000; // T4计数器清0
*T4CON=0X170C; // T4为连续增计数模式,128分频,且选用内部时钟源
*T4PER=0X75; // 设置T4的周期寄存器
*GPTCONB=0X400; // T4周期中断标志触发AD转换
*EVBIFRB=0X0FFFF; // 清除EVB中断标志,写\"1\"清0
*ADCTRL1=0X00; // 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
// 转换时间预定标位CPS为0,AD为启动/停止模式,排
// 序器为级连工作方式,且禁止特殊的两种工作模式
*ADCTRL2=0X8404; // 可以用EVB的一个事件信号触发AD转换,
// 且用中断模式1
*MAXCONV=0X00; // 16通道
*CHSELSEQ1=0X00;
// 转换通道是0-15
}
// 启动AD转换子程序(通过启动定时器4的方式间接启动)
void ADSOC()
{
*T4CON=*T4CON|0X40; // 启动定时器4
}
// 若是其它中断则直接返回子程序
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位后存入规定的数组
ces=ADRESULT; // 检验每个A/D转换的结果
}
*ADCTRL2=*ADCTRL2|0X4200; // 复位SEQ1,且清除INT FLAG SEQ1标志写\"1\"清0
enable(); // 开总中断,因为一进入中断总中断就自动关闭了
}
main()
{
disable( ); // 禁止总中断
initial( ); // 系统初始化
ADINIT( ); // AD初始化子程序
enable( ); // 开总中断
ADSOC( ); // 启动AD转换
while(1)
{
if(i==0x10) break; // 如果已发生中断,则停止等待(发生中断后,i=0x10)
} // 等待中断发生
*T4CON=*T4CON&0X0FFBF; // 停止定时器4,即间接停止A/D转换
while(1)
{
;
} // 死循环,在实际的工程应用中在此可以利用A/D转换的结果用于一些运算
}