OV7670_with_AL422B Color & Size Test Program

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
diasea
Date:
Mon Feb 18 07:53:46 2013 +0000
Parent:
3:e23726af9d38
Commit message:
fix

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
ov7670.h Show annotated file Show diff for this revision Revisions of this file
ov7670reg.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Sun Feb 17 12:42:55 2013 +0000
+++ b/main.cpp	Mon Feb 18 07:53:46 2013 +0000
@@ -1,4 +1,5 @@
 #define BITMAPFILE
+#undef BAYERBITMAPFILE
 #undef HEXFILE
 #undef COLORBAR
 
@@ -19,7 +20,8 @@
 int sizex = 0;
 int sizey = 0;
 
-#ifdef BITMAPFILE
+#if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
+
 #define FILEHEADERSIZE 14                   //ファイルヘッダのサイズ
 #define INFOHEADERSIZE 40                   //情報ヘッダのサイズ
 #define HEADERSIZE (FILEHEADERSIZE+INFOHEADERSIZE)
@@ -92,38 +94,31 @@
 
     pc.printf("Before Init...\r\n");
     camera.PrintRegister();
-    
-    camera.InitForFIFOWriteReset();
 
     pc.printf("Select color format.\r\n") ;
     pc.printf("1: RGB444.\r\n");
     pc.printf("2: RGB555.\r\n");
     pc.printf("3: RGB565.\r\n");
     pc.printf("4: YUV(UYVY).\r\n");
-    pc.printf("5: Bayer RGB(GBGB... RGRG...).\r\n");
+    pc.printf("5: Bayer RGB(BGBG... GRGR...).\r\n");
 
     while(!pc.readable());
     char color_format = pc.getc();
     switch (color_format) {
         case '1':
             camera.InitRGB444();
-            camera.InitDefaultReg();
             break;
         case '2':
             camera.InitRGB555();
-            camera.InitDefaultReg();
             break;
         case '3':
             camera.InitRGB565();
-            camera.InitDefaultReg();
             break;
         case '4':
             camera.InitYUV();
-            camera.InitDefaultReg();
             break;
         case '5':
             camera.InitBayerRGB();
-            camera.InitDefaultReg();
             break;
     }
     pc.printf("select %c\r\n", color_format);
@@ -174,6 +169,9 @@
     }
     pc.printf("select %c\r\n", screen_size);
 
+    camera.InitForFIFOWriteReset();
+    camera.InitDefaultReg();
+
 #ifdef COLORBAR
     camera.InitSetColorbar();
 #endif
@@ -184,7 +182,7 @@
     // CAPTURE and SEND LOOP
     while(1)
     {
-#if defined(BITMAPFILE) || defined(HEXFILE)
+#if defined(BITMAPFILE) || defined(BAYERBITMAPFILE) || defined(HEXFILE)
         pc.printf("Hit Any Key %dx%d Capture Data.\r\n", sizex, sizey) ;
         while(!pc.readable());
         pc.printf("*\r\n");
@@ -203,7 +201,7 @@
             bmp_line_data[i] = 0;
         }
 #endif
-#ifdef BITMAPFILE
+#if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
         FILE *fp;
         char *filename = "/local/test.bmp";
         if((fp = fopen(filename, "wb")) == NULL){
@@ -267,33 +265,6 @@
                         // RGB
                         pc.printf ("%2X%2X%2X", r, g, b) ;
 */
-#ifdef COLOR_TRACKING
-                        int colorR = 210, colorG = 120, colorB = 120;
-                        int diffR, diffG, diffB;
-                        diffR = abs(colorR - r);
-                        diffG = abs(colorG - g);
-                        diffB = abs(colorB - b);
-                        if(diffR < 50 && diffG < 120 && diffB < 120) {
-                            target = 1;
-                            
-                            xmin = min(xmin, x);
-                            xmax = max(xmax, x);
-                            ymin = min(ymin, y);
-                            ymax = max(ymax, y);
-#endif
-
-#ifdef DISPLAY
-                            if( oled_x_start < x && x < oled_x_end && oled_y_start < y && y < oled_y_end) {
-                                oled_color = r;
-                                oled_color = (oled_color << 8) | g;
-                                oled_color = (oled_color << 8) | b;
-                                oled.pixel(x-oled_x_start, y-oled_y_start, oled_color);
-                            }
-#endif
-
-#ifdef COLOR_TRACKING
-                        }
-#endif
                     }
 #ifdef BITMAPFILE
                     fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
