Test Code for OV7670 Camera module with FIFO AL422
Dependencies: MODSERIAL mbed ov7670
You can find more information in this page: https://mbed.org/users/edodm85/notebook/ov7670-camera-module/
Revision 0:19429e334b75, committed 2013-03-10
- Comitter:
- edodm85
- Date:
- Sun Mar 10 13:03:52 2013 +0000
- Child:
- 1:922cfb5e36ba
- Commit message:
- First Version
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AjK/code/MODSERIAL/#ae0408ebdd68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,155 @@ +/* + * Author: Edoardo De Marchi + * Date: 10/03/13 + * Notes: OV7670 + FIFO AL422B camera test +*/ + +#include "main.h" + +#define QQVGA 4 //320*240 +#define QVGA 2 //160*120 + + +void rxCallback(MODSERIAL_IRQ_INFO *q) +{ + new_send = true; +} + +int main() +{ + pc.baud(921600); + pc.printf("SystemCoreClock: %dMHz\r\n", SystemCoreClock/1000000); // print the clock frequency + led4 = 0; + + t.start(); + pc.attach(&rxCallback, MODSERIAL::RxIrq); + + while(1) + { + if(new_send){ + int i = 0; + + while(pc.readable()) + { + word[i] = pc.getc(); + i++; + } + parse_cmd(); + } + wait_ms(50); + } +} + + + +void parse_cmd(){ + new_send = false; + + if(strcmp("snap_yuv", word) == 0) + { + CameraSnap('y'); + memset(word, 0, sizeof(word)); + }else + if(strcmp("snap_rgb", word) == 0) + { + CameraSnap('r'); + memset(word, 0, sizeof(word)); + + }else + if(strcmp("init_yuv", word) == 0) + { + // Reset camera on power up + camera.Reset(); + // Set up for 160*120 pixels YUV (Only Y) + pc.printf("Initializing ov7670 - Format YUV & QQVGA Mode\r\n"); + if(camera.Init('y') != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_rgb", word) == 0) + { + // Reset camera on power up + camera.Reset(); + // Set up for 160*120 pixels RGB565 + pc.printf("Initializing ov7670 - Format RGB & QQVGA Mode\r\n"); + if(camera.Init('r') != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("reset", word) == 0) + { + mbed_reset(); + }else + if(strcmp("time", word) == 0) + { + pc.printf("Time Acq from camera: %dms - Time Send to pc: %dms - Time Tot: %dms\r\n", t2-t1, t3-t2, t3-t1); + memset(word, 0, sizeof(word)); + } + memset(word, 0, sizeof(word)); + +} + + + +void CameraSnap(char c){ + led4 = 1; + int var2 = 0; + int var = 0; + t1 = t.read_ms(); + + // wait until the image has been captured + camera.CaptureNext(); + while(camera.CaptureDone() == false); + + // Start reading in the image data from the camera hardware buffer + camera.ReadStart(); + + // Read the first half of the image + for (int q = 0; q < SIZE; q++) + { + bank0[q] = camera.ReadOnebyte(); + } + // Read the Second half of the image + for (int q = 0; q < SIZE; q++) + { + bank1[q] = camera.ReadOnebyte(); + } + + // Stop reading the image + camera.ReadStop() ; + t2 = t.read_ms(); + + if(c == 'y') + { + var = 2; // set YUV QQVGA + var2 = 1; + } + else{ + var = 1; // set RGB565 QQVGA + var2 = 0; + } + + for (int i = 0; i < SIZE/var; i++) { + pc.putc(bank0[(i*var)+var2]); + } + for (int i = 0; i < SIZE/var; i++) { + pc.putc(bank1[(i*var)+var2]); + } + + // Immediately request the next image to be captured + camera.CaptureNext(); + while (camera.CaptureDone() == false); + t3 = t.read_ms(); + + pc.printf("Grab done\r\n"); + + led4 = 0; +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,46 @@ +#pragma once +#include "mbed.h" +#include "ov7670.h" +#include "MODSERIAL.h" + + + +MODSERIAL pc(USBTX,USBRX); +Timer t; +bool new_send = false; + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + + +//Camera +#define SIZEX (160) +#define SIZEY (120) +#define SIZE (SIZEX*SIZEY) + +OV7670 camera +( + p28,p27, // SDA,SCL(I2C / SCCB) + p23,p24,p25, // VSYNC,HREF,WEN(FIFO) + Port0,0x07878000, // PortIn data p18(P0.26),p17(P0.25),p16(P0.24),p15(P0.23),p11(P0.18),p12(P0.17),p14(P0.16),p13(P0.15) + p26,p29,p30 // RRST,OE,RCLK +); + +unsigned char bank0 [SIZE]; +unsigned char *bank1 = (unsigned char *)(0x2007C000); + +//RESET +extern "C" void mbed_reset(); + +//Serial +char word[8]; +int t1 = 0; +int t2 = 0; +int t3 = 0; + +// +void parse_cmd(); +void CameraSnap(char c); +void CameraGrab();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/5e5da4a5990b \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ov7670.lib Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,1 @@ +ov7670#810d59d0b843