avatar_Hattuşa

grafik tasarımı YARDIM

Başlatan Hattuşa, 06 Mart 2012, 22:16:39

Hattuşa

ete hocam ve usta arkadaşlar selam hepinize,
hocam yeni yeni glcd li devrelere meraklanmaya başladım, ne var ki bazı şeylerde tıkanıp kaldım.
elimde 6 adet ADC değerinden oluşan değişkenlerim var bu değişkenlerimden yararlanarak gerçek zamanlı grafik nasıl çizdiririm, bununla ilgili aramadığım yer kalmadı, google hocam tıkandı, acaba yapmak istediğimi başarabilirmiyim. bu konuda yardımcı olacak arkadaşlar varmıdır? zira projem bu safhada tıkandı örnek projeler yöntemler yazılım algoritmaları ne olursa elinde olan bilgi dağarcığında olan paylaşırsa müteşekkil olurum

pwm.c

Selami ustam, nasıl bir grafik oluşturmak istiyorsunuz? osiloskop yada spectrum analyzer benzeri bişey mi? örnek gösterebilirmisiniz.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Hattuşa

henüz o kadar lüksüm yok usta elimdeki verileri sağlıklı bir şekilde glcd ye yansıtayım yeter

ete

Cevap çok genel olmuş. Elindeki verileri ekrana yansıtmanın bin türlü yolu var.
Grafik denildiği zaman benim aklıma bir birini dik kesen X ve Y eksenleri gelir. Bu eksenleri belirli oranda dilimlere ayrırsın.
Birisinde senin verin yer alır diğerinde zaman yada elindeki veririn değişim gösterdiği diğer parametre yer alır.
Her bir veriyi bu eksenler içinde yerleştirir ve elde ettiğin noktalarıda birleştirirsen bir grafik elde edersin. El ile çok kolay yapılabilecek bu işlemin işlemci yardımı ile GLCD de gösterilmesi çok kolay değil elbette. Bazı algoritmalar geliştirilmesi gerekir.
Ben henüz bu konuda bir çalışma yapmadım ama üzerinde kafa yorabilirim.

Burada önemli olan eksenin birinde senin veri değişimin diğerinde hangi parametrenin yer alacağını tespit etmek olacaktır. Sende bu konuda biraz kafa yor ve mümkünse grafik şekli konusunda da biraz bilgi ver.
Şayet kinci parametre zaman olacak ise programda eşit aralıklarla ADC okumanın sistemini kurman gerekir. Zaman farklılığı bütün işi bozabilir. Yani birisini 1000 ms de diğerini 500 ms de alırsan bir anlamı kalmaz.

Ete

Hattuşa

slm ete hocam

paintte bir koordinat hazırladım, biraz amatörce oldu k.bakmayın.
yapmak istediğim zamana bağlı değilde, tepkiye bağlı olarak değişen adc değerlerini grafiksel hale getirmek.
ekteki koordinat işe yararmı sizce? yani yapılabilirliği varmı? GLCD üzerinde pek fazla benimde deneyimim yok açıkcası, bargraf bastım 6 adet ama grafik olarak daha net görsellik olacağı kanaatinde olduğum için bu şekilde olmasını istiyorum

ete

İllaki PBP da bu işi yapacağım dersen uğraşırız. Ancak Proton da çok kolay bir şekilde bu istediğini yapabilirsin.
Protonda direk "Line " diye bir komut var. Türkçesi çizgi demek. X ekseni için başlangıç noktası (koordinatı) ve Y ekseni için başlangıç noktası veriyorsun. Daha sonra bitiş noktalarınıda vererek iki nokta arasını çizdiriyorsun.
Bu komut ile istediğin grafiği ekrana çizdirebilirsin.

PBP ya gelince bütün ekran noktalardan oluşuyor kabul etmek ve ona göre iki nokta arasını hesapla belirleyip oralara noktalar koyarak çizgiyi oluşturmak gerekir. Epeyce zahmetli bir işlem. Ama yapılmaz değil.

Ete

Mucit23

#6
Grafik LCD monochrome olduğu için bu şekilde farklı renklerde olamaz ancak çizgi çekillerini değiştirebilirsin. (Düz çizgi- Kesik Çizgi Vs) Ama TFT kullanabilirsen açıkçası çok süper olurdu. 3.2" ILI9325 çipsetli bir TFT işini görür. Ama oturup üzerinde çok çalışmak lazım. Eğer TFT çalıştırabilirsen Grafik işinide yaparsın.

Hatta Protonun TFT kütüphaneside var. Denemedim ama çalışır büyük ihtimalle.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

