智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1878|回复: 5
打印 上一主题 下一主题

下面是红树伟业摄像头例程,新手有几个小问题希望希望前辈指点一

[复制链接]

2

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
QQ
威望
185
贡献
106
兑换币
111
注册时间
2014-10-2
在线时间
19 小时
跳转到指定楼层
1#
发表于 2014-10-28 17:32:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <hidef.h>         
#include "derivative.h"         
#include <mc9s12xs128.h>

#define ROW        40             //数字摄像头所采集的二维数组行数
#define COLUMN     120         //数字摄像头所采集的二维数组列数
#define ROW_START  10        //数字摄像头二维数组行开始行值
#define ROW_MAX    200       //数字摄像头所采集的二维数组行最大值
#define THRESHOLD  0x68     //图像阈值,根据所采集图像亮度值大小的实际情况调整
unsigned char Buffer[ROW][COLUMN]={0};      //所采集的图像二维数组
unsigned char Image_Center[ROW]={0};         //所采集的图像中心线
unsigned char SampleFlag=0;       //奇偶场标记
unsigned int  m=0;                      //换行变量
unsigned int  Line;                       //行中断计数变量
unsigned int  hang;

unsigned int  Get_Image[]={   
                         17,19,21,23,25,28,31,34,37,40,43,46,49,53,57,
                         61,65,69,73,77,81,85,89,94,99,105,111,117,123,
                         129,135,141,147,153,159,166,173,180,187
                          }; //定每场采哪几行
/*************************************************************/
/*                                    初始化PLL函数                                              */
/*************************************************************/
void PLL_Init(void) {
    CLKSEL=0X00;                                //disengage PLL to system
    PLLCTL_PLLON=1;                          //锁相环电路允许
    SYNR =0xc0 | 0x09;                       //1、这里为什么要用位或符|,直接用0xc9不行吗?
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;                             //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
                                                        //BUS CLOCK=80M
    _asm(nop);                                   //短暂延时,等待时钟频率稳定
    _asm(nop);                                  //2、这里如何计算出要用两个单周期延时的呢?:dizzy:
    while(!(CRGFLG_LOCK==1));         //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                      //engage PLL to system;

}  
/*************************************************************/
/*                                行场中断初始化函数                                          */
/*************************************************************/
void TIM_Init(void)
{
        TIOS=0x00;        //外部输入捕捉0,1通道
        TCTL4=0x09;     //通道0上升沿触发,通道1下降沿触发
                                //AB配置表:00禁止捕捉、10上升沿捕捉、01下降沿捕捉、11任何边沿(上升沿或下降沿)捕捉
        TSCR1=0x80;    //定时器使能
        TIE=0x03;        //通道0,1中断使能
        TFLG1=0xFF;    //清中断标志位
}
/*************************************************************/
/*                                         IO口初始化函数                                        */
/*************************************************************/
void IO_Init(void) {
         DDRB=0X00;             //端口B配置成输入
}
/*************************************************************/
/*                                            延时函数                                              */
/*************************************************************/
void delays(long m){
while(m--);
}
/*************************************************************/
/*                                         串口0初始化函数                                      */
/*************************************************************/
void SCI_Init() {
         SCI0BD=44;              //115200bps     Baud Rate=BusClock/(16*SCIBD)
         SCI0CR1=0;              //正常8 位模式,无奇偶校验
         SCI0CR2=0X2C;        //发送允许  接受中断允许
}
/*************************************************************/
/*                                         串口0发送函数                                         */
/*************************************************************/
void SCI_Write(unsigned char SendChar) {                           
      while (!(SCI0SR1&0x80));
      SCI0DRH=0;                        //3、在8位数据格式中,只需要访问SCI数据寄存器低字节,那为啥这儿要先将SCIDRH复位:dizzy:
      SCI0DRL=SendChar;
}
/*************************************************************/
/*                               向电脑串口发送所采集的图像                              */
/*************************************************************/
   void Process() {
   unsigned char i,j;
   for(i=0;i<ROW;i++) {
      for(j=0;j<COLUMN;j++)  {
          if(Buffer[j] == 0xFF)
            SCI_Write(0xFE) ;
          else
            SCI_Write(Buffer[j]) ;
            }
      }
   SCI_Write(0xFF);
}
/*************************************************************/
/*                                                主函数                                             */
/*************************************************************/
void main(void)
{
  
   PLL_Init();  //初始化锁相环
   TIM_Init();  //初始化中断
   IO_Init();   //初始化IO口
   SCI_Init();  //初始化串口
EnableInterrupts;   
   for(;;) {
        Process();           //向电脑串口发送所采集的图像        
        }   
}
/*************************************************************/
/*                                    行中断处理函数                                             */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED //4、这个宏定义为什么要写在main()函数下面,其作用是什么呢?:dizzy:
void interrupt 8 PT0_Interrupt(){                         //5、这里p0口的中断向量是8,然后interrupt 8就变成一个整体定义后面的函数名了吗?
   TFLG1_C0F=1;    //行中断标志位清除,以便于下次行中断进行
   Line++;             //行中断计数变量
   if ( SampleFlag == 0 || Line<ROW_START || Line>ROW_MAX ){
      return;           //不是要采集图像的有效行,返回
      }
  if( Line==Get_Image[hang]){  
    delays(8);//如果图像不在中间请修改这里
        Buffer[m][0]=PORTB;_asm();(中间略……)Buffer[m][120]=PORTB;
       hang++;               
       m++;
       }
}
/*************************************************************/
/*                                               场中断处理函数                                  */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 PT1_Interrupt() {
             TFLG1_C1F=1;                    //场中断清除,以便于下次的场中断的正常进行
             TFLG1_C0F=1;                    //行中断清除,以便于开始采集图像数据
             m=0;                                 //行中间变量清零,以便于开始从把采集的图像放到数组的第一行
             Line=0;                              //行中断临时变量清零
             hang=0;                             //行临时变量清除
             SampleFlag=~SampleFlag;   //场中断标记取反,这样只采集奇数场的图像
             }
