Sadaei Osakabe
/
OV7670_with_AL422B_Color_Size_test
OV7670_with_AL422B Color & Size Test Program
Revision 4:2c412c97678c, committed 2013-02-18
- Comitter:
- diasea
- Date:
- Mon Feb 18 07:53:46 2013 +0000
- Parent:
- 3:e23726af9d38
- Commit message:
- fix
Changed in this revision
diff -r e23726af9d38 -r 2c412c97678c main.cpp --- 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
diff -r e23726af9d38 -r 2c412c97678c ov7670.h --- 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; } };
diff -r e23726af9d38 -r 2c412c97678c ov7670reg.h --- 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