avatar_Hattuşa

GLCD ve analog ibre

Başlatan Hattuşa, 18 Haziran 2012, 09:30:22

Hattuşa

s.a.
arkadaşlar proton ile okuduğumuz adc değerine göre GLCD de ibre resmini hareket ettirebilimiyiz? tıpkı araçların devir göstergesinde olduğu gibi, bunu yaparsak nasıl yapabiliriz. protonda ben "LINE: çiz_sil , Xbaşla , Ypos Start , Xpos End , Ypos End" komutunu kullanarak bir cubuğu hareket ettirebiliyorum. ama ibre şeklinde nasıl hareketi sağlayabiliriz işte burda kafa basmıyor

ete

Bir ibre hareketini gözünde canlandırırsan, başlangıç noktasının (alt uç) hep aynı ama üst noktasının dairesel bir hareketler soldan sağa yada sağdan sola doğru gezindiğini görürsün. O halde yapılacak işlem sırası söyle olmalıdır.
- Önceden çizilmiş bir şekil var ise onu sil,
- Üst nokta koordinatlarını ver
- Alt nokta koordinatlarını ver
- Çizgiyi çizdir.
Alt nokta koordinatı her zaman aynı olacaktır. Değişen üst nokta koordinatı olup bunuda hesap sonucunda elde ettiğin analog değerin karşılığını nokta bazında koordinata çevirerek elde etmen gerekiyor.

Ete

Mucit23

#2
Hocam izninizle işi temelden anlatayım. Zor bir olay değil fakat PBP ile yapmak çok zor olur. Protonun meyvelerinden faydalanmak gerekiyor.

Bu işi yapabilmek için biraz trigonometri bilgisine ihtiyaç vardır. Çünkü işin temeli çember çizmeye dayanıyor.

Çember çizmenin çok çeşitli yöntemleri var. Bizim yapacağımız işlem Protonda circle komutunun yaptığı işi elle yapmak. Normalde Circle komutuna kordinat ve yarıçap bilgilerini verdiğiniz zaman kendisi ilgili noktaya hemen çemberi çizer.

Çember çizmek için Cosinüs ve Sinüs eğrilerinden yararlanılır. Protonda bu fonksiyonlar mevcuttur. Bizde bu komutları kullanacağız.

Burada İbre yapabilmek için hayali bir çember çizmek gerekir.  Çemberin uc noktası bizim çizeceğimiz çizginin bitiş kordinatıdır. Çizeceğimiz çizginin başlangıç kordinatı ise LCD üzerinde herhangi bir nokta olabilir. X ve Y ekseninde belirtilmesi yeterlidir.

Yapacağımız işlemlerde hep çizginin konumu 360 derecelik bir daire içerisinde belirleyeceğiz. Bu yüzden biz Çizgimize X ve Y değerlerini belirtmeyeceğiz. Yazacağımız program bu değerleri kendisi hesaplayıp ilgili noktaya çizgiyi çizecek.

Yapacağımız işlemlerde Cos ve Sin eğrilerini kullanacağımızı söylemiştim. Fakat Cos ve Sin eğrileri Radyan cinsinden açı değeri kabul ettiği için bizim 0 ile 360 derece arasında değişen derece cinsinden açı değerimizi Radyana çevirmek gerekiyor. İşte burada Pi sayısına ihtiyaç duyuyoruz.

Bu işlemi yapabilmek için benim yazdığım fonksiyon aşağıdaki gibidir

  AX=(Pi * Angle)/180 
  AY=(Pi * Angle)/180 


Buradaki AX ve AY değeri Angle Yani derece cinsinden açı değerimizin radyana çevrilmiş halidir. Angle değişkeni bizim derece cinsinden açı değerimizi tutar. 0 ile 360 arası bir değer alabilir.

Sıra geldi Çizgimizin Bitiş kordinatlarını belirlemeye. Burada Ax ve AY değerlerini kullanarak çizgimizin bitiş kordinatlarını belirleyeceğiz.

Bu işlemi yapabilmek içinde aşağıdaki fonksiyonu yazdım. Çember çizme algoritmasıdır.  Bunun dışında farklı algooritmalarda kullanılabilir . Ben hep bunu kullanırım.

  Xpos = Size * Cos AX 
  Ypos = Size * Sin AY


