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

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #15 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
               
« Última modificación: 16 de Julio de 2016, 10:38:57 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re:Camara OV7670
« Respuesta #16 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
« Última modificación: 10 de Julio de 2016, 13:35:37 por groundman »
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado luismh

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

Desconectado luismh

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


Desconectado luismh

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

Desconectado groundman

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

Desconectado luismh

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

Desconectado groundman

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

Desconectado luismh

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

Desconectado groundman

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

Desconectado luismh

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


Desconectado luismh

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

Desconectado groundman

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

Desconectado luismh

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

Desconectado groundman

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