TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: groundman en 26 de Junio de 2016, 14:56:36

Título: Camara OV7670
Publicado por: groundman en 26 de Junio de 2016, 14:56:36

Hola a todos estas son las pruebas con la camara OV7670,pic18f87k22 y el ICD3.

en primer lugar.el voltage con el que trabajaremos tanto en la camara como en el pic.es de 3.3v
al terminal RESET de la camara no se le conectara ningun terminal.aunque en el datasheet de la camara dice que 1 es modo reset.es todo lo contrario.y si ponemos este pin a masa
la camara no funcionara.porque se estaria reseteando.

El pic trabajara con el oscilador interno a 64Mhz

El pin XCLX le conectaremos un oscilador externo de 10Mhz que es a la minima frecuencia que puede trabajar la camara.ya que aunque las señales de sincronismo
VSYNC y HREF funcionan.los circuitos de barrido interno no funcionan.y los datos del video no reaccionan.pude ver la señal en un osciloscopio.y tapando
y descubriendo la optica las salidas no hacian nada.cosa que si hacen a su frecuencia.

El pin RE3/REFO del pic se puede configurar para sacar una frecuencia desde f/osc hasta varias divisiones.pero la mas cercana a 10Mhz son 8Mhz y ya lo he probado.
y no funciona.el problema es que este pic se queda corto para esta camara.ya que la camara trabaja a un minimo de 10Mhz con un ciclo de reloj de 100ns
y el pic trabajando a 64Mhz la instruccion mas simple consume 64ns.y lo recomendable seria que consumiera menos de 50ns.asi que haria falta un pic mas rapido.

aunque tambien he probado con 10Mhz y la camara no responde a la luz.asi que o busco un chip mas potente o me olvido de esto.




Título: Re:Camara OV7670
Publicado por: groundman en 26 de Junio de 2016, 15:53:31
creo que con un pic de 120Mhz la camara puede funcionar.alguien me recomienda alguno que sea parecido al 18F87k22 en prestaciones y precio?
Título: Re:Camara OV7670
Publicado por: luismh en 26 de Junio de 2016, 16:35:31
Hola! Hace unos meses estuve jugando con esta camarita
Compré 2 versiones: una con una memoria FIFO donde guarda los datos y otra sin memoria...

La diferencia entre ambas es abismal!

Que versiones tenés?

Si tenés la versión sin FIFO, entonces definitivamente vas a necesitar algo más rápido y probablemente una memoria externa para guardar los datos. Intenté con un dsPIC33FJ128GP802 a 80MHz(lo máximo con este pic) y nunca pude: primero porque era muy lento y segundo porque la memoria del micro era insuficiente... Lo solucioné con un raspberryPi.

Lamentablemente creo que no se puede con ningún pic de gama media.. tendrás que pensar en

La versión con FIFO es muuy fácil de implementar!! La cámara ya trae todo! Solo le mandas un pulso para que saque la foto y automáticamente guarda todos los datos en la FIFO. Luego extraes la información a la velocidad que quieras.. Lo hice con un pic16f88 a 4MHZ!!.
Lo que si vas a necesitar implementar alguna forma para ver la imagen(yo guardaba en una SD y luego la veía en la PC. Para esto tendrás que implementar un sistema de archivos FAT16 o 32). Tomar una foto VGA me tomaba casi 5 minutos!!

Personalmente me llevó mucho tiempo y esfuerzo mental ponerla a andar. Espero que lo logres!

Saludos!
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 26 de Junio de 2016, 17:30:40
gracias por responder luismh.mi intencion hera crear algo parecido a lo que es un calibre laser.es decir proyectar la imagen de un hilo de 1.75mm de diametro y calcular su diametro.
para esto no me hace falta mucha memoria.en realidad solo haria falta una linea horizontal.que segun el datasheet de la camara ocuparia 1024bytes.2 bytes por cada pixel de 640pixel por linea.

pero no tuve en cuenta que el barrido interno de la camara me iba a dar problemas.voy a tener que inyectar a la camara 16Mhz.que con esta velocidad si me funciona la sensivilidad
de recepcion de la matriz receptora de imagen.y de alguna manera sincronizar la recepcion de los datos sin tener encuenta el PCLK que lo usaba para este sincronismo.pero que
me quita velocidad al chip.si lo logro no me haria falta mas velocidad.

ah.le hechare un vistazo a la camara con FIFO que comentas.me podria servir para otros proyectos.
Título: Re:Camara OV7670
Publicado por: groundman en 26 de Junio de 2016, 18:02:06
acabo de mirar lo de la FIFO  AL422B. y por menos de 2€ se puede adaptar a las camaras OV7670  que he comprado.si quieres la camara con el chip adaptado.sale por 9€.lo que te ahorras es hacer la PCB.
Título: Re:Camara OV7670
Publicado por: luismh en 27 de Junio de 2016, 15:43:14
Si está dentro de tus posibilidades, te sugiero que lo intentes con la versión con FIFO  incluida.

En teoría, solo necesitarías 1024 bytes, pero configurar la cámara para que te entregue solo esta cantidad de información puede resultar difícil y confuso. La cámara tiene una gran cantidad de registros y lamentablemente están muy mal documentados(Por ej: leyendo en foros me di con que era vital configurar algunos registros que en el manual figuraban como no implementados :shock:); y además están implementados de una manera poco intuitiva(si estás acostumbrado a los nobles registros de los pics, entonces notarás la diferencia).

No es mi intención desmotivarte, solo te cuento que a mi me costó bastante(aclaro que no soy exactamente un gran iluminado).

Una buena idea sería comenzar a probar con el bus serie de la cámara para configurar sus registros(es un protocolo muuy parecido a I2C, no deberías tener mayores inconvenientes). Puedes empezar a leer los registros y comparar con los valores por defecto que vienen de fábrica y luego puedes empezar a escribirlos y luego leerlos para confirmar la escritura exitosa. Un display LCD 2x16 puede servir para esto.

Manejar el bus I2C me parece importante antes que comenzar a lidiar con la señales de sincronismos e información.
Tiene una memoria volátil por lo que tendrás que configurar los registros siempre que inicie tu programa.

Me comentas tus avances!
Y si hay algo en lo que pueda aportar, lo haré!

Saludos!
Luis.






Título: Re:Camara OV7670
Publicado por: groundman en 30 de Junio de 2016, 10:31:40
te agradezco la ayuda.ya he pedido la camara con FIFO includa.supongo que antes de un mes la tendre en mi poder.claro que para practicar con el I2C me puede servir las que tengo.
el problema es que he estado loco perdido intentando leer por I2C los registros de la camara sin ningun exito. ni siquiera con un 18F2550.si he podido leer una 24L16 bien y algun DS1307
pero con errores porque creo que esta roto.

sin embargo de tras camaras que tengo.no he podido pasar de la fase de Start y Escritura de los bytes de ID y direccion.parece como si la camara no respondiera.los bytes de escritura y lectura
creo que son 0x42 y 0x43 respetivamente.pero no me funciona.no se si es porque el tipo de comunicacion es diferente a los 24LC16 o un DS1307 que usan la comunicacion standar de I2C

o es porque no le tenia una frecuencia por PCLK de la camara.aunque para sincronizar I2C solo deberia hacer fata GND,SCL y SDA.
Título: Re:Camara OV7670
Publicado por: luismh en 30 de Junio de 2016, 14:29:53
No te preocupes por PCLK. Puedes comunicarte con la cámara sin esta señal.

Estás tratando de hacer una red I2C? Probaría primero con la cámara y luego agregaría la memoria y el RTC.
Las direcciones son correctas: 0x42 para escritura y 0x43 para lectura.

La frecuencia máxima del bus es 100KHz(SCL). Con 70Khz anduvo bien para mi.
Para estas frecuencias(menores a 100khz), Microchip recomienda pull-up de 4.7k en ambas líneas.

Para lectura de registros usé dos fases de comunicación:
En la primera fase:
-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro de leer y se espera ACK de cámara.
-se cierra el bus(STOP)

En la segunda fase:
-se abre el bus(START)
-se envía comando lectura(0x43) y se espera ACK de cámara
-se invierte el sentido de información en el bus(estuvimos enviando desde el pic... ahora nos preparamos para recibir la respuesta)
-se lee registro y se envía NACK(significa que se recibió la respuesta y no se desea seguir con la comunicación por ahora.)
-se cierra el bus(STOP)

Entre cada línea de las secuencias anteriores tuve que agregar un retardo de 10useg sino no funcionaba
Tengo un código en C30, quieres q lo suba?.. tal vez puedas ver la secuencia. No se si estás familiarizado con los registros de dspics

Saludos.
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 01 de Julio de 2016, 17:23:59
intentare hacer lo que dices.haber si puedo tener comuncacion.respecto al codigo,solo programo en ASM.se JAVA para programar en android.y es muy parecido al C.pero por el poco tiempo
que tengo.de momento prefiero seguir en el ASM respecto a los pic.aunque cada vez los pic son mas potentes,de momento a mi parecer en algunas aplicaciones se me antojan lentos.
haber si algun dia no me da lastima desperdiciar recursos de un pic.pero por el momento prefiero aprovechar hasta el ultimo bit.saludos y gracias.

PD:epero tener buenos resultados pronto.essty ansioso por ver funcionar la camara.
Título: Re:Camara OV7670
Publicado por: luismh en 04 de Julio de 2016, 09:03:21
Ok. Si tenés alguna duda, escribí.

A mi también me gusta escribir en assembler y exprimir cada bit de cada registro.. pero a partir de los micros de 16 bits, escribir en C es bastante tentador.
Tenés un osciloscopio? Suele ser de mucha utilidad en las comunicaciones seriales.

Saludos!
Luis.

Título: Re:Camara OV7670
Publicado por: groundman en 04 de Julio de 2016, 15:17:31
si tengo osciloscopio y es muy util.la verdad.respecto a usar o no un pic de gama mas alta que por ejemplo el 18F87k22 que estoy usand .solo me lo limita el precio.no tengo miedo a programar en ASM para estos pic.si es cierto que cuanto mas avanzados son los pic,menos ejemplos hay en ASM.el 18f87k22 sale por unos 5€.si un pic de la gama 33F valiera igual.pues me pasaria a este.
lo malo es que pasarse a un pic de una gama mas alta no garantiza que internamente tenga mas perifericos.
Título: Re:Camara OV7670
Publicado por: groundman en 05 de Julio de 2016, 11:00:43
hola luismh.por el momento no logro que funcione el i2c con la camara.estoy usando el modulo interno del pic para esto.y como dices que usas un retardo de 10uS para cada linea,no se a que te refieres.

es antes de la llamada a una de las rutinas del i2c.o el codigo que usas no maneja el i2c interno del pic? porque no se si se puede controlar un retardo en estas condiciones.ya que el envio
de datos por la linea SCK o SDI la gestiona internamente el pic.
Título: Re:Camara OV7670
Publicado por: luismh en 05 de Julio de 2016, 12:15:54
Hola!, tal vez me expresé mal... No son 10useg entre cada línea de código, sino entre cada fase de la comunicación

La secuencia para leer un registro es así:

-Aseguro que el bus está libre
-Envío Start y espero que termine
-Retardo
-Envío 0x42 al bus y espero que se complete el envío
-Espero ACK de cámara
-Retardo
-Envío dirección de registro a leer y espero que se complete el envío.
-Espero ACK de cámara
-Retardo
-Envío Stop

;Hasta aquí enviamos dos palabras a la cámara: dirección en bus y dirección de registro en cámara
;Ahora abrimos de nuevo el bus y nos preparamos para recibir su respuesta.

-Me aseguro que el bus está libre.
-Envío Start y espero que termine.
-Envío 0x43 y espero que se complete el envío.
-Espero ACK de cámara.
-Retardo
-Cambio dirección de bus para permitirle enviar información a la cámara.
-Espero que se complete el envío desde cámara.
-Retardo.
-Leo dato y lo guardo en alguna variable.
-Envío NACK y espero que se complete el envío.
-Retardo.
-Envío Stop.
-Retardo

Primero intenté sin retardos, y me leía mal, luego de agregarlos, me quedó funcionando perfecto.

Te paso mi código en C30 para un dsPIC. Es una función sencilla que le mandas una dirección de registro de la cámara y devuelve el valor guardado en él. Tal vez puedas sacarle algo:

Código: C
  1. unsigned char LeerOV7670(unsigned char direccion){
  2.        
  3.         unsigned char dato = 0;
  4.        
  5.        
  6.        
  7.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  8.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  9.        
  10.         I2C1CONbits.SEN=1;                      //Inicio secuencia de start.
  11.         while(I2C1CONbits.SEN);                 //Espero aquí hasta que finalice secuencia de start.
  12.        
  13.         __delay_us(DELAY_US);
  14.        
  15.         I2C1TRN = WriteAddressOV7670;           //Cargo dato a enviar en buffer.
  16.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  17.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  18.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  19.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  20.        
  21.         __delay_us(DELAY_US);
  22.        
  23.         I2C1TRN = direccion;                    //Cargo dato a enviar en buffer.
  24.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  25.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  26.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  27.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  28.        
  29.         __delay_us(DELAY_US);
  30.        
  31.        
  32.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  33.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  34.        
  35.        
  36.         I2C1CONbits.PEN =1;                     //Inicio secuencia de STOP.
  37.         while(I2C1CONbits.PEN);                 //Espero aquí hasta que finalice secuencia STOP.
  38.        
  39.         __delay_us(DELAY_US);
  40.        
  41.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  42.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  43.        
  44.         I2C1CONbits.SEN=1;                      //Inicio secuencia de start.
  45.         while(I2C1CONbits.SEN);                 //Espero aquí hasta que finalice secuencia de start.
  46.        
  47.         __delay_us(DELAY_US);
  48.        
  49.         I2C1TRN = ReadAddressOV7670;            //Cargo dato a enviar en buffer.
  50.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  51.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  52.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  53.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  54.        
  55.         __delay_us(DELAY_US);
  56.        
  57.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  58.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  59.        
  60.         I2C1CONbits.RCEN = 1;                   //Cambio dirección de bus.
  61.         while(I2C1CONbits.RCEN);                //Espero aquí hasta que se completa envío de byte (8 bits).
  62.        
  63.         __delay_us(DELAY_US);
  64.        
  65.         dato = I2C1RCV;                         //Leo dato.
  66.        
  67.        
  68.         I2C1CONbits.ACKDT=1;                    //Prepara para enviar NACK
  69.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  70.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  71.        
  72.         I2C1CONbits.ACKEN=1;                    //Envío NACK
  73.         while(I2C1CONbits.ACKEN);               //Espero aquí hasta que finalice secuencia NACK.
  74.         I2C1CONbits.ACKDT=0;                    //Reestablezco ACK.
  75.        
  76.         __delay_us(DELAY_US);
  77.        
  78.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  79.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  80.        
  81.         I2C1CONbits.PEN =1;                     //Inicio secuencia de STOP.
  82.         while(I2C1CONbits.PEN);                 //Espero aquí hasta que finalice secuencia STOP.
  83.        
  84.         __delay_us(DELAY_US);
  85.        
  86.         return dato;   
  87. }

Saludos.
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 09 de Julio de 2016, 11:51:22
porfin  :-/ :-/ :-/ :-/ gracias luismh por la ayuda.al final me di cuenta de que durante las practicas si no reseteamos la camara.esta se pude quedar bloqueada a la espera de un evento.
ya porque hayamos enviado mal un comando o porque hemos parado el simulador.por eso hay que enviar un reset cada vez que queramos comunicarnos con ella.almenos durante los ensayos.

otro de los errores hera que despues de escribir la direccion de la memoria de la camara no hacia como tu.STOP y START sino que ponia un RESTART y eso aqui no funciona.
respecto a los retardos de 10us no me han hecho falta ponerlos.y la velocidad la he puesto a 400Khz y va bien por ahora.

solo me queda esperar a recibir la camara con FIFO y empezar las practicas.aunque de momento voy a experimentar con los comandos internos de la camara.y por eso queria preguntarte
que registros hay que configurar para recibir la imagen en B/N.y el tipo de cabezera que usas para almacenar la imagen en BMP.

saludos.
Título: Re:Camara OV7670
Publicado por: groundman en 09 de Julio de 2016, 13:07:48
estos son los datos que he sacado de la camara.desde a direccion 0x00 a la 0xC9.

(http://www.4shared.com/img/oMI1YeBLce/s25/155d079c850/SCCB_OV7670) (http://www.4shared.com/photo/oMI1YeBLce/SCCB_OV7670.html)
Título: Re:Camara OV7670
Publicado por: groundman en 09 de Julio de 2016, 13:58:50


pongo parte del codigo para quien le sea de utilidad:

Código: ASM
  1. call    OV7670_INI
  2.  
  3. lfsr    FSR2,0X100              ;principio de ram donde se introduciran los datos leidos del dispositivo I2C
  4. movlw   0x00                    ;principio de direccion a leer
  5. movwf   DIR_I2C
  6. movlw   0xCA                    ;numero de bytes a gestionar de la camara
  7. call    SCCB_READ               ;leer datos del DS1307 y hubicarlos en la direccion 0x100 de la ram

Código: ASM
  1. ;inicializa camara
  2. OV7670_INI              CS_OFF_OV7670                   ;camara en reset
  3.                         bsf     PIE1,SSP1IE             ;habilita interrupciones para la camara
  4.                         bsf     ODCON1,7                ;habilita open drain
  5.                         bsf     TRISC,3;SCL1            ;configura pins como entrada
  6.                         bsf     TRISC,4;SDA1            ;configura pins como entrada
  7.                         bcf     TRISC,5                 ;reset de la OV7670
  8.                        
  9.                         movlw   0x28                    ; SPI master, clk/16, ckp=1
  10.                         movwf   SSP1CON1                ; SSPEN enabled
  11.                         movlw   0x80                ; set up spi port, SPI master,
  12.                         movwf   SSP1STAT             ; cke = 0 (mode 1,1)
  13.                         ;movlw  .159            ; configurar I2C a 100kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
  14.                         movlw   .39             ; configurar I2C a 400kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
  15.                         ;movlw  .228            ; configurar I2C a 70kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
  16.                         movwf   SSP1ADD
  17.                         clrf    SSP1CON2
  18.                         clrf    PIR1
  19.                         clrf    INTCON3
  20.                        
  21.                         bcf     TRISE,REFO      ;pin salida oscilador para perifericos externos.(a la entrada xclk de a camara)
  22.                         ;movlw  b'10000011'     ;8Mhz
  23.                         movlw   b'10000010'     ;16Mhz
  24.                         movwf   REFOCON
  25.                         return
  26.  
  27. ;-------------------------------------------------------------------------------------------;
  28. ;                                  SUBRUTINA DE I2C SCCB READ                                      ;
  29. ;-------------------------------------------------------------------------------------------;
  30. ;Lectura del dispositivo I2C y traspaso de datos a la ram del pic
  31. ;introducir en el registro DIR_I2C.el principio de  direccion del dispositivo I2C.                     
  32. ;Introducir numero bytes a transferir en w. antes de la llamada a esta rutina.                 
  33. ;seleccinar direccionamiento de la ram donde hubiar datos. ejm..        lfsr    FSR2,0X100             
  34.                
  35. SCCB_READ       movwf   CONT_BYTE_RTC               ;numero de bytes a escribir
  36.                 CS_ON_OV7670
  37.                 movlw   2                           ;
  38.                 call    retardo_ms                  ;retardo pos reset
  39.                 rcall   Start_I2C                   ;Llama a la subrutina de START
  40.                
  41.                 ID_WRITE                            ;byte de control en modo escritura
  42.                 movwf   SSP1BUF,0                   ;cargalo en el Buffer de salida
  43.                 rcall   Write_I2C                   ;Llama a la subrutina de escritura
  44.                
  45.                 movf    DIR_I2C,w                   ;direccion a leer
  46.                 movwf   SSP1BUF,0                   ;cargalo en el Buffer de salida
  47.                 rcall   Write_I2C                   ;Llama a la subrutina de escritura
  48.                
  49.                 call    Stop_I2C
  50.                 call    Start_I2C
  51.        
  52.                 ID_READ                             ;byte de control en modo lectura
  53.                 movwf   SSP1BUF,0                   ;cargalo en el Buffer de salida
  54.                 rcall   Write_I2C                   ;Llama a la subrutina de escritura
  55.                
  56.                
  57. Bucle_rnd3      rcall   Read_I2C                    ;Llama a la subrutina de lectura
  58.                 movff   SSP1BUF,POSTINC2                    ;Guarda el dato en la Ram e incrementa el puntero
  59.                 BANK7
  60.                 dcfsnz  CONT_BYTE_RTC,F             ;repite hasta que sea cero
  61.                 goto    out_i2c3                            ;si es el ultimo dato.salir de la lectura
  62.                 rcall   Send_I2C_Ack                ;Llama a la subrutina de ACKNOWLEDGE
  63.                 bra     Bucle_rnd3                  ;continúa leyendo
  64.                    
  65. out_i2c3        rcall   Send_I2C_NoAck              ;llama a la subrutina de ACKNOWLEDGE
  66.                 rcall   Stop_I2C                    ;Llama a la subrutina de STOP
  67.                 CS_OFF_OV7670                       ;deshabilita camara
  68.                 return                              ;Retorna

Código: ASM
  1. ;;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2.  
  3. i2c_idle            btfsc       SSP1STAT,R_W
  4.                     goto       i2c_idle
  5. reps                movf       SSP1CON2,w
  6.                     andlw       0x1F
  7.                     btfss       STATUS,Z
  8.                     goto       reps
  9.                     return                 
  10.                    
  11.        
  12.  
  13.  
  14. Start_I2C           BANK15
  15.                     BSF      SSP1CON2,SEN                   ;Pone a uno el bit de START
  16.                    
  17. S2                  BTFSC    SSP1CON2,SEN                   ;Espera a que se ponga a cero el bit de START
  18.                     BRA      S2
  19. S3                  BTFSS    PIR1,SSP1IF                    ;Espera a que la condicion de START haya sido completada
  20.                     BRA      S3                             ;cuando se ponga a 1 la bandera de interrupción
  21.                     BCF      PIR1,SSP1IF                    ;Borra la bandera de la interrupción
  22.                     RETURN                                  ;Retorna de la subrutina
  23.                                                      
  24.  
  25. Write_I2C           BANK15
  26.                     BTFSC    SSP1STAT,R_W                   ;Verifica que se ponga a cero el bit R/W
  27.                     BRA      Write_I2C                      ;Espera a que termine de enviar el dato
  28. W2                  BTFSC    SSP1CON2,ACKSTAT               ;Espera a que reciba el bit de ACKNOWLEDGE
  29.                     BRA      W2
  30.                     BCF      PIR1,SSP1IF                    ;borra la bandera de la interrupción
  31.                     RETURN                                  ;Retorna de la subrutina
  32.  
  33.  
  34. Restart_I2C         BSF      SSP1CON2,RSEN,0                ;Pone a uno el bit de RESTART
  35. R2                  BTFSC    SSP1CON2,RSEN,0                ;Espera a que se ponga a cero el bit de RESTART
  36.                     BRA      R2
  37. R3                  BTFSS    PIR1,SSP1IF,0                  ;Espera a que la condicion de RESTART haya sido completada
  38.                     BRA      R3                             ;cuando se ponga a 1 la bandera de interrupción
  39.                     BCF      PIR1,SSP1IF,0                  ;Borra la bandera de la interrupción
  40.                     RETURN                                  ;Retorna de la subrutina
  41.  
  42.  
  43. Read_I2C            BSF      SSP1CON2,RCEN,0                ;Habilita la recepción de datos mediante el bit RCEN
  44. Rea2                BTFSC    SSP1CON2,RCEN,0                ;Espera a que se ponga a cero el bit RCEN
  45.                     BRA      Rea2
  46. Rea3                BTFSS    SSP1STAT,BF,0                  ;Dato disponible en SSPBUF para ser leidos?
  47.                     BRA      Rea3                           ;No, esperar
  48. Rea4                BTFSS    PIR1,SSP1IF,0                  ;Espera a que la condicion de Lectura haya sido completada
  49.                     BRA      Rea4                           ;cuando se ponga a 1 la bandera de interrupción
  50.                     BCF      PIR1,SSP1IF,0                  ;Borra la bandera de la interrupción
  51.                     RETURN                                  ;Retorna de la subrutina
  52.  
  53.  
  54. Send_I2C_Ack        BCF      SSP1CON2,ACKDT,0               ;Pone a cero el bit de ACKNOWLEDGE DATA
  55.                     BSF      SSP1CON2,ACKEN,0               ;Genera la condición de ACKNOWLEDGE Poniendo a 1 el bit ACKEN
  56.                     BTFSS    PIR1,SSP1IF,0                  ;Espera a que la condicion de ACK haya sido completada
  57.                     BRA      Rea4                           ;cuando se ponga a 1 la bandera de interrupción
  58.                     BCF      PIR1,SSP1IF,0                  ;Borra la bandera de la interrupción
  59.                     RETURN                                  ;Retorna de la subrutina
  60.  
  61.  
  62. Send_I2C_NoAck      BSF      SSP1CON2,ACKDT,0               ;Pone a 1 el bit de ACKNOWLEDGE DATA
  63.                     BSF      SSP1CON2,ACKEN,0               ;Genera la condición de NO ACKNOWLEDGE Poniendo a 1 el bit ACKEN
  64.                     BTFSS    PIR1,SSP1IF,0                  ;Espera a que la condicion de No ACK haya sido completada
  65.                     BRA      Rea4                           ;cuando se ponga a 1 la bandera de interrupción
  66.                     BCF      PIR1,SSP1IF,0                  ;Borra la bandera de la interrupción
  67.                     RETURN                                  ;Retorna de la subrutina
  68.  
  69.  
  70. Stop_I2C            BSF      SSP1CON2,PEN,0                 ;Genera la condición de STOP poniendo a 1 el bit PEN
  71. P2                  BTFSC    SSP1CON2,PEN,0                 ;Espera a que se ponga a cero el bit PEN
  72.                     BRA      P2
  73.                     BTFSS    PIR1,SSP1IF,0                  ;Espera a que la condicion de Stop haya sido completada
  74.                     BRA      Rea4                           ;cuando se ponga a 1 la bandera de interrupción
  75.                     BCF      PIR1,SSP1IF,0                  ;Borra la bandera de la interrupción
  76.                     RETURN
               
Título: Re:Camara OV7670
Publicado por: groundman en 09 de Julio de 2016, 16:23:35
luism.podrias pasarme la secuencia de grabacion de un dato en el OV7670? lo estoy intentando pero se me estan presentando algunos problemas.

he encontrado esta secuencia pero no me funciona.

http://www.analog.com/media/en/technical-documentation/application-notes/EE-204_Blackfin_Rev2_0307.pdf
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Julio de 2016, 16:01:03
Excelente! Te felicito! y en assembler! ((:-))

A mi tampoco me funcionaba el RESTART, lamento no haberme dado cuenta para decírtelo.

Bueno, la secuencia de escritura es mas fácil! Pero no tengo el código en esta compu. Si sos paciente, mañana lo subo.
Si la memoria no me falla, es así:

-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)

En la segunda fase:
-se abre el bus(START)
-se envía comando escritura(0x42) nuevamente y se espera ACK de cámara
-se cierra el bus(STOP)

Y listo! Es mas cortito

Luego puedes hacer la secuencia de lectura para confirmar que la escritura fue exitosa
Lo mas difícil de la comunicación ya lo hiciste
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Julio de 2016, 16:07:34
Perdon, me confundi...

en la segunda fase solo tienes que enviar el dato a escribir... Así:

-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)

En la segunda fase:
-se abre el bus(START)
-se envía dato se espera ACK de cámara
-se cierra el bus(STOP)

Título: Re:Camara OV7670
Publicado por: luismh en 10 de Julio de 2016, 16:14:56
Esta cámara guardo las imágenes con extensiones .raw o .yuv de acuerdo a como configures los registros... Para convertirlas a .bmp o .jpg, usé un software gratuito llamado "ffmpeg". Lo podés descargar de su página. Es un programa que se maneja desde la consola de comandos. Al principio es complicado pero luego es manejable. Con gusto te ayudaré a usarlo

Sin embargo, creo que faltan otras cosas antes que esto, como los sincronismos de las señales y definir como y donde vas a guardar la imagen para que sea visible por una PC.

Yo transfiero desde el fifo hacia una memoria SD, pero tendrás que implementar un sistema de archivos FAT para que sea visible por la PC... y hacer esto en assembler, personalmente, me parece una locura... No se si alguien en el foro lo haya hecho. Pero en C si está
Título: Re:Camara OV7670
Publicado por: groundman en 10 de Julio de 2016, 17:04:22
gracias luismh por la ayuda.aunque parece que me va a doler la cabeza mas que cuando intentaba leer de la camara.

he hecho lo que me comentas:

-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)

En la segunda fase:
-se abre el bus(START)
-se envía dato se espera ACK de cámara
-se cierra el bus(STOP)


y sucede algo muy raro en la segunda fase.el OV7670 solo admite el valor 0x42 o 0x43 como dato.cualquier otro valor deja
al pic a la espera de un ACK.

es como si estubiera esperando el comando de lectura o escritura.

lusmh.has mirado el enlace que puse antes.segun dice este.todo se hace en una sola fase.parece que despues de un START
hay que enviar un comando.si o si.

aun asi con las decenas de combinaciones que he realizado.todabia no he conseguido escribir nada.


si es verdad que depende de las combinaciones que he hecho.puedo escribir 0xff en la direccion 0 del OV7670.
aunque da igual a que direccion apunte.ni el dato que quiera enviar.
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Julio de 2016, 20:22:00
No tuve tiempo de leer el documento..

Si dices que en la segunda fase la cámara espera 0x42 o 0x43, podrías intentar lo siguiente:

-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)

En la segunda fase:
-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dato a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)

Te vuelvo a repetir, mañana te confirmaré que esto es así, pues no tengo el programa en esta PC y ahora solo estoy tratando de recordar como era
Título: Re:Camara OV7670
Publicado por: groundman en 11 de Julio de 2016, 11:22:37
te lo agradeceria mucho.ya he realizado infinidad de pruebas.incluso la que comentas en la respuesta anterior.es posible que haya algo que se me escapa.como paso con lo del reset en
la fase de lectura.

como te dije.si he llegado a grabar datos en la camara.en una de las pruebas cambiaron bastantes datos.no solo el primero.y como he probado otra camara.pues descarto que este averiada.
he leido un documento que se referia a una incompatibilidad de I2C con SCCB en el bit de ACK.

por eso queria preguntarte si en las pruebas que has realizado usastes el modulo I2C inerno.o una gestion por software del I2C?
supongo que si he podido leer.tambien deberia escribir.pero es algo diferente.en la lectura,es el PIC el que manda los ACKs y en la escritura es al reves.hay que testar este bit.

bueno.esperare primero a ver si la secuencia de escritura es la correcta. un saludo.
Título: Re:Camara OV7670
Publicado por: luismh en 11 de Julio de 2016, 11:51:18
Pues estamos equivocados los dos!

Resulta que para escribir no son necesarias 2 fases, solo una... Es decir, no hace falta enviar un STOP luego de enviar 0x42 y dirección de registro... Me explico?

Aquí mi secuencia:

-se abre el bus(START)
-se envía comando de escritura(0x42) y se espera ACK de cámara
-se envía dirección de registro a escribir y se espera ACK de cámara.
-se envía dato a escribir y se espera ACK de cámara.
-se cierra el bus(STOP)
-Retardo 1 mseg.

El último retardo es importante, pues la operación de escritura toma algo de tiempo. Con un milisegundo es mas que suficiente

Aquí un código en C30:

Código: C
  1. void EscribirOV7670(unsigned char direccion,unsigned char dato){
  2.        
  3.         while(I2C1CONbits.SEN || I2C1CONbits.RSEN || I2C1CONbits.PEN ||
  4.                 I2C1CONbits.RCEN || I2C1CONbits.ACKEN);//Aseguro que el bus está ocioso.
  5.        
  6.         I2C1CONbits.SEN=1;                      //Inicio secuencia de start.
  7.         while(I2C1CONbits.SEN);                 //Espero aquí hasta que finalice secuencia de start.
  8.        
  9.         __delay_us(DELAY_US);
  10.        
  11.         I2C1TRN = WriteAddressOV7670;           //Cargo comando de escritura.
  12.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  13.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  14.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  15.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  16.        
  17.         __delay_us(DELAY_US);
  18.        
  19.         I2C1TRN = direccion;                    //Cargo dirección de registro a escribir.
  20.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  21.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  22.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  23.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  24.        
  25.         __delay_us(DELAY_US);
  26.        
  27.         I2C1TRN = dato;                         //Cargo dato a escribir
  28.         while(I2C1STATbits.TBF);                //Espero aquí hasta que se completa envío de byte.
  29.         while(!IFS1bits.MI2C1IF);               //Espero interrupción por sucesión de noveno bit.
  30.         IFS1bits.MI2C1IF = 0;                   //Limpio bandera de inetrrupción.
  31.         while(I2C1STATbits.ACKSTAT);            //Espero aquí hasta que recibo confirmación de recepción.
  32.        
  33.         __delay_us(DELAY_US);
  34.        
  35.         I2C1CONbits.PEN =1;                     //Inicio secuencia de STOP.
  36.         while(I2C1CONbits.PEN);                 //Espero aquí hasta que finalice secuencia STOP.
  37.        
  38.         __delay_ms(1);
  39.        
  40.         return;
  41. }

Cada vez que envías un STOP al bus, la cámara se prepara para recibir un comando(0x42 o 0x43)... Es por eso que no hay que enviar STOP aquí.
Creo que esta secuencia debe funcionar!

Contame como te fue!
Título: Re:Camara OV7670
Publicado por: groundman en 12 de Julio de 2016, 15:41:15
bueno luismh.llevo probando desde ayer con esa secuencia y otras que se me han ido ocurriendo.pero nada.no hay manera de que funcione.
solo se me ocurre de que el modulo interno del pic no sea compatible con el bus SCCB. y es posible que a ti te haya funcionado con el 16f88 porque
has realizado una comuniacion por software.puedes confirmarme si tu codigo usa el modulo I2C interno?

ya me estoy desmoralizando.no se si realizar un codigo para comunicarme con la camara sin usar el modulo MSSP interno.
Título: Re:Camara OV7670
Publicado por: luismh en 12 de Julio de 2016, 16:01:57
Vamos amigo! No se desmoralice!

