Stm32f10xx & OV7670 & Tft

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

z

Data hattini open collector + pull up tipi seciyorsun degilmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Evet hocam pull-up ve OD yapıyorum.

I2C ile farklı birşey deniyeyim. Dediğiniz gibi I2C rutini sorunlu olabilir. Döngülerle data gönderiyorum çünkü.

mistek

Alıntı yapılan: Mucit23 - 08 Mart 2014, 10:51:56
Hocam Benim yaptığım işlem sırası şöyle

Start gönder
Device Adres yaz
ACK bekle, Eğer ACK geldiyse Data gönder yoksa Stop gönder hattan çık.

ACK gelmediği için hattan çıkıyorum. Normalde böyle olması gerekiyor ama

Start Gönder - Clock başlat en az 20 periyot olsun
Adres gönder
ACK bekle.

9. clock darbesinde ACK biti gelir.

ACK gelecek diye beklemeyin siz ona clock gönderin ki oda geri bişey göndersin burada master cihaz işlemci çünkü.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

ACK Geldi çok şükür.

I2C rutinini aşağıdaki gibi yaptım.
GPIO_SetBits(GPIOD,GPIO_Pin_12); //Reset Pini Lojik 1 Yapiliyor
	I2C_Delay();
	/*Start islemi Yapiliyor*/
  SDAH;
	SCLH;
	I2C_Delay();
	SDAL;
	I2C_Delay();
  SCLL;
	I2C_Delay();
	/*Start islemi Bitti Sira Adres Göndermede 
  	Yazma islemi icin 0x42 gönderilecek */
	SDAL;   //7.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
	SDAH;   //6.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor	
	SDAL;   //5.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
  SDAL;   //4.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
  SDAL;   //3.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
  SDAL;   //2.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
  SDAH;   //1.Bit Gönderilir.
	I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
  SDAL;   //0.Bit Gönderilir.
  I2C_Delay();
	SCLH;I2C_Delay();SCLL;I2C_Delay();//Clock Uygulaniyor
	/*ACK Bakiyoruz.*/
	SDAH;
  I2C_Delay();
	SCLH;I2C_Delay();  //Clock Uygulaniyor
	if(SDAR) return (0xFF);
	;SCLL;I2C_Delay();

	STM_EVAL_LEDOn(LED3);


Hard I2C yi de bi deneyelim. Eğer olursa onu kullanırım. Yoksa yukarıdaki kodları fonksiyonlaştırıp kullanacağım

Mucit23

Hard I2C yi denedim onda sonuç alamadım. Nedense Start bitinin başında SCL hattı anlık olarak lojik 0 olup tekrar lojik 1 oluyor. Tahminimce bundan dolayı çalışmıyorlar. Bu kameralar I2C de çok hassas. Hata kabul etmiyorlar.

Ama yukarıda verdiğim kodları fonksiyonlaştırdım. Şimdi Hem OV9655 ile hemde OV7670 ile harbi harbi konuşabiliyorum.

tekosis

arkadaşlar bir yol gösterme amacı ile anlatıyorum belki faydalı olur. şu an elimde mikromediaplus for stm32 kartı var ve bu kartta ssd1963 sürücüsü kullanılmış. aynı zamanda mikroc nin de hazır initial kodları var ve tft sürmek çok kolay oluyor. bununla ilgili eğer kurulumda sıkıntı yaşıyorsanız bu kodların ve devre şemasının incelenmesinde fayda olabilir. aşağıdaki linkte download edilebilir şema ve örnek programlar mevcut.
http://www.mikroe.com/mikromedia/plus/stm32/
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Mucit23

Düzgün olmasada Kameradan görüntü almayı başardım. Fakat neden bilmiyorum görüntüde renk problemleri var ayrıca görüntü kırık.

İlk başlarda hiç görüntü alamamıştım. Sonradan DCMI_Frame kesmesini aktif ettim. Her bir frame alındığında kesme oluşuyor. Bende kesme içerisinde gidip LCD nin kordinatlarını 0,0 noktasına çekiyorum. Sonrasında DMA, DCMI den dataları alıp FSMCye yolluyor. Ekran dolunca tekrar kesme oluşuyor.

