ov7670 FIFO from Edoardo De Marchi

Dependents:   3D_Scanner_OV7670_

Fork of OV7670 with FIFO by angelo mottolese

Files at this revision

API Documentation at this revision

Comitter:
rulla
Date:
Tue Oct 03 16:39:42 2017 +0000
Parent:
0:101fbacf126f
Commit message:
ok

Changed in this revision

OV7670.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
diff -r 101fbacf126f -r f5f5d7c979cf OV7670.cpp
--- a/OV7670.cpp	Wed Nov 16 10:37:49 2016 +0000
+++ b/OV7670.cpp	Tue Oct 03 16:39:42 2017 +0000
@@ -2,161 +2,149 @@
 #include "ov7670reg.h"
 #include "OV7670.h"
 
- // capture request
-    void OV7670::CaptureNext(void)
-    {
-        CaptureReq = true ;
-        Busy = true ;
-        printf("CaptReq\n");
-    }
-    
-    // capture done? (with clear)
-    bool OV7670::CaptureDone(void)
-    {
-        bool result ;
-        if (Busy) {
-            result = false ;
-        } else {
-            result = Done ;
-            Done = false ;
-        }
-        return result ;
-    }
+OV7670::OV7670(PinName sda, PinName scl, PinName vs, PinName hr, PinName we, PortName port, int mask, PinName rt, PinName o, PinName rc) : camera(sda,scl),vsync(vs),href(hr),wen(we),dataP(port,mask),rrst(rt),oe(o),rclk(rc)
+{
+    camera.stop() ;
+    camera.frequency(OV7670_I2CFREQ) ;
+    vsync.fall(this,&OV7670::VsyncHandler) ;
+    //camera.start() ;
+    CaptureReq = false ;
+    Busy = false ;
+    Done = false ;
+    LineCounter = 0 ;
+    rrst = 1 ;
+    oe = 1 ;
+    rclk = 1 ;
+    wen = 0 ;
+}
+
+
+OV7670::~OV7670()
+{
+
+}
+// capture request
+void OV7670::CaptureNext(void)
+{
+    CaptureReq = true ;
+    Busy = true ;
+}
 