slm
ete hocam ben proton kullanıyorum, proton kullanımını muhiddin kaplan hocamdan öğrendim ama şu var ki sizin 11 derste PBP dersleri sayesinde zira malumdur ki her ikiside aynı tabanlı derleyiciler, sıkıştığım anda sizin dersleri açıp ilgili konuları gözden geçiriyorum. hatta nette gezen bitmiş projeleriniz bizim için örnek uygulamalardır. oldukça da yararlanıyorum. bu konuda ne kadar teşekkür etsem azdır.
mucid hocam çizmiş olduğum koordinatların hepsini aynı anda kullanmayacağım. eldeki veriler ile hangi grafik çıkarsa onu çizeceğim. vermiş olduğum örnek sadece farklılığı görebilmek adınaydı. bahsettiğiniz line komutu ile ilgili örnek bir proje, döküman veya uygulama varmıdır? varsa paylaşırsanız memnun kalırım. örnek uygulamada ki algoritmayı devreme uyarlayıp bu haftasonu (hava şartları elverirse) uygulama yapmak istiyorum.

Mucit23

Ohalde PRoton ve GLCDişini rahatlıkla görür.
Benim aklımda şöyle bir olay döngüsü canlandı.
Ben olsaydım ilk Önce Timer kesmesini kurardım ve 1sn aralıklarda ADC den örnek alırdım. Aldığın örnekler 10Bit çözünürlükte olacak. Dolayısıyla 0-1023 arasında değişecek.
Glcd 64 satır olduğuna göre okuduğun adc değerine 1 ekleyip 16 ya bölersen elde ettiğin adc değerini 0-64 arasına indirgemiş olursun. Bundan sonra yapman gereken Line komutuyla ekrana çizgiler çizmek.
Line komutunu inceleyelim.

Protonda line komutu aşağıdaki gibi kulanılıyor.

"LINE SET_CLR , XPOS_START , YPOS_START , XPOS_END , YPOS_END"

Şimdi buradaki  değerleri açıklayalım

SET_CLR Çizgi invert seçim biti. 1 ise ekrana çizgi çizer, 0 ise ekrandan çizgi siler.
XPOS_START Çizginin X eksenindeki başlangıç adresidir. 0 ile 127 arasında değer alabilir.
YPOS_START Çizginin Y eksenindeki başlangıç adresidir. 0 ile 63 arasında bir değer alabilir.
XPOS_END  Çizginin X eksenindeki Bitiş adresidir. 0 ile 127 arasında değer alabilir.
YPOS_END  Çizginin Y eksenindeki Bitiş Adresidir. 0 ile 63 arasında değer alabilir.

Bu değerler ile ekrandaki çizginin başlangıç ve bitiş kordinatları belirlenip ekrana çizgi çizilir. Proton bu işi çok güzel yapıyor.
Burada Ypos_start değerin senin önceki okuduğun ADC değeri YPOS_EN değerin ise En son okuduğun ADC değeri olacak. XPOS_START ve XPOS_END değerileri ise Ekranda çizgiyi nereye çizdirmek istiyorsan ona oranın kordinatlarını vereceksin. Ama Atladığım bir konu var. Onu nasıl yaparım bilmiyorum aklıma gelmedi.
Her örnek aldığında Önceki örneklerini 1 adet sola kaydırman gerekir. Bunu yapmaz isen her seferinde çizgiaynı yere çizilir. Dolyısıyla grafik oluşmaz. Bu nasıl yapılır aklıma gelmedi ama önerisi olan var ise söylesin.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

hocam çok güzel ya gerçek zamanlı bir grafik çizebiliriz yani, söylediğin eksikliği şimdilik giderecek çözüm bulamadım ama bulan arkadaşlar yardımcı olur inş.

Hattuşa

s.a.
mucid hocam bazı fikirler söylediniz devamı gelmedi, ben 1-2 başarısız deneme yaptım. adc değerine göre çizgiyi çizdiriyorum ama nedense yatay çizgilerde çıkıyor ve nasıl bu çizgilerden kurtulmak lazım bilemiyorum.  ;D

ete

Çizgi çizdirme sisteminde ufak bir düzeltme yapmak lazım sanırım.
Diyelimki 1. kana ADC ölçümleri sonucunda grafik üzerinde 5 adet nokta oluştu.
Bu noktaların aralarını çizgi ile birleştirince asıl grafik ortaya çıkacaktır.
Bu nedenle programın yapması gerken şey şu olmalıdır.
1. nokta ile 2. nokta arasına bir çizgi çiz. (teorik olarak birinci ölçüm ile ikinci ölçüm değeri arasındaki çizgi olacaktır)
2. nokta ile 3. nokta arasına bir çizgi çiz.
3. nokta ile 4. nokta arasına bir çizgi çiz.
4. nokta ile 5. nokta arasında bir çizgi çiz.
Bu şekilde yapılır ise yatay çizgi çıkmayacaktır.

Toplam 5 nokta üzerinden örnekleme yapıldığını varsayar isek belirli bir zaman aralığından sonra yeniden 5 adet ölçüm alıp bunları ekrana çizmek gerekir. Ancak bunu yapmadan önce çizmiş olduğun grafiği ekrandan silmen gerekir. Bunu yapmak çok kolay. Aynı çizim komutlarını bu seferde SET_CLR parametresini sıfır yaparak vereirsen önceki çizilmiş değer ekrandan silinecektir. Daha sonra yenisini çizdirirsin.

