STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

tekosis

#255
bu konu ile yine bir problemle karşılaştım. şimdi sinyali tam olarak alıyorum. yanlız frekans benim belirlediğimin tam yarısı çıkıyor. örnek hesaplamam şöyle
sinyal frekansı = 1 khz
bir peryottaki örnek sayısı = 20

1000Hz x 20 = 20Khz lik frekansta kesme üretmek üzere dma'yı çalıştıran timer6 yı kuruyorum ancak üretilen frekans değeri 500Hz çıkıyor. yani hesapladığımın tam yarısı. acaba nerede hata yapıyorum? timer hesaplamaları için mikroelektroika nın timer calculator programını kullanıyorum.

düzeltme : apb1 veri yolunun hızını 168Mhz olarak hesapladığımdan olmuş hata. frekans 84MHZ olarak hesaplanınca düzeldi.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Mucit23

Merhaba arkadaşlar,

320x240 lcd ekranda osiloskoplardaki gibi çizgi grafiği göstermek istiyorum. Bunun mantığı tam olarak nasıl işliyor, Fikir yürütemedim bir türlü.

Mucit23

Fikri olan yokmu?

Amacım ekranda hareketli olarak aşağıdaki gibi bir grafik çizdirmek.

Arka taraftaki ızgaranın olmasına gerek yok. Çizgi çizerek grafiği oluştursam yeter, nasıl yapacağımı bilmiyorum. Bu iş için hazır bir kütüphanede olur.

Bu işin mantığı nedir? Kayar bir grafik nasıl oluştururum? Fikir verirseniz sevinirim.

Klein

#258
Eğer LCD üzerinde iki nokta arasına çizgi çekebiliyorsan, hareketlisi kolay. Ama yok, yolun başındayım , çizgi nasıl çizilir diyorsan, o iş biraz karışık.

mesaj birleştirme:: 29 Mayıs 2014, 23:26:38

Eğer hazır kütüphane bulamazsan, şöyle bir başlangı önerebilirim.
Çizgi çizmekten önce nokta koymakla başlayabilirsin.  Eğer istediğin yere nokta koyabiliyorsan izgi de çizebilirsin.
bir tane 320 elemanlı tablo yap.  Bu tablonun her elemanı  0-240 arasında değer içersin.  Bu deperlerin her biri bir satırı temsil edecek. Eğer bu satırlara noktaları yerleştirebilirsen, ve bunları grafik hızına uygun bir şekilde silip yeniden koyabiliyorsan, çizgi çizmeye hazırsın demektir.

Müh. müh.

Alıntı yapılan: Mucit23 - 29 Mayıs 2014, 23:08:28
Fikri olan yokmu?

Amacım ekranda hareketli olarak aşağıdaki gibi bir grafik çizdirmek.
(Resim gizlendi görmek için tıklayın.)
Arka taraftaki ızgaranın olmasına gerek yok. Çizgi çizerek grafiği oluştursam yeter, nasıl yapacağımı bilmiyorum. Bu iş için hazır bir kütüphanede olur.

Bu işin mantığı nedir? Kayar bir grafik nasıl oluştururum? Fikir verirseniz sevinirim.


Sample ları bir biri ile birleştireceksin o kadar..

320x240 lcd n var. 32 tane sample al.

X ekseninde,

1-10-20-30-40-50-60......

pixellere,


Y ekseninde ise, grafiğin değerine göre noktasal yerleşimlerini yap. Sonra noktalar arasında çizgi çiz. Çözünürlük ne kadar artasa, grafik o kadar güzel, kıvrımlı, düzgün görünür.
Destiny of white is dirtied. Destiny of black is found guilty...

Mucit23

Hocam yok çizgi çizmede nokta koymada sıkıntım yok. LCD kütüphanemde bununla ilgili fonksiyonlarım çalışıyorlar.

Grafiği kaydırırken her seferinde yeni bir değer gönderirim büyük ihtimal. Her seferinde grafiği kaydırdığımdada Ekranın tümünü silmek hiç mantıklı gelmiyor bana. Bu durum görüntüde muhtemelen titremeler oluşturacak.

Belki ekrandaki noktalara çizgiler çekerek grafik çizebilirim ama kaydırırıp yeni değerleri basarken dediğim gibi ekranın tümünü silmek gerekecek. Bunu yapmak istemiyorum. Daha efektif bir yöntem oluşturmam gerekiyor. Bu konuda önerisi olan varmı?

X-Fi

