中级会员
- 积分
- 353
- 威望
- 255
- 贡献
- 32
- 兑换币
- 0
- 注册时间
- 2010-11-26
- 在线时间
- 33 小时
|
CCD采集程序如下
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
unsigned char pic[70][80];
unsigned int hang;
unsigned int changwan;
unsigned int point;
unsigned char *p;
void allinit(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x05;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=96MHz;
_asm(nop); //BUS CLOCK=48M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
////////////////////////////////////////////
ATD0CTL1=0x00;//8位精度
ATD0CTL2=0x40;//禁止外部触发,标志位快速清零,中断禁止
ATD0CTL3=0x88;//右对齐无符号.转换序列长度为1,No FIFO模式,Freeze模式下继续转换?
ATD0CTL4=0x00;//4AD采样周期,ATDClock=[BusClock*0.5]/[PRS+1] ;
ATD0CTL5=0x20;//特殊通道禁止,单通道采样,扫描模式连续采样,ch AN0
ATD0DIEN=0x00;//禁止数字输入
/////////////////////////////////////////
TIOS=0x0B; //PT0-3 通道设置为输出比较,PT4-7 通道设置为输入捕捉
TIE=0; //初始时屏蔽所有通道的中断
TSCR2=0x04; //溢出中断禁止,计时器频率由总线频率16分频得到==3.125MHz
TCTL3=0x40; //检测上升沿 7通道
TSCR1=0x80; //启动ECT模块及计数器
IRQCR=0; //关闭行同步中断(IRQ
///////////////////////////////////////////
SCI0CR1 = 0X00;
SCI0CR2 = 0X0c;
SCI0BDH = 0x01; //busclk 8MHz,19200bps,SCI0BDL=0x1a
SCI0BDL = 0x38; //SCI0BDL=busclk/(16*目标波特率)
/////////////////////////////////////////
DDRM = 0x00; //场中断打开
}
//发送一个字
void scisend1(unsigned char i)
{
for(;;)
if((SCI0SR1 & 0X80) != 0) //发送数据寄存器空
{
SCI0DRL=i;
break;
}
}
//main函数
void main(void)
{
allinit();
hang=0; //一场中行计数清零
changwan=0; //清除场采集结束标志
//场中断开()?
for(;;)
{
hang=0; //一场中行计数清零
changwan=0; //清除场采集结束标志
while((PTM&0x01)!=0); //等待场同步信号到来 ?
DDRM = 0XFF; //关闭场中断()?
TC0=TCNT+0x0c48; //等待场消隐结束定时 ?
TFLG1=0xFF; //清楚计数完成标志 ?
TIE=0x01; //开启TC0 中断(interrupt 8)
while(changwan==0);
DisableInterrupts;
//下面处理或发送 ,最后开启场中断。
// 图像到底怎么存储
// 最后要不要把手地址复原 ,场中断要zenyan判断?
p=p-5600; //图像首地址前一个地址
if(p<p+5600)
scisend1(*(p++));
DDRM =0X00; //开启场中断
}
}
////////////////////////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
// Vector 8 Interrupt:Timer0
interrupt 8 void timer0(void)
{
scisend1(4);
TIE=0; //关闭定时器局部中断
IRQCR=0x40; //开启行同步中断(interrupt 6)
}
// Vector Interrupt:start get a line
interrupt 6 void line_start(void)
{
IRQCR=0; //关闭行中断
if(hang==70)
{
changwan=1; //场结束标志位
}
else
{
point=0; //一行中点计数清零
TC1=TCNT+0x001D; //等待行消隐结束定时 ?
TFLG1=0xFF; //清除计数完成标志
TIE=0x02; //开启TC1 局部中断(interrupt 9)
}
}
// Vector 9 Interrupt:Timer1
interrupt 9 void timer1(void)
{
TIE=0; //关闭定时器局部中断
p=&(pic[hang][0]);
while(point!=80)
{
while(!ATD0STAT0_SCF); // ?
*p=ATD0DR0L;
p++;
point++;
}
hang++;
TC1=TCNT+0x001D; // ?
TFLG1=0xFF; //清除计时完成标志
TIE=0x04; //开启TC2局部中断(interrupt 10)
}
// Vector 10 Interrupt:Timer2
interrupt 10 void timer2(void)
{
TIE=0; //关闭定时器局部中断
IRQCR=0x40; //开启行同步中断(interrupt 6)
}
#pragma CODE_SEG DEFAULT
///系统是如何到达你指定的中断的呢?
程序有点问题 好像进入不了子程序。哪位高手给看看 。帮改改 |
|