|
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uchar unsigned char
#define uint unsigned int
#define lie_max 90 //一行里最多采集90个点
#define row_max 60 //一场里最多采集60行
uint lie_count=0;//计算点数
uchar hang_h=0; //一维数组下标号
uint hang=0; //计算特定行数
uchar image_data[row_max][lie_max];//存储灰度值
uint get_n[60]=
{ 16,29,41,52,62,71,79,86,92,98,
103,108,112,116,120,124,128,132,135,138,
141,144,147,150,153,156,159,162,165,168,
170,172,174,176,178,180,182,184,186,188,
190,192,194,196,198,200,202,204,206,208,
210,211,212,242,243,245,246,247,248,249,
}; //各行采集
/***************************************************
** 函数名称: 延时函数
** 功能描述:
** 说明:
****************************************************/
void delay(int i)
{
int j;
for(;i>0;i--)
for(j=0;j<3200;j++);
}
/***************************************************
** 函数名称: 总线时钟PLL设置40MHz
** 功能描述:总线频率40MHZ 晶振频率为16MHz
** 说明:
****************************************************/
void PLL_Init_40M(void)
{
CLKSEL=0X00; //关闭锁相环
PLLCTL_PLLON=1; //锁相环电路允许
SYNR =0xc0|0x04; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
// SYNR =0xc0|0x05; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=96MHz;
REFDV=0x80|0x01;
_asm(nop); //BUS CLOCK=40M 延时等待稳定
POSTDIV=0x00; //fPLL= fVCO/(2xPOSTDIV)
_asm(nop); //fBUS=fPLL/2=40M
_asm(nop);
while(!(CRGFLG_LOCK==1))//时钟频率已经稳定,锁相环频率锁定
{
;
}
CLKSEL_PLLSEL =1; //使能锁相环时钟
}
/***************************************************
** 函数名称: IO_Init
** 功能描述: IO口初始化函数
** 说明:
****************************************************/
void IO_Init(void)
{
DDRA=0x00; //8个光电开关检测口均为输入
// DDRB=0xf0;//
}
/***************************************************
** 函数名称:Motor_Init
** 功能描述:电机PWM初始化
** 说明:01级联频率10K
****************************************************/
void Motor_Init(void)
{
PWME_PWME1 = 0; //先禁止1通道输出
// PWME_PWME5 = 0; //先禁止5通道输出
PWMCTL_CON01 = 1; //01两两级联成16位PWM
// PWMCTL_CON45 = 1; //45两两级联成16位PWM
PWMPRCLK_PCKA = 0; //预分频系数为1,总线频率40
PWMSCLA = 2; //SA_CLK = A_CLK / (2*2) == 10MHz
PWMCLK_PCLK1 = 1; //1通道选择clock SA 做时钟源
/// PWMCLK_PCLK5 = 1; //0通道选择clock SA 做时钟源
PWMCNT01=0; //01计数器清零
// PWMCNT45=0; //45计数器清零
PWMCAE_CAE1=0; //选择输出模式为左对齐输出模式
// PWMCAE_CAE5=0; //选择输出模式为左对齐输出模式
PWMPOL_PPOL1=1; //先输出高电平,计数到DTY时,反转电平
// PWMPOL_PPOL5=1;
PWMPER01=1000; // 0.1ms ;10KHz
// PWMPER45=1000; // 0.1ms ;10KHz
PWME_PWME1 = 1; //各通道打开
// PWME_PWME5 = 1;
}
/***************************************************
** 函数名称:Steer_Init
** 功能描述:舵机PWM初始化
** 说明:23级联
****************************************************/
void Steer_Init(void)
{
PWME_PWME3 = 0; //先禁止各通道输出
PWMCTL_CON23 =1; //两两级联成16位PWM
PWMPRCLK_PCKB = 2; //预分频系数为B 4,总线频率,即10MHZ
PWMSCLB = 2; //SB_CLK = B_CLK / (2*2) ==2.5MHz
PWMCLK_PCLK3 = 1; //通道选 clock SB做时钟源
PWMCNT23=0; //23计数器清零
PWMCAE_CAE3=0; //选择输出模式为左对齐输出模式
PWMPOL_PPOL3=1; //先输出高电平,计数到DTY时,反转电平
PWMPER23=50000; // 20ms ;50Hz
PWMDTY23=0;
PWME_PWME3 = 1;
}
/***************************************************
** 函数名称IT0_Init
** 功能描述:定时器
** 说明: 1ms
****************************************************/
void PIT0_init(void)
{
PITCFLMT=0x00; //关闭PIT模块
PITCE_PCE0=1; // PIT0通道时能
PITMUX=0x00; //采用微时间基准0
PITMTLD0=5;
PITLD0=10665; //设置16位递减计数器载入初值 Time_out_period=(PITMTLD+1)x(PITLD+1)/fbus
PITINTE_PINTE0=1; //PIT0通道中断使能
PITCFLMT_PITE=1 ; //pit模块使能
}
/**************************************************
** 函数名称:TIM_Init
** 功能描述:行场中断初始化函数
** 说明: 1ms
**************************************************/
void TIM_Init(void)
{
TIOS=0x00; //外部输入捕捉 1,2 通道
TCTL4=0x24; //通道1上升沿触发,通道 2 下降沿触发
TSCR1=0x80; //使能
TIE=0x06; //通道 1,2 中断使能
TFLG1=0xFF; //清中断标志位
}
/***************************************************
** 函数名称:SCI_Init
** 功能描述:SCI初始化
** 说明:
****************************************************/
void SCI0_Init()
{
SCI0BD=217;//总线频率40M?SCI0BD=fbus/16/11520
SCI0CR1=0x00;//LOOPS=0,SCISWAI=0,RSRC=0,M=0
SCI0CR2=0x2c;//TIE=0,TCIE=0,RIE=0,ILIE=0
}
/***************************************************
** 函数名称:SCI_Init
** 功能描述:SCI初始化
** 说明:
****************************************************/
void sci_send(uchar send_data)
{
while (!SCI0SR1_TC); //正在发送数据
while (!SCI0SR1_TDRE); //等待发送数据寄存器为空
SCI0DRH=0;
SCI0DRL=send_data;
}
void main(void)
{
PLL_Init_40M();
IO_Init();
Motor_Init();
Steer_Init();
SCI0_Init();
PORTA=0x00;
EnableInterrupts;
TIM_Init();
PIT0_init();
for(;;)
{
}
}
/***************************************************
** 函数名称:行中断
** 功能描述:
** 说明:
****************************************************/
#pragma CODE_SEG NON_BANKED
interrupt 10 void HREF_Count(void)
{
TFLG1_C2F = 1; //清10中断
if(hang==get_n[hang_h])
{
delay(5);
for(lie_count=0;lie_count<lie_max;lie_count++)
{
image_data[row_max][lie_max]=PORTA;
}
hang_h++;
}
hang++;
}
/***************************************************
** 函数名称:场中断
** 功能描述:
** 说明:
****************************************************/
//#pragma CODE_SEG NON_BANKED
interrupt 9 void VSYN_Interrupt(void)
{
TFLG1_C1F = 1; //清9中断
hang_h=0;
lie_count=0;
hang=0;
}
#pragma CODE_SEG DEFAULT
郁闷啊!!!求大神解答,在此先谢谢啦!!!
|
|