查看: 1006|回复: 0
打印 上一主题 下一主题

Mega128+(OV7670+FIFO+3.0TFT)+代码

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-30 17:20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,端午节废寝忘食奋斗三天出结果——(OV7670+FIFO+3.0TFT)+代码、思想详细注释——有图有真相!
一直都是从神坛拿东西,这回共享一回,有详细注释。
摄像头模块是guanfu_wang那儿买的,效果很牛X!
以下是主函数中说明:
/***********************************************************
XXXX:Designed by LuoFaJiang —— 刺客        
                如有雷同,当没看见!
说明:该程序中SCCB部分及摄像头初始化部分照抄guanfu_wang的,表示感谢哈
在这儿给他打个小广告哈:http://shop37116146.taobao.com/
其余FIFO部分为参照guanfu_wang的程序及datasheet自己写的,第一次看着
英文资料弄,比较头痛。

感觉思想不错,给大家分享下,希望对初学者有帮助!
————————————————————————————————————
————————————————————————————————————
主要思想为:
    始终保持FIFO片选和读(WEN)有效(这个和guanfu_wang的例程应该是
不一样),在进入循环前,首先FIFO_WRST_L();为FIFO第一次复位做准备,然后
等待帧中断(VSYNC),在中断中,首先判断前一帧是否写完,如果没写完,
就不要这一帧的数据,退出中断继续写上一帧,如果写完,就复位写FIFO,
开始写入数据,然后(其实和FIFO几乎同步,但是写TFT比写F IFO慢
得多,故不用担心数据出错,同时能保证高效和数据准确)复位读FIFO,开
始写TFT,如此循环。
    总的说来,程序流程设计效率还是比较高(具体多少帧/S没算过,大概可
以达到诺基亚7100S手机摄像头2/5的速度,大概在5~8帧/S),还说过得去吧,呵呵
我已经很满足了...
—————————————————————————————————————
—————————————————————————————————————

编程环境:
          AVR Studio4.17 + WINAVR2010
硬件环境:
          Mega128 @ 16M  使用Mega128在3.3V下小小超到16M,比较稳定)
          TFT为WQVGA3.0寸240*400屏,安富莱的,驱动为SPFD5420A

注:程序中delay.h为修改过的延时函数,针对8M晶振,包含的东西比较繁杂,
    ,所以就不加进来了,大家可以自己写一个代替,但是建议大家用库的延时
        函数,否则一优化就被和谐了!!!

其中刷屏速度没测过,或许还能高一点,哪位师兄搞出更优化的说一声哈!!!

再有,下面图片是在傍晚用手机照的,手机130W的像素,大家将就看了,另外,接线
是自己飞线,没画原理图,接线在程序定义里面都有,你懂的!
先贴主函数代码:(全部程序在下面链接)
int main(void)
{
   PIN_Init();          //TFT引脚初始化
   T_SPI_Init();        //SPI初始化
   TFT_Init();          //TFT初始化
   Pant(0x0000);            //TFT清屏

   Sensor_Init();       //传感器初始化
   M128_INT01_Init();   //外部中断0,1初始化

   FIFO_OE_L();         //FIFO片选使能
   FIFO_WEN_H();        //FIFO写使能
   FIFO_WRST_L();       //为FIFO第一次复位做准备
   
   asm("sei");          //开全局中断
   PORTA=0xff;
   DDRA=0xff;           //A端口输出,用于下面设置TFT窗口参数           
   Address_set(0,0,239,319);//设置TFT窗口参数为240*320
   PORTA=0xff;
   DDRA=0x00;           //A端口上拉输入,以免影响摄像头和TFT数据传输
//*********************************
//*********************************
   while(1)
   {
       if(!Frame_Writed)       //查询该帧图像是否没有写过
        {                      //写过,就不再写,等待下一帧
           Frame_Write_State=1;//正在写TFT
           Write_Picture();    //写TFT
               Frame_Write_State=0;//写完TFT
               Frame_Writed=1;     //该帧图像被写过  
          }  
        while(Frame_Writed){}  //等待下一帧图像来临
   }
//*********************************
//*********************************

   return 0;
}
点击此处下载 ourdev_646037ZRMHTO.rar(文件大小:189K) (原文件名OV7670+FIFO+3.0TFT)+代码、思想详细注释.rar)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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