Buradaki değerleri açıklarsak eğer Xpos ve Ypos Değeri bizim çemberimizin X ve Y eksenindeki kordinatlarıdır. Bu kordinatları daha sonra çizeceğimiz çizginin bitiş noktası olarak kullanacağız.

Size Değerimiz ise Çizeceğimiz çemberin yarı çapıdır.

AX ve AY değeri ise bizim radyan cinsinden açı değerimizdir. Bir önceki fonksiyonda Derece cinsinden açı değerini Radyana çevirerek AX ve AY değerlerini elde etmiştik.

Tüm bu işlemlerin sonucunda X ve Y ekseninde çizgimizin bitiş noktasını belirlemiş olduk. Çizgimizin Başlangıç noktası ise Ekranımızın Tam ortası olacak. Yukarıdaki kodlar işletildiğinde Ekranın tam ortasından verdiğimiz yarı çap uzunluğunda bir çizgi çizilir.

Şimdi yukarıda yazdıklarımı toparlayalım. Bu iş için ufak bir program yazdım.

'****************************************************************
'*  Name    : Dashboard.BAS                                     *
'*  Author  : FERHAT YOL                                        *
'*  Notice  : Copyright (c)          *
'*          : All Rights Reserved                               *
'*  Date    : 01.06.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 18F452

Config_Start
   OSC = HS ; HS osc
   OSCS = OFF ; Disabled
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   CCP2MUX = OFF ; Disable (RB3)
   STVR = OFF ; Disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Disabled
Config_End

Xtal 20

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000

PORTA=0:PORTB=0
PORTC=0:PORTD=0
    PORTE=0
PORTB.5=1                          'GLCD RESET=1
LCD_DTPort = PORTD                 'GLCD DATA PORTLARI PORTD'YE BAĞLI
LCD_RSPin = PORTB.0                'GLCD RS PİNİ PORTB.0 BAĞLI
LCD_ENPin = PORTB.2                'GLCD ENABLE PİNİ PORTB.2 BAĞLI
LCD_RWPin = PORTB.1                'GLCD RW PİNİ PORTB.1 BAĞLI
LCD_CS1Pin = PORTB.4               'GLCD CS1 PİNİ PORTB.4 BAĞLI
LCD_CS2Pin = PORTB.3               'GLCD CS2 PİNİ PORTB.3 BAĞLI
LCD_Type =  Samsung                'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Declare Internal_Font = On
Declare Font_Addr = 0
Declare GLCD_STROBE_DELAY = 5
;GLCD_EXTERNAL_PRINT = PPRINT
DelayMS 100

Dim Pi    As Float  ; Pi Değeri 3,1415
Dim AX    As Float  ; Açı Değerinin X eksenindeki Radyana çevrilmiş Hali
Dim AY    As Float  ; Açı Değerinin Y eksenindeki Radyana çevrilmiş Hali
Dim Xpos  As Word   ; X Eksenindeki kordinat
Dim Ypos  As Word   ; Y Eksenindeki kordinat
Dim Xpos_ As Word   ; X Eksenindeki Eski kordinat
Dim Ypos_ As Word   ; Y Eksenindeki Eski kordinat
Dim Angle As Word   ; Açı Değeri
Dim Size  As Byte   ; Çizginin Uzunluğu(Bi anlamda çemberin çapı)
Dim X     As Byte   ; Orjin Noktasının X kordinatı
Dim Y     As Byte   ; Orjin Noktasının Y kordinatı

Pi=3.1415           ; Pi Değeri Belirleniyor
Cls                 ; Ekran Temizleniyor

X=64:Y=32           ; Burada Ekrana çizilecek çizginin Başlangıç noktası belirlenir. Ekranın Tam ortasında olacağı için
                    ; Kordinatlarımızı 32,64 olarak belirliyoruz
Size = 30           ; Çizgimizin uzunluğu

BASLA:

For Angle=0 To 360
  AX=(Pi * Angle)/180  ; ilk önce açımız radyan değerine çevriliyor. çünkü Protondanki Sin ve Cos
  AY=(Pi * Angle)/180  ; fonksiyonları radyan değerini kabul eder. Eğer açı değerini derece olarak yazarsanız ekranda
  Xpos = Size * Cos AX ; sadece çember çıkar. Xpos ve Ypos Değerleri Belirlendikten sonra Ekranda belirlediğimiz orjin   
  Ypos = Size * Sin AY ; noktasından Xpos ve Ypos kordinatlarına çizgi çizilir.
  Line 0,X,Y,(X+XPOS_),(Y+YPOS_) ; Bir önceki çizdiğimiz çizgi siliniyor
  Line 1,X,Y,(X+XPOS),(Y+YPOS)   ; Eski Çizgini yerine yenisi çiziliyor
  Ypos_=Ypos:Xpos_=Xpos          ; Bir önceki kordinatlar belirleniyor
  Print At 0,0,"ACI=",Dec3 Angle
  Print At 7,0,"X=",Dec3 (X+XPOS)
  Print At 7,16,"Y=",Dec3 (Y+Ypos)

DelayMS 50
Next

GoTo BASLA

Include "FONT.inc"

End


Programda gerekli Tüm açıklamalar mevcuttur.  Programda Line komutlarının yerine Plot Ypos, Xpos diye yazarsanız eğer Ekranda bir çember çizersiniz. Aynı şekilde döngü sayısını 360dan 90'a düşürürseniz. Çemberin sadece 4. Bölgesinin yani çeyrek çember çizersiniz. Döngü sayısını 180 yaparsanız yarım daire çizersiniz.

Birde video çektim. İnceleyebilirsiniz.

Analog_Mucit23

Bu programla Bir analog saat yapabilirsiniz. veya  araç için gösterge paneli.
128X64 pixel LCD de görüntü pekde güzel çıkmıyor. 240X128 LCD daha güzel görünecektir.

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

www.arectron.com/

Hattuşa

ete hocam ve mucid23 ustam vermiş olduğunuz bilgiler için teşekkür ederim. soruyu sordum ama yoğunluktan cevaba ancak bakabildim.
vermiş olduğunuz bilgiler çerçevesinde deneme yapacağım. mucid23 ustam ben proton kullanıyorum ve sanırım anlatımlarınızla işim kolay olacak, şimdilik ben 180 derecelik bir dönüş bana yetecek, vakit bulursam bir deneme yapacağım ve becerebilirsem sizin sayenizde olacak inş.

Hattuşa

s.a.
@mucid23 hocam vermiş olduğunuz bilgiler doğrultusunda ve bir ustamın yardımıyla yapmak istediğim analog ibreyi oluşturdum. ibre çizgisi biraz ince oldu ama yapmak istediğim böyle birşeydi ilginiz için tşk ederim.



Device 18F4520
Xtal 10
Config_Start
   OSC = HS'PLL ; HS oscillator, PLL enabled (Clock Frequency=4 x FOSC1)
   PWRT = On ; PWRT enabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = On ; MCLR pin enabled; RE3 input pin disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End
'Declare PLL_Req TRUE '40mhz

Declare LCD_DTPort =PORTD
Declare LCD_RSPin =PORTB.2
Declare LCD_ENPin =PORTB.0
Declare LCD_RWPin =PORTB.1
Declare LCD_CS1Pin =PORTB.4
Declare LCD_CS2Pin =PORTB.3
Declare LCD_Type =GRAPHIC
Declare Internal_Font = On
Declare Font_Addr = 0
Declare GLCD_CS_Invert =0
Declare GLCD_STROBE_DELAY = 100
DelayMS 100

TRISA =%00000001  :PORTA =0
TRISB =%00000000  :PORTB =0
TRISC =%00000000  :PORTC =0
TRISD =%00000000  :PORTD =0
TRISE =%00000000  :PORTE =0
PortB_Pullups =0

CMCON =7

ADCON0 =%00000011
ADCON1 =%00001110 '1 kanal secildi an0
'ADCON2 =%10001010
ADCON2.7 =1
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 100