Şuanda XCLK Hızı 24Mhz. Eğer Görünütüyü düzeltebilirsem FPS değeri iyi gibi.

Ufak bir test videosu çektim.
Stm32f407 OV9655 Camera Test (Vol 1)

Ramiz

#67
Congratulations! :)

Renk paleti ile ilgili bir sorun var gibi. Yani stm32 nin atıyorum red2 nolu kamera girişine, kameranın blue3 nolu çıkışı bağlanmış gibi duruyor. Kameranın paralel bağlantısından emin olun :)
Electrical & Electronics Engineering -> Step one

Mnemonic

işte bendeki görüntüde buna çok benziyor.
sanırım artık aynı noktada takıldık.
ben register ayarlarında sorun var diye düşünüyorum. ancak
pll 24mhz görüntü qcif ve renk olarak rgb565 ayarladığıma cok eminim
bir türlü işin içinden çıkamadım

Mucit23

@Ramiz, kamerada öyle bir bağlantı yok.  :o

@Mnemonic
Hocam daha registerleri hiç karıştırmadım. Problem olduğunu da pek sanmıyorum açıkçası.  Bana kalırsa ya sıralamada problem var yada lcd de sorun var. Lcd de renk farklı olarak görüntü düzgün çıksa derim tamam renk ayarlarıyla ilgili sorun var Ama görüntü de kırık çıkıyor. Bu yüzden lcd ayarları ile ilgili olabileceğini düşünüyorum.
Geçenler de resim basmada da sorun yaşamıştım. Düzgün bir şekilde ekrana resim basabilmem gerekir.

Birde ben frame kesmesini aktif etmiştim.  Her bir görüntü geldiğinde kesme oluşuyor bende gidip lcd'nin başlangıç kordinatlarını veriyorum. Normalde birkere başlangıç kordinatını verdinmi lcd tamamen dolduğunda tekrar baştan başlaması gerekiyor. Yani ekran her dolduğunda gidip yeniden başlangıç kordinatlarına adres vermeye gerek kalmaması lazım.
Lcd de bu işlerin nasıl yürüdüğünü çözmek gerekiyor.

mistek

@mucit23 sorun neymiş ? Clock'la ilgisi varmıymış?

Ayrıca sabrınızı takdir ettim ben uğraşıyor olsaydım 5. günün şafağında pert olurdu. :)
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mnemonic

@Mucit23 hocam selamlar;

ben lcd olarak ssd1963 kullanıyorum dcmi frame interrupt kullanıyorum bende interraupta her girdiğimde lcd üzrerinde window set yapıyorum ondan kaynaklı olabilir bir kere ayarlamayı hiç denemedim. ov7670 çözünürlüğü için qcif(176X144) kullandığımdan lcd üzerinde window vermem gerekiyor ama daha sonra ayarladığım windowu kapatmazsam ekrana başka şey basamıyorum ve lcd  kararıyor. ama yazıları kaldırıp sadece görüntü basmayı deneyeceğim. ayrıca lcdyi rgb565 sürdüğüm için kamera üzerinden yuv yerine rgb565 veri olacak şekilde registerleri set ediyorum. dediğin gibi sorun veriyi lcdye göndermekle alakalı olabilir. bu kendi projem olduğu için ben sadece akşamları ilgilenebiliyorum. senden güzel haberler bekliyoruz
sevgiler

Mucit23

Alıntı yapılan: mistek - 10 Mart 2014, 10:33:30
@mucit23 sorun neymiş ? Clock'la ilgisi varmıymış?

Ayrıca sabrınızı takdir ettim ben uğraşıyor olsaydım 5. günün şafağında pert olurdu. :)

