HAL lib I2C OLED LCD ve Mandelbrot set

Başlatan MC_Skywalker, 15 Temmuz 2017, 11:29:02

MC_Skywalker

48MHz lik 32bit MCU'e Mendelbrot set çizdirseniz ne olur? :) :lol:


// Mandelbrot set	çizidrmece
		// MCU ineyen nameleri söylerken. :)
	int height =64;
	int width =128;	
	int max =1000;
		for (int row = 0; row < height; row++) 
		{
			for (int col = 0; col < width; col++) 	
			{
					double c_re = (col - width/2.0)*4.0/width;
					double c_im = (row - height/2.0)*4.0/width;
					double x = 0, y = 0;
					int iteration = 0;
					while (x*x+y*y <= 4 && iteration < max) {
            double x_new = x*x - y*y + c_re;
            y = 2*x*y + c_im;
            x = x_new;
            iteration++;
        }
        if (iteration < max) 
				{	
					ssd1306_DrawPixel(col, row, White);
					//ssd1306_UpdateScreen();
				}
					else 
					{	
						ssd1306_DrawPixel(col, row, Black);
						//ssd1306_UpdateScreen();
					}
ssd1306_UpdateScreen();
    }
	}


optimizasyon, DMA vb. yok.


kantirici

16 MIPS PIC18F46K22 ile 240*128 monochorm ekrana bir kaç dakika içinde çizdirmiştim. Buradaki sorun I2C iletişim olmalı.

MC_Skywalker

#2
Tam emindeğilim. SSD1306 için basit bir kütüpane kullandım.  Ayrıca HAL' da şikinlik veriyor olabilir.
Amacım primitives/pligon vb. cizdirmek. Eski Demo scene'lerdeki gibi.

ssd1306_DrawPixel(x, y, color);

Elektroemre


MC_Skywalker

Ekrana çizdirmek 16Dk sürdüğü için Video çekmedim. Ekrana pixel pixel çiziyor. Telefonun hafızasını boşaltıp akşama çekerim

E-x8


MC_Skywalker

#6
evet CubeMx ile  projeyi oluşturdum. IIC ve RCC ye ayar verdim. Diğer kısımlara dokunmadım.

SSD1306 için github da rastladığım bir driver kullandım. Keil çıktı optimizasyonu 3.


Hız için önce ram'e frame buffer yapıp sonrada çizdirmek gerek te o konuda cahilim :)


Bir daire ve bir yıldız çizmek ~10sn sürüyor.

Elektroemre

Alıntı yapılan: MC_Skywalker - 15 Temmuz 2017, 13:25:51
Ekrana çizdirmek 16Dk sürdüğü için Video çekmedim. Ekrana pixel pixel çiziyor. Telefonun hafızasını boşaltıp akşama çekerim

1 frame mi 16 dakika????

MC_Skywalker

#8
Alıntı yapılan: Elektroemre - 15 Temmuz 2017, 13:58:16
1 frame mi 16 dakika? ???

Evet tek frame.

Bu arada PC'nizin hızını görmek için Octave ve ya Matlabda bu seti çzidirin. :)

Octave için

function mandel_img = mandel ()
  %% Parameters
  w = [-2.5 1.5]; % Domain
  h = [-1.5 1.5]; % Range
  s = 0.005;      % Step size
  it = 64;        % Iteration depth

  %% Prepare the complex plane
  [wa ha] = meshgrid (w(1):s:w(2), h(1):s:h(2));
  complex_plane = wa + ha * i;

  %% Preallocate image
  mandel_img = zeros( length(h(1):s:h(2)), length(w(1):s:w(2)));

  %% Generate mandelbrot
  for wi = 1:size(mandel_img, 2)
    for hi = 1:size(mandel_img, 1)

      z = 0;
      k = 0;
      while k < it && abs(z) < 2
        z = z^2 + complex_plane (hi, wi);
        k = k + 1;
      end
      mandel_img (hi, wi) = k - 1;

    end
    %% Display progress
    waitbar (wi/size(mandel_img, 2));
  end
end


çıkıtıyı görmek için

m=mendel();
imshow(m);

E-x8

I2C ve RCC dışında diğer tüm kütüphaneleriniz de Standart Periph Lib mi kullandınız? :)

MC_Skywalker

HAL lib ile I2C TX pini için DMA aktif hale getirdim ve iterasyonu 64'e düşürdüm 14Dk sürdü çizim

video yükleniyor.

https://youtu.be/YHuHMY254Z4

MC_Skywalker

Son durum kodu mbed lpc1768 işlemciye taşıdım. Adafruit in SSD1306 lib kullanarak deneme yaptım 3 dk 50sn sürdü 1 frame çizdirmek.