高级会员
- 积分
- 738
- 威望
- 406
- 贡献
- 194
- 兑换币
- 249
- 注册时间
- 2013-2-2
- 在线时间
- 69 小时
|
买的龙丘的CCD,然后用他们的测试程序和开发板做测试,采集到的数据变化幅度几乎为零。检测不到黑线。救命啊
程序如下,救命。。。
/********************************************
龙丘MC9S12XS多功能开发板--大家玩版本
Designed by Chiu Sir
E-mail:chiusir@yahoo.cn
软件版本:V1.1
最后更新:2012年10月31日
相关信息参考下列地址:
网站: http://www.lqist.cn
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 5.1
Target : MC9S12XS128
Crystal: 16.000Mhz
busclock:32.000MHz
pllclock:64.000MHz
============================================
TSL1401接线定义:
------------------------------------
单片机管脚 模块/芯片管脚
PORTB_PB0 CLK
PORTB_PB1 SI
PTAD_AD0 AO
============================================
LCD接线定义:
------------------------------------
单片机管脚 定义名称 LCD管脚
PORTA_PA4 LCD_SDA DB7
PORTA_PA3 LCD_SCL DB6
PORTA_PA2 LCD_CD A0
PORTA_PA1 LCD_RST RST
PORTA_PA0 LCD_CS CS
============================================
TSL1401线性CCD测试步骤:
1.下载程序到开发板
2.插上液晶屏
3.接好TSL1401模块接线
4.复位即可看到屏幕显示
5.手动挡住镜头或者放摄像头到黑白线前,就可以看
到液晶上黑色线条的宽度。
*********************************************/
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#include "LQ12864.h"
#include "LQprintp.h"
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
extern const byte longqiu96x64[768];
byte ADV[128]={0,0}; //声明数组,用于存放采集的线性数值
word LCDD[128]={0,0}; //转换为LCD显示的数值
#define TSL_SI PORTB_PB1 //定义线性传感器的端口 SI
#define TSL_CLK PORTB_PB0 //定义线性传感器的端口 CLK
//#define USEUART //如果用户有大家玩开发板不选择这个宏定义,
//不用串口输出,否则液晶刷新太慢了
//短暂的延时
void Dly_us(void)
{
int ii;
for(ii=0;ii<20;ii++); //32M
//for(ii=0;ii<100;ii++); //64M
}
//较长延时
void Dly_ms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<2670;jj++); //busclk:32MHz--1ms
//for(jj=0;jj<5340;jj++); //busclk:64MHz--1ms
}
void SetBusCLK_32M(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR =0x40 | 0x03; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
_asm(nop); // BUS CLOCK=32M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void SetBusCLK_64M(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x07;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=128MHz;
_asm(nop); //BUS CLOCK=64M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
//-----------------------------------------------------
void AD_Init(void)
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //禁止外部触发, 中断禁止
ATD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
ATD0DIEN=0x00; //禁止数字输入
}
void RD_TSL(void)
{
byte i=0,tslp=0;
TSL_CLK=1;//起始电平高
TSL_SI=0; //起始电平低
Dly_us(); //合理的延时
TSL_SI=1; //上升沿
TSL_CLK=0;//下降沿
Dly_us(); //合理延时
TSL_CLK=1;//上升沿
TSL_SI=0; //下降沿
Dly_us(); //合理延时
for(i=0;i<128;i++)
{
TSL_CLK=0;//下降沿
Dly_us(); //合理延时
while(!ATD0STAT0_SCF);//等待转换结束
ADV[tslp]=ATD0DR0L; //AD采集
++tslp;
TSL_CLK=1;//上升沿
Dly_us(); //合理延时
}
}
//单行显示
void SHOW_TSL8(void)
{
byte i=0,maxv=0,minv=0xff;
word evv=0,tslp=0;
char txt[16]="";
for(i=0;i<128;i++)
{
evv+=ADV;
}
evv=evv/128;
#ifdef USEUART
printp("\n\n128 CCD data:");
#endif
for(i=0;i<128;i++)
{
#ifdef USEUART
if(!(i%16)) printp("\n"); //每16个数据显示一行
printp("%02x ",ADV);
Dly_ms(1);
#endif
if(minv>ADV) minv=ADV;
if(maxv<ADV) maxv=ADV;
}
#ifdef USEUART
printp("\nMax:0x%02x\n",maxv);
#endif
sprintf(txt,"Max:%03d",maxv);
LCD_P6x8Str(31,4,txt);
#ifdef USEUART
printp("Evv:0x%02x\n",evv);
#endif
sprintf(txt,"Evv:%03d",evv);
LCD_P6x8Str(31,5,txt);
#ifdef USEUART
printp("Min:0x%02x\n",minv);
#endif
sprintf(txt,"Min:%03d",minv);
LCD_P6x8Str(31,6,txt);
LCD_Set_Pos(0,7);
for(i=0;i<128;i++)
{
if(ADV< evv-5) tslp=0xfe;
else tslp=0x80;
LCD_WrDat(tslp);
}
}
void main(void)
{
/* put your own code here */
byte i=0;
SetBusCLK_32M(); //总线初始化
uart_init(); //串口初始化 19200,8,n,1
//SetBusCLK_64M(); //总线初始化
DisableInterrupts;//关闭中断
AD_Init(); //AD初始化
DDRA = 0xff; //IO口初始化
PORTA= 0x00; //IO口初始化
DDRB = 0xff; //IO口初始化
PORTB= 0xff; //IO口初始化
LCD_Init(); //LCD初始化
Draw_LQLogo(); //显示LOGO
LCD_P6x8Str(16,7,"chiusir@yahoo.cn"); //显示字符串
Dly_ms(500); //延时
LCD_CLS(); //清屏
LCD_Print(36,0,"龙丘科技"); //显示汉字
LCD_Print(31,2,"智能车CCD"); //显示混合字符串
Dly_ms(1000);
for(;;)
{
RD_TSL(); //读取线性传感器的数值
SHOW_TSL8(); //液晶显示读取的数值
//Dly_ms(10); //根据需要延时
if(!(++i%10)) PORTB_PB7=~ PORTB_PB7; //每循环10次,LED反转一次
}
/* please make sure that you never leave this function */
}
// ---------------------- |
|