Dim Pi    As Float  ; Pi Değeri 3,1415
Dim AX    As Float  ; Açı Değerinin X eksenindeki Radyana çevrilmiş Hali
Dim AY    As Float  ; Açı Değerinin Y eksenindeki Radyana çevrilmiş Hali
Dim Xpos  As Word   ; X Eksenindeki kordinat
Dim Ypos  As Word   ; Y Eksenindeki kordinat
Dim Xpos_ As Word   ; X Eksenindeki Eski kordinat
Dim Ypos_ As Word   ; Y Eksenindeki Eski kordinat
Dim Angle As Float   ; Açı Değeri
Dim Size  As Byte   ; Çizginin Uzunluğu(Bi anlamda çemberin çapı)
Dim X     As Byte   ; Orjin Noktasının X kordinatı
Dim Y     As Byte   ; Orjin Noktasının Y kordinatı
Dim vOlT As Word
Dim dEl As Float



Pi=3.1415           ; Pi Değeri Belirleniyor
Cls                 ; Ekran Temizleniyor

X=64:Y=60           ; Burada Ekrana çizilecek çizginin Başlangıç noktası belirlenir. Ekranın Tam ortasında olacağı için
                    ; Kordinatlarımızı 32,64 olarak belirliyoruz
Size = 30           ; Çizgimizin uzunluğu

BASLA:
GoSub AdC_oKu




Angle = vOlT * 180/1023
Angle = Angle + 180

  AX=(Pi * Angle)/180  ; ilk önce açımız radyan değerine çevriliyor. çünkü Protondanki Sin ve Cos
  AY=(Pi * Angle)/180  ; fonksiyonları radyan değerini kabul eder. Eğer açı değerini derece olarak yazarsanız ekranda
  Xpos = Size * Cos AX ; sadece çember çıkar. Xpos ve Ypos Değerleri Belirlendikten sonra Ekranda belirlediğimiz orjin   
  Ypos = Size * Sin AY ; noktasından Xpos ve Ypos kordinatlarına çizgi çizilir.
  Line 0,X,Y,(X+XPOS_),(Y+YPOS_) ; Bir önceki çizdiğimiz çizgi siliniyor
  Line 1,X,Y,(X+XPOS),(Y+YPOS)   ; Eski Çizgini yerine yenisi çiziliyor
  Ypos_=Ypos:Xpos_=Xpos          ; Bir önceki kordinatlar belirleniyor
 
  Print At 0,0,"ACI=",Dec3 Angle-180
  Print At 0,12,"ADC:",Dec1 vOlT," "
  Print At 7,0,"X=",Dec3 (X+XPOS)
  Print At 7,16,"Y=",Dec3 (Y+Ypos)

DelayMS 50




GoTo BASLA
AdC_oKu:
ADCON0 =%00000011
vOlT =ADIn 0
While ADCON0.1 ==1 :Wend
Return


End
Include "FONT.inc"

Mucit23

Senin yerinde olsaydım arkaya bir resim basardım sonra ibreyi bu resim içerisinde hareket ettirirdim. Daha güzel olur.

İbrenin ince olması da şu şekilde yapabilirsin. Yani genelde böyle yapılır.
eğer bir ibre yerine üçgen oluşturacak şekilde 2 adet ibre çizersen ok şeklinde hareket eden bir ibre elinde olur. Şuanda bizim çizgimizin başlangıç eksenini 32,64olarak belirlemiştik.
Bu noktanın değerini 32,62 olarak değiştir. Sonra başka bir nokta belirle bunun değerinide 32,66 olarak belirle. Sonra yukarıdaki hesaplamalarla belirlediğin bitiş noktasına göre iki çizgi çiz. Bu şekilde ücgeni oluşturmuş olursun. Ama üzerinde biraz çalışmak gerekir. Çünkü bu sefer merkezde sabit olmayacak. Onunda dönmesi gerekiyor.

Aslında bu iş en güzel rotate algoritmaları ile yapılır ama bu çok zor bir işlem ve çok yüksek işlem gücü ister. Bunun altından protonun kalakacağını sanmıyorum. Rotate algoritmalarını koşturmak için ileri seviyede basic ve programcılık bilgisine ihtiyaç vardır.

Benim vaktim yok yoksa benimde uğraşmak istediğim bir konu. Ben şuanda PicBasic ile TFT sürmek için kendi fonksiyonlarımı yazıyorum. Yakında 18F452 ile TFT ye Renkli resim basacağım  :D
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

