Stm32f10xx & OV7670 & Tft

Başlatan yldzelektronik, 27 Mayıs 2013, 03:55:03

Mnemonic

Evet bende OV7670 modülün çıkışını RGB565'e göre ayarladım ve öyle kullanıyorum. elimde 16bit RGB datası var ve bunu SSD1963 üzerinde direk window (176X144) üzerine gönderiyorum.
sorunun bende bu durumda kaynaklandığını düşünmüyorum Mucit23 hocamında dediği gibi onlarca örnek inceledim hiç biri bu konuda kodunda bir şey yapmamış ve datayı direk olarak ekrana basmış. hatta YUV data alıp direk ekrana basan bile var. Bende bir tülü tam sorunun nereden kaynaklandığını bulamadım.
@Mucit23 hocam sendeki kodları paylaşman mümkünmü farklı LCD'ler kullanıyoruz bende SSD1963 üzerinde görüntü konusunda testler yapmak isterim

yldzelektronik

Mucit bir yerde goruntuyu direk seri porttan basildigini gordum oyle bir test yapabilirsin ama nasil yapildigini bilmiyorum Bir de sd kart baglayabilirsen sisteme gelen goruntuyu direk jpg olarak kaydet veya bmp olarak pcden goruntuye bir bak Sikintinin dmci ile ilgili olup olmadigi belli olur Ben meselenin lcd ile ilgili oldugnu dusunuyorum Bu arada kirikligi nasil giderdin_
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

@Mnemonic

Hocam Bendeki kodlar OV9655'e göre. İkimizde aynı sorunu yaşadığımıza göre bence kameralarda problem yok. Çünkü iki farklı kamera kullanmamıza rağmen ikimizde STM32F4 Discovery kullanıyoruz. Bence stm32f407 üzerine yoğunlaşalım.

Günün Sorusu: DCMI modülünün görevini doğru bir şekilde yaptığını nasıl anlarım?

@yldzelektronik

Hocam aslında DMA yı FSMC yerine direk Usarta bağlayarak görüntüyü usarttan basabilirim. Bunun için C# da bir form hazırlamam gerekli ama Seri portun bu hıza yetişeceğini sanmıyorum.
30FPS de çalışsa kamera 320x240  bir görüntü için saniyede 30x320x240=2,304,000 Data eder. Tabi bunlar 16 bit. Usartan 8 bit halinde göndereceğimiz için bu sayıyı tekrardan 2 ile çarpmak gerekir. Saniyede 4,6 Mbyte veri ediyor.(Akan verinin bu derece yüksek olması şarşırttı açıkçası. )

LCD bence çalışıyor. Çünkü RGB565 formatında gönderdiğim resim datalarını problemsiz bir şekilde ekrana basıyor. LCD'deki kırıklık ise basit bir hatadan kaynaklanıyordu. Normalde Ekrana pencere açarken Ekran boyutlarını 320,240 şeklinde vermiştim. Fakat 1 eksiğini vermek gerektiğini unutmuşum.

Ben biraz DCMI modülüne bakacağım.

yldzelektronik

#78
Alıntı yapılan: Mucit23 - 11 Mart 2014, 10:56:50
...
Günün Sorusu: DCMI modülünün görevini doğru bir şekilde yaptığını nasıl anlarım?
...

Daha önce de söyledim.Ya jpeg formatlayıp yada bmp formatlayıp kayıt edebilirsin veya seri portu çıkabildiğin en yüksek hız ile test edersin.


Ekleme:

Alıntı yapılan: Mucit23 - 11 Mart 2014, 10:56:50
Hocam aslında DMA yı FSMC yerine direk Usarta bağlayarak görüntüyü usarttan basabilirim. Bunun için C# da bir form hazırlamam gerekli ama Seri portun bu hıza yetişeceğini sanmıyorum.
30FPS de çalışsa kamera 320x240  bir görüntü için saniyede 30x320x240=2,304,000 Data eder. Tabi bunlar 16 bit. Usartan 8 bit halinde göndereceğimiz için bu sayıyı tekrardan 2 ile çarpmak gerekir. Saniyede 4,6 Mbyte veri ediyor.(Akan verinin bu derece yüksek olması şarşırttı açıkçası. )

Demişsin.Ancak ben şimdi data sheet açıp baktım ve gördüm ki - ilk sayfada-

"Up to 4 USARTs/2 UARTs (10.5 Mbit/s, ISO 7816 interface, LIN, IrDA, modem control)" demiş.?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mnemonic