@@ -340,14 +311,6 @@
                         // RGB
                         pc.printf ("%2X%2X%2X", r, g, b) ;
 */
-#ifdef DISPLAY
-                        if( oled_x_start < x && x < oled_x_end && oled_y_start < y && y < oled_y_end) {
-                            oled_color = r;
-                            oled_color = (oled_color << 8) | g;
-                            oled_color = (oled_color << 8) | b;
-                            oled.pixel(x-oled_x_start, y-oled_y_start, oled_color);
-                        }
-#endif
                         index++;
                     }
 #ifdef BITMAPFILE
@@ -373,50 +336,65 @@
                 }
 
                 for (int x=0; x<sizex; x++) {
-                    // odd line GBGB... even line RGRG...
+                    // odd line BGBG... even line GRGR...
                     bayer_line_data[0][x] = (unsigned char)camera.ReadOneByte();
+#ifdef BAYERBITMAPFILE
+                    bmp_line_data[x*3]     = (unsigned char)bayer_line_data[0][x];
+                    bmp_line_data[x*3 + 1] = (unsigned char)bayer_line_data[0][x];
+                    bmp_line_data[x*3 + 2] = (unsigned char)bayer_line_data[0][x];
+#endif
                 }
+#ifdef BAYERBITMAPFILE
+                fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
+#endif
                 bayer_line[1] = bayer_line_data[0];
 
                 for (int y=1; y<sizey; y++) {
                     int line = y%2;
 
                     for (int x=0; x<sizex; x++) {
-                        // odd line GBGB... even line RGRG...
+                        // odd line BGBG... even line GRGR...
                         bayer_line_data[line][x] = (unsigned char)camera.ReadOneByte();
+#ifdef BAYERBITMAPFILE
+                        bmp_line_data[x*3]     = (unsigned char)bayer_line_data[line][x];
+                        bmp_line_data[x*3 + 1] = (unsigned char)bayer_line_data[line][x];
+                        bmp_line_data[x*3 + 2] = (unsigned char)bayer_line_data[line][x];
+#endif
                     }
-
+#ifdef BAYERBITMAPFILE
+                    fwrite(bmp_line_data, sizeof(unsigned char), real_width, fp);
+#endif
                     bayer_line[0] = bayer_line[1];
                     bayer_line[1] = bayer_line_data[line];
 
                     for (int x=0; x<sizex - 1; x++) {
                         if(y%2==1) {
                             if(x%2==0) {
-                                // GB
-                                // RG
-                                b = bayer_line[0][x+1];
-                                g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
-                                r = bayer_line[1][x];
-                            } else {
                                 // BG
                                 // GR
                                 b = bayer_line[0][x];
                                 g = ((int)bayer_line[0][x+1] + bayer_line[1][x])>>1;
                                 r = bayer_line[1][x+1];
+                            } else {
+                                // GB
+                                // RG
+                                b = bayer_line[0][x+1];
+                                g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
+                                r = bayer_line[1][x];
                             }
                         } else {
                             if(x%2==0) {
+                                // GR
+                                // BG
+                                b = bayer_line[1][x];
+                                g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
+                                r = bayer_line[0][x+1];
+                            } else {
                                 // RG
                                 // GB
                                 b = bayer_line[1][x+1];
                                 g = ((int)bayer_line[0][x+1] + bayer_line[1][x])>>1;
                                 r = bayer_line[0][x];
-                            } else {
-                                // GR
-                                // BG
-                                b = bayer_line[1][x];
-                                g = ((int)bayer_line[0][x] + bayer_line[1][x+1])>>1;
-                                r = bayer_line[0][x+1];
                             }
                         }
 #if defined(BITMAPFILE) || defined(HEXFILE)
@@ -447,7 +425,7 @@
         }
         camera.ReadStop();
 
-#ifdef BITMAPFILE
+#if defined(BITMAPFILE) || defined(BAYERBITMAPFILE)
         free(bmp_line_data);
         fclose(fp);
 #endif
--- a/ov7670.h	Sun Feb 17 12:42:55 2013 +0000
+++ b/ov7670.h	Mon Feb 18 07:53:46 2013 +0000
@@ -14,16 +14,16 @@
 class OV7670
 {
 public:
-    I2C camera ;
+    I2C camera;
     InterruptIn vsync,href;
-    DigitalOut wen ;
-    BusIn data ;
-    DigitalOut rrst,oe,rclk ;
-    volatile int LineCounter ;
-    volatile int LastLines ;
-    volatile bool CaptureReq ;
-    volatile bool Busy ;
-    volatile bool Done ;
+    DigitalOut wen;
+    BusIn data;
+    DigitalOut rrst,oe,rclk;
+    volatile int LineCounter;
+    volatile int LastLines;
+    volatile bool CaptureReq;
+    volatile bool Busy;
+    volatile bool Done;
 
     OV7670(
         PinName sda,// Camera I2C port
@@ -44,74 +44,74 @@
         PinName rc  // RCLK      
         ) : camera(sda,scl),vsync(vs),href(hr),wen(we),data(d0,d1,d2,d3,d4,d5,d6,d7),rrst(rt),oe(o),rclk(rc)
     {
-        camera.stop() ;
-        camera.frequency(OV7670_I2CFREQ) ;
-        vsync.fall(this,&OV7670::VsyncHandler) ;
-        href.rise(this,&OV7670::HrefHandler) ;
-        CaptureReq = false ;
-        Busy = false ;
-        Done = false ;
-        LineCounter = 0 ;
-        rrst = 1 ;
-        oe = 1 ;
-        rclk = 1 ;
-        wen = 0 ;
+        camera.stop();
+        camera.frequency(OV7670_I2CFREQ);
+        vsync.fall(this,&OV7670::VsyncHandler);
+        href.rise(this,&OV7670::HrefHandler);
+        CaptureReq = false;
+        Busy = false;
+        Done = false;
+        LineCounter = 0;
+        rrst = 1;
+        oe = 1;
+        rclk = 1;
+        wen = 0;
     }
 
     // capture request
     void CaptureNext(void)
     {
-        CaptureReq = true ;
-        Busy = true ;
+        CaptureReq = true;
+        Busy = true;
     }
     
     // capture done? (with clear)
     bool CaptureDone(void)
     {
-        bool result ;
+        bool result;
         if (Busy) {
-            result = false ;
+            result = false;
         } else {
-            result = Done ;
-            Done = false ;
+            result = Done;
+            Done = false;
         }
-        return result ;
+        return result;
     }
 
     // write to camera
     void WriteReg(int addr,int data)
     {
         // WRITE 0x42,ADDR,DATA
-        camera.start() ;
-        camera.write(OV7670_WRITE) ;
+        camera.start();
+        camera.write(OV7670_WRITE);
         wait_us(OV7670_WRITEWAIT);
-        camera.write(addr) ;
+        camera.write(addr);
         wait_us(OV7670_WRITEWAIT);
-        camera.write(data) ;
-        camera.stop() ;
+        camera.write(data);
+        camera.stop();
     }
 
     // read from camera
     int ReadReg(int addr)
     {
-        int data ;
+        int data;
 
         // WRITE 0x42,ADDR
-        camera.start() ;
-        camera.write(OV7670_WRITE) ;
+        camera.start();
+        camera.write(OV7670_WRITE);
         wait_us(OV7670_WRITEWAIT);
-        camera.write(addr) ;
-        camera.stop() ;
+        camera.write(addr);
+        camera.stop();
         wait_us(OV7670_WRITEWAIT);    
 
         // WRITE 0x43,READ
-        camera.start() ;
-        camera.write(OV7670_READ) ;
+        camera.start();
+        camera.write(OV7670_READ);
         wait_us(OV7670_WRITEWAIT);
-        data = camera.read(OV7670_NOACK) ;
-        camera.stop() ;
+        data = camera.read(OV7670_NOACK);
+        camera.stop();
     
-        return data ;
+        return data;
     }
 
     // print register
@@ -129,12 +129,12 @@
     }
 
     void Reset(void) {    
-        WriteReg(REG_COM7,0x80) ; // RESET CAMERA
-        wait_ms(200) ;
+        WriteReg(REG_COM7,COM7_RESET); // RESET CAMERA
+        wait_ms(200);
     }
 
     void InitForFIFOWriteReset(void) {
-        WriteReg(REG_COM10,0x02);
+        WriteReg(REG_COM10, COM10_VS_NEG);
     }
 
     void InitSetColorbar(void)  {
@@ -388,7 +388,11 @@
     void InitBayerRGB(void){
         int reg_com7 = ReadReg(REG_COM7);
 
-        WriteReg(REG_COM7, reg_com7|COM7_PBAYER);
+        // odd line BGBG... even line GRGR...
+        WriteReg(REG_COM7, reg_com7|COM7_BAYER);
+        // odd line GBGB... even line RGRG...
+        //WriteReg(REG_COM7, reg_com7|COM7_PBAYER);
+
         WriteReg(REG_RGB444, RGB444_DISABLE);
         WriteReg(REG_COM15, COM15_R00FF);
 
@@ -404,7 +408,7 @@
         int reg_com7 = ReadReg(REG_COM7);
 
         WriteReg(REG_COM7,reg_com7|COM7_VGA);
-        
+
         WriteReg(REG_HSTART,HSTART_VGA);
         WriteReg(REG_HSTOP,HSTOP_VGA);
         WriteReg(REG_HREF,HREF_VGA);
@@ -425,7 +429,7 @@
         int reg_com7 = ReadReg(REG_COM7);
 
         WriteReg(REG_COM7,reg_com7|COM7_VGA);
-        
+
         WriteReg(REG_HSTART,HSTART_VGA);
         WriteReg(REG_HSTOP,HSTOP_VGA);
         WriteReg(REG_HREF,HREF_VGA);
@@ -451,7 +455,7 @@
         int reg_com7 = ReadReg(REG_COM7);
 
         WriteReg(REG_COM7,reg_com7|COM7_VGA);
-        
+
         WriteReg(REG_HSTART,HSTART_VGA);
         WriteReg(REG_HSTOP,HSTOP_VGA);
         WriteReg(REG_HREF,HREF_VGA);
@@ -519,57 +523,57 @@
     {
         // Capture Enable
         if (CaptureReq) {
-            wen = 1 ;
-            Done = false ;
-            CaptureReq = false ;
+            wen = 1;
+            Done = false;
+            CaptureReq = false;
         } else {
-            wen = 0 ;
+            wen = 0;
             if (Busy) {
-                Busy = false ;
-                Done = true ;
+                Busy = false;
+                Done = true;
             }
         }
 
         // Hline Counter
-        LastLines = LineCounter ;
-        LineCounter = 0 ;
+        LastLines = LineCounter;
+        LineCounter = 0;
     }
     
     // href handler
     void HrefHandler(void)
     {
-        LineCounter++ ;
+        LineCounter++;
     }
     
     // Data Read
     int ReadOneByte(void)
     {
-        int result ;
-        rclk = 1 ;
-//        wait_us(1) ;
-        result = data ;
-        rclk = 0 ;
-        return result ;
+        int result;
+        rclk = 1;
+//        wait_us(1);
+        result = data;
+        rclk = 0;
+        return result;
     }
     
     // Data Start
     void ReadStart(void)
     {        
-        rrst = 0 ;
-        oe = 0 ;
-        wait_us(1) ;
-        rclk = 0 ;
-        wait_us(1) ;
-        rclk = 1 ;
-        wait_us(1) ;        
-        rrst = 1 ;
+        rrst = 0;
+        oe = 0;
+        wait_us(1);
+        rclk = 0;
+        wait_us(1);
+        rclk = 1;
+        wait_us(1);        
+        rrst = 1;
     }
     
     // Data Stop
     void ReadStop(void)
     {
-        oe = 1 ;
-        ReadOneByte() ;
-        rclk = 1 ;
+        oe = 1;
+        ReadOneByte();
+        rclk = 1;
     }
 };
--- a/ov7670reg.h	Sun Feb 17 12:42:55 2013 +0000
+++ b/ov7670reg.h	Mon Feb 18 07:53:46 2013 +0000
@@ -18,7 +18,7 @@
 #define COM7_VGA                    0x00
 #define HSTART_VGA                  0x13
 #define HSTOP_VGA                   0x01
-#define HREF_VGA                    0x36
+#define HREF_VGA                    0x36 //0xb6 0x36
 #define VSTART_VGA                  0x02
 #define VSTOP_VGA                   0x7a
 #define VREF_VGA                    0x0a