金牌会员
- 积分
- 2467
- 威望
- 1101
- 贡献
- 692
- 兑换币
- 711
- 注册时间
- 2014-4-22
- 在线时间
- 337 小时
- 毕业学校
- dabuliedian大学
|
找的一个程序,有两个函数不理解,shijain() 周期性中断大概是9.375ms,这个数字代表什么?10ms采集一场?还有
TIM_init()与摄像头的采集有关系吗?谢谢
#include <hidef.h>
#include <MC9S12XS128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
int ii,jj;
unsigned int t,t1;
unsigned char sdata;
//------------------------------------------------
#define lie_end 100
#define hang_end 91
#define lie 52
unsigned char ab[lie+1];
#define delay(num) \
{ \
unsigned int i,j; \
for(i=0;i<num;i++) \
for(j=0;j<58;j++); \
}
unsigned char c_lie=0,g_lie=0;
unsigned int lie_count=0,hang_count=0,am;
unsigned char ta[lie][hang_end];
unsigned int get_n[]={ 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,250};
unsigned char ts1,ts2, ge,shi;
void SciTx(unsigned char text);
void chuankou(){
delay(1700);
ge=37%10;
shi=37/10;
//sdata=shi*16+ge;
//SciTx(sdata);
for(ii=1;ii<40;ii++){///第一次的调试的时候把40修改为2,校对调试助手的屏幕大小,当出现的数据刚刚一行时,说明串口调试助手的屏幕大小适合。
//当完成上面的操作后,把2修改为40,这时候就能够看到一幅图像的数据了。
for(jj=1;jj<90;jj++){
ts1=0;ts2=0;
if(ta[ii][jj]==1&&ta[ii][jj+1]==1) ts1=16;//&&ta[ii][jj]>20
jj++;
if(ta[ii][jj]==1&&ta[ii][jj+1]==1) ts2=1;//&&ta[ii][jj]>20
sdata=ts1+ts2;
SciTx(sdata);
}
} for(;;) {}
}
void SciInit()
{
DDRM=0x01;
SCI0BDH=0x00|0x01;
SCI0BDL =0xA0;
SCI0CR2=0X2C;
SCI0CR1=0;
}
/*-------发射端程序----------------------*/
void SciTx(unsigned char text)
{
while (!(SCI0SR1&0x80));
SCI0DRH=0;
SCI0DRL=text;
}
void chaopin(void)
{
CLKSEL=0X00; // fbus == 64M
PLLCTL_PLLON=1;
SYNR =0xc0 | 0x07;
REFDV=0xc0 | 0x01;
POSTDIV=0x00;
_asm(nop);
_asm(nop);
_asm(nop);
_asm(nop);
while(!(CRGFLG_LOCK==1));
CLKSEL_PLLSEL =1;
}
void TIM_init(void)
{
PACTL=0X50; // 脉冲累加器+门控时间累加器
PACNT=0X0000;
TIOS =0x00;// 相应通道做输入捕捉。
TSCR1=0x80; // start the timer
TCTL4=0x18; // 跳变沿触发。
TIE=0x06; //allow the interrupt flag
TFLG1=0xFF; // 清零相应标志位
}
void shijian(void) {
PITCFLMT_PITE=0;// 禁用
PITCE_PCE0=1; // 使能pit定时器0的通道
PITLD0=9999; // 9999
PITMTLD0=5; // 微定时器装载初值
PITMUX=0X00; // 微定时基准0计数
PITINTE_PINTE0=1; //允许相应的pit通道中断请求。
PITCFLMT_PITE=1; // 使能pit模块。
}
void atd_init(void)
{
ATD0CTL1=0x00;
ATD0CTL2=0X40; //禁止中断 转换后自动清除寄存器
ATD0CTL3=0X88; //没有断点 没有FIFO 通道0开始 单通道 继续转换右对齐 转换序列1
ATD0CTL4=0X00; //4周期,64/2,最快
ATD0CTL5=0X24; // 连续转换 单通道转换 通道AN4开始
ATD0DIEN=0x00; //相应的数字信号输入禁止
}
//===========================================================================================
void main(void)
{
DDRA=0X00;
DDRJ=0X02;
DDRK=0X30;
DisableInterrupts;
{
DDRB=0X01;
DDRM=0X00;
DDRJ=0XBF;
PTJ_PTJ6=1;
DDRS=0XEE;
PPSS=0X11;
PPSJ=0XFF;
}
chaopin();
TIM_init();
shijian();
atd_init();
SciInit();
EnableInterrupts;
{
unsigned int e,w;
for(e=1;e<6;e++)
for(w=0;w<10;w++);
}
DDRS=0XFF;
PPSS=0X11;
PPSJ=0XFF;
DDRB=0XFF;
DDRJ=0XfF;
// DDRA=0X00;
for(;;)
{
chuankou();
/*这个函数一定要开启,串口调试方法
首先链接好线:通过USB转串口或者是MAX232,把芯片的S0与TXD接通,S1与RXD接通,共地线。
接着把接通芯片的电源,和摄像头的电源,同时保证摄像头和芯片的线连接正确,并保证摄像头看到完整的赛道。
把本程序拷入芯片里。打开串口调试助手,校对对应的串口端口,并选择十六进制显示。接下来的操作看上面的注释。
*/
}
}
//---------------------------------
#pragma CODE_SEG NON_BANKED
void interrupt 10 IC2ISR(void) {
TFLG1_C2F=1;
if(lie_count==get_n[c_lie]) {
delay(1);
for(hang_count=0;hang_count<=hang_end;hang_count++)
{
// while(!ATD0STAT2L_CCF4);
ta[c_lie][hang_count]=PORTA_PA0;//ATD0DR0LORTA_PA4
}
c_lie++;
}
lie_count++;
}
void interrupt 9 IC1ISR(void){
TFLG1_C1F=1;
hang_count=0;
lie_count=0;
c_lie=0;
}
void interrupt 66 PIT0Interrupt(void)
{
//chesudu=PACNT;
PITTF_PTF0=1;
PACNT=0X0000;
}
#pragma CODE_SEG DEFAULT
//接脚是行同步接pt2 场同步接pt1
|
|