Alıntı YapHocam Bendeki kodlar OV9655'e göre. İkimizde aynı sorunu yaşadığımıza göre bence kameralarda problem yok. Çünkü iki farklı kamera kullanmamıza rağmen ikimizde STM32F4 Discovery kullanıyoruz. Bence stm32f407 üzerine yoğunlaşalım.

@Mucit23 hocam bendeki camera modulunun arızalı olmadığından net eminim çünkü ben alırken 2 adet OV7670 aldım
her ikisinde de aynışeyi yaşıyorum
her halde ikisi bir arızalı olamaz :)
dediğin gibi DCMI ve DMA üzerine yoğunlaşmakta fayda var ancak benim aklıma takılan bir noktada daha var kullandığım SSD1963 driveri ne kadar doğru acaba ?

Mucit23

Alıntı yapılan: yldzelektronik - 11 Mart 2014, 11:28:50
"Up to 4 USARTs/2 UARTs (10.5 Mbit/s, ISO 7816 interface, LIN, IrDA, modem control)" demiş.?

Hocam yanlışınız olacak. Benim bildiğim 10.5 Mbit/sn = 1.25Mbyte/sn

Her neyse Dediğiniz gibi DCMI dan gelen dataları direk resim olarak kaydetmem gerekecek anlaşılan. Aslında bununla ilgili bir örnek var elimde ama o örnekte ilk önce DCMI'dan gelen dataları LCD ye gönderiyor. Resim kaydedeceği zaman Kamerayı durdurup LCD deki Görüntüyü tekrar çekip SD karta kaydediyor. Yani LCD yi ram alanı olarak kullanıyor.

Ben bunun aynısını işlemcinin ram alanıyla yapmaya çalışacağım.

DCMI modülüne bakıyorum ama ondada fazla bir ayar yokki? Nedir neyin nesidir anlamadım.

Mnemonic

Şu anda kesin olarak eminimki benim SCCB protokolümde sıkıntı var.
okuduğum bir dökümanda SCCB'nin kesinlikle doğru çalıştığından emin olun ve 0X01 adresini okuyun demiş veriyi 0X80(default değer) görmeniz gerekli demiz
ben register read yaptığım zaman bam başka birşey görüyorum
ve artık kesinlikle sccbyi doğru kullanamadığımı ve istediğim şekilde rgisterleri ayarlayamadığım için çalışmadığını biliyorum

sccbnin doğru çalışan bir driveri üzerinde çalıştıkdan sonra kamera ayarlarına geri döneceğim

Mucit23

Benim SCCB Write Kodlarım çalışıyor. Ama Read Meselesini hiç bakmadım.

Çalıştığını nerden anlıyorum diye sorarsan eğer 8D nolu adresten Kamera test modunu aktif etmiştim.Ekrana colorbar çıkmıştı. Ayrıca init kodlarıyla oynayınca farklı sonuclar alıyorum. Demekki Yazma işleminde sıkıntı yok.

Kamera init bölümünde herhangi bir okuma yapılmıyor. Bu yüzden okuma kısmına hiç uğraşmadım.

Bu arada en sonki çalışan uygulama videosu böyle.
https://www.youtube.com/watch?v=yTBqYgAgdZQ

Ramiz

Alıntı yapılan: Mucit23 - 10 Mart 2014, 23:13:06
@Ramiz,

Kamerada rgb332 diye bir çıkış seçeneği yok. Kamera modülü RGB565 Formatına ayarlı. DCMI modülü doğrudan 16bit 565 formatında pixel datası vermesi gerekir. 

Eğer konuya müdahil olacaksan lütfen kameranın datasheetini açıp nasıl çalıştığına birazcık bak.

Bunu yapmak için ne vaktim var nede internetim. Yalnız siz türkçe bilmiyorsunuz anlaşılan. Orada karartarak yazmışım ki,

Alıntı yapılan: Ramiz - 10 Mart 2014, 20:45:55
Bu geğerleri atıyorum,

Konuya müdahil olma gibi bir amacım yok. Sorun sizin sorununuz. Çözüm için buradan medet umuyorsunuz. Yalnız tavrınız çok enteresan. Sanki ben cevap yazmaya mecburmuşum gibi konuşuyorsunuz.

2 sene önce fpga ve vga ile çalışmıştım. Ramdeki resim bilgisini, fpga in vga dac ına direk bastığımda, renk paletleri uyuşmadığı için renkler karışıyordu ama görüntü sorunsuz oluşuyordu. Basit bir aritmetik işlemden geçirince düzelttim. Bu konu hakkında böyle bir deneyimim oldu ve büyük ihtimal ile sizin sorununuzda renk paletinden kaynaklandığını düşünüyorum.