为方便观看,非重要信息有删减,版面有重排,希望高手指点一下下,也方便后来人理解,不胜感激!

回复

使用道具 举报

14

主题

876

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5811
威望
3006
贡献
1961
兑换币
1991
注册时间
2013-2-28
在线时间
422 小时
2#
发表于 2014-10-28 19:39:07 | 只看该作者
1、只是习惯,方便修改,直接写也行
2、只是延时,两个指令周期,可以通过主频算出来,算不算无所谓,两个延时或三个延时都可以
3、不知道。。。但是我一般都这么写。。。你注释试试看?
4、自己百度
5、同4
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
QQ
威望
185
贡献
106
兑换币
111
注册时间
2014-10-2
在线时间
19 小时
3#
 楼主| 发表于 2014-10-28 20:17:56 | 只看该作者
高手就是高手,简单粗暴,真有个性,但同样感谢
回复 支持 反对

使用道具 举报

25

主题

213

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
威望
664
贡献
302
兑换币
403
注册时间
2013-10-8
在线时间
157 小时
4#
发表于 2014-11-4 23:10:42 | 只看该作者
同是摄像头XS128啊,求加好友,qq1447707156
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
QQ
威望
185
贡献
106
兑换币
111
注册时间
2014-10-2
在线时间
19 小时
5#
 楼主| 发表于 2014-11-5 17:16:41 | 只看该作者
zhifu 发表于 2014-11-4 23:10
同是摄像头XS128啊,求加好友,qq1447707156

已加,同时欢迎更多朋友留下QQ!
回复 支持 反对

使用道具 举报

1

主题

58

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1218
威望
630
贡献
378
兑换币
380
注册时间
2014-7-17
在线时间
105 小时
毕业学校
内蒙古民族大学
6#
发表于 2014-11-5 20:02:19 | 只看该作者
290676154
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 02:49 , Processed in 0.050720 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表