Ete

Mucit23

#12
Hocam bence silmeye gerek yok. Ekranı sürekli komple silip grafiği yeniden basarsak ekranda Rahatsız edici şekilde titreme olur. Hocam sizin şu kayan yazı devreleri aklıma geliyor. Sizin yaptığınız mantık yani yazıyı kaydırma mantığı kesinlikle bu sistemde uygulanabilir. Sadece biraz ram'e ihtiyacımız olacak. Çünkü epeyce değişken tanımlamamız gerekecek.
Oturup sakin kafayla düşününce çalışmaya engel hiçbirşey görünmüyor.

Benim aklımdaki sistem şudur.

Şimdi hocam örnekleme hızımız 1Sn olacak. Timeri kurup her 1 snde bir adc den örnek alacağız.
Ekran devamlı tarama halinde olacak. Toplam  yaklaşık 128 adet  değişkeni tanımlayacağız.

Ekrana sırasıyla 128 adet çizgi çizlecek. Tam olarak aşağıdaki gibi.

LINE 1 , 0 , YPOS1 , 1, YPOS2
LINE 1 , 1 , YPOS2 , 2  YPOS3
LINE 1 , 2,  YPOS3 , 3, YPOS4
LINE 1 , 3 , YPOS4 , 4, YPOS5
LINE 1 , 4 , YPOS5 , 5, YPOS6
LINE 1 , 5 , YPOS6 , 6, YPOS7
LINE 1 , 6 , YPOS7 , 7, YPOS8
LINE 1 , 7 , YPOS8 , 8, YPOS9
                             *
                             *
                             *           
                             *
                             *
LINE 1 , 125 , YPOS126 , 126, YPOS127
LINE 1 , 126 , YPOS127 , 127, YPOS128   
LINE 1 , 127 , YPOS128 , 128, YPOS128   ;İlk  başlangıc noktası koyuluyor

Ekran çizdirme rutini bu şekilde olacak. Hatta bu şekilde ekranın en sol kısmına bir doğruda çizebilirsin.
Bu işlemi yaptıktan sonra sıra grafiğimizi sağdan sola doğru kaydırmaya geliyor.
Bu işlem biraz kritik. Çünkü yapılacak işlem hatası grafiğin bozulmasına yol açar.
Okuduğumuz adc değeri sürekli sağdan sola doğru kayarak ilerliyecek bunu yapmak için aşağıdaki gibi bir mantık kullanılabilir. Ete Hocam siz kayan yazı devrelerinizdede bu mantığı kullanmıştınız oradan hatırlayabilirsiniz. Eminim ne demek istediğimi anlayacaksınız.

Burada kaydırma Rutini şu şekilde ilerliyecek.
İlk başta en sağdaki bir sütüna bir okunan ADC değerine göre bir nokta koyacağız.  Sonra yapılacak işlem rutini aşağıdaki gibi olacak

YPOS1=YPOS2
YPOS2=YPOS3
YPOS3=YPOS4
YPOS4=YPOS5
YPOS5=YPOS6
YPOS6=YPOS7
YPOS7=YPOS8
YPOS8=YPOS9
YPOS10=YPOS11
            *
            *
            *
            *
            *
YPOS126=YPOS127
YPOS127=YPOS128
YPOS128=HAM  ;okunan adc değeri sağ taraftan giriyor displaye

Burada okunan ADC değeri Her seferinde bir adet sola kayıyor. Burada hata yapmış olabilirim ama zaten mantığını anlatmaya çalışıyorum.
Kayan yazılarda bu işlemi bi for döngüsüyle yapmıştınız. Aynısı buradada uygulanabilir.
Bu işlemin bir artı özelliğide ilk başta hiç okuma yapılmadığı zaman ekranın en altında sadece düz bir çizgi görünecek olması. Çünkü ilk başta ypos değerleri 0 olacaktır.
Hocam bu şekilde uygun olur herhalde değilmi.



Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Ben ekranı komple silmek yerine çizilen çizginin silinmesini tarif etmiştim.
Ekrana çizdiğin çizgileri niye kaydırıyorsun onuda anlamış değilim. Normal bir işlem grafiği çizilecek ise kaydırma olmaması gerekir.
Bu şekilde ekran çorbaya döner bence.

Ete

Mucit23

Hocam o şekilde değil yanlış anladınız.
hocam her okumada ekrana bir çizgi çizilecek. Her seferinde okunan yeni değer ekranın en sağına çizilecek. Sonra bu çizgi bir adet sola kaydırılıp yine en sağa en sonki güncel değer çizilicek. Bu şekilde  alınan grafikler sürekli sola doğru kayacak. Ama yeni çizgi basılmadan önce eskisinin silinmesi gerekiyor. Bunu düşünmemiştim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal