Autor Tema: Camara OV7670  (Leído 29688 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #45 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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #46 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.



Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #47 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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #48 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.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #49 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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #50 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.



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





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.



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







y aumentando mas vemos el principio de una linea horizontal




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

Xclk:



Pclk:



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.





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.


« Última modificación: 29 de Octubre de 2016, 15:35:09 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #51 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.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #52 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?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #53 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)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #54 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?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #55 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.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #56 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.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #57 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



Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #58 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?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Camara OV7670
« Respuesta #59 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


 

anything