He usado el módulo interno del pic, tanto del 16f88 como del dspic33fj128gp802. Así que deberías seguir el camino que estás tomando(nada de implementar i2c por soft)

Cómo sabés que no funciona? Que pruebas estás realizando?

Debo recordarte que los registros de la cámara se borran y vuelven a su valor por defecto si quitas la alimentación y/o aplicas un reset... Que tensión tenés en el pin de reset de la cámara? Es importante que esté siempre habilitada(no dejar al aire).

Si has logrado establecer la lectura, la escritura debería ser más fácil.

Título: Re:Camara OV7670
Publicado por: luismh en 12 de Julio de 2016, 16:19:21
Estoy recordando que algunos usuarios de la cámara afirman que antes de escribir/leer los registros es recomendable hacer una lectura del registro COM7(0x12) y luego escribir 0x80 en COM7: (Es un comando que escribe en TODOS los registros su valor por defecto)

Personalmente, nunca necesité hacer esto.

Ya que escribe en todos los registro(y son muchos), tendrás que hacer un delay importante(1 segundo) para darle tiempo a la cámara a que finalice la escritura.
Título: Re:Camara OV7670
Publicado por: groundman en 13 de Julio de 2016, 11:03:12
 :-/ :-/ :-/ :-/ :-/ :-/ por fin descrubri el fallo.o fallos...  o almenos eso creo.

uno de los fallos y que es un fallo muy gordo. fue el resetear la camara despues de escribir en ella.porque los datos
como tu dices luismh.buelven a ponerse por defecto.

pero ese no es el fallo mas gordo.ya que estoy seguro que en el monton de puebas que he realizado.en algun momento
me ha estado funcionando la escritura y no me he dado cuenta.

ya que di por sentado de que si escribia un valor en una direccion,este iva a estar ahi cuando lo hubiera leido.
pero no todas la direcciones son datos fijos de configuracion.muchas de ellas supongo que son registros de valores
que la camara va cambiando segun su propio funcionamiento interno y eventos externos.ademas en algunos registros
solo podemos cambiar algun bit determinado.me di cuenta al escribir un dato y aparecer otro distinto.

asi que probe con algunas direcciones.y una de es son la 0x92 en esta direccion podemos grabar cualquier dato
y este estara ahi en la proxima lectura.eso si,si no reseteamos la camara.


muchas gracias luismh.has sido de gran ayuda.aunque creo que esto es solo un pequeño escalon con respecto a lo que me queda
que pasar.

espero que me llegue pronto la camara con FIFO.pero que me aconsejas respecto a la configuracion de los registros internos
de la camara?

he visto por internet que esta camara tiene la opcion de visualizar una carta de ajuste de barras de colores
o B/N .podrias decirme que registros hay que configurar para sacar esta imagen por el puerto de salida?
seria una buena practica para distinguir los datos en la memoria flash de la FIFO. saludos.
Título: Re:Camara OV7670
Publicado por: luismh en 13 de Julio de 2016, 11:45:09
Excelente! Me alegro mucho!  ((:-)) ((:-))

Bueno, pues para configurar una imagen VGA(640x480) en formato .raw  usé la siguiente configuración:

Código: C
  1. void            ConfigurarOV7670(void){
  2.        
  3.         ResetearOV7670();
  4.         //Configuración de cámara para VGA Bayer
  5.        
  6.         EscribirOV7670(CLKRC,0x01);             //Prescaler interno sobre clock
  7.         EscribirOV7670(COM7,0x01);              //Formato de salida "Bayer Raw"
  8.         EscribirOV7670(COM3,0x00);              //
  9.         EscribirOV7670(COM14,0x00);             //
  10.         EscribirOV7670(SCALING_XSC,0x3A);
  11.         EscribirOV7670(SCALING_YSC,0x35);
  12.         EscribirOV7670(SCALING_DCWCTR,0x11);
  13.         EscribirOV7670(SCALING_PCLK_DIV,0xF0);
  14.         EscribirOV7670(SCALING_PCLK_DELAY,0x02);
  15.         EscribirOV7670(COM17,0x00);             //Color bar=0x08
  16.        
  17.         //Configuración de cuadros por segundo
  18.         EscribirOV7670(CLKRC,0x80);             //Sin prescaler interno sobre clock.
  19.         EscribirOV7670(DBLV,0x0A);              //PLL desactivado.
  20.         EscribirOV7670(EXHCH,0x00);             //
  21.         EscribirOV7670(EXHCL,0x00);             //
  22.         EscribirOV7670(DM_LNL,0x00);            //
  23.         EscribirOV7670(DM_LNH,0x00);            //
  24.         EscribirOV7670(COM11,0x0A);             //
  25.        
  26.         //Configuración de Exposición automática
  27.        
  28.         EscribirOV7670(AEW,0x95);               //
  29.         EscribirOV7670(AEB,0x33);               //
  30.         EscribirOV7670(VPT,0xE3);               //
  31.         EscribirOV7670(HAECC7,0x00);            //Algoritmo de promedios.
  32.                
  33.         //
  34.         EscribirOV7670(SATCTR,0x60);            //
  35.         EscribirOV7670(CHLF,0x0B);              //
  36.         EscribirOV7670(ARBLM,0x11);             //
  37.         EscribirOV7670(ADCCTR1,0x02);           //
  38.         EscribirOV7670(ADCCTR2,0x91);           //
  39.         EscribirOV7670(ADC,0x1D);               //
  40.         EscribirOV7670(ACOM,0x71);              //
  41.         EscribirOV7670(OFON,0x2A);              //
  42.         EscribirOV7670(ABLC1,0x0C);             //Habilita función ABLC
  43.         EscribirOV7670(THL_ST,0x82);            //Objetivo ABLC
  44.        
  45.         //Windowing
  46.         EscribirOV7670(HSTART,0x13);            //
  47.         EscribirOV7670(HSTOP,0x01);             //
  48.         EscribirOV7670(HREF,0xB6);              //
  49.         EscribirOV7670(VSTRT,0x02);             //
  50.         EscribirOV7670(VSTOP,0x7A);             //
  51.         EscribirOV7670(VREF,0x0A);              //
  52.        
  53.        
  54.         //Configuración de cámara para salida "Processed Bayer RGB"
  55.        
  56.         EscribirOV7670(COM7,0x01);              //Configuro formato de salida. Color bar=0x03 o 0x07
  57.         EscribirOV7670(TSLB,0x04);              //Configuro secuencia de datos.
  58.         EscribirOV7670(0xB0,0x8C);              //Registro indocumentado.
  59.         //EscribirOV7670(COM13,0x08);           //Gamma deshabilitado
  60.         //
  61.        
  62.         EscribirOV7670(COM8,0xE7);              //
  63.         EscribirOV7670(AWBCTR0,0x9F);           //
  64.         EscribirOV7670(COM9,0x10);              //
  65.         EscribirOV7670(BLUE,0x40);              //
  66.         EscribirOV7670(RED,0x40);               //
  67.         EscribirOV7670(GGAIN,0x40);             //
  68.         EscribirOV7670(COM16,0x3D);             //0x08?
  69.        
  70.         //
  71.        
  72.         EscribirOV7670(DNSTH,0x00);             //
  73.         EscribirOV7670(REG77,0x00);             //
  74.         EscribirOV7670(EDGE,0x00);              //
  75.         EscribirOV7670(REG75,0x03);             //
  76.         EscribirOV7670(REG76,0xE1);             //
  77.        
  78. }

y tal vez te sean útilies estos #define con la dirección y nombre de cada registro(claro que está en C... lo podrías hacer en assembler con la directiva "equ"):

Código: C
  1. #define CLKRC                   0X11
  2. #define COM7                    0x12
  3. #define COM3                    0x0C
  4. #define COM14                   0x3E
  5. #define COM17                   0x42
  6. #define SCALING_XSC             0x70
  7. #define SCALING_YSC             0x71
  8. #define SCALING_DCWCTR          0x72
  9. #define SCALING_PCLK_DIV        0x73
  10. #define SCALING_PCLK_DELAY      0xA2
  11. #define TSLB                    0x3A
  12. #define GFIX                    0x69
  13. #define HSTART                  0x17
  14. #define HSTOP                   0x18
  15. #define HREF                    0x32
  16. #define VSTRT                   0x19
  17. #define VSTOP                   0x1A
  18. #define VREF                    0x03
  19. #define EXHCH                   0x2A
  20. #define EXHCL                   0x2B
  21.  
  22. #define COM8                    0x13
  23. #define GAIN                    0x00
  24. #define AECH                    0x10
  25. #define COM4                    0x0D
  26. #define COM9                    0x14
  27. #define BD50MAX                 0xA5
  28. #define BD60MAX                 0xAB
  29. #define AEW                     0x24
  30. #define AEB                     0x25
  31. #define VPT                     0x26
  32. #define HAECC1                  0x9F    
  33. #define HAECC2                  0xA0
  34. #define RSVD1                   0xA1
  35. #define HAECC3                  0xA6
  36. #define HAECC4                  0xA7
  37. #define HAECC5                  0xA8
  38. #define HAECC6                  0xA9
  39. #define HAECC7                  0xAA   
  40. #define SATCTR                  0xC9
  41.  
  42. #define COM5                    0x0E
  43. #define COM6                    0x0F
  44. #define RSVD2                   0x16
  45. #define ADCCTR1                 0x21
  46. #define ADCCTR2                 0x22
  47. #define RSVD3                   0x29
  48. #define CHLF                    0x33
  49. #define RSVD4                   0x35
  50. #define ADC1                    0x37
  51. #define ACOM                    0x38
  52. #define COM12                   0x3C
  53. #define COM13                   0x3D
  54. #define COM16                   0x41
  55. #define RSVD5                   0x4D
  56. #define RSVD6                   0x4E
  57. #define GFIX                    0x69
  58. #define DBLV                    0x6B
  59. #define REG74                   0x74
  60. #define REG76                   0x76
  61. #define RSVD7                   0x8D
  62. #define RSVD8                   0x8E
  63. #define ADC                     0x37
  64. #define OFON                    0x39
  65.  
  66. #define RSVD9                   0x8F
  67. #define RSVD10                  0x90
  68. #define RSVD11                  0x91
  69. #define RSVD12                  0x96
  70. #define RSVD13                  0x9A
  71. #define RSVD14                  0xB0
  72. #define ABLC1                   0xB1
  73. #define RSVD15                  0xB2
  74. #define THL_ST                  0xB3
  75. #define RSVD16                  0xB8
  76.  
  77. #define AWBC1                   0x43
  78. #define AWBC2                   0x44
  79. #define AWBC3                   0x45
  80. #define AWBC4                   0x46
  81. #define AWBC5                   0x47
  82. #define AWBC6                   0x48
  83. #define RSVD17                  0x59
  84. #define RSVD18                  0x5A
  85. #define RSVD19                  0x5B
  86. #define RSVD20                  0x5C
  87. #define RSVD21                  0x5D
  88. #define RSVD22                  0x5E
  89. #define AWBCTR3                 0x6C
  90. #define AWBCTR2                 0x6D
  91. #define AWBCTR1                 0x6E
  92. #define AWBCTR0                 0x6F
  93. #define GGAIN                   0x6A
  94. #define BLUE                    0x01
  95. #define RED                     0x02
  96.  
  97. #define ARBLM                   0x34
  98. #define DM_LNL                  0x92
  99. #define DM_LNH                  0x93
  100. #define COM11                   0x3B
  101. #define NT_CTRL                 0xA4
  102. #define RSVD23                  0x96
  103. #define RSVD24                  0x97
  104. #define RSVD25                  0x98
  105. #define RSVD26                  0x99
  106. #define RSVD27                  0x9A
  107. #define RSVD28                  0x9B
  108. #define RSVD29                  0x9C
  109. #define BD50ST                  0x9D
  110. #define BD60ST                  0x9E
  111. #define RSVD30                  0x78
  112.  
  113. #define RSVD31                  0x79
  114. #define RSVD32                  0xC8
  115. #define COM17                   0x42
  116.  
  117. #define DNSTH                   0x4C
  118. #define REG75                   0x75
  119. #define REG77                   0x77
  120. #define EDGE                    0x3F

Si aplicas esta configuración, puedes hacer la siguiente prueba:

Tapas la lente y te fijas en el puerto de salida... deberías tener todos ceros(o unos.. no me acuerdo)
Así también, puedes acercarle una luz muy fuerte(como una linterna), y deberías tener todos ceros(o unos si era al revés)
Si esta prueba no funciona, intentá ajustando el foco de la lente e intentá nuevamente

Para la barra de colores hay que configurar el registro COM17... No me acuero bien como, pero en la hoja de datos está.

Saludos!
Título: Re:Camara OV7670
Publicado por: groundman en 14 de Julio de 2016, 10:06:18
hola luismh.tengo una curisidad.en los define que has puesto.hay unos registros RSVD que se les esta indicando el valor que les corresponde.pero en el datasheet pone que estan
reservados.

sabes que significa? porque si no tienen utilidad no se porque alguien los ha definido en un codigo.a no ser que fuera para descartarlos.
Título: Re:Camara OV7670
Publicado por: luismh en 14 de Julio de 2016, 10:57:05
Hola. Creo que si te comenté que hay registros que en teoría debería ignorarse pero en realidad hay que configurarlos sino no anda... Lo peor de todo es que están indocumentados. La documentación de esta cámara es pésima.

Al saber de esto, los definí a todos.. por las dudas.. Pero la verdad es que solo configuro uno de ellos: el RSVD14(línea 58)
Título: Re:Camara OV7670
Publicado por: groundman en 16 de Julio de 2016, 08:30:49


bueno ya estoy aqui de nuevo.al final logre configurar a la camara OV7670.he podido grabar los datos en sus registros.y queria analizar un poco lo que he
experimentado.

primero voy a poner unos registros que cambian de valor segun donde dirijamos el ovjetivo de la camara.y creo que tienen que ver con la luminancia general
y de tereminados colores.no se si habran mas.pero estos son los que yo he visto.

0x00   GAIN:   Es el registro de ganancia luminica.se comprueba tapando el objetivo de la camara.y los valores van esde 0x00 para iluminado y 0xff para oscuro.
0x05   BAVE:   nivel promedio de U/B   "azul"   valor base 0x80 a oscuras.varia segun datos recogidos.
0x06   GbAVE:   nivel promedio de Y/Gb      valor base 0x00 a oscuras
0x08   RAVE:   nivel promedio de V/R   "rojo"   valor base 0x80 a oscuras.
0x2f   YAVE:   nivel promedio de Y/G      valor base 0x00 a oscuras

Y normalmente significa Luminancia R,G,B ya sabemos lo que es.pero G,V,Gb no se lo que son.


esta es una captura de los datos de ls registros de la camara despues de un reset.