Electrical & Electronics Engineering -> Step one

Mnemonic

Alıntı YapAyrıca init kodlarıyla oynayınca farklı sonuclar alıyorum. Demekki Yazma işleminde sıkıntı yok.
@Mucit23 hocam böyle demişsin ama bende de aynı durum var bu kodun doğru çalıştığını göstermez. Zira sen değerleri değiştirdiğin zaman hatalı iden değerlerde değişecektir.
senden rica etsem kodu paylaşabilirmisin ? seninkiyle benimkini karşılaştırmak isterim

Mucit23

#85
@Ramiz birgün sana internette nekadar PDF datasheet varsa toplayıp birkaç dvd'ye çekip yollayacağım.  PDF Download Problemini çözmüş olursun en azından.  :-X

Herneyse

@Mnemonic,
Hocam valla ben lojik analyser ile hattı takip ediyordum. Oradan giden datalar belli. Bu yüzden SCCB çalışıyor dedim. Ama kodları vereyim. Bu kodlarla kamerayı init etmeye çalışın. Umarım problem dediğiniz gibidir.

I2C.c
/**
  ******************************************************************************
  * @file    I2C.c
  * @author  Ferhat YOL
  * @version V0.0.3
  * @date    1/3/2014
  * @brief   Software I2C Program
  *          
  ******************************************************************************/
	/* Includes ------------------------------------------------------------------*/
  #include "stm32f4xx.h"
	#include "I2C.h"
	#include "main.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
	 #define I2C_Port GPIOB
	 #define I2C_SDA  GPIO_Pin_9
	 #define I2C_SCL  GPIO_Pin_8
/* Bits definitions ----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
   #define SDAH GPIO_SetBits(GPIOB,GPIO_Pin_9)
	 #define SDAL GPIO_ResetBits(GPIOB,GPIO_Pin_9)
	 #define SCLH GPIO_SetBits(GPIOB,GPIO_Pin_8)
	 #define SCLL GPIO_ResetBits(GPIOB,GPIO_Pin_8)
   #define SDAR GPIOB->IDR & GPIO_Pin_9
   #define SCLR GPIOB->IDR & GPIO_Pin_8
/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

void Soft_I2C_Configuration(void){
  GPIO_InitTypeDef GPIO_InitStructure;
	/* Enable GPIOB clocks */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	/*SDA Pin Configuration*/
  GPIO_InitStructure.GPIO_Pin = I2C_SDA; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(I2C_Port, &GPIO_InitStructure);
	/*SCL Pin Configuration*/
	GPIO_InitStructure.GPIO_Pin = I2C_SCL; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(I2C_Port, &GPIO_InitStructure);
	
}


void I2C_Delay(void)
{
   unsigned int i=I2C_Delay_Time;
   while(i)
   {
     i--;
   }
}

uint8_t I2C_Start(void)
{
  SDAH;
	SCLH;
	I2C_Delay();
  SDAL;
	I2C_Delay();
	SCLL;
	I2C_Delay();
 return (0x00);
}

void I2C_Stop(void)
{
 SDAL;
 I2C_Delay();
 SCLH;
 I2C_Delay();
 SDAH;
 I2C_Delay();
}

void I2C_Ack(void)
{
 SCLL;
 I2C_Delay();
 SDAL;
 I2C_Delay();
 SCLH;
 I2C_Delay();
 SCLL;
 I2C_Delay();
}

void I2C_NoAck(void)
{
 SCLL;
 I2C_Delay();
 SDAH;
 I2C_Delay();
 SCLH;
 I2C_Delay();
 SCLL;
 I2C_Delay();
}
 
uint8_t I2C_WaitAck(void)  
{
	SDAH;
  I2C_Delay();
	SCLH;I2C_Delay();  //Clock Uygulaniyor
	if(SDAR) return (0xFF);
	;SCLL;I2C_Delay();
	return(0x00);
}

void I2C_SendByte(unsigned char SendByte)
{
    unsigned char i=0;
    for(i=0;i<8;i++)
		{
      if ((SendByte << i) & 0x80)
			 {
				 SDAH;
       }
			 else
			 {
         SDAL;
       }
			 I2C_Delay();
       SCLH;
			 I2C_Delay();
       SCLL;
			 I2C_Delay();
    }
}
 
unsigned char I2C_ReceiveByte(void)  
{
    unsigned char i=8;
    unsigned char ReceiveByte=0;
 
    SDAH;    
    while(i--)
    {
      ReceiveByte<<=1;      
      SCLL;
      I2C_Delay();
      SCLH;
      I2C_Delay();
      if(SDAR)
      {
        ReceiveByte|=0x01;
      }
    }
    SCLL;
    return ReceiveByte;
}