-    // write to camera
-    void OV7670::WriteReg(int addr,char data)
-    {
-        // WRITE 0x42,ADDR,DATA
-        //camera.write(OV7670_WRITE,d1,2) ;
-        camera.start() ;
-        camera.write(OV7670_WRITE) ;
-        wait_us(OV7670_WRITEWAIT);
-        camera.write(addr) ;
-        wait_us(OV7670_WRITEWAIT);
-        camera.write(data) ;
-        camera.stop() ;
+// capture done? (with clear)
+bool OV7670::CaptureDone(void)
+{
+    bool result ;
+    if (Busy) {
+        result = false ;
+    } else {
+        result = Done ;
+        Done = false ;
     }
+    return result ;
+}
 
-    // read from camera
-    char OV7670::ReadReg(int addr)
-    {
- /*
- char buff[20];
- char buf[20];
-    buff[0] = addr;
-    buff[1] = OV7670_NOACK;
+// write to camera
+void OV7670::WriteReg(int addr,char data)
+{
+    // WRITE 0x42,ADDR,DATA
+    //camera.write(OV7670_WRITE,d1,2) ;
+    camera.start() ;
+    camera.write(OV7670_WRITE) ;
+    wait_us(OV7670_WRITEWAIT);
+    camera.write(addr) ;
+    wait_us(OV7670_WRITEWAIT);
+    camera.write(data) ;
+    camera.stop() ;
+}
 
-    camera.write(OV7670_WRITE,buff,1);
-    camera.read(OV7670_WRITE+1,buf,1);
-    return buf[0];*/
+// read from camera
+char OV7670::ReadReg(int addr)
+{
+    /*
+    char buff[20];
+    char buf[20];
+       buff[0] = addr;
+       buff[1] = OV7670_NOACK;
+
+       camera.write(OV7670_WRITE,buff,1);
+       camera.read(OV7670_WRITE+1,buf,1);
+       return buf[0];*/
     int data ;
 
-        // WRITE 0x42,ADDR
-        camera.start() ;
-        camera.write(OV7670_WRITE) ;
-        wait_us(OV7670_WRITEWAIT);
-        camera.write(addr) ;
-        camera.stop() ;
-        wait_us(OV7670_WRITEWAIT);    
+    // WRITE 0x42,ADDR
+    camera.start() ;
+    camera.write(OV7670_WRITE) ;
+    wait_us(OV7670_WRITEWAIT);
+    camera.write(addr) ;
+    camera.stop() ;
+    wait_us(OV7670_WRITEWAIT);
+
+    // WRITE 0x43,READ
+    camera.start() ;
+    camera.write(OV7670_READ) ;
+    wait_us(OV7670_WRITEWAIT);
+    data = camera.read(OV7670_NOACK) ;
+    camera.stop() ;
+
+    return data ;
+}
+
+void OV7670::test(void)
+{
+    printf("ResetMAMT\n");
+}
 
-        // WRITE 0x43,READ
-        camera.start() ;
-        camera.write(OV7670_READ) ;
-        wait_us(OV7670_WRITEWAIT);
-        data = camera.read(OV7670_NOACK) ;
-        camera.stop() ;
-    
-        return data ;
+void OV7670::Reset(void)
+{
+    WriteReg(REG_COM7,0x80) ; // RESET CAMERA
+    wait_ms(200) ;
+    printf("Reset\n");
+}
+
+void OV7670::InitQQVGA(int SIZEX)
+{
+    Reset();                                 // Resets all registers to default values
+    Reset();                                 // Resets all registers to default values
+
+    WriteReg(DBLV, 0x0a);                    // bypass PLL
+    WriteReg(REG_CLKRC,0x80);//0x80
+    WriteReg(SCALING_XSC, 0x3a);
+    WriteReg(SCALING_YSC, 0x35);
+    WriteReg(REG_HREF, 0x24);
+    WriteReg(REG_HSTART, 0x16);
+    WriteReg(REG_HSTOP, 0x04);
+    WriteReg(REG_VREF, 0x0a);
+    WriteReg(REG_VSTART,0x02);
+    WriteReg(REG_VSTOP, 0x7a);
+
+    if(SIZEX==640) {
+        WriteReg(REG_CLKRC,0x0);//0x80
+        WriteReg(REG_COM7,0x04) ;
+        WriteReg(REG_COM3,0x0) ;
+        WriteReg(REG_COM14, 0x00);
+        WriteReg(SCALING_DCWCTR,0x11);
+        WriteReg(SCALING_PCLK_DIV,0xf0);
+        WriteReg(SCALING_PCLK_DELAY,0x02);
+
+        WriteReg(0xff, 0xff); /* END MARKER */
     }
 
-    void OV7670::test(void) 
-    { 
-        printf("ResetMAMT\n");   
-    }
-    
-    void OV7670::Reset(void) 
-    { 
-        WriteReg(0x12,0x80) ; // RESET CAMERA
-        wait_ms(200) ;
-        printf("Reset\n");
-    }
-    
-    void OV7670::InitQQVGA(void) 
-    {
-       /*
-       //WriteReg(REG_COM7,0x80) ;
-        WriteReg(REG_CLKRC,0x80);
-        WriteReg(REG_COM11,0x1A) ;
-        WriteReg(REG_TSLB,0x04);
-        WriteReg(REG_TSLB,0x04);
-        WriteReg(REG_COM3,0x04) ;
-        WriteReg(REG_COM7,0x07) ;
-            WriteReg(REG_COM8,0x87) ;
-        //WriteReg(REG_RGB444, 0x00);
-        //WriteReg(REG_RGB444, 0x00);     // Disable RGB 444?
-        WriteReg(REG_COM15, 0xD0);      // Set RGB 565?
-*/
-
-        WriteReg(REG_CLKRC,0x80);
-        WriteReg(REG_COM11,0x1A) ;
-      //  WriteReg(REG_TSLB,0x04);
-        //WriteReg(REG_TSLB,0x04);
-        //WriteReg(REG_COM1,0x0) ;        
-        WriteReg(REG_COM3,0x04) ;
-        WriteReg(REG_COM7,0x04) ;
-        WriteReg(REG_COM14, 0x1a);
-        WriteReg(SCALING_XSC, 0x3a);
-        WriteReg(SCALING_YSC, 0x35);
-        WriteReg(SCALING_DCWCTR,0x22);
-        WriteReg(SCALING_PCLK_DIV,0xf2);
+    if(SIZEX==320) {
+        WriteReg(REG_COM7,0x4) ;
+        WriteReg(REG_COM17,0x00) ;
+        WriteReg(REG_COM3,0x38) ;
+        WriteReg(REG_COM14, 0x19);
+        WriteReg(REG_COM2, 0x3);
+        WriteReg(SCALING_DCWCTR,0x11);
+        WriteReg(SCALING_PCLK_DIV,0xf1);
         WriteReg(SCALING_PCLK_DELAY,0x02);
-          WriteReg(REG_COM8,0x87) ;
-     //   WriteReg(REG_RGB444, 0x02);
-       // WriteReg(REG_RGB444, 0x00);     // Disable RGB 444?
-        WriteReg(REG_COM15, 0xD0);      // Set RGB 565?
-        
-        WriteReg(REG_HSTART,0x16) ;
-        WriteReg(REG_HSTOP,0x04) ;
-        WriteReg(REG_HREF,0x24) ;
-        WriteReg(REG_VSTART,0x02) ;
-        WriteReg(REG_VSTOP,0x7a) ;
-        WriteReg(REG_VREF,0x0a) ;
-        WriteReg(REG_COM10,0x02) ;
-        WriteReg(REG_MVFP,0x27) ;
 
-        // COLOR SETTING
-        WriteReg(0x4f,0x80);
-        WriteReg(0x50,0x80);
-        WriteReg(0x51,0x00);
-        WriteReg(0x52,0x22);
-        WriteReg(0x53,0x5e);
-        WriteReg(0x54,0x80);
-        WriteReg(0x56,0x40);
-        WriteReg(0x58,0x9e);
-        WriteReg(0x59,0x88);
-        WriteReg(0x5a,0x88);
-        WriteReg(0x5b,0x44);
-        WriteReg(0x5c,0x67);
-        WriteReg(0x5d,0x49);
-        WriteReg(0x5e,0x0e);
-        WriteReg(0x69,0x00);
-        WriteReg(0x6a,0x40);
-        WriteReg(0x6b,0x0a);
-        WriteReg(0x6c,0x0a);
-        WriteReg(0x6d,0x55);
-        WriteReg(0x6e,0x11);
-        WriteReg(0x6f,0x9f);
 
-        WriteReg(0xb0,0x84);
-        //////////
-        
-        
-             
         WriteReg(0x7a, 0x20);
         WriteReg(0x7b, 0x1c);
         WriteReg(0x7c, 0x28);
         WriteReg(0x7d, 0x3c);
-        WriteReg(0x7e, 0x5a);
+        WriteReg(0x7e, 0x55);
         WriteReg(0x7f, 0x68);
         WriteReg(0x80, 0x76);
         WriteReg(0x81, 0x80);
@@ -168,31 +156,30 @@
         WriteReg(0x87, 0xc4);
         WriteReg(0x88, 0xd7);
         WriteReg(0x89, 0xe8);
-        
+
         WriteReg(0x13, 0xe0);
         WriteReg(0x00, 0x00);
         WriteReg(0x10, 0x00);
-        WriteReg(0x0d, 0x40);
-        WriteReg(0x14, 0x18);
+        WriteReg(0x0d, 0x00);
+        WriteReg(0x14, 0x28);
         WriteReg(0xa5, 0x05);
         WriteReg(0xab, 0x07);
-        WriteReg(0x24, 0x95);
-        WriteReg(0x25, 0x33);
-        WriteReg(0x26, 0xe3);
+        WriteReg(0x24, 0x75);
+        WriteReg(0x25, 0x63);
+        WriteReg(0x26, 0xA5);
         WriteReg(0x9f, 0x78);
         WriteReg(0xa0, 0x68);
         WriteReg(0xa1, 0x03);
-        WriteReg(0xa6, 0xd8);
-        WriteReg(0xa7, 0xd8);
+        WriteReg(0xa6, 0xdf);
+        WriteReg(0xa7, 0xdf);
         WriteReg(0xa8, 0xf0);
         WriteReg(0xa9, 0x90);
         WriteReg(0xaa, 0x94);
         WriteReg(0x13, 0xe5);
-        
+
         WriteReg(0x0e, 0x61);
         WriteReg(0x0f, 0x4b);
         WriteReg(0x16, 0x02);
-
         WriteReg(0x21, 0x02);
         WriteReg(0x22, 0x91);
         WriteReg(0x29, 0x07);
@@ -205,15 +192,14 @@
         WriteReg(0x4d, 0x40);
         WriteReg(0x4e, 0x20);
         WriteReg(0x69, 0x00);
-
-        WriteReg(0x74, 0x10);
+        WriteReg(0x6b, 0x00);
+        WriteReg(0x74, 0x19);
         WriteReg(0x8d, 0x4f);
         WriteReg(0x8e, 0x00);
         WriteReg(0x8f, 0x00);
         WriteReg(0x90, 0x00);
         WriteReg(0x91, 0x00);
         WriteReg(0x92, 0x00);
-
         WriteReg(0x96, 0x00);
         WriteReg(0x9a, 0x80);
         WriteReg(0xb0, 0x84);
@@ -221,8 +207,7 @@
         WriteReg(0xb2, 0x0e);
         WriteReg(0xb3, 0x82);
         WriteReg(0xb8, 0x0a);
-        
-        WriteReg(0x43, 0x0a);
+        WriteReg(0x43, 0x14);
         WriteReg(0x44, 0xf0);
         WriteReg(0x45, 0x34);
         WriteReg(0x46, 0x58);
@@ -239,7 +224,6 @@
         WriteReg(0x66, 0x05);
         WriteReg(0x94, 0x04);
         WriteReg(0x95, 0x08);
-
         WriteReg(0x6c, 0x0a);
         WriteReg(0x6d, 0x55);
         WriteReg(0x6e, 0x11);
@@ -249,7 +233,6 @@
         WriteReg(0x02, 0x40);
         WriteReg(0x13, 0xe7);
         WriteReg(0x15, 0x02);
-
         WriteReg(0x4f, 0x80);
         WriteReg(0x50, 0x80);
         WriteReg(0x51, 0x00);
@@ -257,22 +240,20 @@
         WriteReg(0x53, 0x5e);
         WriteReg(0x54, 0x80);
         WriteReg(0x58, 0x9e);
-        
         WriteReg(0x41, 0x08);
         WriteReg(0x3f, 0x00);
         WriteReg(0x75, 0x05);
         WriteReg(0x76, 0xe1);
         WriteReg(0x4c, 0x00);
         WriteReg(0x77, 0x01);
-        WriteReg(0x3d, 0xc1);
+        WriteReg(0x3d, 0xc2);
         WriteReg(0x4b, 0x09);
         WriteReg(0xc9, 0x60);
         WriteReg(0x41, 0x38);
         WriteReg(0x56, 0x40);
-        
         WriteReg(0x34, 0x11);
         WriteReg(0x3b, 0x02);
-        WriteReg(0xa4, 0x88);
+        WriteReg(0xa4, 0x89);
         WriteReg(0x96, 0x00);
         WriteReg(0x97, 0x30);
         WriteReg(0x98, 0x20);
@@ -283,7 +264,6 @@
         WriteReg(0x9d, 0x4c);
         WriteReg(0x9e, 0x3f);
         WriteReg(0x78, 0x04);
-        
         WriteReg(0x79, 0x01);
         WriteReg(0xc8, 0xf0);
         WriteReg(0x79, 0x0f);
@@ -309,78 +289,359 @@
         WriteReg(0x79, 0x26);
         WriteReg(0x09, 0x03);
         WriteReg(0x3b, 0x42);
-        
-        WriteReg(0xff, 0xff);   /* END MARKER */ 
-               
-        printf("Init\n");
-    }    
+    }
+
+    if(SIZEX==160) {
+        WriteReg(REG_COM7,0x04) ;
+        WriteReg(REG_COM3,0x04) ;
+        WriteReg(REG_COM14, 0x1a);
+        WriteReg(SCALING_DCWCTR,0x22);
+        WriteReg(SCALING_PCLK_DIV,0xf2);
+        WriteReg(SCALING_PCLK_DELAY,0x02);
+    }
+
+    WriteReg(REG_COM1,0x0) ;
+    WriteReg(REG_COM8,0xc7) ;
+    WriteReg(REG_COM9,0x7a) ;
+    WriteReg(REG_COM10,0x2) ;
+    WriteReg(REG_COM11,0x10) ;//1A //0x90
+    WriteReg(REG_COM13, 0x88);
+    WriteReg(REG_COM15, 0xd0);      // Set RGB 565?
+    WriteReg(REG_EDGE,0x04) ;
+    WriteReg(REG_RGB444, 0x00);     // Disable RGB 444?
+    // WriteReg(REG_TSLB,0x05);//Forza YUV
+
+    /////////
+    WriteReg(REG_MVFP,0x27) ;
+
+    /*
+      WriteReg( REG_COM5, 0x61 );   WriteReg( REG_COM6, 0x4b );
+      WriteReg( 0x16, 0x02 );
+      WriteReg( 0x21, 0x02 );   WriteReg( 0x22, 0x91 );
+      WriteReg( 0x29, 0x07 );   WriteReg( 0x33, 0x0b );
+      WriteReg( 0x35, 0x0b );   WriteReg( 0x37, 0x1d );
+      WriteReg( 0x38, 0x71 );   WriteReg( 0x39, 0x2a );
+      WriteReg( REG_COM12, 0x78 );   WriteReg( 0x4d, 0x40 );
+      WriteReg( 0x4e, 0x20 );   WriteReg( REG_GFIX, 0 );
+      WriteReg( 0x6b, 0x4a );   WriteReg( 0x74, 0x10 );
+      WriteReg( 0x8d, 0x4f );   WriteReg( 0x8e, 0 );
+      WriteReg( 0x8f, 0 );   WriteReg( 0x90, 0 );
+      WriteReg( 0x91, 0 );   WriteReg( 0x96, 0 );
+      WriteReg( 0x9a, 0 );   WriteReg( 0xb0, 0x84 );
+      WriteReg( 0xb1, 0x0c );   WriteReg( 0xb2, 0x0e );
+      WriteReg( 0xb3, 0x82 );   WriteReg( 0xb8, 0x0a );
+      */
+    /*
+            // COLOR SETTING
+            WriteReg(0x4f,0x80);
+            WriteReg(0x50,0x80);
+            WriteReg(0x51,0x00);
+            WriteReg(0x52,0x22);
+            WriteReg(0x53,0x5e);
+            WriteReg(0x54,0x80);
+            WriteReg(0x56,0x40);
+            WriteReg(0x58,0x9e);
+            WriteReg(0x59,0x88);
+            WriteReg(0x5a,0x88);
+            WriteReg(0x5b,0x44);
+            WriteReg(0x5c,0x67);
+            WriteReg(0x5d,0x49);
+            WriteReg(0x5e,0x0e);
+            WriteReg(0x69,0x00);
+            WriteReg(0x6a,0x40);
+            WriteReg(0x6b,0x0a);
+            WriteReg(0x6c,0x0a);
+            WriteReg(0x6d,0x55);
+            WriteReg(0x6e,0x11);
+            WriteReg(0x6f,0x9f);
+
+            WriteReg(0xb0,0x84);
+            //////////
+            */
+
+    /*
+            WriteReg(0x7a, 0x20);
+            WriteReg(0x7b, 0x1c);
+            WriteReg(0x7c, 0x28);
+            WriteReg(0x7d, 0x3c);
+            WriteReg(0x7e, 0x5a);
+            WriteReg(0x7f, 0x68);
+            WriteReg(0x80, 0x76);
+            WriteReg(0x81, 0x80);
+            WriteReg(0x82, 0x88);
+            WriteReg(0x83, 0x8f);
+            WriteReg(0x84, 0x96);
+            WriteReg(0x85, 0xa3);
+            WriteReg(0x86, 0xaf);
+            WriteReg(0x87, 0xc4);
+            WriteReg(0x88, 0xd7);
+            WriteReg(0x89, 0xe8);
+
+            WriteReg(0x13, 0xe0);
+            WriteReg(0x00, 0x00);
+            WriteReg(0x10, 0x00);
+            WriteReg(0x0d, 0x40);
+            WriteReg(0x14, 0x18);
+            WriteReg(0xa5, 0x05);
+            WriteReg(0xab, 0x07);
+            WriteReg(0x24, 0x95);
+            WriteReg(0x25, 0x33);
+            WriteReg(0x26, 0xe3);
+            WriteReg(0x9f, 0x78);
+            WriteReg(0xa0, 0x68);
+            WriteReg(0xa1, 0x03);
+            WriteReg(0xa6, 0xd8);
+            WriteReg(0xa7, 0xd8);
+            WriteReg(0xa8, 0xf0);
+            WriteReg(0xa9, 0x90);
+            WriteReg(0xaa, 0x94);
+            WriteReg(0x13, 0xe5);
+
+            WriteReg(0x0e, 0x61);
+            WriteReg(0x0f, 0x4b);
+            WriteReg(0x16, 0x02);
+
+            WriteReg(0x21, 0x02);
+            WriteReg(0x22, 0x91);
+            WriteReg(0x29, 0x07);
+            WriteReg(0x33, 0x0b);
+            WriteReg(0x35, 0x0b);
+            WriteReg(0x37, 0x1d);
+            WriteReg(0x38, 0x71);
+            WriteReg(0x39, 0x2a);
+            WriteReg(0x3c, 0x78);
+            WriteReg(0x4d, 0x40);
+            WriteReg(0x4e, 0x20);
+            WriteReg(0x69, 0x00);
+
+            WriteReg(0x74, 0x10);
+            WriteReg(0x8d, 0x4f);
+            WriteReg(0x8e, 0x00);
+            WriteReg(0x8f, 0x00);
+            WriteReg(0x90, 0x00);
+            WriteReg(0x91, 0x00);
+            WriteReg(0x92, 0x00);
+                WriteReg(0x93, 0x00);
+
+
+            WriteReg(0x96, 0x00);
+            WriteReg(0x9a, 0x80);
+            WriteReg(0xb0, 0x84);
+            WriteReg(0xb1, 0x0c);
+            WriteReg(0xb2, 0x0e);
+            WriteReg(0xb3, 0x82);
+            WriteReg(0xb8, 0x0a);
+
+            WriteReg(0x43, 0x0a);
+            WriteReg(0x44, 0xf0);
+            WriteReg(0x45, 0x34);
+            WriteReg(0x46, 0x58);
+            WriteReg(0x47, 0x28);
+            WriteReg(0x48, 0x3a);
+            WriteReg(0x59, 0x88);
+            WriteReg(0x5a, 0x88);
+            WriteReg(0x5b, 0x44);
+            WriteReg(0x5c, 0x67);
+            WriteReg(0x5d, 0x49);
+            WriteReg(0x5e, 0x0e);
+            WriteReg(0x64, 0x04);
+            WriteReg(0x65, 0x20);
+            WriteReg(0x66, 0x05);
+            WriteReg(0x94, 0x04);
+            WriteReg(0x95, 0x08);
+
+            WriteReg(0x6c, 0x0a);
+            WriteReg(0x6d, 0x55);
+            WriteReg(0x6e, 0x11);
+            WriteReg(0x6f, 0x9f);
+            WriteReg(0x6a, 0x40);
+            WriteReg(0x01, 0x40);
+            WriteReg(0x02, 0x40);
+            WriteReg(0x13, 0xe7);
+           // WriteReg(0x15, 0x02);
+
+              WriteReg(0x4f, 0xb3);
+            WriteReg(0x50, 0xb3);
+            WriteReg(0x51, 0x00);
+            WriteReg(0x52, 0x3d);
+            WriteReg(0x53, 0xa7);
+            WriteReg(0x54, 0xe4);
+            WriteReg(0x58, 0x9e);
+
+            WriteReg(0x41, 0x08);
+            WriteReg(0x3f, 0x00);
+            WriteReg(0x75, 0x05);
+            WriteReg(0x76, 0xe1);
+            WriteReg(0x4c, 0x00);
+            WriteReg(0x77, 0x01);
+           // WriteReg(0x3d, 0xc1);
+            WriteReg(0x4b, 0x09);
+            WriteReg(0xc9, 0x60);
+            WriteReg(0x41, 0x38);
+            WriteReg(0x56, 0x40);
+
+            WriteReg(0x34, 0x11);
+            WriteReg(0x3b, 0x02);
+            WriteReg(0xa4, 0x88);
+            WriteReg(0x96, 0x00);
+            WriteReg(0x97, 0x30);
+            WriteReg(0x98, 0x20);
+            WriteReg(0x99, 0x30);
+            WriteReg(0x9a, 0x84);
+            WriteReg(0x9b, 0x29);
+            WriteReg(0x9c, 0x03);
+            WriteReg(0x9d, 0x4c);
+            WriteReg(0x9e, 0x3f);
+            WriteReg(0x78, 0x04);
+
+            WriteReg(0x79, 0x01);
+            WriteReg(0xc8, 0xf0);
+            WriteReg(0x79, 0x0f);
+            WriteReg(0xc8, 0x00);
+            WriteReg(0x79, 0x10);
+            WriteReg(0xc8, 0x7e);
+            WriteReg(0x79, 0x0a);
+            WriteReg(0xc8, 0x80);
+            WriteReg(0x79, 0x0b);
+            WriteReg(0xc8, 0x01);
+            WriteReg(0x79, 0x0c);
+            WriteReg(0xc8, 0x0f);
+            WriteReg(0x79, 0x0d);
+            WriteReg(0xc8, 0x20);
+            WriteReg(0x79, 0x09);
+            WriteReg(0xc8, 0x80);
+            WriteReg(0x79, 0x02);
+            WriteReg(0xc8, 0xc0);
+            WriteReg(0x79, 0x03);
+            WriteReg(0xc8, 0x40);
+            WriteReg(0x79, 0x05);
+            WriteReg(0xc8, 0x30);
+            WriteReg(0x79, 0x26);
+            WriteReg(0x09, 0x03);
+            WriteReg(0x3b, 0x42);
+    /////////////
+            */
+
+    /*
+    WriteReg(0x4f, 0x80);
+    WriteReg(0x50, 0x80);
+    WriteReg(0x51, 0x00);
+    WriteReg(0x52, 0x22);
+    WriteReg(0x53, 0x5e);
+    WriteReg(0x54, 0x80);
+    */
+
+    /*
+        WriteReg( REG_COM9, 0x38 );
+        WriteReg( 0x4f, 0xb3 );
+        WriteReg( 0x50, 0xb3 );
+        WriteReg( 0x51, 0    );
+        WriteReg( 0x52, 0x3d );
+        WriteReg( 0x53, 0xa7);
+        WriteReg( 0x54, 0xe4 );
+        WriteReg( REG_COM13, COM13_GAMMA|COM13_UVSAT );
+        */
+    // WriteReg( REG_COM13, COM13_GAMMA|COM13_UVSAT );
+    //WriteReg(REG_COM8,0x8f) ;
+    //    WriteReg(REG_COM7,0x04) ;
+    //     WriteReg(REG_CLKRC,0x80);
+    WriteReg(0xff, 0xff);   /* END MARKER */
+
+    printf("Init\n");
+}
 
 
 
-    // vsync handler
-    void OV7670::VsyncHandler(void)
-    {
-        // Capture Enable
-        if (CaptureReq) {
-            wen = 1 ;
-            Done = false ;
-            CaptureReq = false ;
-        } else {
-            wen = 0 ;
-            if (Busy) {
-                Busy = false ;
-                Done = true ;
-            }
+// vsync handler
+void OV7670::VsyncHandler(void)
+{
+    // Capture Enable
+    if (CaptureReq) {
+        wen = 1 ;
+        Done = false ;
+        CaptureReq = false ;
+    } else {
+        wen = 0 ;
+        if (Busy) {
+            Busy = false ;
+            Done = true ;
         }
-
-        // Hline Counter
-        LastLines = LineCounter ;
-        LineCounter = 0 ;
     }
-    
-    
-    // Data Read
-    int OV7670::ReadOneByte(void)
-    {
-        int result;
-        rclk = 1;
-        result = dataP;
-/*
-        // Shift the bits around to form the byte
-        int top = result >> 19;         // Isolate the top nibble
-        int middle = result >> 2;       // Isolate bits 2 & 3
-        result = result & 0x00000003;   // Isolate bits 0 & 1      
-        result += middle;
-        result += top;
-  */    
-    
-    //int middle= ((result)& 0xf00)>>4;
-    result= ((result&0x0f)|(((result)& 0xf00)>>4))&0xff;
-      //  int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1) | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
-        int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1) 
-              | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
-              
-        rclk = 0;
-        return top;
-    }
-    
-    // Data Start
-    void OV7670::ReadStart(void)
-    {        
-        rrst = 0 ;
-        oe = 0 ;
-        wait_us(1) ;
+
+    // Hline Counter
+    LastLines = LineCounter ;
+    LineCounter = 0 ;
+}
+
+
+// Data Read
+int OV7670::ReadOneByte(void)
+{
+    int b1;
+    rclk = 1;
+    // result = dataP;
+
+    /*    result= ((result&0x0f)|(((result)& 0xf00)>>4))&0xff;
+          //  int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1) | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
+            int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1)
+                  | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
+        */
+
+    /*
+        int r,r1,r2;
+        rclk = 1 ;
+        r = dataP ;
         rclk = 0 ;
-        wait_us(1) ;
-        rclk = 1 ;
-        wait_us(1) ;        
-        rrst = 1 ;
-    }
-    
-    // Data Stop
-    void OV7670::ReadStop(void)
-    {
-        oe = 1 ;
-        ReadOneByte() ;
-        rclk = 1 ;
-    }
\ No newline at end of file
+        r1 = r & 0x07800000 ;
+        r1 = r1 >> (26-7-0) ; // bit26 to bit7
+        r2 = r & 0x00078000 ;
+        r2 = r2 >> (18-3-0) ; // bit18 to bit3
+        return r1+r2;
+    */
+
+    b1=(((dataP&0x07800000)>>19)|((dataP&0x078000)>>15));
+    rclk = 0;
+    return b1;
+}
+
+int OV7670::ReadOneWord(void)
+{
+    int r,r1,r2,r3,r4 ;
+    rclk = 1 ;
+    r = dataP ;
+    rclk = 0 ;
+    r1 = r & 0x07800000 ;
+    r1 = r1 >> (26-7-0) ; // bit26 to bit7
+    r2 = r & 0x00078000 ;
+    r2 = r2 >> (18-3-0) ; // bit18 to bit3
+    rclk = 1 ;
+    r = dataP ;
+    rclk = 0 ;
+    r3 = r & 0x07800000 ;
+    r3 = r3 >> (26-7-8) ; // bit26 to bit7
+    r4 = r & 0x00078000 ;
+    r4 = r4 >> (18-3-8) ; // bit18 to bit3
+    return r4+r3+r2+r1 ;
+}
+
+
+// Data Start
+void OV7670::ReadStart(void)
+{
+    rrst = 0 ;
+    oe = 0 ;
+    wait_us(1) ;
+    rclk = 0 ;
+    wait_us(1) ;
+    rclk = 1 ;
+    wait_us(1) ;
+    rrst = 1 ;
+}
+
+// Data Stop
+void OV7670::ReadStop(void)
+{
+    oe = 1 ;
+    ReadOneByte() ;
+    rclk = 1 ;
+}
\ No newline at end of file
diff -r 101fbacf126f -r f5f5d7c979cf OV7670.h
--- a/OV7670.h	Wed Nov 16 10:37:49 2016 +0000
+++ b/OV7670.h	Tue Oct 03 16:39:42 2017 +0000
@@ -1,3 +1,4 @@
+#pragma once 
 #include "mbed.h"
 #include "ov7670reg.h"
 
@@ -6,7 +7,7 @@
 #define OV7670_WRITEWAIT (20)
 #define OV7670_NOACK (0)
 #define OV7670_REGMAX (201)
-#define OV7670_I2CFREQ (50000)
+#define OV7670_I2CFREQ (100000)
 
 
 //
@@ -16,25 +17,7 @@
 {
     
 public:  
-volatile int LineCounter ;
-    volatile int LastLines ;
-    volatile bool CaptureReq ;
-    volatile bool Busy ;
-    volatile bool Done ;  
-        void CaptureNext(void);
-        bool CaptureDone(void);
-            void WriteReg(int addr,char data);
-        void Reset(void);
-        void test(void);
-        void InitQQVGA(void);
-            char ReadReg(int addr);
-    int ReadOneByte(void);
-    void ReadStart(void);
-    void ReadStop(void);
-    void VsyncHandler(void);
-    InterruptIn vsync;
-
-    OV7670(
+OV7670(
         PinName sda,// Camera I2C port
         PinName scl,// Camera I2C port
         PinName vs, // VSYNC
@@ -45,26 +28,35 @@
         PinName rt, // /RRST
         PinName o,  // /OE
         PinName rc  // RCLK      
-        ) : camera(sda,scl),vsync(vs),href(hr),wen(we),dataP(port,mask),rrst(rt),oe(o),rclk(rc)
-    {
-        //camera.stop() ;
-        camera.frequency(OV7670_I2CFREQ) ;
-      //  camera.start() ;
+        ) ;
+        
+                 ~OV7670();
 
-        CaptureReq = false ;
-        Busy = false ;
-        Done = false ;
-        LineCounter = 0 ;
-        rrst = 1 ;
-        oe = 1 ;
-        rclk = 1 ;
-        wen = 0 ;
-             vsync.rise(this,&OV7670::VsyncHandler) ;
-    }
-protected:
+        void CaptureNext(void);
+        bool CaptureDone(void);
+            void WriteReg(int addr,char data);
+        void Reset(void);
+        void test(void);
+        void InitQQVGA(int SIZEX);
+            char ReadReg(int addr);
+    int ReadOneByte(void);
+    int ReadOneWord(void);
+    void ReadStart(void);
+    void ReadStop(void);
+    void VsyncHandler(void);
+          
+
+private:
     I2C camera ;
+    InterruptIn vsync;
     DigitalIn href;
     DigitalOut wen ;
     PortIn dataP;
     DigitalOut rrst,oe,rclk ;
+            volatile int LineCounter;
+        volatile int LastLines;
+        volatile bool CaptureReq;
+        volatile bool Busy;
+        volatile bool Done; 
+        char *format_temp;
     };
diff -r 101fbacf126f -r f5f5d7c979cf ov7670reg.h
--- a/ov7670reg.h	Wed Nov 16 10:37:49 2016 +0000
+++ b/ov7670reg.h	Tue Oct 03 16:39:42 2017 +0000
@@ -120,3 +120,26 @@
 #define REG_HAECC6      0xa9    /* Hist AEC/AGC control 6 */
 #define REG_HAECC7      0xaa    /* Hist AEC/AGC control 7 */
 #define REG_BD60MAX     0xab    /* 60hz banding step limit */
+
+
+#define MTX1            0x4f    /* Matrix Coefficient 1 */
+#define MTX2            0x50    /* Matrix Coefficient 2 */
+#define MTX3            0x51    /* Matrix Coefficient 3 */
+#define MTX4            0x52    /* Matrix Coefficient 4 */
+#define MTX5            0x53    /* Matrix Coefficient 5 */
+#define MTX6            0x54    /* Matrix Coefficient 6 */
+#define REG_CONTRAS     0x56    /* Contrast control */
+#define MTXS            0x58    /* Matrix Coefficient Sign */
+#define AWBC7           0x59    /* AWB Control 7 */
+#define AWBC8           0x5a    /* AWB Control 8 */
+#define AWBC9           0x5b    /* AWB Control 9 */
+#define AWBC10          0x5c    /* AWB Control 10 */
+#define AWBC11          0x5d    /* AWB Control 11 */
+#define AWBC12          0x5e    /* AWB Control 12 */
+#define REG_GFIX        0x69    /* Fix gain control */
+#define GGAIN           0x6a    /* G Channel AWB Gain */
+#define DBLV            0x6b    
+#define AWBCTR3         0x6c    /* AWB Control 3 */
+#define AWBCTR2         0x6d    /* AWB Control 2 */
+#define AWBCTR1         0x6e    /* AWB Control 1 */
+#define AWBCTR0         0x6f    /* AWB Control 0 */
\ No newline at end of file