STM32F4 Discovery ile TFT üzerinde RNG Uygulaması

Başlatan camby, 07 Ocak 2013, 01:20:05

camby

STM32F4 ile Random Number Generator uygulaması :

- Üretilen random sayılar 32 bit .
- Renkler ve dairelere ait kordinatlar üretilen random sayılar ile belirleniyor.
- Renk datası 24 bit
- X ekseni 320 piksel , Y ekseni 240 piksel
- 32 bit'lik random sayılar kullanılacak yere göre ölçülendiriliyor. Örneğin renk için random sayı 256'ya bölündüğünde 24 bitlik skala'ya alınmış oluyor.
- RNG amaçlı bir çalışma olduğundan sadece main.c dosyasını paylaşıyorum.

Bülent hoca'nın şu linkte yapmış olduğu RNG örneğini görsel hale getirdim sadece : https://www.picproje.org/index.php/topic,35896.0.html


http://www.youtube.com/watch?v=LiQbAo0lsNQ#


main.c :

/*----------------------------------------------------------------------------
 * Name: STM32F407XX Denemeleri
 * Purpose: Temel Islemler - RNG - Random Number Generator
 * Note(s): 
 *----------------------------------------------------------------------------
 * Tarih : 06.01.2013
 *----------------------------------------------------------------------------*/

#include "STM32F4xx.h"													
#include "GPIO.h"	
#include "SSD1963_Driver.h"
#include "delay_ms.h"

unsigned int Random[512];
unsigned int Kor_x[512];
unsigned int Kor_y[512];

//====== Timer 7 Interrupt Handler ============================================
void TIM7_IRQHandler()
{
	volatile static char LedFlag = 0;
	
	TIM7->SR = 0;                           // UIF: Update interrupt flag 
	LedFlag = (LedFlag+1)&1;
	if (LedFlag==1) GPIOD->ODR |= (1<<13);  // Ledler yansin
	else GPIOD->ODR &=~ (1<<13);            // Ledler sonsun
	
} 

//====== Timer7 Init ==========================================================
void Timer7_Init(void) 
{
	// Timer7 clock 84 MHZ , Prescaler 42.000 -> Her 1/2000 sn 0.5 ms'de bir deger 1 artar.
	
	RCC->APB1ENR |= (1UL << 5);               	// Enable Timer7 clock   ( 84 MHz )
	TIM7->CR1 = 0x0080;              			// 1: TIMx_ARR register is buffered
	TIM7->PSC = 42000-1;           				// Prescaler : 42000
	TIM7->ARR = 2000;	            	    	// Auto-Reload : 2000
	TIM7->DIER = 0x0001;                    	// Update interrupt enabled.0;       
	NVIC->ISER[1] = (1<<55-32);        			// NVIC ISER 55 , TIM7
	TIM7->CR1|=0x0001;                    		// Counter Enable
}