(http://www.4shared.com/img/oMI1YeBLce/s25/155d079c850/SCCB_OV7670) (http://www.4shared.com/photo/oMI1YeBLce/SCCB_OV7670.html)

y esta es una imagen despues de cargar los datos de configuracion de la camara para capturas de imagen RAW.

(http://www.4shared.com/img/mN2UKdErce/s25/155f35ad828/SBBC_OV7670-CONF) (http://www.4shared.com/photo/mN2UKdErce/SBBC_OV7670-CONF.html)

aunque despues de su carga en la OV7670.algunos registros no tienen los valores que les hemos enviado.y son estos:


COM17   0X42
CLKRC   0X11
SATCTR   0XC9
DNSTH   0X4C
EDGE   0X3F

aunque supongo que sus contenidos han podido haber cambiado durante su carga.


ah.queria hacerte una pregunta luismh.al configurar la camara en formato RAW.como son los datos en el puerto de salida?es como indica en el datasheet
como con RGB.usando 2 bytes (D7-D3)para el rojo,(D2-D0 y D7-D5)para el verde,(D4-D0)para el azul. y en ese caso si activaramos la varra de colores.
se identificaria facilmente en un osciloscopio las tramas en el caso de sincronizar el disparo con Vsync.

y como seria el efecto de visualizar las barras en B/N si eso es posible?
Título: Re:Camara OV7670
Publicado por: groundman en 16 de Julio de 2016, 10:27:56
aqui el codigo:

Código: ASM
  1. #define         ID_WRITE        movlw   0x42    ;valor de direccion para escritura del OV7670
  2.                 #define         ID_READ         movlw   0x43    ;valor de direccion para lectura del OV7670
  3.  
  4.         CS_ON_OV7670
  5.                         movlw   .10                         ;
  6.                         call    retardo_ms                  ;retardo pos reset
  7.                         CALL    RAW_CONF
  8.  
  9.                         lfsr    FSR2,0X100              ;principio de ram donde se introduciran los datos leidos del dispositivo I2C
  10.                         movlw   0x00                    ;principio de direccion a leer
  11.                         movwf   DIR_I2C
  12.                         movlw   0xCA                    ;numero de bytes a gestionar de la camara
  13.                         call    SCCB_READ               ;leer datos del DS1307 y hubicarlos en la direccion 0x100 de la ram
  14.                
  15.                        
  16.                        
  17.                
  18.                         CS_OFF_OV7670                       ;deshabilita camara

Código: ASM
  1. LIST
  2.                            
  3.                         CBLOCK          OV7670_VAR
  4.                         CONT_TABLA_RAW
  5.                         CONT_BYTE_RTC                                   ;contador de numero de bytes
  6.                         DIR_I2C                                                 ;principio de direccion de dispositivo
  7.                         DATO_I2C
  8.                         ENDC    
  9.                        
  10.                         #define                 TABLA_CONF_RAW      0X5000  ;direccion de hubicacion de tabla
  11.                            
  12.                            
  13.                        
  14.                        
  15.                         ;inicializa camara
  16. OV7670_INI              CS_OFF_OV7670                   ;camara en reset
  17.                         bsf     PIE1,SSP1IE             ;habilita interrupciones para la camara
  18.                         bsf     ODCON1,7                ;habilita open drain
  19.                         bsf     TRISC,SCL1              ;configura pins como entrada
  20.                         bsf     TRISC,SDA1              ;configura pins como entrada
  21.                         bcf     TRISC,5                 ;reset de la OV7670
  22.                        
  23.                         movlw   0x28                    ; I2C master, SSPEN enabled
  24.                         movwf   SSP1CON1                ;
  25.                         movlw   0x80                    ; 400Khz compat,
  26.                         movwf   SSP1STAT            
  27.                         ;movlw  .159                    ; configurar I2C a 100kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
  28.                         movlw   .39                     ; configurar I2C a 400kHz (para fosc de 64Mhz) clock=Fosc/(4*(SSPxADD+1))
  29.                         movwf   SSP1ADD
  30.                         clrf    SSP1CON2
  31.                         clrf    PIR1
  32.                         clrf    INTCON3
  33.                        
  34.                        
  35.                         bcf     TRISE,REFO              ;pin salida oscilador para perifericos externos.(a la entrada xclk de a camara)
  36.                         ;movlw  b'10000011'             ;8Mhz
  37.                         movlw   b'10000010'             ;16Mhz
  38.                         movwf   REFOCON
  39.                         return         
  40.                        
  41.                        
  42.                        
  43.                        
  44.                        
  45.                        
  46.                        
  47. RAW_CONF                movlw   0x50                    ;direccion alta de la tabla 0x50
  48.                         movwf   TBLPTRH
  49.                         clrf    TBLPTRL                 ;direccion baja de la tabla 0x00
  50.                
  51.                         movlw   .52                     ;nuemro de datos a leer de la tabla.cada dato son dos bytes= numero de bytes /2
  52.                         movwf   CONT_TABLA_RAW          ;cargalo en registro contadr
  53.                
  54. rep_raw                 call    TBL_CONF_RAW            ;busca byte de direccion
  55.                         movwf   DIR_I2C                 ;carga en el registro de direccion I2C el valor leido de la tabla.
  56.                         call    TBL_CONF_RAW            ;busca byte de dato y lo carga en w.
  57.                         call    SCCB_WRITE              ;rutina de escritura I2C en la camara OV7670
  58.                         decfsz  CONT_TABLA_RAW          ;decrementa registro contador de numero de bytes de la tabla
  59.                         goto    rep_raw                 ;repite busqueda de bytes en tabla mientras haya datos que leer
  60.                         return                          ;retorna
  61.                
  62. TBL_CONF_RAW            tblrd*+                         ;incrementa puntero de tabla antes de su lectura
  63.                         movf    TABLAT,W                ;carga el valor leido de la tabla en W
  64.                         tblrd*+                         ;incrementa puntero de tabla antes de su lectura
  65.                         return         
  66.                    
  67.                 ;Esta tabla contiene los datos a introducir en los registros de configuracion de la camara OV7670.los datos son extraidos de dos en dos.
  68.                 ;el primer byte impar es la direccion del registro a escribir y el siguiente byte es el dato a escribir en el OV7670.y asi sucesivamente.
  69.                         ORG             TABLA_CONF_RAW
  70.  
  71.                         dt      0x11,0x01, 0x12,0x01, 0x0c,0x00, 0x3e,0x00, 0x70,0x3A, 0x71,0x35, 0x72,0x11, 0x73,0xf0, 0xa2,0x02, 0x42,0x00
  72.                         dt      0x11,0x80, 0x6b,0x0a, 0x2a,0x00, 0x2b,0x00, 0x92,0x00, 0x93,0x00, 0x3b,0x0a, 0x24,0x95, 0x25,0x33, 0x26,0xe3
  73.                         dt      0x9f,0x00, 0xc9,0x60, 0x33,0x0b, 0x34,0x11, 0x21,0x02, 0x22,0x91, 0x37,0x1d, 0x38,0x71, 0x39,0x2a, 0xb1,0x0c
  74.                         dt      0xb3,0x82, 0x17,0x13, 0x18,0x01, 0x32,0xb6, 0x19,0x02, 0x1a,0x7a, 0x03,0x0a, 0x12,0x01, 0x3a,0x04, 0xb0,0x8c
  75.                         dt      0x13,0xe7, 0x6f,0x9f, 0x14,0x10, 0x01,0x40, 0x02,0x40, 0x6a,0x40, 0x41,0x3d, 0x4c,0x00, 0x77,0x00, 0x3f,0x00
  76.                         dt      0x75,0x03, 0x76,0xe1
  77.                            
  78.                            
  79.                             LIST
  80.  
  81.  
  82.  
  83.                         ;Configuración de cámara para VGA Bayer          
  84.                 ;CLKRC              (0x11)=0x01     //Prescaler interno sobre clock
  85.                 ;COM7               (0x12)=0x01     //Formato de salida "Bayer Raw"
  86.                 ;COM3               (0x0c)=0x00
  87.                 ;COM14              (0x3E)=0x00
  88.                 ;SCALING_XSC        (0x70)=0x3A
  89.                 ;SCALING_YSC        (0x71)=0x35
  90.                 ;SCALING_DCWCTR     (0x72)=0x11
  91.                 ;SCALING_PCLK_DIV   (0x73)=0xF0
  92.                 ;SCALING_PCLK_DELAY (0xA2)=0x02
  93.                 ;COM17              (0x42)=0x00     //Color bar=0x08
  94.                 ;
  95.                 ;Configuración de cuadros por segundo
  96.                 ;CLKRC              (0x11)=0x80     //Sin prescaler interno sobre clock.
  97.                 ;DBLV               (0x6b)=0x0A     //PLL desactivado.
  98.                 ;EXHCH              (0x2a)=0x00
  99.                 ;EXHCL              (0x2b)=0x00
  100.                 ;DM_LNL             (0x92)=0x00
  101.                 ;DM_LNH             (0x93)=0x00
  102.                 ;COM11              (0x3b)=0x0A
  103.                 ;Configuración de Exposición automática
  104.                 ;AEW                (0x24)=0x95
  105.                 ;AEB                (0x25)=0x33
  106.                 ;VPT                (0x26)=0xE3
  107.                
  108.                 ;HAECC7             (0x9f)=0x00     //Algoritmo de promedios.
  109.                 ;SATCTR             (0xc9)=0x60
  110.                 ;CHLF               (0x33)=0x0B
  111.                 ;ARBLM              (0x34)=0x11
  112.                 ;ADCCTR1            (0x21)=0x02
  113.                 ;ADCCTR2            (0x22)=0x91
  114.                 ;ADC                (0x37)=0x1D
  115.                 ;ACOM               (0x38)=0x71
  116.                 ;OFON               (0x39)=0x2A
  117.                 ;ABLC1              (0xb1)=0x0C     //Habilita función ABLC
  118.                
  119.                 ;THL_ST             (0xb3)=0x82     //Objetivo ABLC
  120.                 ;Windowing
  121.                 ;HSTART             (0x17)=0x13
  122.                 ;HSTOP              (0x18)=0x01
  123.                 ;HREF               (0x32)=0xB6
  124.                 ;VSTRT              (0x19)=0x02
  125.                 ;VSTOP              (0x1a)=0x7A
  126.                 ;VREF               (0x03)=0x0A
  127.                 ;Configuración de cámara para salida "Processed Bayer RGB"
  128.                 ;COM7               (0x12)=0x01     //Configuro formato de salida. Color bar=0x03 o 0x07
  129.                 ;TSLB               (0x3a)=0x04     //Configuro secuencia de datos.
  130.                 ;RSVD               (0Xb0)=0x8C     //Registro reservado.
  131.                
  132.                 ;//EscribirOV7670(COM13,0x08);      //Gamma deshabilitado "no fijado en codigo"
  133.                 ;COM8               (0x13)=0xE7
  134.                 ;AWBCTR0            (0x6f)=0x9F
  135.                 ;COM9               (0x14)=0x10
  136.                 ;BLUE               (0x01)=0x40
  137.                 ;RED                (0x02)=0x40
  138.                 ;GGAIN              (0x6a)=0x40
  139.                 ;COM16              (0x41)=0x3D
  140.                 ;DNSTH              (0x4c)=0x00
  141.                 ;REG77              (0x77)=0x00
  142.                 ;EDGE               (0x3f)=0x00
  143.                
  144.                 ;REG75              (0x75)=0x03
  145.                 ;REG76              (0x76)=0xE1

Código: ASM
  1. ;-------------------------------------------------------------------------------------------;
  2. ;                                  SUBRUTINA DE I2C SCCB_WRITE                                      ;
  3. ;-------------------------------------------------------------------------------------------;
  4. ;Escritura del dispositivo I2C
  5. ;introducir en el registro DIR_I2C.el principio de  direccion del dispositivo I2C.                     
  6.        
  7.                
  8. SCCB_WRITE      movwf   DATO_I2C                    ;numero de bytes a escribir
  9.                 rcall   Start_I2C                   ;Llama a la subrutina de START
  10.                 ID_WRITE                            ;byte de control en modo escritura
  11.                 movwf   SSP1BUF,0                   ;cargalo en el Buffer de salida
  12.                 rcall   Write_I2C                   ;Llama a la subrutina de escritura
  13.                
  14.                 movff   DIR_I2C,SSP1BUF
  15.                 rcall   Write_I2C                   ;Llama a la subrutina de escritura
  16.                
  17.                 movff   DATO_I2C,SSP1BUF
  18.                 rcall   Write_I2C                   ;Llama a la subrutina de lectura
  19.                
  20.                 rcall   Stop_I2C                    ;Llama a la subrutina de STOP
  21.                 return                              ;Retorna
      

las rutinas I2C estan en las respuestas anteriores.
Título: Re:Camara OV7670
Publicado por: groundman en 16 de Julio de 2016, 15:31:41
queria subir unas imagenes que he captado con el osciloscopio.mi idea hera saber si configurando el registro COM17 0x42.si podria activar las barras de colores.
y efectivamente asi es.poniendo el valor 0x08 se activan.la muestra es que estando desactivadas las salidas de datos de la camara cambian al tapar la lente.
es decir los datos desaparecen.y si le da la luz los datos aparecen.en este video lo muestro:


la captura en el osciloscopio la he hecho sinclonizando VSYNC.y los datos que aparecen serian los primero en emitir la camara en la esquina superior izquierda.

en el se muestra como aparece y desaparece la señal que nos entrega D7 de la camara.parece como si la señal se modulara en anchura.pero ampliando la frecuencia del osciloscopio
puede notarse que son unos pequeños impulsos que van desapareciendo.esa pequeña apariencia de modulacion PWM que no lo es.porque depende de la imagen que incida
aparecen pequeños impulsos en un espacio de tiempo de 128uS.y que pasados esos 128uS empieza otra señal muy parecida,son los datos del pixel.en concreto los
que esta enviando D7.

en esta otra imagen se notan esos pequeños impulsos:

(http://www.4shared.com/img/vjY43m-Lba/s25/155f4ad5c50/IMAG2216) (http://www.4shared.com/photo/vjY43m-Lba/IMAG2216.html)

la frecuencia a la que tengo Xclk es de 16Mhz.y el ciclo al que estamos trabajando es de 62.5nS . una linea horizontal tiene 640t que corresponde a 1byte.
asi que como cada dato tiene 2bytes. cada dato consume 125nS

este espacio de tiempo de 125nS  corresponde a la profundidad de color del pixel.de la linea D7 en concreto.la profundidad de color es el nivel de luminancia
de cada color.
si en este caso es de 10bit(1024 niveles). 125nS x 1024=128us que es mas o menos al tiempo que hay entre pixeles en la imagen del osciloscopio.


esto que he expuesto es la conclusion a la que he llegado despues de las pruevas que he realizado.no quiere decir que no me haya equivocado.y si alguien ve
que estoy en un error le agradeceria que me corrigieran.
Título: Re:Camara OV7670
Publicado por: luismh en 16 de Julio de 2016, 16:32:45
guau amigo groundman! que buen trabajo estás haciendo. Sencillamente te felicito!

Me llevó meses tratar de darle un significado a esas señales.

Pues yo configuré esta cámara como "raw bayer"... De esta manera, cada pixel  ocupa 1 byte en memoria y cada imagen serían unos 300kbyte (640x480=307200bytes o pixeles)

Si configuras en modo RGB o YUV, entiendo que cada pixel ocupa mas de un byte(por supuesto, la imagen es mucho mejor!). El problema es que la cámara con FIFO solo soporta un poco menos de 400kB de datos, y sería imposible guardar una imagen VGA en él con estos formatos de mayor calidad. En este caso es necesario disminuir el tamaño de la imagen.

Lamentablemente, no hay un registro que configuren si la foto será en color o blanco y negro. Nunca lo intenté pero imagino que para lograr eso tendrás que "jugar" con los registros de colores BLUE, RED, GREEN, y otros.

No se casi nada de procesamiento de imágenes, pero tengo entendido que si configuras formato YUV y solo guardas los datos de "Y" y descartas los componentes "U" y "V" tendrás una imagen en blanco y negro!

Saludos! Y felicidades!
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 16 de Julio de 2016, 17:55:32

gracias luismh.el tiempo que he sacado del osciloscopio de 128uS es real.lo que no se es cual es la prufundidad de color de la camara.la configuracion que le he
cargado es la que has puesto antes.y si me estas diciendo que la cámara esta configurada como "raw bayer" y solo ocupa 1byte por pixel.es posible que la profundidad
de color no se a 1024niveles.deberia de ser 2048 niveles  que son 11bit.

tu sabes cual es la profundidad de color de esta camara.es decir cuantos niveles de color o luminancia tiene esta camara con tu configuracion?
Título: Re:Camara OV7670
Publicado por: luismh en 17 de Julio de 2016, 14:38:53
Perdón, pero no se que es "profundidad de color". Tal vez puedas definirla para entender

Si te refieres a la cantidad de colores que puede tener un pixel en esta configuración, pues la respuesta  es 256 (2^8)

Con otras configuraciones puede ser mayor.
Título: Re:Camara OV7670
Publicado por: groundman en 18 de Julio de 2016, 09:57:41
si.me referia a eso.si esque no estoy equivocado en la definicion.

pero entonces si cada pixel tiene 1byte.que significado RGB tiene cada bit? intento entender que es lo que estoy visualizando en el osciloscopio.porque no me cuadra segun lo que estoy viendo.
Título: Re:Camara OV7670
Publicado por: luismh en 18 de Julio de 2016, 11:12:06
En la configuración "Bayer Raw", que es la mas básica de todas, no aplica el concepto RGB... Simplemente, a cada pixel se le asigna un color, y a cada color se le asigna un número binario y eso es lo que ves en el puerto de salida. 0x00 corresponde a blanco y 0xFF a negro, pasando por varios colores en el medio.
La imagen que obtienes no es de la mejor calidad, pero para mi aplicación fue mas que suficiente.

Si quieres RGB, tendrás que configurar la cámara como RGB. Existen mas de un formato RGB: RGB444, RGB565(o algo así),etc.
Por ejemplo, RGB444 significa que los primeros 4 bits tienen información de rojos, los siguiente 4, información de verdes y los últimos 4, de azules. Así, en este caso, tienes un dato de 12 bits(necesitas 2 bytes para almacenar)

Saludos!
Título: Re:Camara OV7670
Publicado por: KILLERJC en 18 de Julio de 2016, 11:22:10
Justo luismh contesto, pero aporto un poco mas

El datasheet aclara correctamente lo siguiente:

Todas las salidas RGB tienen 2 bytes
En Modo salida RGB 565, Conformandose (en orden) de lo siguiente: 5 bits rojos, 3 bits verde - 3 bits verde, 5 bits azul
En Modo salida RGB 555, Conformandose (en orden) de lo siguiente: 1 bit a descartar, 5 bits rojos, 2 bits verde - 3bits verde, 5 bits azul
En Modo salida RGB 444, Conformandose (en orden) de lo siguiente: 4 bits a descartar, 4 bits rojos - 4 bits verde, 4 bits azul

La profundidad de color va a depender el modo que se elija, 565 = 16 bits, 555 = 15 bits, 444 = 12 bits

Suponiendo que sea RGB.

PD: Se podria pedir el datasheet a Omnivision, para ver si es que posee uno mas completo, por que todos los que estan dando vuelta estan incompletos o son de versiones preliminares.

PD2: Una guia de implementacion del mismo omnivision
http://web.mit.edu/6.111/www/f2015/tools/OV7670app.pdf
Habla que todos los RAWs son de 888
Título: Re:Camara OV7670
Publicado por: groundman en 18 de Julio de 2016, 17:30:07
vaya.muchas gracias  KILLERJC.ya estoy hechandole un vistazo y la verdad es que hay mucha informacion.

hola luismh.he visto que pone Raw Bayer RGB  8-bit R or 8-bit G or 8-bit B.supongo que en algun registro se selecciona el color.y visualizar solo el valor de luminancia
de ese color. almenos es lo que me parece ese OR que separa las indicaciones.

respecto a la imagen del osciloscopio,se notan como 3 trenes de impulsos.cada tren de impulsos tiene un tiempo de unos 120uS.y segun ponia el dedo en la optica.
los trenes variaban casi identicamente.asi que creo que cada tren corresponde al bit7 de  una linea horizontal.

si "raw bayer RGB usara" 3bytes para cada pixel.todo cuadraria en mis calculos.si ha 16Mhz tenemos un ciclo de 62.5us.y cada ciclo fuera para un byte.
62.5uS x 3bytes=187.5uS x 640pixl =120uS. que es la anchura del tren del osciloscopio.

o lo que es lo mismo.62.5uS x 640pixel = 40uS x 3bytes=120uS.

Pero todo esto son congeturas.si en raw bayer cada pixel ocupa un byte.esto mo me cuadra.y no podre saber que significan estas señales hasta que no me llege la FIFO y lo vea en datos.saludos



Título: Re:Camara OV7670
Publicado por: groundman en 18 de Julio de 2016, 19:09:17
hay algo que se me pasa por la cabeza y es que en el datasheet no lo explica bien.si en Raw Bayer solo se utiliza un byte por pixel.y ese byte solo expresa el valor de un solo color.
donde se configura que color seleccionar.y en todo caso no se estara convirtiendo la camara  en dartonica :D   solo seria sensible a un determinado color.

esque no entiendo muy bien lo de raw bayer.

Título: Re:Camara OV7670
Publicado por: groundman en 18 de Julio de 2016, 19:12:59
ahora si: http://www.siliconimaging.com/RGB%20Bayer.htm
Título: Re:Camara OV7670
Publicado por: groundman en 31 de Julio de 2016, 14:43:37

hola de nuevo.me ha ocurrido algo muy raro con la comunicacion I2C y la camara.desde que logre realizar la conexion ha ido bien durante algun tiempo.pero un dia me puse a practicar con el SPI pero en otro puerto.
cuando fui a probar el I2C del otro puerto.dejo de funcionar. el programa se cuelga en la sentencia de escritura I2C.exactamente donde se espera a recivir el ACKNOWLEDGE.

despues de dejar el circuito durante una semana.me puse de nuevo a practicar.y cual fue mi sorpresa de que empezo a funcionar.pero he vuelto a tocar el circuito y otra vez mismo problema.
la cosa es que cuando me funciono,cambie las tres camaras que tengo y todas funcionaban.

en el circuito use dos resistencias de 4k7 y iban bien.pero he visto en otros circuitos con resistencias serie en los dos pin SIOD y SIOC ademas de una pull-up en SIOD.pero no funciona.segun que resistencias ponga
el programa se cuelga incluso en el START.

lo raro es que todo funciona correctamente con una memoria 24lc16.asi que no se a que echarle la culpa.si a la camara,al programa o al pic.incluso podria ser el ICD3.ni idea.tendre que dejar otra semana el circuito
y volver a practicar.haber si cambia algo.

he recibido dos AL422B.pero hasta que no vuelva a funcionar esto.habra que esperar.
Título: Re:Camara OV7670
Publicado por: groundman en 15 de Agosto de 2016, 17:41:08

hola ya me ha llegado la camara con FIFO.y he empezado con las pruebas.pero he realizado otra placa con un pic18f87k22 nuevo.

pero estoy teniendo muchos problemas con las resistencias de las lineas SCL y SDA. he tenido que poner en SCL una resistencia de 15K en vez de la de 4k7.porque el programa se quedaba
atrancado leyendo el bit R/W de SSP1STAT.

y ahora estoy jugando con la resistencia de SDA.le he puesto una de 4k7 pero se queda atrancado en la linea  SSP1STAT,BF de la rutina de lectura.

pero nada funciona.en definitiva.si cambio valores en la resistencia de SDA el programa se cuelga en las rutinas WRITE,STOP y READ segun los valores
y si cambio valores en SCL el programa se cuelga en START o WRITE.

la verdad es que ya no se por donde ira el fallo.igual son varios a la vez.tendre que seguir realizando pruebas haber por que falla.ojala tubiera un osciloscopio
con dataloger.y asi veria si el problema esta en las señales.

Título: Re:Camara OV7670
Publicado por: luismh en 16 de Agosto de 2016, 08:42:46
Hola amigo, tanto tiempo!

Es extraño el problema que planteas.... A que velocidad está configurado tu bus i2c? las resistencias de pull-up no deberían ser mucho mayores de 10k

Estás simulando? o debuggeando? En este último caso, asegúrate que tu herramienta para debug pueda correr el bus i2c normalmente. Imagino que todos lo hacen, pero por ej, con pickit3, debes habilitar el periférico para debuggearlo.

El bus de la cámara sin fifo es idéntico al bus de la cámara que si tiene. Así que si pudiste con uno, estás muy cerca de lograrlo con el otro.

Saludos.
Luis
Título: Re:Camara OV7670
Publicado por: groundman en 16 de Agosto de 2016, 09:55:15
hola luismh.estoy usando el ICD3 debugger.la cosa esta en que con memorias 24lcxx funciona perfectamente.no se con el reloj DS1307 porque este trabaja a 5v y yo trabajo con 3.3v
habria que adaptar señales.

lo mas raro de todo es que el circuito funciono.como ya puse en las respuestas anteriores.y cuando dejo de hacerlo. a la semana se puso a funcionar de nuevo sin hacerle nada.
y las cosas raras que hace cuando cambio las resistencias.

estoy trabajando con 100khz.pero este circuito ya funcino con 400khz.me da la sensacion de que las señales no estan a los niveles que deberian.

lo que dices de configurar el ICD3 para que funcione el bus I2C.no tenia ni idea de que hubiera que configurarlo.mirare haber si lo veo por algun lado.



Título: Re:Camara OV7670
Publicado por: luismh en 16 de Agosto de 2016, 10:02:14
Desconozco por completo el ICD3, solo te cuento mi experiencia con pickit3: para debuggear desde mplab X, debes entrar en propiedades del proyecto y "decirle" al debugger que usarás i2c y cualquier otro periférico que necesites.

El tema de la adaptación de señales me parece importante... También necesitaras esto cuando comiences a trabajar con la señales de sincronización
Título: Re:Camara OV7670
Publicado por: groundman en 28 de Octubre de 2016, 11:28:19
hola luismh.ya hace algunos meses que deje el tema de la camara hasta que recibiera la camara con fifo y otros proyectos que tenia.

llevo una semana practicando con el OV7670 y he estado igual de atrancado con el problema de que me dejo de funcionar.ya no sabia a que hecharle la culpa.
pero por fin encontre el error.

resulta que si al pin xclk no se le aplica una señal de frecuencia.el puerto SCCB no se puede leer.como comentastes que no hacia falta introducir una señal aqui
para poder leer el bus i2c.pues no le heche cuenta.pero no tube en cuenta que tu trabajastes con una camara con FIFO.y a estas creo que ya tienen un circuito
que se le aplica su propia frecuencia.cosa que no pasa con la DS7670 sin FIFO.

bueno ha sido un error que me ha costado muchas horas de pruebas.pero no es culpa tuya.te agradezco toda la ayuda.asi de paso tabien hize practicas con
un reloj DS1307 que tambien me dio dolores de cabeza.hasta entender que este no funciona si esta bloqueado.y que desbloquea escribiendo datos en el.

bueno haber si empiezo con la camara con FIFO y sale todo a pedir de boca. un saludo.
Título: Re:Camara OV7670
Publicado por: luismh en 28 de Octubre de 2016, 12:04:59
Hola amigo, tanto tiempo!

Perdón por haberte confundido, pero es tal cual como dices... la cámara con FIFO trae un cristal incorporado y por eso no tuve inconvenientes. No me di cuenta que la cámara sin FIFO necesitaba un reloj.

Pero todo sirve para aprender!

Seguramente ahora, con la versión con fifo podrás avanzar mas rápido... Cualquier duda que surja, trataré de ayudarte.
Y por supuesto... queremos ver imágenes también!!

Saludos!
Luis
Título: Re:Camara OV7670
Publicado por: groundman en 29 de Octubre de 2016, 15:25:11
bueno.pues al final no iva mal encaminado al intentar entender como funcionaba esta camara.en respuestas anteriores puse algunos oscilogramas para descifrar como
actuaban las señales de salida de la camara.me refiero al bus D0 a D7. y a las señales de sincronismo Vsync,Href. de reloj Pclk y Xclk. y control Reset y Pwdn.
SIO-D y SIO-C para el acceso a registros interno.

dare un repaso:

Xclk es la entrada de reloj y es indispensable para el funcionamiento de la camara.incluso para comunicarse mediante el bus SCCB (entre 10Mhz y 48Mhz)
Pclk:(pixel clock)es una salida de reloj para sincronizar dispositivos externos.y es la mitad de la frecuencia de entrada por Xclk.segun configuracion

Pwdn. tiene una resistencia pull-down. a este pin no le conectaremos nada.
Reset.  segun el datasheet tambien lleva una resistencia Pull-down.y segun el datasheet debe de estar 0.como funcionamiento normal.pero mi experiencia dice lo contrario.
   asi que se resetea a 0 logico y ha de llevarse a nivel 1 para que la camara funcione.

el bus SCCB es compatible I2C.aunque tiene su propia forma de leer y escribir en los registros.



esta camara con la configuracion por defecto tiene 640 x 480 pixels utiles.

asi que se podria decir que tiene 480 lineas. y que cada linea tiene 640 pixeles.y segun el formato de imagen y como cada pixel ocupa 2bytes.un byte cuando sube Xclk
y otro cuando baja Xclk.cada linea ocupa 1280 bytes.  1280 bytes x 480 lineas dan un total de 614.400 bytes utiles.

pero podemos bajar esta cantidad a 307.200bytes si usamos un formato de imagen RAW RGB.y que cada ciclo de reloj gestionaria un byte.


ahora explicare con imagenes capturadas por un osciloscopio el funcionamiento de las señales.configurando la camara para que nos muestre la barra de colores.
en concreto veremos la señal del D0 y con el formato RAW RGB.


en estas imagenes empezaremos a mostrar la frecuencia mas baja con el osciloscopio.asi que podremos ver la señal que genera cada cuadro.
que es la señal que hay entre espacios.

(http://www.4shared.com/img/iy6ION9hce/s25/1581153a808/cuadro) (http://www.4shared.com/photo/iy6ION9hce/cuadro.html)

cada cuadro esta separado por un tiempo.que en mitad de este esta la señal de SyncV.en color azul.

(http://www.4shared.com/img/3ZGcyJ1dce/s25/15811585b28/sync_V1) (http://www.4shared.com/photo/3ZGcyJ1dce/sync_V1.html)



ahora seguiremos ampliando y sincronizalemos con la señal Href.esta señal se mantiene a nivel alto durante el tiempo que dura una linea horizontal.bajando a nivel
cero cuando termina esta.

(http://www.4shared.com/img/wI5tYOzAce/s25/158116d6db0/pic_20_2) (http://www.4shared.com/photo/wI5tYOzAce/pic_20_2.html)

si seguimos ampliando veremos como coincide.y las diferentes combinaciones de las 8 barras de colores de la salida D0.

(http://www.4shared.com/img/fuldG11Lce/s25/15811343158/pic_19_3) (http://www.4shared.com/photo/fuldG11Lce/pic_19_3.html)

(http://www.4shared.com/img/AqJEfVm_ba/s25/15811351fa0/pic_19_4) (http://www.4shared.com/photo/AqJEfVm_ba/pic_19_4.html)

(http://www.4shared.com/img/ZUfqpePrba/s25/1581133d398/pic_19_5) (http://www.4shared.com/photo/ZUfqpePrba/pic_19_5.html)

y aumentando mas vemos el principio de una linea horizontal

(http://www.4shared.com/img/XT6S0qWAba/s25/158113569d8/pic_19_2) (http://www.4shared.com/photo/XT6S0qWAba/pic_19_2.html)


Por lo que he visto en estas imagenes del osciloscopio.Pclk es la mitad de frecuencia de Xclk.

Xclk:

(http://www.4shared.com/img/-6brgSypce/s25/15811a02610/pic_21_1) (http://www.4shared.com/photo/-6brgSypce/pic_21_1.html)

Pclk:

(http://www.4shared.com/img/SFiL4T9Rce/s25/158119fd408/pic_21_2) (http://www.4shared.com/photo/SFiL4T9Rce/pic_21_2.html)

Pclk es el Pixel clock.y biendo la imagen de abajo que corresponde a una de las barras de colores.todo cuadra.la barra de colores tiene 40ciclos.
y hay 8 barras de colores.40bytes x 8= 320bytes.que es el formato RAW RGB.

(http://www.4shared.com/img/5CcRak_Tce/s25/15811a68ac8/pic_22_1) (http://www.4shared.com/photo/5CcRak_Tce/pic_22_1.html)



bueno con todo esto creo tener aclaradas las dudas que tenia.y si no me he equivocado he dado una explicacion lo mas aproximada posible al funcionamiento
de la camara.aunque me gustaria comprobar si puedo configurar la camara para B/W y asi reducir el consumo de bytes sin tener que sacrificar la resolucion.
ya que es lo que me hace falta para crear el medidor optico que quiero desarroyar.


Título: Re:Camara OV7670
Publicado por: luismh en 31 de Octubre de 2016, 09:39:32
Bien bien bien

Esas imágenes y lo que describes suena bien.

Te cuento que para realizar capturas solo utilicé la señal VSYNC(HREF Y PCLK quedaron sin conectar). Cada vez que detectaba un pulso VSYNC(por interrupción externa INT0) ejecutaba la siguiente secuencia:

- Nivel alto en WEN: para habilitar escritura de fifo
- Pulso bajo en WRST:solo un pequeño pulso de 5 useg, luego vuelve a alto. Esto resetea el puntero de escritura de fifo y así guarda los bytes ordenadamente.
- Espero siguiente pulso VSYNC y pongo nivel bajo en WEN: para deshabilitar escritura en memoria y no sobreescriba lo que acaba de guardar.
- Listo! hay una foto guardada en la fifo!

El siguiente paso es habilitar la memoria fifo para lectura y luego tendrás que pensar como vas a hacer para visualizar la imagen un una PC. Tienes idea como hacer esto? Yo usé una SD con formato FAT via SPI.. Esto es un poco lento pero como tu imagen ya está guardada, puedes acceder a ella a la velocidad que quieras o puedas.

El problema de esto es que varios micros ocupan las mismas patitas para el puerto serial y se complica tener I2C y SPI al mismo tiempo. Lo ideal es un micro que tenga I2C y SPI en módulo separados(usé un dspic33fj128gp802)

Bueno, espero que sea de ayuda.
Saludos!
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 31 de Octubre de 2016, 11:58:40
hola luismh.voy a usar un 18f87k22.este tiene pins de sobra y dobles puertos.asi que es no es un problema.

lo primero que quiero hacer es capturar el codigo de barras y analizarlo en la memoria FIFO para tener una idea de que es lo que ha almacenado.
despues estoy pensando en pasar la imagen via usart a alguna aplicacion de PC o tablet.

pero resulta que la camara con FIFO no funciona igual que la otra.he intentado comunicarme por I2C y no responde.
la cosa es que conecto la camara normal y leo los datos.pero conecto la camara con FIFO y no hace nada.

he comprobado si funcionaba el oscilador de la camara con FIFO y me da 12Mhz.el reset ha de estar a 1 logico en esta camara?
en la otra funcina asi.aunque el datasheet dice lo contrario.aunque creo haber hecho la prueba con el reset invertido y da lo mismo.

lo que no se es si habria que quitar las resistencias de 4k7.supongo que son circuitos identicos a excepcion de la FIFO.
habra que poner algun pin a otro estado para que funcione el I2C o no tiene nada que ver?
Título: Re:Camara OV7670
Publicado por: luismh en 31 de Octubre de 2016, 13:34:23
Me temo que ambas cámaras son idénticas en cuanto comunicación i2c. Debería funcionarte inmediatamente.

Conecté: RST a Vcc y PWD a GND(RST=1 y PWD=0)
Título: Re:Camara OV7670
Publicado por: groundman en 01 de Noviembre de 2016, 14:39:47
hola luismh.al final he montado un circuito con la camara con fifo y una camara sin fifo.ya que no puedo esperar otro mes a que me llegue la camara nueva.

he hecho lo que me has dicho para el traspaso de datos de la camara a la fifo.pero ahora queria pasar los datos de la fifo a la ram del pic.
almenos los 256 primeros bytes para ver si funciona.

podrias decirme cual es la secuencia de lectura?
Título: Re:Camara OV7670
Publicado por: luismh en 01 de Noviembre de 2016, 15:24:46
Bueno, para lectura tendrás que generar un clock con tu micro y enviarlo al pin RCK de la cámara... La secuencia es la siguiente:

- Pones a nivel bajo WR. Te aseguras que no se va a escribir nada en la memoria(pues quieres leerla)
- Ahora debes resetear el puntero de lectura de la fifo... Presta atención a esto, pues a mi me llevó mucho tiempo descubrir como se hacía hasta que leí el datasheet de la memoria :oops::
- Para resetear, debes poner a cero el pin RRST... Pero no basta con esto
- Luego, mientras RRST está bajo, debes enviar 2 pulsos al pin RCK de la cámara. Según el datasheet de la memoria, el cursor de lectura solo se reseteará si, estando RRST en bajo, se detectan dos flancos ascendentes en el pin RCK(por eso necesitas enviar 2 pulsos)
- Luego, pones en alto RRST. Recién entonces, el cursor de lectura estará apuntando a la primera posición de memoria de la FIFO. Ahora sí, estás listo para extraer la información guardada.

- Para ello es que debes generar la señal de clock con tu micro y enviarla a RCK: La memoria te entregará un nuevo dato y aumentará automáticamente el puntero de lectura con cada flanco ascendente que envíes. Así, irás recorriendo toda la memoria.

Entonces, para leer sería así:
1- pin RCK en alto(se detecta el flanco ascendente).
2- Un nuevo dato está en el puerto de salida y el puntero se incrementó... Leo dato y guardo donde quiero.
3- pin RCK en bajo.
4- Vuelvo al paso 1 y repito tantas veces hasta recorrer toda la memoria o hasta obtener la cantidad de datos que requiero.

es más fácil de lo que parece, creo que di muchas vueltas para explicarlo, pero es una simple gestión de puertos lo que te permite acceder a la información guardada. Cabe destacar que la frecuencia de RCK puede ser tan lenta como quieras, solo tendrás que pagar el precio de esperar un poco mas hasta que termine.

Saludos!
Luis.
Título: Re:Camara OV7670
Publicado por: groundman en 01 de Noviembre de 2016, 18:33:24
hola uismh.he hecho lo suiguiente:

poner OE a low.
esperar a que Vsync se ponga a Hi
poner WEN a Hi.

un pulso a masa de 5us.

espero al pulso de Vsync.y pongo WEN a Lo.

esto es para guardar la imagen en el AL422.

ahora me pongo a leer el AL422 y pasar los datos a la ram del pic.


pongo RRST a Lo.

envio:

RRST_LO         
         
RCLK_LO   
RCLK_HI
RCLK_LO
RCLK_HI
      
RRST_HI

RCLK_LO
movff   PORTH,POSTINC2
RCLK_HI

RCLK_LO
movff   PORTH,POSTINC2
RCLK_HI

de esta forma se supone que habria leido dos bytes.pero solo leo 0x00 y 0x00

lo que ya no se es si esta leyendo correctamente o es que no hay nada en la memoria porque no se escribio nada.
Título: Re:Camara OV7670
Publicado por: luismh en 02 de Noviembre de 2016, 09:07:03
mmm... creo que te has equivocado en el proceso de escritura...

Pones OE a cero(lo tengo conectado a masa directamente a través de una R)

- Detectas flanco ascendente de VSYNC
- Envías pulso bajo de WRST de 5useg... es decir, WRST debe estar siempre alto hasta que llegas hasta este punto, donde lo pones a bajo durante 5 useg y luego vuelve a alto. Recuerda que los punteros, tanto de lectura como de escritura son activos bajos.
- Luego del pulso, el puntero de escritura está reseteado.
- Recién ahora pones WEN a uno(habilitas escritura) y lo mantienes en alto hasta que llegue otro VSYNC.

La secuencia de lectura parece correcta. Solo te sugiero que en el clock pongas algún retardo entre RCLK_LO y RCLK_HI y entre RCLK_HI y RCLK_LO. De lo contrario tu reloj tiene la frecuencia a la que tu micro está corriendo y tal vez sea demasiado rápido.

Deberías intentar guardar mas datos... sería bueno que guardes un par de filas de 640 pixeles

Saludos
Luis


Título: Re:Camara OV7670
Publicado por: groundman en 04 de Noviembre de 2016, 12:15:06
hola luismh.ya logre hacer funcionar la camara.capturo datos en la FIFO y luego los leo resetando el puntero de lectura.pero hay algo que no me convence respecto a los datos
grabados.

la lectura la realiza bien.ya que he reseteado varias veces el puntero de lectura y los datos son los mismos en varias lecturas.a excepcion de un par de bytes en la primera
lectura.pero sera un problema de adaptacion de sincronismo y no tiene importancia.

lo malo es que creo que no esta grabando bien en la FIFO.he hecho la prueba de tapar la lente para ver que datos ha grabado.estos datos deberian de ser sobre 0xff
en todos los bytes.y sobre 0x00 con una luzz de una linterna.pero esto no es asi.

se me ocurrio grabar la generacion de barras.pero los datos siempre varian.cuando se supone que las barra no varian sus datos.la primera barra es blanca.
asi que los primeros bytes deberian ser 0x00.

sabrias decirme de algun programa que introduciendo los datos por la usart.visualizara la imagen?


se me acaba de ocurrir otra cosa.para resetear el puntero de escritura.no habra que hacer como con el puntero de lectura? enviar los dos pulsos de reloj?
Título: Re:Camara OV7670
Publicado por: luismh en 04 de Noviembre de 2016, 12:42:27
Citar
se me acaba de ocurrir otra cosa.para resetear el puntero de escritura.no habra que hacer como con el puntero de lectura? enviar los dos pulsos de reloj?

No. Porque no puedes acceder al clock de escritura.. éste está conectado internamente con el oscilador de cristal

Para ver la imagen tendrás que crear en tu pc un archivo con extensión .raw(este es el formato que entrega la cámara)... Entonces debes guardar todos los bytes que les envíes por USART en este archivo. Luego, existe una aplicación gratuita llamada ffmpeg que te permitirá convertir este archivo .raw a .jpg y ver la foto

Una buena idea para comprobar que la transferencia de bytes es correcta, es crear un archivo de texto .txt y guardar allí los bytes. De esta manera puedes abrir y ver el archivo para comprobar que se grabó algo(el archivo .raw no podrás abrirlo ni ver que tiene). Cuando estés seguro que puedes enviar todos los bytes, recién puedes intentar con el archivo .raw

Me puedes contar otra vez cual es tu secuencia de escritura?

Saludos
Título: Re:Camara OV7670
Publicado por: KILLERJC en 04 de Noviembre de 2016, 12:51:38
Citar
(el archivo .raw no podrás abrirlo ni ver que tiene)

A no ser que use un editor hexadecimal
Título: Re:Camara OV7670
Publicado por: groundman en 04 de Noviembre de 2016, 18:31:50
seria asi:


      OE_LO         ;habilita chip AL422 "previamente estaba a HI"

VSYNC1      btfss   PORTJ,5      ;busca principio de cuadro Vsync
      goto   VSYNC1      ;espera hasta que se produzca



      WRST_LO         ;nivel bajo en WRST (reset del puntero de la FIFO) "previamente estaba a HI"
      call   retardo_5us
         
      WRST_HI         ;nivel alto en WRST
      call   retardo_5us


      WEN_HI         ;permite escritura en el AL422 ( en cada deteccion de Href )  "previamente estaba a LO"
         
VSYNC2      btfss   PORTJ,5      ;busca principio de cuadro Vsync
      goto   VSYNC2      ;espera hasta que se produzca
      WEN_LO         ;deshabilita escritura en AL422
      call   retardo_5us

Título: Re:Camara OV7670
Publicado por: groundman en 05 de Noviembre de 2016, 16:55:25
hola luismh.ya pude guardar la imagen en un archivo de texto.he guardado 307200bytes.
y luego he nombrado la extension del archivo .rar

pero no puedo pasarlo a jpg.los archivos rar no tienen una cabecera para indicar cuantos bytes lleva el archivo
y algunas cosas mas?

esque no se como montar este archivo .rar
Título: Re:Camara OV7670
Publicado por: groundman en 06 de Noviembre de 2016, 10:11:02
hola de nuevo.ya estoy obteniendo avances.aunque todabia se me resiste.he pasado los datos de la FIFO a un programa monitor
de comunicaciones serie.lo he hecho a 9600 porque tenia algunos errores de comunicacion.aunque igual se podria aumentar la velocidad
si adapto mejor la señal de 5v a 3.3v

para guardar los datos los he direccionado a un archivo de texto.tienen que ser 307200bytes.este archivo lo he abierto con una aplicacion llamada
Hexplorer.y esto es loo que he conseguido:


(http://www.4shared.com/img/36nXcHSDce/s25/15839a95ed8/barras1) (http://www.4shared.com/photo/36nXcHSDce/barras1.html)

hay una aplicacion. Easy2convert RAW to jpg.pero no me deja convertirlo.y eso que le he cambiado la extension del archivo txt a raw.
no se cual sera el problema.igual no se puede pasar un archivo de texto a raw solo con cambiarle la extension.

el programa funciona porque me baje una imagen de las barras en formato raw.y lo pasa bien a jpg.

el archivo de texto pesa 300k y cuando lo paso a raw pasa a 301k.igual es ese el problema.
Título: Re:Camara OV7670
Publicado por: groundman en 06 de Noviembre de 2016, 11:18:48
pues si que era ese el problema.resulta que al pasar la extencion del archivo txt a raw.al principio de los datos cambia algunos bytes.
y al final le sobran otros.solo hay que editarlo para corregirlo y el programa conversor raw-jpg ya funciona.

en esto es en lo que se ha convertido:

(http://www.4shared.com/img/nQrfN_Ggce/s25/15839f43ed0/barras2) (http://www.4shared.com/photo/nQrfN_Ggce/barras2.html)


como puede verse no es lo que realmente deberia haber producido la camara.pues estos son os datos que ha entregado la FIFO.he comprobado si
los datos se hubieran modificado al pasarlos por la usart.pero no es asi.esto es lo que entrega la camara.

ahora tendre que ver si esta mal configurada la camara.asi que seguire haciendo pruebas hasta que lo saque.
Título: Re:Camara OV7670
Publicado por: groundman en 06 de Noviembre de 2016, 14:39:51
al final en vez de cambiar la extension.abro el archivo con el editor hexagesimal y lo guardo como raw.asi no hay fallos
y esta es la imagen que he capturado con la camara.sigo experimentando haber porque no sale bien.

(http://www.4shared.com/img/FCir5KcBba/s25/1583ab4e338/imagen1) (http://www.4shared.com/photo/FCir5KcBba/imagen1.html)
Título: Re:Camara OV7670
Publicado por: luismh en 07 de Noviembre de 2016, 08:54:10
Excelente!

Puedo decirte con seguridad que estás mas cerca de lo que imaginas!!!

Pienso que te faltan 2 cosas: La cámara está mal configurada y fuera de foco

Has usado la configuración que envié algunos posts atrás? Esa me está andando

Recuerda que el foco es manual y tienes que ajustarlo y jugar hasta que lo encuentres

A seguir adelante! Falta poco para tener algunas imágenes!
Título: Re:Camara OV7670
Publicado por: groundman en 07 de Noviembre de 2016, 18:06:03
pues ya casi lo tenia cuando obtube esto:

(http://www.4shared.com/img/58TkJOGvba/s25/1583aff9c20/imag4) (http://www.4shared.com/photo/58TkJOGvba/imag4.html)

pero luego dejo de funcionar.se que el fallo esta en la captura de la imagen porque los datos de la imagen de las barras de colores no se parecen
en nada a lo que antes recibia.tendre que repasar otra vez todo el circuito.

y si.la configuracion es la que pusistes en respuestas anteriores.
Título: Re:Camara OV7670
Publicado por: KILLERJC en 07 de Noviembre de 2016, 18:35:54
Uff cada vez mas cerca groundman, te felicito.
Título: Re:Camara OV7670
Publicado por: luismh en 08 de Noviembre de 2016, 08:56:17
Definitivamente estás muy cerca!!

Me parece extraño que los colores salgan así...

Es como si estuviera mal configurada.

Aquí te paso algunas imágenes que tomé:

https://drive.google.com/open?id=0BxUPoFrAtnsHS0lBcGl4SFVra2s
https://drive.google.com/open?id=0BxUPoFrAtnsHcXRmSm8wbWUxLTQ
https://drive.google.com/open?id=0BxUPoFrAtnsHZE5tMDRyUVEyRk0

No somos realmente los modelos mas lindos, pero es lo que hay!
Estábamos probando como se veía dentro de un auto

Título: Re:Camara OV7670
Publicado por: groundman en 09 de Noviembre de 2016, 11:44:07
vaya.pues se ve bien con la camara.crei que al tener el formato RAW BAYER se verian peor.espero llegar pronto a ese logro que  has hecho.

yo por el momento sigo experimentando.he encontrado un error en la placa de desarroyo.el pin D0 no estaba conectado al microcontrolador.me di cuenta al ver que ese bit siempre estaba
a cero en la lectura de los datos de la FIFO.no digo que podria haber coincidido en la generacion de barras.pero en la toma de imagenes es casi imposible.

ojala me llegara ya la otra camara con fifo que pedi.pero las cosas de china 2 semanas como minimo de espera.

Título: Re:Camara OV7670
Publicado por: groundman en 10 de Noviembre de 2016, 12:18:49
hola.pude volver a echar a andar la camara.y esto es lo que sigo sacando:

(http://www.4shared.com/img/5kfJ0VUjba/s25/1584ec6a8c0/imag18) (http://www.4shared.com/photo/5kfJ0VUjba/imag18.html)

no se si sera algun registro que este mal configurado.o que al pasar los datos y crear la imagen estos se corrompan.lo que me ayudaria mucho es saber que datos envia la camara a
la FIFO con las barras activadas.al ser una sucesion de bytes iguales a trozos.pues me bendria bien saber que datos son del color blanco,amarillo,cyan,verde,azul,rojo,magneta,negro.

y de esta forma se puede saber si la camara esta mal configurada.encontre por internet una imagen de las barra de esta camara.ls datos del blanco eran el valor 0xAA.y este valor
no coincide con las varras que genera mi camara.
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Noviembre de 2016, 12:52:25
Has configurado el registro indocumentado 0xB0??? Debes escribir 0x8C en él. La hoja de datos no dice nada respecto de eso.

Es como si estuvieses sacando las imágenes en negativo... Todo tus colores están invertidos...

No conozco los valores binarios de cada color, lo lamento.
Título: Re:Camara OV7670
Publicado por: KILLERJC en 10 de Noviembre de 2016, 15:44:32
Negativo no es, le inverti los colores y queda igual.
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Noviembre de 2016, 16:06:22
Si no es negativa entonces pienso que estás perdiendo información en cada pixel...

No notas que algún bit(o mas) de los datos que recolectas se repite siempre?

Y la última opción que se me ocurre es una mala configuración.
Título: Re:Camara OV7670
Publicado por: groundman en 10 de Noviembre de 2016, 16:10:10
estos son los datos con los que configuro la camara:

dt   0x11,0x01, 0x12,0x01, 0x0c,0x00, 0x3e,0x00, 0x70,0x3A, 0x71,0x35, 0x72,0x11, 0x73,0xf0, 0xa2,0x02, 0x42,0x00
dt   0x11,0x80, 0x6b,0x0a, 0x2a,0x00, 0x2b,0x00, 0x92,0x00, 0x93,0x00, 0x3b,0x0a, 0x24,0x95, 0x25,0x33, 0x26,0xe3
dt   0xaa,0x00, 0xc9,0x60, 0x33,0x0b, 0x34,0x11, 0x21,0x02, 0x22,0x91, 0x37,0x1d, 0x38,0x71, 0x39,0x2a, 0xb1,0x0c
dt   0xb3,0x82, 0x17,0x13, 0x18,0x01, 0x32,0xb6, 0x19,0x02, 0x1a,0x7a, 0x03,0x0a, 0x12,0x01, 0x3a,0x04, 0xb0,0x8c
dt   0x13,0xe7, 0x6f,0x9f, 0x14,0x10, 0x01,0x40, 0x02,0x40, 0x6a,0x40, 0x41,0x3d, 0x4c,0x00, 0x77,0x00, 0x3f,0x00
dt   0x75,0x03, 0x76,0xe1


los he puesto de dos en dos.el primer byte es la direccion.el segundo el dato.ya los revise y no encontre ningun error.


es lo mismo que esto: tu configuracion.


Código: [Seleccionar]
;Configuración de cámara para VGA Bayer    
;CLKRC     (0x11)=0x01     //Prescaler interno sobre clock
;COM7     (0x12)=0x01     //Formato de salida "Bayer Raw"
;COM3     (0x0c)=0x00
;COM14     (0x3E)=0x00
;SCALING_XSC     (0x70)=0x3A
;SCALING_YSC     (0x71)=0x35
;SCALING_DCWCTR     (0x72)=0x11
;SCALING_PCLK_DIV   (0x73)=0xF0
;SCALING_PCLK_DELAY (0xA2)=0x02
;COM17     (0x42)=0x00     //Color bar=0x08
;
;Configuración de cuadros por segundo
;CLKRC     (0x11)=0x80     //Sin prescaler interno sobre clock.
;DBLV     (0x6b)=0x0A     //PLL desactivado.
;EXHCH     (0x2a)=0x00
;EXHCL     (0x2b)=0x00
;DM_LNL     (0x92)=0x00
;DM_LNH     (0x93)=0x00
;COM11     (0x3b)=0x0A
;Configuración de Exposición automática
;AEW     (0x24)=0x95
;AEB     (0x25)=0x33
;VPT     (0x26)=0xE3

;HAECC7     (0xAA)=0x00     //Algoritmo de promedios. *******************************
;SATCTR     (0xc9)=0x60
;CHLF     (0x33)=0x0B
;ARBLM     (0x34)=0x11
;ADCCTR1     (0x21)=0x02
;ADCCTR2     (0x22)=0x91
;ADC     (0x37)=0x1D
;ACOM     (0x38)=0x71
;OFON     (0x39)=0x2A
;ABLC1     (0xb1)=0x0C     //Habilita función ABLC

;THL_ST     (0xb3)=0x82     //Objetivo ABLC
;Windowing
;HSTART     (0x17)=0x13
;HSTOP     (0x18)=0x01
;HREF     (0x32)=0xB6
;VSTRT     (0x19)=0x02
;VSTOP     (0x1a)=0x7A
;VREF     (0x03)=0x0A
;Configuración de cámara para salida "Processed Bayer RGB"
;COM7     (0x12)=0x01     //Configuro formato de salida. Color bar=0x03 o 0x07
;TSLB     (0x3a)=0x04     //Configuro secuencia de datos.
;RSVD     (0Xb0)=0x8C     //Registro reservado.

;//EscribirOV7670(COM13,0x08);      //Gamma deshabilitado "no fijado en codigo"
;COM8     (0x13)=0xE7
;AWBCTR0     (0x6f)=0x9F
;COM9     (0x14)=0x10
;BLUE     (0x01)=0x40
;RED     (0x02)=0x40
;GGAIN     (0x6a)=0x40
;COM16     (0x41)=0x3D
;DNSTH     (0x4c)=0x00
;REG77     (0x77)=0x00
;EDGE     (0x3f)=0x00

;REG75     (0x75)=0x03
;REG76     (0x76)=0xE1
Título: Re:Camara OV7670
Publicado por: luismh en 10 de Noviembre de 2016, 16:22:55
Has leído los registros de la cámara y confirmado que efectivamente se están guardando los valores que le indicas?

Podrías leer unos 5 al azar y confirmar que contienen el valor que le mandas y no el valor por defecto que indica la hoja de datos.

Recuerda que aplicar un reset o quitar la alimentación a la cámara resetea todo por defecto
Título: Re:Camara OV7670
Publicado por: groundman en 10 de Noviembre de 2016, 18:39:41
estos son los datos que leo despues de un reset:

(http://www.4shared.com/img/lpF5wFocce/s25/15853a2f7b8/ov7670reset) (http://www.4shared.com/photo/lpF5wFocce/ov7670reset.html)

y estos cuando le cargo la nueva configuracion:

(http://www.4shared.com/img/O456WWUyce/s25/15853a55530/ov7670conf) (http://www.4shared.com/photo/O456WWUyce/ov7670conf.html)

puede notarse que los bytes que se han modificado estan en rojo.


bueno.algunos registros como el de ganancia 0x00 varia segun la luz que entre por el objetivo.y otros como el 0x11 varia segun que configuracion estemos
realizando.

por lo que vi otra vez.solo hay un registro que lo configuramos con un valor y este cambia a otro.el registro 0xc9 que se le introduce el valor 0x60
y aparece el 0x6b.

pero como algunos registro o la mayoria trabajan con bits de entrada como de salida.es dificil saber que valores son fijos o cuales van a variar.
Título: Re:Camara OV7670
Publicado por: groundman en 11 de Noviembre de 2016, 11:59:33
me he dado cuenta de una cosa que puede que sea el fallo que me esta ocurriendo.he comprobado que cuando inicio la simulacion.desde el principio del codigo.
en cada secuencia se producen dos imagenes diferentes referente a los datos recibidos de la camara.

los 256bytes de la direccion 0x100 son los registros internos.
y apartir de la 0x200 son los datos de la FIFO

(http://www.4shared.com/img/sPey-S1Bba/s25/15853d926d0/par) (http://www.4shared.com/photo/sPey-S1Bba/par.html)

(http://www.4shared.com/img/mIzhjIHUba/s25/15853d93a58/impar) (http://www.4shared.com/photo/mIzhjIHUba/impar.html)

y siempre sale lo mismo.incluso los datos se envian por el puert serie y son identicos.asi que no se pierden datos por el camino.
estos datos son de la generacion de las barras de colores.
Título: Re:Camara OV7670
Publicado por: luismh en 11 de Noviembre de 2016, 12:10:13
porqué los registros internos cambian?

Será que tal vez estás ordenando mal los datos de la FIFO?
Título: Re:Camara OV7670
Publicado por: groundman en 11 de Noviembre de 2016, 17:26:52
los registros internos se cargan desde el bus SCCB a partir de la direccion 0x100.y los datos leidos de la FIFO a partir de la direccion 0x200.
la direccion 0x00 es el valor de ganancia.y este cambia segun la luz ambiental.supongo que abra otros registros que tambien cambian por otros motivos.

a ti no te ocurre esto con tu camara?que cambien los registros.
Título: Re:Camara OV7670
Publicado por: groundman en 11 de Noviembre de 2016, 18:28:33
en esta pagina: http://embeddedprogrammer.blogspot.com.es/2012/07/hacking-ov7670-camera-module-sccb-cheat.html

dicen que para configurar los registros internos.priimero hay que leerlos y luego modificar los valores pertinentes.pero no sobreescribirlos sin mas.luismh a ti te hizo falta implementar
esta opcion en el codigo?

tambien dicen algo de una prueba con la camara tapada.la he tapado y he obtenido algo curioso.empezo a crear una imagen en negro.para luego en mitad de la image
empezar a cambiar casi como si hubieramos configurado la camara para visualizar las barras.

voy a tener que revisar esto.haber cual es el problema que esta ocurriendo.
Título: Re:Camara OV7670
Publicado por: groundman en 12 de Noviembre de 2016, 10:49:14
he hecho unas pruebas.y estos son los registros que cambian cada vez que se leen los registros internos.con la configuracion RAW BAYER.

            valores aleatorios.
0x00   GAIN            ;varia segun obstruccion de la lente
0x01   BLUE         ;varia segun obstruccion de la lente
0x05   BAVE         ;varia segun obstruccion de la lente
0x06   GbAVE         ;varia segun obstruccion de la lente
0x08   RAVE         ;varia segun obstruccion de la lente
0x2f   YAVE         ;varia segun obstruccion de la lente
0x4c   DNSTH         ;07 es el mas comun
0x6a   GGAIN         ;varia segun obstruccion de la lente
0xbe   AD-CHB         ;00,01,02
0xbf   AD-CHR         ;00,01,02
0xc0   AD-CHGb         ;42,43,44
0xc1   AD-CHGr         ;42,43,44

ademas he comprobado que con la configuracion por defecto al tapar la lente la salida D7 sigue mandando datos.y D0..D6 no mandan datos.
sin embargo con la configuracion RAW BAYER D0..D2 envian datos y D3..D7 no envia.

es decir despues de un reset.los datos de la imagen solo se utilizan las salidas D0..D6
y con la configuracion RAW BAYER.solo se utilizan las salidas D3..D7  almenos estas son las mediciones que me salen.

supongo que depende de la configuracion que le pongamos a la camara esta trabaja de una forma u otra con el sensor de imagen.



respecto a los archivos que se modifican solos aunque los hayamos configurado.son el 0x01 BLUE y el 0x4c DNSTH.
los demas no se inmutan.

incluso puedo decir que con el objetivo tapado.apenas cambian los valores de los registros.

Título: Re:Camara OV7670
Publicado por: groundman en 12 de Noviembre de 2016, 17:33:38

parece que cometi un error enorme.no se como no me di cuenta.lo tenia delante y no lo vi.

para recibir los datos de la fifo. uso el programa Serial Port Monitor.y cuando recivo los datos no hay nada raro.

(http://www.4shared.com/img/C5D6lyfpce/s25/1585a2fd128/SerialPort) (http://www.4shared.com/photo/C5D6lyfpce/SerialPort.html)

los datos recividos se guardan en un archivo.

pero al abrir el archivo con Hexplorer:

(http://www.4shared.com/img/KmGjCpzdce/s25/1585a3497d0/Hexplorer) (http://www.4shared.com/photo/KmGjCpzdce/Hexplorer.html)

se ve como los datos han cambiado.siendo separados por el dato 0x00.
todabia no se que programa voy a utilizar para obtener un archivo limpio de estos ceros.
Título: Re:Camara OV7670
Publicado por: groundman en 12 de Noviembre de 2016, 18:57:26

ya encontre la forma.

se selecciona todo el texto de la ventana Termina view del programa Serial Port Monitor.y se pega en el Bloc de notas.y se guarda con la extencion .raw
esto es lo que he conseguido.ya estoy muy cerca.

(http://www.4shared.com/img/l8cG2C-zce/s25/1585a89f360/imag26) (http://www.4shared.com/photo/l8cG2C-zce/imag26.html)
Título: Re:Camara OV7670
Publicado por: groundman en 12 de Noviembre de 2016, 19:20:05
por lo que veo la secuencia de las barras de colores es: blanco , cyan , amarillo , verde , magneta , azul , rojo , negro
lo que no se porque salen las barras de colores desincronizadas.pero en grupos.es muy raro.
Título: Re:Camara OV7670
Publicado por: groundman en 13 de Noviembre de 2016, 13:53:26
por fin  :-/.aqui esta el resultado:

(http://www.4shared.com/img/67ruIX1Kce/s25/1585e8fa108/imag33) (http://www.4shared.com/photo/67ruIX1Kce/imag33.html)

no se porque la barra blanca esta cortada.pero me da la impresion de que es realmente lo que genera la camara.

he cometido varios errores hasta llegar a este objetivo.los he ido solucionando realizando multitud de pruebas.
y los he encontrado de pura casualidad.

el ultimo de los fallos que he descubierto es que despues de habilitar WEN hay que ponerle un retardo para que a la camara
le de tiempo a estabilizarse.si no se desincroniza todo.
Título: Re:Camara OV7670
Publicado por: KILLERJC en 13 de Noviembre de 2016, 14:39:21
Felicidades groundman!
Título: Re:Camara OV7670
Publicado por: groundman en 13 de Noviembre de 2016, 16:05:56
gracias.ahora estoy liado con la imagen.pero no encuentro un programa con el que pueda recibir datos por el puerto serie.copiar los datos y pegarlos o crear un archivo directamente.

la mayoria de los que he visto al copiar y pegar se modifican los datos y los corrompen.aveces los copia bien y otras no.por eso he tardado tanto en hacer que funcione.
si no ya estaria todo funcionando.
Título: Re:Camara OV7670
Publicado por: luismh en 13 de Noviembre de 2016, 16:56:02
Excelente!  ((:-)) ((:-)) ((:-)) :-/ :-/ :-/
Título: Re:Camara OV7670
Publicado por: luismh en 13 de Noviembre de 2016, 16:57:28
También a mi me salía la barra blanca cortada... no le des importancia a esto, tus fotos saldrán bien!
Título: Re:Camara OV7670
Publicado por: groundman en 14 de Noviembre de 2016, 10:19:41
pues me lie ha hacer pruebas con la camara y muchas fotos me salen asi:

(http://www.4shared.com/img/l-LXf-xTba/s25/15862fbdc98/imag44) (http://www.4shared.com/photo/l-LXf-xTba/imag44.html)

solo una me salio bien pero desenfocado.ya que tengo que ir ajustando la lente.pero lo raro es que las imagenes desisncronizadas.pare que salen segun el enfoque que realice.
seguire haciendo pruebas.
Título: Re:Camara OV7670
Publicado por: groundman en 17 de Noviembre de 2016, 11:53:09
pues valla.los dolores de cabeza no han termminado.no se porque las cosas no pueden salir bien a la primera.

por lo que estoy viendo.el problema lo tengo con los programas que uso para recibir los bytes.
el VSP de eltima.tenia el problema de que si enviaba los datos a una carpeta.estos datos estaban separados por el byte 0x00
y si los copio de la ventana ascii.como hay caracteres como el espacio que no se pueden copiar.pues como que le faltan datos.

pero encontre un programa el Free Device Monitoring Studio.que si puedo copiar los datos en formato RAW.y convertirlos en jpg.

resulta de que si pongo las barras de colores.lo hace perfecto.307200bytes.
pero si pongo una imagen,no llegan a esaa cantidad de bytes.asi que hice unas pruebas y resulto loo que ya sospechava.
faltan bytes!!!

envie del 0x00 al 0xff y resulto que faltan los bytes 0x11 y 0x13.como las barras no tienen estos bytes pues funcionan bien.
pero las imagenes solo me salian algunas si da la casualidad de que estos bytes no estan entre los datos.
asi que no se que programa podra pasarme bien los datos.
Título: Re:Camara OV7670
Publicado por: luismh en 17 de Noviembre de 2016, 12:33:55
No entiendo bien... dondes pierdes los datos? al guardar en fifo o al transferir desde un archivo .raw a .jpg?

Como te comenté, usé el programa ffmpeg... y no tuve problemas. El único temita es que es un poco difícil y poco intuitivo de usar, pues se controla desde la consola de comandos. Pero si quieres probar, te puedo ayudar.
Título: Re:Camara OV7670
Publicado por: groundman en 18 de Noviembre de 2016, 12:11:40
hola luism.gracias por tu voluntad en ayudarme.la verdad que sin tu ayuda esto habria tirado para largo.cuando todo funciona a la primera
el control de esta camara no es tan dificil.pero como depende de tantas cosas,pues simpre hay errores.

el programa que comentas es vastante complicado de manejar.y por eso no me puse con el.pero para pasar el RAW a JPG esta solucionado.
ya encontre el programa Easy2convert RAW to JPG 2.3  y funciona perfectamente.lo unico es que el RAW tiene que tener un determinado numero
de bytes para que haga la conversion.si no.no funciona.en mi caso pongo los 307200bytes y hace la convesion bien.

referente al problema que tenia con el programa Free Device Monitoring Studio.con respecto a los caracteres que se perdian 0x11 y 0x13
me di cuenta de que era porque tenia activado el control de flujo Xon/Xoff

por lo visto la camara ya estaba funcinando bien de hace bastante tiempo.en la fifo se guardaban bien las imagenes.el error estaba
al extraerlas por la usart.ya porque algunos programas no funcionaban de la forma que yo queria.o porque no sabia manejarlos.

aqui esta el fruto de casi 5 meses desde que que empeze el tema.ufff como pasa el tiempo.



(http://www.4shared.com/img/1idQpkSVba/s25/15877f58950/imag80) (http://www.4shared.com/photo/1idQpkSVba/imag80.html)

Título: Re:Camara OV7670
Publicado por: luismh en 18 de Noviembre de 2016, 12:19:38
Excelente!!!! ((:-)) ((:-)) ((:-)) :-/ :-/ :-/ :mrgreen: :mrgreen: :mrgreen:

Ahora puedes empezar a jugar con distintas configuraciones para ajustar color, contraste, brillo, tamaños, etc.
Lamentablemente, la documentación es exacta y tendrás que probar experimentalmente.
Tiene función para tomar fotos en condiciones de poca luminosidad pero no la probé nunca!

Muchas felicitaciones!!
Título: Re:Camara OV7670
Publicado por: groundman en 18 de Noviembre de 2016, 19:01:33
gracias. luismh tendrias por ahi la configuracion para capturar la imagen en blanco y negro? me gustaria saber como se generan los bytes para este tipo de imagen.
he puesto la configuracion del datasheet pero sale esto:

(http://www.4shared.com/img/WAF2cEnSba/s25/15879721730/imag87) (http://www.4shared.com/photo/WAF2cEnSba/imag87.html)

tengo entendido de que RAW BAYER usa un byte para cada color/pixel y los va  alternando.pero YUV usa 2bytes para cada pixel.
lo que no entiendo es si la imagen ya seria del doble. de 307200bytes.

Título: Re:Camara OV7670
Publicado por: groundman en 19 de Noviembre de 2016, 17:45:26
he encontrado esta pagina con la configuracion.pero no se como implementarla.

https://gist.github.com/taylanpince/a30199647af85698b10b
Título: Re:Camara OV7670
Publicado por: groundman en 20 de Noviembre de 2016, 17:41:01
bueno.sigo con los avances.estube dandole bueltas a la cabeza con respecto a la generacion de una imagen en formato YUV
y pensaba que la imagen saldria en blanco y negro.pero no es asi.es otro formato diferente.nada mas.

lo que pasa es que cada pixel ocupa 2bytes.y esta imagen no cabe en la fifo.pero si puedo guardar media imagen
en la fifo.y seguir leyendo hasta que alcance los 614.400bytes que ocupa este tipo de formato de 640x480
la imagen no saldria bien pero podemos practicar con su funcionamiento.

el formato de salida aparte de la calidad.tambien posibilita el uso de la imagen en diferentes dispositivos.
ya que no todos los aparato o programas son capaces de reproducir diferentes formatos.

por ejemplo.las imagenes RAW BAYER he podido reproducirlas con el programa Easy2Converter.
pero no puedo reproducirlas con el programa Magic Lantern YUV422.sin embargo con este si puedo reproducir una imagen
YUV422.

he generado las barras de colores con el formato YUV422 y esto es lo que he visualizado:

una imagen de 614.400bytes.que son dos bytes por pixel.al contrario del formato RAW BAYER que ocupa un byte por pixel.

(http://www.4shared.com/img/jRJhwkfXba/s25/15883663b68/yuv6) (http://www.4shared.com/photo/jRJhwkfXba/yuv6.html)

es diferente a las barras que ya puse en otra captura.ya que no he encontrado la configuracion correcta.
los colores se ven nitidos.pero no son los clores que les corresponde.si capturamos una imagen se ve esto:

(http://www.4shared.com/img/pNsEbZ67ba/s25/15883743d58/yuv2) (http://www.4shared.com/photo/pNsEbZ67ba/yuv2.html)

y supongo que sucede esto porque los colores no estan donde deberian.
Título: Re:Camara OV7670
Publicado por: groundman en 21 de Noviembre de 2016, 12:24:22
aqui traigo un adelanto de los avances que he tenido para la captura de una imagen en blanco y negro.con la señal de luminancia Y

(http://www.4shared.com/img/JPKryetrce/s25/158877b7970/imagBW2) (http://www.4shared.com/photo/JPKryetrce/imagBW2.html)
Título: Re:Camara OV7670
Publicado por: groundman en 21 de Noviembre de 2016, 18:26:53
es posible que en la imagen en color este bien.pero al reproducirla con un programa no compatible no se vea bien.
habria que buscar uno que lo fuera.pero ahora mismo no tengo mucho tiempo para experimentar con esto.

asi que me he puesto a experimentar con el dato de la luminancia. Y

hay varias formas de ordenar los datos de la imagen en la memoria de la camara con el formato YUV422.
serian YUYV,YVYU,VYVU,UYVY.

el problema es que este formato usa 2bytes por pixel.y eso son 614.400bytes.y esta imagen no cabe en la FIFO.
pero si solo usamos los bytes de luminancia,la imagen de 640x480 en blanco y negro si cabria en la FIFO.

pero para hacer esto habria que dividir la señal Pclk que entra al pin WCK del AL422B.se podria poner
una bascula JK entre medias.

por estos motivos la imagen en blanco y negro de arriva aparece cortada.porque estoy extrayendo la mitad de los datos.
es decir de la señal YUYV extraigo YY.la otra mitad de los datos que hay en la FIFO.los UV solo estan ocupando espacio.
si pudiera configurar la camara para generar solo los datos de luminancia,no habria que poner la bascula JK.
ya que no estariamos guardando los datos UV en la FIFO.pero no se si esto es posible.

seguire buscando.pero si no lo encuentro,pondre la bascula.


cuando solucione esto.estoy pensando en reproducir la imagen directamante de la camara.a algun interfaz de imagen.
se me ocurre que podria poner a la salida de la camara sin pasar por la FIFO.un conversor digital-analogico.
descartando los datos UV.asi tendria una señal analogica de la luminancia.y con las señales de sincronismo.
formaria otra señal para el sincronismo del cuadro y lineas.

no se como funciona una GLC.pero si fuera compatible,igual podria implementarlo.

Título: Re:Camara OV7670
Publicado por: groundman en 27 de Noviembre de 2016, 17:23:02
Pues como ya que logre hacer funcionar la camara.voy a analizar e intentar explicar a mi entender como gestiona la camara
los datos de la imagen segun su formato.

La imagen en el formato RAW BAYER RGB.usa un byte por pixel y tiene una distribucion un tanto curiosa.
como se explica aqui: http://www.siliconimaging.com/RGB%20Bayer.htm

la imagen en VGA tiene 640x480.si usamos otra resolucion pues tendriamos imagenes mas pequeñas que ocuparian menos espacio.
640x480= 307.200bytes. y estos son los bytes que va a generar la camara por cada cuadro.

esta es una imagen del generador de barras de colores.son 8 en total.aunque la blanca se vea partida.

(http://www.4shared.com/img/N9DprSapba/s25/158a2c2d7a0/imag142) (http://www.4shared.com/photo/N9DprSapba/imag142.html)

y estas otras dos imagenes son los datos con los que se integra la imagen:


principio de los datos de la imagen:

(http://www.4shared.com/img/SuiwBCIrce/s25/158a2acee40/barras_raw_bayer__1_) (http://www.4shared.com/photo/SuiwBCIrce/barras_raw_bayer__1_.html)


final de los datos de la imagen:

(http://www.4shared.com/img/3HdcDmnsba/s25/158a2f27320/barras_raw_bayer_fin) (http://www.4shared.com/photo/3HdcDmnsba/barras_raw_bayer_fin.html)



ahora bamos a analizar los datos.

como se puede ver en la primera imagen de los datos.estos alternan entre diferentes grupos de datos.
desde la direccion 0x00 a la 27fh(640d) que pertenece a la primera linea horizontal.

puede notarse como el ultimo dato de la linea horizontal contiene e valor 0x00.esto es igual para todas las lineas.

tambien se puede notar como los primeros bytes corresponderian con la banda blanca del generador de barras.
y los ultimos tambien son de la banda blanca.ya que son los mismos valores.

los ultimos datos de la imagen.que son los de la banda blanca.tienen mas de 80 bytes.
que son los que corresponden a la segunda linea horizontal.pero que teniendo en referencia el 0x00 de la direccion 27fh
nos queda indicado que es el principio de la segunda linea.

los valores
d5 c6 d5 c6 d5 c6......  conforma el color blanco.pero es una tonalidad.si he visto que
hay una coincidencia en el formato RAW BAYER entre lineas horizontales.ya que coinciden asi:

para el blanco:

d5 c6 d5 c6 d5.... 640bytes por linea
c6 d5 c6 d5 c6.... 640bytes
d5 c6 d5 c6 d5....
c6 d5 c6 d5 c6....


si ponemos en el Hexplorer estos datos:
hay que enviar los valores d5 c6 en un total de 307200bytes y obtendriamos el color blanco

pero los datos de las lineas horizontales hay que intercalarlos para obtener el formato RAW BAYER

(http://www.4shared.com/img/m23u8-85ba/s25/158a65cbb88/hexPlorerBlanco) (http://www.4shared.com/photo/m23u8-85ba/hexPlorerBlanco.html)


(http://www.4shared.com/img/SxnIVsG2ba/s25/158a66016e8/blanco) (http://www.4shared.com/photo/SxnIVsG2ba/blanco.html)


aunque no es un blanco total.


el magneta sigue la secuancia:

d5 17 d5 17 d5
17 d5 17 d5 17
d5 17 d5 17 d5
17 d5 17 d5 17

y la imagen es:

(http://www.4shared.com/img/tIVYHKdtce/s25/158a6d955f8/rojo3) (http://www.4shared.com/photo/tIVYHKdtce/rojo3.html)

el verde suige la secuencia:

17 d5 17 d5 17
d5 17 d5 17 d5
17 d5 17 d5 17
d5 17 d5 17 d5

y la imagen es:

(http://www.4shared.com/img/h1aVuIYVba/s25/158a6fab108/verde) (http://www.4shared.com/photo/h1aVuIYVba/verde.html)

es curioso que aunque sean bytes iguales la imagen sea diferente.pero esto es prque se ha empezado con otra secuencia diferente.











cuando los 307.200bytes que conforman la imagen son identicos.se obtiene una tonalidad entre el negro 0x00 y el blanco 0xff

si utilizaramos el valor 0x7f que es 127 en decimal.se obtendria una imagen en gris.ya que le estamos dando el mismo
valor de luminosidad a cada pixel.

(http://www.4shared.com/img/EvTqXXkNce/s25/158a714a978/imagxx7f) (http://www.4shared.com/photo/EvTqXXkNce/imagxx7f.html)









esto de abajo es la secuencia RAW BAYER.
R G R G R
G B G B G
R G R G R
G B G B G


para entender como funciona esta secuencia.he puesto estos valores manualmente.esta secuencia es del color verde:

00 ff 00 ff 00.... todas las tineas tienen 640bytes.
ff 00 ff 00 ff...
00 ff 00 ff 00...
ff 00 ff 00 ff...

este es el resultado:

(http://www.4shared.com/img/f8p1lXJDce/s25/158a7363750/imagxxff00) (http://www.4shared.com/photo/f8p1lXJDce/imagxxff00.html)

esta secuencia corresponde al color rojo:

ff 00 ff 00 ff.... todas las tineas tienen 640bytes.
00 00 00 00 00...
ff 00 ff 00 ff...
00 00 00 00 00...

este es el resultado:

(http://www.4shared.com/img/W30A7mTzce/s25/158a73c0b80/imagxxR) (http://www.4shared.com/photo/W30A7mTzce/imagxxR.html)

esta secuencia corresponde al color azul:

00 00 00 00 00.... todas las tineas tienen 640bytes.
00 FF 00 FF 00...
00 00 00 00 00...
00 FF 00 FF 00...

este es el resultado:

(http://www.4shared.com/img/LVvET6n2ba/s25/158a7651368/imagxxB) (http://www.4shared.com/photo/LVvET6n2ba/imagxxB.html)


bueno.esto es lo que he aprendido realizando un monton de pruebas.ya que no estaba muy seguro del funcionamiento.
ahora ya lo tengo bastante claro.es posible que internamente la camara tenga la opcion de transformar los datos RAW BAYER RGB
a imagenes de blanco y negro.y que no hiciera falta el doble de memoria que usa un formato YUV422.

aunque tampoco se si los satos serian los mismo respecto a la calidad.de todas formas estoy esperando a recibir
una bascula JK para dividir el CLK y asi coger solo los datos de luminancia.mas adelante pondre el proyecto
pero por ahora lo estoy limpiando un poco.
Título: Re:Camara OV7670
Publicado por: groundman en 04 de Diciembre de 2016, 15:06:59
pues ya limpie el codigo.y pongo el archivo para que los descargueis.

este codigo sirve tanto para una camara con FIFO integrada como para una a la que le fabriquemos el circuito con el AL422 externo.

para la camara con FIFO.los pins HREF,STR y PWDN quedaran libres.ademas tal y como se ve en la imagen.hay que soldar 2 resistencias de 4k7 entre SIOC y SIOD a +3.3v

(http://www.4shared.com/img/oMmUt_2-ce/s25/158ca6c73d8/IMAG2393) (http://www.4shared.com/photo/oMmUt_2-ce/IMAG2393.html)



yo me he montado un circuito multiproposito.es decir,una placa para hubicar el PIC18F87K22 de la forma mas compacta y versatil posible.aparte de poder trabajar a diferentes voltages.
desde 3.3v,5 o superiores.ya que monto un regulador integrado.pero que hay que combinar con el Vreg interno del pic.para ello hay un interruptor para conmutar.
tambien le he dotado de un conector microUsb para alimentar el circuito con un cargador de mobil standar.y un conector micro ICSP para la conesion del Debugger en circuito.
aparte de hubicaciones para los Cristales.aunque en este circuito no hacen falta.

estoy pensando en mandar a hacer las PCB a china.pero como es la primera vez estoy en la duda si hare bien el prototipo y no vendra con errores.
aunque hacer esta placa a mano se te va casi todo el dia.


(http://www.4shared.com/img/kQ_bV07vce/s25/158ca740558/IMAG2394) (http://www.4shared.com/photo/kQ_bV07vce/IMAG2394.html)


para realizar la conexion con este circuito.yo recomiendo imprimir la pagina del componente y señalar cada pin que se valla a utilizar.

estos son los pin:

   ;PORTC,3=pin44 SCL1      ;para I2C
   ;PORTC,4=pin45 SDA1      ;para I2C
   ;PORTC,5=pin46         ;reset de la OV7670
   ;PORTC,6=pin37 TX1      ;eusart1 (poner resistencia serie de 1k)
   ;PORTJ,7=pin42         ;conexion a WRST de la FIFO
   ;PORTJ,6=pin41         ;conexion a RRST de la FIFO
   ;PORTJ,5=pin40         ;conexion a Vsync de la camara
   ;PORTJ,4=pin39         ;conexion a WR = WE o WEN del AL422
   ;PORTJ,3=pin59         ;conexion a OE del AL422
   ;PORTJ,2=pin60         ;conexion a RCK del AL422
   ;PORT3,3=pin77         ;conexion a XCLK de la camara(no se usa en la version con fifo integrada)
   ;PORTH             ;puerto de entrada para el bufer de la FIFO.

el pin 77 REFO del pic es una salida de 16Mhz.y no se usa para la camara con fifo porque esta ya tiene su oscilador integrado de 12Mhz.esta frecuencia es necesaria incluso para que funcione
el puerto SCCB de la camara.hay unos limites de frecuencia maxima y minima.que si los sobrepasamos la camara no funcionara.

en la camara con FIFO.solo hay que realizar estas conexiones y funcinara.en la camara sin FIFO hay que tener en cuenta cuando se fabrique el circuito para el AL422.que tenemos que
poner una puerta logica NAND entre HREF y WE de la fifo.

es decir.conectar HREF a una de las entradas de la NAND y WE a la salida de la NAND. y asi la otra entrada de la NAND se convierte en el pin WR.en realidad es como si pusieramos
un interruptor que cuando lo habilitaramos(WR).solo se grabaran datos a la FIFO cuando se active Href.que es cuando se pasan los datos de cada linea horizontal.
el componente es el SN74LVC1G00DBVRG4 sirve para 3.3v con encapsulado SOT23-5

asi lo explica este esquema:

(http://www.4shared.com/img/jOT_GQN1ce/s25/1581b2e8398/esquema_ov7670) (http://www.4shared.com/photo/jOT_GQN1ce/esquema_ov7670.html)




en el archivo OV7670_18f87k22.inc   hay comentados dos tipos de configuracion. la que genera una imagen RAW BAYER RGB  VGA. y la que genera las barras de colores tambien en el mismo formato.
hay que descomentar y comentar otra para segun lo que queramos usar.

el pin TX del pic lo usaremos para enviar la imagen a un archivo.el cual convertiremos en un formato de imagen para visualizarlo.

hay varios programas de monitor serie que pueden capturar los datos.pero no todos los mandan a un archivo de forma correcta.

uno que si que funciona es el Advanced Serial Port Terminal 6 de Eltima Software.

y funciona de la suiguiente manera:

una vez que conectemos el conversor USB-SERIAL a nuesto ordenador.se creara un puerto.el programa debe de cogerlo automaticamente.

crearemos una nueva sesion.eligiremos el puerto y una velocidad de 57600 baud.lo demas no lo tocaremos.abriremos la sesion.seleccionarems DataView.y luego OpenPort.
luego clicaremos en Receive ASCII/binary file.escribiremos el nombre con el que queremos guardar el archivo con la extension .raw

ya solo queda enviar los datos serie y recibir los 307.200bytes.estos datos se enviaran al archivo que creamos con la extension .raw

ahora solo queda convertir el archivo .raw en .jpg con la aplicacion Easy2Converter RAW to JPG 2.3  y tendremos la imagen lista.

si pasamos la imagen a una velocidad de 115200baud tambien nos sale bien la imagen y es mas rapido de pasar los datos.
para eso hay que cargar en el archivo Eusart.inc  el valor .34 en el registro SPBRG1. en vez del valor .69 que es para 57600baud.

la imagen sale asi:

(http://www.4shared.com/img/riyxFDWHce/s25/158caf47c10/OVfifo13) (http://www.4shared.com/photo/riyxFDWHce/OVfifo13.html)

pero si quisieramos pasarla mas rapido todabia a 256000baud.la imagen saldria distorsionada.

(http://www.4shared.com/img/qd4GxXYFce/s25/158caf4ca30/OVfifo12) (http://www.4shared.com/photo/qd4GxXYFce/OVfifo12.html)

supngo que habria que adaptar mejor la señal y aislarla tambien.pero lo mejor es esperar un poco y nos quitamos de enredos.

bueno esto es todo.mas adelante ire poniendo otras configuraciones.si es que me da tiempo despues de hacer funcionar esto:

http://www.todopic.com.ar/foros/index.php?topic=47097.0













Título: Re:Camara OV7670
Publicado por: jeremylf en 21 de Diciembre de 2016, 13:08:36
Gran trabajo groundman!
Título: Re:Camara OV7670
Publicado por: groundman en 23 de Diciembre de 2016, 11:30:27
gracias jeremylf.estoy ansioso a recibir las TFT de 2.4" 

haber si se me resisten menos que la camara OV7670.que me ha dado vastantes dolores de cabeza.
Título: Re:Camara OV7670
Publicado por: groundman en 14 de Enero de 2017, 12:55:44
hola.se me olvido decir que en el programa Advanced Serial Port Terminal 6 de eltima software.despues de elegir la velocidad y abrir el puerto COM.
hay que clicar en Receive ASCII/binari file y guardar el archivo como .raw

luego todos los bytes que recivamos se enviaran a esa carpeta.
Título: Re:Camara OV7670
Publicado por: jhojodicre en 13 de Febrero de 2017, 21:42:07
Hola amigo,  me puedes hecha una mano.  Ya que he estado comunicando me con la cam y no he podid
Cuando trato de leer la recibo datos erroneos
Título: Re:Camara OV7670
Publicado por: groundman en 18 de Febrero de 2017, 14:04:48
hola jhojodicre.que es lo que no puedes hacer? leer el puerto SCCB o te refieres a leer de la camara? tu camara es con fifo o sin fifo.que pic utilizas y que lenguaje de programacion.

debes especificar un poco mejor para poder ayudarte.