跨届大侠
- 积分
- 9159
- 威望
- 258
- 贡献
- 8837
- 兑换币
- 0
- 注册时间
- 2009-5-23
- 在线时间
- 32 小时
|
1贡献
改的实在头晕了,或者我思维受困了,请帮忙看看哪里出来问题。
注:外部中断E1接行同步,J口中断接场同步,PORTA口0位接奇偶场,AD转化1口接视频信号。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */#define VERTICAL 30 // 垂直分辨率
#define HORIZONTAL 16 //水平分辨率
int line_now,catch_line; // 现在行数及捕捉后存放的行数
int n,m; //普通循环变量
unsigned int r,l; //场行循环变量
int field_ready=0; //场开始标志
unsigned char ccd[VERTICAL][HORIZONTAL]; // 像素存储数组
char txtbuf[16]=""; //串行通讯时用字符缓存
const unsigned int Line_catch[30]={26,30,34,38,43,
48,53,59,65,71,
78,85,92,110,118,
126,135,144,153,163,
173,183,194,205,216,
228,238,250,262,273
}; //要采集行的行号
//****************************************************** 毫秒级延时
void delayms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<3338;jj++); //40MHz--1ms
}//****************************************************** 串行通信初始化
static void SCI_Init(void)
{
SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1a
SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)
//busclk 16MHz, 9600bps,SCI0BDL=0x68
} //****************************************************** AD初始化 1void AD_Init1(void)
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //禁止外部触发, 中断禁止
ATD0CTL3=0x88; //10001000 转换长度为一
ATD0CTL4=0x01; // fATDCLK=fBUS/[2 × (PRS + 1)]
ATD0CTL5=0x20; //0单通道连续转换
ATD0DIEN=0x00; //缓冲区禁止~~;
} //****************************************************** PLL设置
void init_PLL()
{
REFDV=1;
SYNR=1;
while(0==CRGFLG_LOCK);
CLKSEL=0x80; //32Mhz
}
//****************************************************** 初始化B口灯和A口输入 void INIT_PORT(void)
{
DDRB=0XFF;
PORTB=0X00;
DDRA=0X00;
}
//****************************************************** 主函数
void main(void)
{
DisableInterrupts;
init_PLL() ;
SCI_Init();
IRQCR_IRQEN =1; //中断使能
IRQCR_IRQE=1; //下降沿触发
AD_Init1() ;
DDRJ=0X00;
PPSJ=0X00; //J口作为中断初始化
PIEJ=0X80;
PIFJ=0XFF;
//PUCR_PUPAE=1;
INIT_PORT();
//putstr("\ntest.");
EnableInterrupts; for(;;) { } ;
}
//******************************************************
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//******************************************************
void interrupt 6 IRQ_interrupt(void) //外部中断作为行同步处理函数
{
if(PORTA_PA0&&field_ready){
if(line_now==Line_catch[r]){
for(l=0;l<HORIZONTAL;l++){
while(!ATD0STAT0_SCF);
ccd[catch_line][l]=ATD0DR0L;
}
catch_line++; r++; l=0;
}
line_now++;
}
}
//******************************************************
void interrupt 24 Field_PJ(void) //PJ口作为场同步中断处理函数
{
DisableInterrupts;
field_ready=1; //关中断
if(PORTA_PA0==0){
IRQCR_IRQEN =0; //停止行输入
for(m=0;m<VERTICAL;m++){
for(n=0;n<HORIZONTAL;n++){
while(!(SCI0SR1&0x80)) ;
SCI0DRL=ccd[m][n];
} while(!(SCI0SR1&0x80)) ; SCI0DRL=0;
} while(!(SCI0SR1&0x80)) ; SCI0DRL=0; while(!(SCI0SR1&0x80)) ; SCI0DRL=0;
}
PORTB++;
line_now=0 ;
PIEJ=0XFF;
IRQCR_IRQEN =1; //中断使能
EnableInterrupts; //开中断
} |
|