ekranın tümünü silmenize gerek yok çizdiğiniz kordinatları bir buffer da toplayın silmek istediğiniz kadarını ters renkde üzerine çizin kaybolacaktır. Daha sonrada yenisini koyu renkde çizdirin. Böylece ekran yenilenmiş olur.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Burak B

Bol miktarda RAM' e ihtiyacın var. En az 320*240*2 byte kadar. Frame buffer kullanıp, katman katman çizim yapıp sonra bu bufferı ekrana basacaksın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

Alıntı yapılan: ByteMaster - 30 Mayıs 2014, 00:18:23
Bol miktarda RAM' e ihtiyacın var. En az 320*240*2 byte kadar. Frame buffer kullanıp, katman katman çizim yapıp sonra bu bufferı ekrana basacaksın.

Hocam siz farklı bir yöntemden bahsediyorsunuz herhalde, Çizgi çizerek bukadar büyük bir alana ihtiyaç olmuyor. Sizin bahsettiğiniz yöntemin aslı nedir?

Elektroemre

@Mucit23 hocam öylesine keyif için deneysel çalışma yapıyorsan tavsiyem linkteki kiti temin etmen:
http://market.cizgi.com.tr/product/education/stm-stm32F429I-discovery

İçerinde 8 MByte SDRAM var. MCU'da donanımsal LCD sürücüsü mevcut. LCD layer buffer'lar SDRAM da tanımlı.
Şimsek hızında grafikler çizdiriliyor. RAM gani.

Şurada da bu kitle hazırlanmış bir scop örneği mevcut.
http://www.coocox.org/forum/topic.php?id=4052

Kodları detaylı incelemedim ama ekran fonksiyonları yeterince optimize edilmemiş olabilir bu proje için.
Normalde bu kitteki ekrana  double buffer kullanırak çok yüksek hızda ve yumuşak bir şekilde frame basmak mümkün. Double buffer kullanılmaz ise ekrana yazma sırasında kullanıcıyı rahatsız eden kırpışmalar oluşabiliyor.

z

Ekrani tamamen silmene gerek yok.

yatay eksen x=0,1,2,3,4 seklinde ilerlerken diyelim ki x=7 icin y degerini ekrana basacaksin.
Once x=7 icin y=0 dan, x=7 y=ymax dikey cizgisi ciz. Bunun rengi zemin rengi olsun.
Boylece x=7 deki eski pixel silinecektir. Daha sonra x=7 icin asil koyman gereken pixeli cizersin.


Yada tek boyutlu bir aray tanimlarsin. boyu ekranin xmax degerine esit olur.
Sen ekrana pixel koymadan once o x degeri icin saklanmis eski y degerini okur ve ardindan bu pixeli silersin.
ardindan asil koyman gereken pixeli koyarken y degerini arrayde de saklarsin.

Ilk yontem array istemez fakat yavas calisir. Ikinci yontem ram ister ama hizli calisir.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Pikseli silmek tek başına işe yaramaz ki hocam. Bir önceki y noktasından tazeleyeceğimiz y noktasına kadar çizilmiş bir doğru var. bu doğrunun da silinmesi gerekecek.   Tabi bir de ekran kayacağı için, önceki noktaların hepsi bir sola kayacak.  Bunun için tüm  çizgilerin silinmesi gerekecek.  Silme yazma esnasında kırpışma olabilir.  Ekranı komple tazelemek daha temiz bir çözüm gibi geliyor bana.
Double buffer de gerekmeyebilir.     Veri yine tek boyutlu diziye atılır. Circular buffer kullanılıp, her tazelemede dizinin başlangıç adresi bir artırılır.

z

#267
Bir onceki y ile simdiki y arasinda sadece 1 pixel fark var. Degisen bir sey yok. Bir pixel onunde ne var ne yok sil yeni pixeli yada egriyi koy.

Edit: Evet Klein bahsettigin durum line grafik cizildiyse her x icin 1 y degeri saklayan buffer metodunda sorun olusturur. Line metodunda sorun yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Çizgi çizerek nasıl yapacağımı anladım ama buffer kullanarak nasıl yapıldığını anlayamadım. Ben boş ekranda biraz çalışma yapayım.  320 genişlik için en az 160 noktalı bir grafik oluşturmaya çalışacağım.

@Elektroemre, Hocam o kitten bendede var. Ama onu kullanmak istemiyorum. Yapabilirsem STM32F10x de yapmam lazım.

Şu EMWIN içimi kemiriyor yeminle. Kendi içerisinde bu işler için Graph Widget var.

yamak

Hocam hiç uğraşma Emwin kullan. :)