OV7670 no FIFO Nucleo F411
Dependencies: mbed OV7670 FastPWM
main.cpp@3:a73f9d592bf7, 2020-04-20 (annotated)
- Committer:
- rulla
- Date:
- Mon Apr 20 15:16:11 2020 +0000
- Revision:
- 3:a73f9d592bf7
- Parent:
- 2:9c5089ac2596
nm
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mio | 0:d69a19a5c0ff | 1 | // |
mio | 0:d69a19a5c0ff | 2 | // OV7670 + FIFO AL422B camera board test |
mio | 0:d69a19a5c0ff | 3 | // |
mio | 0:d69a19a5c0ff | 4 | #include "mbed.h" |
rulla | 2:9c5089ac2596 | 5 | #include <stdio.h> |
rulla | 2:9c5089ac2596 | 6 | #include <stdlib.h> |
rulla | 2:9c5089ac2596 | 7 | #include <string.h> |
rulla | 2:9c5089ac2596 | 8 | #include "OV7670.h" |
rulla | 2:9c5089ac2596 | 9 | #include "FastPWM.h" |
mio | 0:d69a19a5c0ff | 10 | |
rulla | 2:9c5089ac2596 | 11 | #define SIZEX 320 |
rulla | 2:9c5089ac2596 | 12 | #define SIZEY 240 |
rulla | 2:9c5089ac2596 | 13 | |
rulla | 2:9c5089ac2596 | 14 | OV7670 camera( |
rulla | 2:9c5089ac2596 | 15 | D14,D15, // SDA,SCL(I2C / SCCB) |
rulla | 2:9c5089ac2596 | 16 | // PortC,0x160, // VSYNC,HREF,pclk -> PC_5,PC_6,PC_8 |
rulla | 2:9c5089ac2596 | 17 | PortA,0x000000E0, // VSYNC,HREF,pclk -> PA_7,PA_6,PA_5 |
rulla | 2:9c5089ac2596 | 18 | PortB,0x0000E03E); //D7-D0: PB_15, PB_14, PB_13, PB_5, PB_4, PB_3, PB_2, PB_1 |
rulla | 2:9c5089ac2596 | 19 | |
rulla | 2:9c5089ac2596 | 20 | FastPWM xclk(D7); |
mio | 0:d69a19a5c0ff | 21 | |
rulla | 1:b5475be96383 | 22 | Serial pc(USBTX,USBRX); |
rulla | 2:9c5089ac2596 | 23 | //Timer tempo; |
rulla | 2:9c5089ac2596 | 24 | DigitalOut led(D10); |
mio | 0:d69a19a5c0ff | 25 | |
rulla | 2:9c5089ac2596 | 26 | double freq; |
rulla | 2:9c5089ac2596 | 27 | |
rulla | 1:b5475be96383 | 28 | |
rulla | 2:9c5089ac2596 | 29 | void flushSerial(void) { char char1 = 0; while (pc.readable()) { char1 = pc.getc(); } return; } |
rulla | 2:9c5089ac2596 | 30 | |
mio | 0:d69a19a5c0ff | 31 | |
mio | 0:d69a19a5c0ff | 32 | int main() { |
mio | 0:d69a19a5c0ff | 33 | |
rulla | 2:9c5089ac2596 | 34 | int k=0, rb=0, c, i; |
mio | 0:d69a19a5c0ff | 35 | |
rulla | 2:9c5089ac2596 | 36 | xclk.period(0.5e-7); //MAGIC VALUE 0.5e-7 |
rulla | 2:9c5089ac2596 | 37 | xclk.write(0.5); |
rulla | 2:9c5089ac2596 | 38 | |
rulla | 2:9c5089ac2596 | 39 | pc.baud(921600); |
rulla | 2:9c5089ac2596 | 40 | |
rulla | 2:9c5089ac2596 | 41 | uint8_t bank[76801]; |
rulla | 2:9c5089ac2596 | 42 | |
rulla | 2:9c5089ac2596 | 43 | for(i=0;i<76801;i++) bank[i]=0; |
rulla | 2:9c5089ac2596 | 44 | |
rulla | 2:9c5089ac2596 | 45 | double fr=12000000.0; |
rulla | 2:9c5089ac2596 | 46 | const char *temp="START"; |
rulla | 2:9c5089ac2596 | 47 | |
rulla | 2:9c5089ac2596 | 48 | wait(0.05); |
rulla | 2:9c5089ac2596 | 49 | |
rulla | 2:9c5089ac2596 | 50 | camera.Reset(fr) ; |
rulla | 2:9c5089ac2596 | 51 | |
rulla | 2:9c5089ac2596 | 52 | int cnt=0; |
rulla | 2:9c5089ac2596 | 53 | char data1[OV7670_REGMAX],data2[OV7670_REGMAX]; |
rulla | 2:9c5089ac2596 | 54 | |
rulla | 2:9c5089ac2596 | 55 | for (i=0;i<OV7670_REGMAX;i++) |
rulla | 2:9c5089ac2596 | 56 | { |
rulla | 2:9c5089ac2596 | 57 | data1[i]=camera.ReadReg(i); // READ REG |
rulla | 2:9c5089ac2596 | 58 | // if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); |
rulla | 2:9c5089ac2596 | 59 | // pc.printf("Addr %02X = %02X ,",i,data1[i]); |
rulla | 2:9c5089ac2596 | 60 | } |
rulla | 2:9c5089ac2596 | 61 | camera.Init(0,SIZEX) ; |
rulla | 2:9c5089ac2596 | 62 | |
rulla | 2:9c5089ac2596 | 63 | for (i=0;i<OV7670_REGMAX;i++) |
mio | 0:d69a19a5c0ff | 64 | { |
rulla | 2:9c5089ac2596 | 65 | // data2[i]=camera.ReadReg(i); // READ REG |
rulla | 2:9c5089ac2596 | 66 | // pc.printf("data2= %02X\n",data2[i]); |
rulla | 2:9c5089ac2596 | 67 | // if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); |
rulla | 2:9c5089ac2596 | 68 | // if(data1[i]!=data2[i]) pc.printf("CHANGED %02X = %02X/%02X ,",i,data1[i],data2[i]); |
rulla | 2:9c5089ac2596 | 69 | } |
rulla | 2:9c5089ac2596 | 70 | |
rulla | 2:9c5089ac2596 | 71 | wait(0.1); |
rulla | 2:9c5089ac2596 | 72 | |
rulla | 2:9c5089ac2596 | 73 | // tempo.start(); |
rulla | 2:9c5089ac2596 | 74 | int j=0,idx=0,index=0; |
rulla | 2:9c5089ac2596 | 75 | // float time, t0; |
rulla | 2:9c5089ac2596 | 76 | |
rulla | 2:9c5089ac2596 | 77 | uint8_t ss, sss; |
rulla | 2:9c5089ac2596 | 78 | |
rulla | 2:9c5089ac2596 | 79 | led=0; |
rulla | 2:9c5089ac2596 | 80 | |
rulla | 2:9c5089ac2596 | 81 | // camera.shot(SIZEX,SIZEY,bank); |
rulla | 2:9c5089ac2596 | 82 | |
rulla | 2:9c5089ac2596 | 83 | while(1){ |
rulla | 2:9c5089ac2596 | 84 | |
rulla | 2:9c5089ac2596 | 85 | /* |
rulla | 2:9c5089ac2596 | 86 | time=tempo.read(); |
rulla | 2:9c5089ac2596 | 87 | if(j==0) t0=time; |
rulla | 2:9c5089ac2596 | 88 | time-=t0; |
rulla | 2:9c5089ac2596 | 89 | // printf("\n%f\n",time); |
rulla | 2:9c5089ac2596 | 90 | |
rulla | 2:9c5089ac2596 | 91 | if(time>2.0) { |
rulla | 2:9c5089ac2596 | 92 | tempo.stop(); |
rulla | 2:9c5089ac2596 | 93 | t0=tempo.read(); |
rulla | 2:9c5089ac2596 | 94 | // printf("%f Iteration n. %d, Freq= %.9f\n",time,i,1.0/freq); |
rulla | 2:9c5089ac2596 | 95 | // i+=5; |
rulla | 2:9c5089ac2596 | 96 | i+=0x01; |
rulla | 2:9c5089ac2596 | 97 | } |
rulla | 2:9c5089ac2596 | 98 | |
rulla | 2:9c5089ac2596 | 99 | if(i>0x8f) i=0x0; |
rulla | 2:9c5089ac2596 | 100 | */ |
rulla | 2:9c5089ac2596 | 101 | |
rulla | 2:9c5089ac2596 | 102 | // pc.abort_write(); |
rulla | 2:9c5089ac2596 | 103 | flushSerial(); |
rulla | 2:9c5089ac2596 | 104 | // pc.send_break(); |
rulla | 2:9c5089ac2596 | 105 | |
rulla | 2:9c5089ac2596 | 106 | |
rulla | 2:9c5089ac2596 | 107 | char str[25], test[25]; |
rulla | 2:9c5089ac2596 | 108 | for (int g=0;g<25;g++) str[g]=0; |
rulla | 2:9c5089ac2596 | 109 | uint8_t reg,dat; |
rulla | 2:9c5089ac2596 | 110 | |
rulla | 2:9c5089ac2596 | 111 | uint8_t buf=pc.getc(); |
rulla | 2:9c5089ac2596 | 112 | k=0; |
rulla | 2:9c5089ac2596 | 113 | str[k]=buf; |
rulla | 2:9c5089ac2596 | 114 | |
rulla | 2:9c5089ac2596 | 115 | |
rulla | 2:9c5089ac2596 | 116 | while(str[k]!='\n'){ |
rulla | 2:9c5089ac2596 | 117 | k++; |
rulla | 2:9c5089ac2596 | 118 | str[k]=pc.getc(); |
mio | 0:d69a19a5c0ff | 119 | } |
rulla | 2:9c5089ac2596 | 120 | |
rulla | 2:9c5089ac2596 | 121 | pc.printf("ECHO %s\n",str); |
rulla | 2:9c5089ac2596 | 122 | if(sscanf(str,"R_%d,%u",®,&dat)!=0) { |
rulla | 2:9c5089ac2596 | 123 | camera.WriteReg((int)reg,dat); |
rulla | 2:9c5089ac2596 | 124 | pc.printf("ECHO REGACK\n"); |
rulla | 2:9c5089ac2596 | 125 | } |
rulla | 2:9c5089ac2596 | 126 | |
rulla | 2:9c5089ac2596 | 127 | if(sscanf(str,"I_%d",®)!=0) { |
rulla | 2:9c5089ac2596 | 128 | camera.Init2(); |
rulla | 2:9c5089ac2596 | 129 | pc.printf("ECHO INTACK\n"); |
rulla | 2:9c5089ac2596 | 130 | } |
rulla | 2:9c5089ac2596 | 131 | |
rulla | 2:9c5089ac2596 | 132 | int n=0; |
rulla | 2:9c5089ac2596 | 133 | for(i=0;i<k;i++){ |
rulla | 2:9c5089ac2596 | 134 | if (str[i]==temp[i]) n++; |
rulla | 2:9c5089ac2596 | 135 | } |
rulla | 2:9c5089ac2596 | 136 | |
rulla | 2:9c5089ac2596 | 137 | if(n==(strlen(temp))){ |
rulla | 2:9c5089ac2596 | 138 | // pc.printf("ECHO FOUND\n"); |
rulla | 2:9c5089ac2596 | 139 | |
rulla | 2:9c5089ac2596 | 140 | camera.shot(SIZEX,SIZEY,bank); |
rulla | 2:9c5089ac2596 | 141 | c=0; |
rulla | 2:9c5089ac2596 | 142 | |
rulla | 2:9c5089ac2596 | 143 | pc.printf("FrameStart\n"); |
rulla | 2:9c5089ac2596 | 144 | for(j=0;j<SIZEY;j++){ |
rulla | 2:9c5089ac2596 | 145 | for(i=0;i<SIZEX;i++) { |
rulla | 2:9c5089ac2596 | 146 | pc.printf("%d ",bank[c]); |
rulla | 2:9c5089ac2596 | 147 | wait_us(40); |
rulla | 2:9c5089ac2596 | 148 | c++; |
rulla | 2:9c5089ac2596 | 149 | } |
rulla | 2:9c5089ac2596 | 150 | pc.printf("\n"); |
rulla | 2:9c5089ac2596 | 151 | } |
rulla | 2:9c5089ac2596 | 152 | wait_ms(250); |
rulla | 2:9c5089ac2596 | 153 | pc.printf("FrameEnd\n"); |
rulla | 2:9c5089ac2596 | 154 | |
rulla | 2:9c5089ac2596 | 155 | } |
rulla | 2:9c5089ac2596 | 156 | led=!led; |
rulla | 2:9c5089ac2596 | 157 | |
mio | 0:d69a19a5c0ff | 158 | } |
rulla | 2:9c5089ac2596 | 159 | } |