@mucid23 ustam dediğini deneyeceğim, her türlü fikirlere açığım. ve arka plana dediğiniz gibi bir yay ve değerleri eklemeyi bende düşünüyorum, zira ibrenin gösterdiği değer benim için önemli.

Bülent

Mucit23 arkadaşımız bu başlıkta GLCD kullanımı konusunda çok yararlı bilgiler vermiş. Bunları çalışırken, son mesajında önerdiği,  "arkaya bir resim basardım sonra ibreyi bu resim içerisinde hareket ettirirdim " denemesini yapıp proteusta çalıştırdım.Sonra da bunu gerçek devrede PIC' e kodu atıp elimde daha önceden aldığım GLCD' de görmek istedim. Ancak sürpriz, benim GLCD farklı çıktı QC12864B imiş. C1 ce C2 bacakları yok. Acaba bu tip bir GLCD kullanan oldu mu ? GLCD tanıtım kodlarını yazarken nasıl bir yol izlemek gerek ?



Mucit23

Çipi bilmiyorum ama orada psb denen bir bacak var. Çip seçim islemini o yapıyordur.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Bülent

Hayır, maalesef o değil. PSB' nin görevi Kontrol entegresi ST7920' nin datayı LCD' ye paralel veya seri aktarmasına karar vermek. PSB=1 Paralel, PSB=0 Seri

Hattuşa

#10
s.a.
arkadaşlar konu GLCD ile açılmışken GLCD deki print sürelerini nasıl kısaltabiliriz? yani düşünün bir kod yazıyorsunuz kodun içinde kesme var ve GLCD kullanmışsınız, GLCD ye print dediğiniz de kesmeniz sıkıntı yaratıyor sebebi print süresinin uzunluğu, zira en basit bir yazıyı print etmenizin süresi 40-50mS. bunu aşmanın bir yolu yokmudur?
yani şu marka GLCD ler daha hızlı veya PIC ile GLCD arasına şu entegre ile sürersen sıkıntı kalmaz gibi çözümler varmıdır?

Mucit23

Yanlışın olacak 40 50 ms print fonksiyonu sürmez.  Okadar sürüyor ya text cok uzundur yada işlemci cok yavastir.

Alternatifler söyle

1-) işlemci çalışma frekansını arttırma
2-) print fonksiyonu kendin yazman.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

Alıntı yapılan: Mucit23 - 22 Ağustos 2013, 00:15:13
Yanlışın olacak 40 50 ms print fonksiyonu sürmez.  Okadar sürüyor ya text cok uzundur yada işlemci cok yavastir.

Alternatifler söyle

1-) işlemci çalışma frekansını arttırma
2-) print fonksiyonu kendin yazman.


mucit23 ustam
1. tekniği anladım, 2. tekniği biraz açıklayabilirmisiniz? yada basit bir örnek verebilirmisiniz

Mucit23

print dediğin zaman arka planda bir dizi kod çalışır. Bu fonksiyonu kendin yazarsan sorun print fonksiyonundamı değilmi anlarsın. Bunu demek istiyorum. Örneğe gerek yok..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

gergy

Alıntı yapılan: Bülent - 21 Ağustos 2013, 10:44:13
Hayır, maalesef o değil. PSB' nin görevi Kontrol entegresi ST7920' nin datayı LCD' ye paralel veya seri aktarmasına karar vermek. PSB=1 Paralel, PSB=0 Seri
Sanırım proton ve picbasic'in print, line, plot vb. komutları bu GLCD'yi desteklemiyor. Seri iletişim (shout) ile kendi macrolarınız oluşturup kullanabilirsiniz diye düşünüyorum. Zamanında Nokia 3310 için bu tip seri iletişimi ben de kullanmak durumunda kalmıştım. İlla bu GLCD'yi kullanacağım diyorsanız Proton'un web sitesinde barak adlı kullanıcının oluşturduğu demo programı bir inceleyin; kontrolörü aynı değil ancak benzerdir sanırım ve linki aşağıda...

http://www.protonbasic.co.uk/content.php/3679-Using-PDS-with-SPI-GLCD-based-on-ST7565R-Controller

Powered by EzPortal