金牌会员
积分 1608
威望 436
贡献 1080
兑换币 30
注册时间 2012-3-3
在线时间 46 小时
15 贡献
硬件方面经过检查没有问题,应该是程序错了,我用的是内部AD(具体是AD1引脚,8位精度)现在能采集数据,就是数据不对,估计是初始化,或者端口哪边错了,求指导。。。。
#include <MC9S12XS128.h> #include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "CRP.h"
int column;
int row;
unsigned int str[columnnum][row_max];
void ATD0Init(void){ ATD0CTL1=0x01; //AD 转换控制器1 初始设定,具体功能查表(比如 采样前不放电) ATD0CTL2=0x00;
ATD0CTL3=0x80;
ATD0CTL4=0x80;
ATD0CTL5=0x21; //连续转 换,1通道转换, }
void PLL_Init(void) //初始化
{ //BUS-CLOCK=PLL-CLOCK/2=32M
REFDV = 31; // set the REFDV register 16M*2*(3+1)/(1+1)=64M
SYNR = 63; // set the SYNR register to give us a 64 MHz PLL-clock.
asm nop // nops required for PLL stability.
asm nop
asm nop
asm nop
while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.
CLKSEL|=0x80; // switch the bus clock to the PLL.}
void SCI_Init(void)
{
SCI0CR1=0x04; //允许快速检测
SCI0CR2=0x2C; //允许RDRF或者 OR置1 产生SCI中断请求,允许发送,接收
SCI0BDH=0x00; //波特率控制寄存器 SCI0BDL=0xd0;
}
void Init(void)
{
PLL_Init();
SCI_Init();
ATD0Init();
}
void main(void) //主函数
{
PPSH=0x00; //H口对应的下降沿信号将使PIFH寄存器相应位置1
PIEH=0x01; //H口引脚0中断使能
PIEJ=0x00; //J口中断关闭 原来是关闭0口的
Init();
EnableInterrupts;
for(;;);
}
extern int column;
extern int row;
extern unsigned int str[columnnum][row_max]; //定义一个36行,24列的数组
#pragma CODE_SEG NON_BANKED //中断入口
void interrupt 24 PJI(void)
{ //行中断
int i,j;
PIFJ=0x01; //PIFJ为J口中断标志位寄存器,为1清除标志位,为0无效
for(i=0; i<16; i++)
{
asm nop;
}
if (column%6==0&&column<276&&column>=60) //行循环
{
for(row=0; row<24 ;row++) //列循环
{
while (!ATD0STAT0_SCF); //SCF ---转换序列完成标志,0 表示转换序列没有完成,1 转换序列完成
str[(column-60)/6][row]=ATD0DR1;// AD转换结果寄存器
ATD0STAT0_SCF=1; //图像采集完成
}
}
column++;
if(column>=275)
{
PIEJ=0x00;
for(i=0; i<36; i++)
{
for(j=0; j<24 ;j++)
{
while(!(SCI0SR1&0x40));
SCI0DRL= (unsigned char)str[j];
}
}
PIEH=0x01; //H口中断使能寄存器,为0关中断
}
}
void interrupt 25 PHI(void) //场中断入口
{
PIFH=0x01; //H口标志位清除
EnableInterrupts;
PIEJ=0x01; //允许行中断
PPSJ=0x00; //J口极性选择寄存器某一位为零时j口对应引脚
//下降沿将使PIFJ寄存器相应位置1
column=0;
}
我来回答