OV7670 + 23LC1024 + Bluetooth
Dependencies: FastPWM MODSERIAL mbed
main.cpp@0:f309a2b2f27b, 2013-07-22 (annotated)
- Committer:
- sampullman
- Date:
- Mon Jul 22 23:55:34 2013 +0000
- Revision:
- 0:f309a2b2f27b
- Child:
- 1:6e4d2cff76e8
Successful OV7670 camera test with QQVGA resolution and no peripherals.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sampullman | 0:f309a2b2f27b | 1 | #include "mbed.h" |
sampullman | 0:f309a2b2f27b | 2 | #include "OV7670.h" |
sampullman | 0:f309a2b2f27b | 3 | #include "FastPWM.h" |
sampullman | 0:f309a2b2f27b | 4 | |
sampullman | 0:f309a2b2f27b | 5 | #define SIZEX (160) |
sampullman | 0:f309a2b2f27b | 6 | #define SIZEY (120) |
sampullman | 0:f309a2b2f27b | 7 | #define SIZE 19200 |
sampullman | 0:f309a2b2f27b | 8 | |
sampullman | 0:f309a2b2f27b | 9 | OV7670 camera( |
sampullman | 0:f309a2b2f27b | 10 | p28, p27, // SDA,SCL(I2C / SCCB) |
sampullman | 0:f309a2b2f27b | 11 | p21, p22, p23, p24, // XCLK, PCLK, VSYNC, HREF |
sampullman | 0:f309a2b2f27b | 12 | Port0, 0x07878000); // D0-D7 -> P11-p18 |
sampullman | 0:f309a2b2f27b | 13 | |
sampullman | 0:f309a2b2f27b | 14 | Serial host(USBTX, USBRX); |
sampullman | 0:f309a2b2f27b | 15 | DigitalOut status(p20); |
sampullman | 0:f309a2b2f27b | 16 | |
sampullman | 0:f309a2b2f27b | 17 | unsigned char bank0[SIZE]; |
sampullman | 0:f309a2b2f27b | 18 | unsigned char *bank1 = (unsigned char *)(0x2007C000); |
sampullman | 0:f309a2b2f27b | 19 | |
sampullman | 0:f309a2b2f27b | 20 | int hexToInt(int i) { |
sampullman | 0:f309a2b2f27b | 21 | if(i >= '0' && i <= '9') return i - '0'; |
sampullman | 0:f309a2b2f27b | 22 | else if(i >= 'A' && i <= 'F') return i - 55; |
sampullman | 0:f309a2b2f27b | 23 | else return 0; |
sampullman | 0:f309a2b2f27b | 24 | } |
sampullman | 0:f309a2b2f27b | 25 | |
sampullman | 0:f309a2b2f27b | 26 | int getHexWord(Serial *ser) { |
sampullman | 0:f309a2b2f27b | 27 | int b1 = ser->getc(); |
sampullman | 0:f309a2b2f27b | 28 | int b2 = ser->getc(); |
sampullman | 0:f309a2b2f27b | 29 | return (hexToInt(b1) << 4) | hexToInt(b2); |
sampullman | 0:f309a2b2f27b | 30 | } |
sampullman | 0:f309a2b2f27b | 31 | |
sampullman | 0:f309a2b2f27b | 32 | void sendImage() { |
sampullman | 0:f309a2b2f27b | 33 | // Write the image to the serial host |
sampullman | 0:f309a2b2f27b | 34 | for (int i = 0; i < SIZE; i++) { |
sampullman | 0:f309a2b2f27b | 35 | while(!(host.writeable())) {} |
sampullman | 0:f309a2b2f27b | 36 | host.putc(bank0[i]); |
sampullman | 0:f309a2b2f27b | 37 | while(!(host.writeable())) {} |
sampullman | 0:f309a2b2f27b | 38 | host.putc(bank1[i]); |
sampullman | 0:f309a2b2f27b | 39 | } |
sampullman | 0:f309a2b2f27b | 40 | } |
sampullman | 0:f309a2b2f27b | 41 | |
sampullman | 0:f309a2b2f27b | 42 | int main() { |
sampullman | 0:f309a2b2f27b | 43 | host.baud(115200); |
sampullman | 0:f309a2b2f27b | 44 | |
sampullman | 0:f309a2b2f27b | 45 | // Initialize a 12Mhz XCLK for the camera |
sampullman | 0:f309a2b2f27b | 46 | camera.Init(); |
sampullman | 0:f309a2b2f27b | 47 | |
sampullman | 0:f309a2b2f27b | 48 | // Reset camera on power up |
sampullman | 0:f309a2b2f27b | 49 | camera.Reset(); |
sampullman | 0:f309a2b2f27b | 50 | |
sampullman | 0:f309a2b2f27b | 51 | // Set up for 160*120 pixels RGB565 |
sampullman | 0:f309a2b2f27b | 52 | camera.InitQQVGA(); |
sampullman | 0:f309a2b2f27b | 53 | |
sampullman | 0:f309a2b2f27b | 54 | char c; |
sampullman | 0:f309a2b2f27b | 55 | while(1) { |
sampullman | 0:f309a2b2f27b | 56 | if(host.readable()) { |
sampullman | 0:f309a2b2f27b | 57 | c = host.getc(); |
sampullman | 0:f309a2b2f27b | 58 | } else { |
sampullman | 0:f309a2b2f27b | 59 | continue; |
sampullman | 0:f309a2b2f27b | 60 | } |
sampullman | 0:f309a2b2f27b | 61 | if(c == 'r') { |
sampullman | 0:f309a2b2f27b | 62 | int reg = getHexWord(&host); |
sampullman | 0:f309a2b2f27b | 63 | host.printf("%d\n\r", camera.ReadReg(reg)); |
sampullman | 0:f309a2b2f27b | 64 | } else if(c == 'w') { |
sampullman | 0:f309a2b2f27b | 65 | int reg = getHexWord(&host); |
sampullman | 0:f309a2b2f27b | 66 | int val = getHexWord(&host); |
sampullman | 0:f309a2b2f27b | 67 | camera.WriteReg(reg, val); |
sampullman | 0:f309a2b2f27b | 68 | host.printf("%d\n\r", camera.ReadReg(reg)); |
sampullman | 0:f309a2b2f27b | 69 | } else if(c == 't') { |
sampullman | 0:f309a2b2f27b | 70 | camera.scopeTest(&host); |
sampullman | 0:f309a2b2f27b | 71 | } else if(c == 'c') { |
sampullman | 0:f309a2b2f27b | 72 | status = 1; |
sampullman | 0:f309a2b2f27b | 73 | int bytes = camera.captureImage(bank0, bank1); |
sampullman | 0:f309a2b2f27b | 74 | //host.printf("%d\n", bytes); |
sampullman | 0:f309a2b2f27b | 75 | sendImage(); |
sampullman | 0:f309a2b2f27b | 76 | status = 0; |
sampullman | 0:f309a2b2f27b | 77 | } |
sampullman | 0:f309a2b2f27b | 78 | } |
sampullman | 0:f309a2b2f27b | 79 | } |
sampullman | 0:f309a2b2f27b | 80 |