//====== MAIN function ========================================================
int main (void) 
{
	unsigned short i;
	
	GPIO_Init();
	Initial_SSD1963();
	Timer7_Init();
	
	Ekran_Doldur(siyah);
	Cizgi_Cek(75,10,180,0,1,beyaz);
	text_yaz(75,1,"SSD1963 RNG Test - STM32F407VG",1,5,beyaz);
	
	RCC->AHB2ENR |= (1<<6);        				// RNGEN: Random number generator clock enable 
    RNG->CR |= (1<<2);                    		// RNGEN: Random number generator enable
  
    for(i=0;i<512;i++)                 			// 512 adet random sayi uretilsin
    {
		while (!(RNG->SR&1));        			// kullanilabilir sayi olusumunu bekle
		Random [ i ] = RNG->DR;
	}
	
	for(i=0;i<512;i++)                 			// 512 adet random sayi uretilsin
    {
		while (!(RNG->SR&1));        			// kullanilabilir sayi olusumunu bekle
		Kor_x [ i ] = RNG->DR;
	}
	
	for(i=0;i<512;i++)                 			// 512 adet random sayi uretilsin
    {
		while (!(RNG->SR&1));        			// kullanilabilir sayi olusumunu bekle
		Kor_y [ i ] = RNG->DR;
	}
	
	while(1) 									// Loop forever               
	{   
		text_yaz(75,110,"Picproje.org",3,20,beyaz);
		delay_ms(1500);
		
		for(i=0;i<512;i++)                 			
		{	
			delay_ms(2);
			daire_olustur(Kor_x[i]/(4294967296/320),Kor_y[i]/(4294967296/240),21,Random[i]/256);
			text_yaz(75,110,"Picproje.org",3,0,beyaz);
		}
		for(i=512;i>0;i--)                 			
		{	
			delay_ms(2);
			daire_olustur(Kor_y[i]/(4294967296/320),Kor_x[i]/(4294967296/240),21,Random[i]/256);
		}
		for(i=0;i<512;i++)                 			
		{
			delay_ms(1);
			daire_olustur(Random[i]/(4294967296/320),Kor_x[i]/(4294967296/240),21,Kor_y[i]/256);
			text_yaz(75,110,"Picproje.org",3,0,sari);
		}
		for(i=0;i<512;i++)                 			
		{	
			delay_ms(2);
			Piksel_Koy_RNG(Kor_x[i]/(4294967296/320),Kor_y[i]/(4294967296/240),6,Random[i]/256);
			text_yaz(75,110,"Picproje.org",3,0,sari);
		}
		for(i=512;i>0;i--)                 			
		{	
			delay_ms(2);
			Piksel_Koy_RNG(Kor_y[i]/(4294967296/320),Kor_x[i]/(4294967296/240),6,Random[i]/256);
			text_yaz(75,110,"Picproje.org",3,0,mavi);
		}
		for(i=0;i<512;i++)                 			
		{	
			delay_ms(2);
			Piksel_Koy_RNG(Random[i]/(4294967296/320),Kor_x[i]/(4294967296/240),6,Kor_y[i]/256);
			text_yaz(75,110,"Picproje.org",3,0,yesil);
		}
	}
}

yldzelektronik

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Hocam Merhaba

Geçenlerde bende SSD1963 çipi 480X272 Çözünürlüğe sahip bir Bir LCD satın almıştım. Finallerden dolayı daha üzerinde hiç uğraşamadım. Mümkünse SSD1963 Driver dosyanızı paylaşabilirmisiniz.

camby

#3
Alıntı yapılan: yldzelektronik - 07 Ocak 2013, 03:00:09
Hocam tft ilgi çekiciymiş.Hikayesi nedir?
Winstar WF57B - Özdisan

Özdisanda başka çeşitleri de var.


@Mucit23

Daha önce OptimusPrime isimli üye driver'ı paylaşmış , SSD1963'e ait ,  ben de oradan yararlandım. Bu kodları kullanabilirsiniz , kullanırken SSD1963 datasheet ve uygulama pdf'leri de açık olursa , üzerinde istediğiniz gibi değişiklik yapabilirsiniz.

Burası da çok yararlı :

http://www.techtoys.com.hk/Displays/SSD1963EvalRev2A/SSD1963%20Eval%20Board%20Rev2A.htm
http://www.techtoys.com.hk/Components/SSD1963QL9/SSD1963QL9.htm

Mucit23

Hocam Sanırım Buradaki başlıktan bahsediyorsunuz.

https://www.picproje.org/index.php/topic,37122.msg268979.html#msg268979

Kodları kullandığım işlemciye göre uygurmam gerekecek.

SSD1963 ile daha önce hiç uğraşmadım. Çok yabancıyım bu çipe.

Bendeki TFT dediğim gibi 480X272,

@OptimusPrime nın verdiği kodları biraz inceledim. .h dosyasında ekranın boyutunu belirleyen parametreler var.