Teşekkürler.
Clockla ilgisi var. XCLK den mutlaka sinyal uygulamak gerekiyor. Ben şuanda 24Mhz veriyorum. Sonuç test videosundaki gibi(Bu daha çok kristal olmadan mcu'yu çalıştırmaya benziyor.)  Bana vakit kaybettiren zaten bu oldu.

Diğer bir yandan Hardware I2C ile çalışmıyor sistem. Kameralar I2C konusunda okadar hassaski hiç hata kabul etmiyor. Bu yüzden I2C rutinlerini kendim yazdım. Harware I2C'de start bitinden önce SCL ve SDA hattı anlık olarak Low oluyor. Bundan dolayı kamera çalışmıyordu. Ama şuanda I2C iletişimde sıkıntı yok. Hem OV9655, Hemde OV7670 Çalışıyor.

@Mnemonic, Çözeceğim bu meseleyi. Okul ve işten dolayı bende sadece akşamları çalışabiliyorum. Bu yüzden yavaş ilerliyorum.

SSD1963 veya 1289 olsun. İksindede çok problem yaşadım. Heleki SSD1963'de 4.3'LCD çalıştırabilmek için SSD1963'ün Datasheetini yalayıp yutmam gerekti. SSD1289 da abisi kadar olmasa canımı sıkmıştı. En son FSMC'deki AddressSetupTime, DataSetupTime gibi değerler ile oynayınca lcdyi stabil hale getirdirdim. Bu değerleri düşürmek gerekiyor. Mesela SSD1289'da Siyah arka planın üzerine Beyaz renk basınca lcd saçmalamaya başlıyordu. FSMC deki delay sürelerini aşağı çekerek düzelttim.

Buna rağmen SSD1963'e beyaz renk datası(0xFFFF) gönderince SSD1963 donuyordu. Hala çözemedim.

3.2" LCD'de ili9325 çipsetli bir lcd almak lazım.






Ramiz

Bu geğerleri atıyorum,

TFT rgb565 (16 bit), kamera 8 bit ve rgb332. Sizin bu veriyi işleyip, Tft ye göre düzenlemeniz gerekir. Büyük ihtimalle kameradan gelen veriyi direk tft ye basıyorsunuz ve renk paletleri bir birine giriyor.

Electrical & Electronics Engineering -> Step one

Mucit23

#74
@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.

Datasheet Sayfa 9'da 1 pixel için çıkış format şekli gösterilmiş.

resim yuklemek
Resimde görüldüğü üzere her bir pixelin renk datası 2 paket halinde geliyor. DCMI bunları birleştirmesi lazım.

LCD'de kırıklık vardı onu çözdüm. Şuan ekranda tam bir görüntü alıyorum fakat renk problemi devam ediyor. LCD'ye tam bir resim bastım yani LCD nin çalışmasında sıkıntı yok.

Sabahtan beri kameranın Registerlerine bakıyorum. Renkle veya çıkış formatı ile ilgili olan bütün registerleri elden geçirdim ama çözüm olmadı.
Datasheet çok kıt yazılmış. Hangi registerin, hangi bitin ne işe yaradığı çok kısa bilgilerle açıklanmış. Eğer sorun kameranın ayarlarıyla ilgili ise doğru çözümü bulmak bize çok vakit kaybettirecek gibi görünüyor.

Ayrıca OV9655 ile ilgili neredeyse bütün örnek programlara baktım. İnit kodları neredeyse hepsinde aynı. Yani Adamlar aynı init kodlarıyla kamerayı çalıştırıyorlarsa bende aynı init kodlarıyla kameradan net bir görüntü almam gerek.

Sorun renkle ilgili. Dedim ya DCMI gelen iki paketlik renk datasını birleştirmesi gerekiyor. İşte DCMI'nin bunu yaptığından emin değilim. Belki Sadece yüksek 8 bit bana geliyor. Belki bu yüzden renkler kırmızı ve mor ağırlıklı.

Aslında bir şekilde DMA ile FSMC arasındaki Data hattını izleyebilsem güzel olacak. Gelen datalar kaç bit olduğu belli olur.

Aklıma başka birşey gelmiyor. Başka fikri olan varsa söylesin test edeyim.

mesaj birleştirme:: 10 Mart 2014, 23:05:35

Kameranın Registerlerini kurcalarken ne gördüm.

0x8D nolu registerin 4. bitini enable yapınca color test özelliği aktif oluyormuş. Aktif ettim ekrana şöyle bir görüntü geldi.

resim gönder
Belliki ekranda renk renk barlar var. Fakat biraz kayık çıkmış Acaba senkronizasyonmu yakalanamıyor.