unsigned char I2C_ReadByte( unsigned char DeviceAddress,unsigned int ReadAddress)
{  
    unsigned char temp;
    if(!I2C_Start())return (0xFF);    
 
    I2C_SendByte((DeviceAddress & 0xFF));
    if(!I2C_WaitAck()){I2C_Stop(); return 0xFF;}
   
    I2C_SendByte((unsigned char)((ReadAddress>>8) & 0xFF));    
    I2C_WaitAck();
    I2C_SendByte((unsigned char)((ReadAddress) & 0xFF));        
    I2C_WaitAck();
    I2C_Start();
    I2C_SendByte((DeviceAddress & 0xFE)|0x01);    
    I2C_WaitAck();
   
    temp = I2C_ReceiveByte();
   
    I2C_NoAck();
     
    I2C_Stop();
    return temp;
}


I2C.h

/********************************************************************************
  * @file    I2C.h
  * @author  Ferhat YOL
  * @version V0.0.3
  * @date    01/3/2014
  * @brief   Software I2C Program
  *          
  ******************************************************************************/
#ifndef I2C_H
#define I2C_H
/* Includes ------------------------------------------------------------------*/
   #include "stm32f4xx.h"
	 
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/ 
	 #define I2C_Delay_Time 500
/* Bits definitions ----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Soft_I2C_Configuration(void);
void I2C_Delay(void);
uint8_t I2C_Start(void);
void I2C_Stop(void);
void I2C_Ack(void);
void I2C_NoAck(void);
uint8_t I2C_WaitAck(void);
void I2C_SendByte(unsigned char SendByte);
unsigned char I2C_ReceiveByte(void);
unsigned char I2C_ReadByte(unsigned char DeviceAddress,unsigned int ReadAddress);

#endif


Fakat dediğim gibi okuma komutları çalışmayabilir. Hiç üzerinde çalışmadım.

ekleme:

Bu adamda aynı problemi yaşıyor sanırım.
https://www.youtube.com/watch?v=e-I7UyxRZlk

Mucit23

Şimdi Teker Teker Registerleri kurcalıyordumki  ilginç bir durumla karşı karşıya geldim.

Ov9655'in 0x69 nolu registerine bakın. Datasheet'te reserved yazıyor. Yani boş olması gerekir.

Benim init kodlarımda 0x69 nolu registere 0x0A yazmışlar. Boş registere neden boşu boşuna yazma yapıyorlar diyip bu satırı kapatınca kamera çalışmadı.

Aynı şekilde bir iki durumla daha karşılaştım. Bence Kamerayı ben RGB565 Moduna sokamıyorum. Kamera Hala YUV modunda. Çünkü YUV ile ilgili Registerler ile oynuyorum doğrudan görüntü değişiyor veya bozuluyor.

Bakalım daha neler çıkacak...

Mnemonic

Selam mucit23;
sende benle aynı fikire gelmeye başladın :)
hadi bakalım nerede çözeceğiz işi

Mucit23

@Mnemonic Hocam bendeki ov7670 ile ilgili topladığım Kaynak kodları ve dökümanları göndereyim. Onlarıda bir deneyin.

Öyle birşeyki elim kolum bağlandı resmen. Farklı kütüphaneleri denemekten başka şuanda elimden birşey gelmiyor. Dün akşam kameranın ayarlarıyla bayağı bi oynadım. Ne yaptıysam artık bilmiyorum kamera daha koyu göstermeye başladı. Ama beyaz ışığa tutunca yine mor gösteriyor. ilk başlarda DCMI da felan olabileceğini düşünüyordum ama DCMI modülünün fazla bir ayarı yok. DMA'nında ne olduğunu biliyoruz zaten.

İnternette ov9655 ile ilgili nekadar kaynak varsa okudum. Google 'un bütün "o" larına baktım.  Kimse bizim yaşadığımız problemlerle uğraşmamış. Genelde XCLK yı  uygulayan herkes ikinci denemesinde kamerayı düzgün bir şekilde çalıştırmış. Anlamıyorum işte aynı kodları bende kullanıyorum. Bizde renkler düzgün çıkmıyor.

Ne yapayım bilmiyorum  :'(

Mnemonic

@Mucit23
teşekkür ederim kodları aldım inceleyip sonuçları bildiricem ama bir iki gün alabilir.
ben inatla sorunun SCCB'yi doğru kullaamadığımız için olduğunu düşünüyorum