LCD_VERTICAL_MAX       239
LCD_HORIZONTAL_MAX           319

Şeklinde Ekran Boyutunu değiştirmek için Bu iki parametre ile oynamak yeterlimidir?

camby

Alıntı yapılan: Mucit23 - 07 Ocak 2013, 10:12:50
Hocam Sanırım Buradaki başlıktan bahsediyorsunuz.

https://www.picproje.org/index.php/topic,37122.msg268979.html#msg268979

Kodları kullandığım işlemciye göre uygurmam gerekecek.

SSD1963 ile daha önce hiç uğraşmadım. Çok yabancıyım bu çipe.

Bendeki TFT dediğim gibi 480X272,

@OptimusPrime nın verdiği kodları biraz inceledim. .h dosyasında ekranın boyutunu belirleyen parametreler var.

LCD_VERTICAL_MAX       239
LCD_HORIZONTAL_MAX           319

Şeklinde Ekran Boyutunu değiştirmek için Bu iki parametre ile oynamak yeterlimidir?

pardon linki yapıştırmayı unutmuşum.

SSD1963 Zor bir çip değil , dökümanlarınızı hazırlayıp başına oturduğunuzda çözülecektir ki örnek kodlar da var. Ayrıca çip 120 MHz'de çalıştığından STM32F4 ile bile çalışırken hiç bekleme yapmaya gerek kalmıyor. Bu da kolaylık sağlıyor.


Arkadaşın verdiği kodları doğrudan kullanmadım , oradaki akışa bakarak terkrar yazdım.


Doğru bir şekilde init işlemini yaptığınızda olay çözülür.

memo333

Gömülü Linux Notları --> http://linuxedu.xyz/

camby

Alıntı yapılan: memo333 - 07 Ocak 2013, 14:20:19
ssd1963ü 24bit nasıl sürdünüz?

Winstar WF57B TFT'lerin arayüzü 8 bit.

Datasheet 13. sayfada da SSD1963'ün arayüz seçenekleri belirtilmiş : http://www.winstar.com.tw/UserFiles/File/WF57BTIBCDC.pdf

Bu durumda kullanılabilecek sadece tek bir format bulunuyor. 8 bit x 3.

SSD1963'ün , set_pixel_data_interface ( 0xF0 ) komutu ile bu ayar da yapılabiliyor. Datasheet : http://www.allshore.com/pdf/solomon_systech_ssd1963.pdf

8 bit'lerin son 2 bitleri de kullanılmıyor. Yani aslında 18bit renk , 24 bit formatta gönderiliyor.


Mucit23


camby

Alıntı yapılan: Mucit23 - 07 Ocak 2013, 15:11:19
6 bit renk çözünürlüğü yetiyormu?

R , G ve B için 6'şar bit , toplam 18 bit. 262144 renk ediyor. Görüntüler renkler fena değil gibi. Tabi 24 bit ekran da deneyip karşılaştıramadım.



yldzelektronik

Bu tip uygulamalarda soketler beni nedense ürkütüyor.Sizin çözümünüz nasıl oldu?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

camby

FFC konnektör genelde TFT satılan yerde bulunuyor. Denemek için ise küçük bir PCB ile DIP dişi konnektöre çevirmek yeterli. Yukardaki resimde ve videodaki küçük kahverengi PCB gibi..



Yada şu :


sseedat

stm için tft ekran almayı düşünüyorumda ne tür bişey almalıyım daha önce hiç tft kullanmadım ona göre bişeyler önerebilirmisiniz.
Görünmez bir mezarlıktır Zaman...

Mucit23

TFT alırken Piyasada bol örnek bol driver bulunanları almaya bak. Almakla iş bitmiyor çünkü.

Bana kalırsa SSD1289 lu 3.2" bir TFT uğraşmak için Yeterlidir.

sseedat

bu ürün uygun gibi fiyatıda iyi alayım bundan birtane.
Görünmez bir mezarlıktır Zaman...