18F452 İle Grafik LCD (glcd) Sürme
Merhaba uzun zamandır birşeyler yazmadığımı farkettim. Evde gizli gizli çalışıyorum
. Neyse güzel ve herkes tarafından merak edilen bir uygulamayı paylaşıyorum bu sefer. Grafik LCD ekran nasıl sürülür? Bunun için 18F452 kullandım ama siz 16F877 de kullanabilirsiniz. Ancak 18F452 nin RAM belleği bizim için daha uygun çünkü daha geniş. 16F877 de sürekli hafıza hatası alabilirsiniz.
Proje için Karaköy'den bir adet 128x64 Grafik LCD ekran aldım. MAVİ arkaışıklı. Yaklaşık 30 ytl civarında. Ararsanız bulabilirsiniz. Alırken kontrol kolaylığı olarak KS108 işlemcili olmasına dikkat edin.
18F452 zaten pin itibariyle 877 nin aynısı fiyatı da 10 ytl idi ben alırken. Onu da 2 hafta önce felan almıştım. Sonra gelelim çalışmamıza. Burada önemli nokta Grafik LCD ekranın kontras ayarının standart karakter LCD ekranlardan farklı olması. Şimdi pinlere bakarsanız şayet şöyle göreceksiniz:
//// * 1: VSS is connected to GND ////
//// * 2: VDD is connected to +5V ////
//// * 3: V0 - LCD operating voltage is connected from a 20k Ohm POT////
//// * 4: D/I - Data or Instruction is connected to B2 ////
//// * 5: R/W - Read or Write is connected to B4 ////
//// * 6: Enable is connected to B5 ////
//// *7-14: Data Bus 0 to 7 is connected to port d ////
//// *15: Chip Select 1 is connected to B0 ////
//// *16: Chip Select 2 is connected to B1 ////
//// *17: Reset is connected to C0 ////
//// *18: Negative voltage is also connected to the 20k Ohm POT ////
//// *19: Positive voltage for LED backlight is connected to +5V ////
//// *20: Negavtive voltage for LED backlight is connected to GND ////

Şimdi benım LCD ekranımda hangi pin ne gösteriyor. Ama sorun şu ki V0 ve VEE olmak üzere iki adet pin görünüyor. İlk önce bunları karıştırdım ben hangisine pot pağlayacağım diye. Ama sonra bir siteden öğrendim ki, bağlantı şekli şu şekilde olmalıymış.

İşte bunları da yaptıktan sonra örnek bir program hazırladım. Zaten kodlarda açıklamalar da mevcut.
İşte bu kullandığım 128x64 resim. Photoshop da normal olarak yazıp tek renk kaydettip bmp olarak.

Sonra bunu BMP2ASM programı ile açıp kodlarını aldım. Dikkat eğer programla açarken problem çıkarsa Resim dosyasını önce PAİNT ile açıp farklı kaydet diyip TEK RENK BMP OLARAK KAYDET deyin.
Bu simulasyonun ekran görüntüsü:

Bu da devre üzerinde çalıştırılmış hali:

Sorunuz olursa sorabilrisiniz.
BMP2ASM Programı
BMP resmi
CCS C kodları
Proteus ISIS simulasyonunu arşivleyip aşağıya linkini ekliyorum
http://projects.harmankaya.org/PIC/uygulamalar4/GLCD/GLCD_ORNEK.zip


13. SBT, 2009






Sponsor Linkler
Anlatım için teşekkürler önümüzdeki hafta bu uygulamayı deneyeceğim :).
Denedikten sonra siz de deneyimlerinizi paylaşırsanız sevinirim. Mesela PIC 20Mhz ikn ben çalıştıramadım. Ekranda böyle bozuk bişeyler çıktı :)
Bu da videom
http://www.youtube.com/watch?v=IJXuiWloVe0
Pic16f877 ile aynı bağlantıları yaparak çalıştırdım. anlatımınız için tekrardan teşekkürler.
20Mhz ile deneme şansım yok pic 4mhz lık :).
Merhaba 16f877 de 20mhz lik frekansı destekliyor (:
Bu arada yazmayı unutmuşum grafik lcd kütüphanesinde delay_cycle() şeklinde tanımlanmış cycle hesabı gecikmeleri 5 ile çarpıp içlerine yazdım ve düzeldi. :) Yani 20Mhz de de çalıştırıyorum
merhaba,
ben bu entegrenin üzerinde PIC16f877 -04/P yazıyor. elimdeki bu pic 20mhz desteklemiyor.
Birşey sormak istiyorum size,
ben bu lcd yi kablosuz olarak yazılanları nasıl değiştiririm ?
Elbette değiştirebilirsiniz. Şimdi bir arkadaşımın projesi zaten. Bluetooth ile yapıyor o. Ama siz RF modül kullanıp (10 ytl felan alıcı + vericisi) ayrıca RS232 portunu kullanarak yapabilirsiniz.
BEN SİZİN PROJELERİNİZDE BİR EKSİKLİK GÖRDÜM VE SÖYLEMEM GEREKİR.MALZEME LİSTESİ YOK VE BEN BNLARI YAPMAK İSTİYORUM YARDIMCI OLURMUSUNUZ.
üstad şu proğramı birde 877 ile yapsan
paylaşım için teşekkürler...elinize sağlık
Çok bir farkı yok aslında 877 ile zaten pinleri aynı tek fark programın başındaki configürasyonlar değişiyor :)
Merhabalar,
Yaptığınız çalışmadan dolayı ellerinize sağlık, Allah razı olsun. Hakikaten çok faydalı oldu.
Kafama takılan bir durum var, grafik lcdYe yazı yazdırırken değişken yazdırmayı nasıl yapıyoruz bir türlü çözemedim kafayı yiyeceğim.
Hani printf("%d",degisken); şeklinde ifade ediyoruz ya, glcd_text57 komutu ile olmuyor sanırsam. Yardımlarınız için şimdiden teşekkürler.
Merhablar,
Değişkeni ekrana yazdırmak için kullanılan komut
char degisken[]="ekran";
glcd_text57(2,0,degisken,1,ON);
2 : X koordinatörü ( x,y yeri ters olabilir )
0 : Y koordinatörü
degisken : Ekrana yazdırılcak değişken
1 : Yazı kalınlığı
ON : Yazı rengi
Merhabalar,
Arkadaşlar problemi çözdüm.. Mert arkadaşa teşekkür ederim.
Yalnız değişken ekrana yazdırmayı şu şekilde yapabiliyoruz, eğer başka şekillerde yapılabiliyorsa bilmiyorum diğerlerini, bilen olur da paylaşılırsa memnun ve mesrur oluruz:D
mesela int i; gibi değişkenimiz olsun. Ve i değişkeni her değiştiğinde ekrana son değerini yazdırmamız gerekiyor olsun.
İki seçeniğimiz var: ya i'nin alacağı değerleri tek tek karakter olarak tanıtıp, her değere karşılık gelen karakteri if() ifadesiyle yazdırmak,(bu zor olan)
ya da, sprintf komutuyla halledivermek..
ekrana yazılabilecek en uzun karakterli için bir dizi tanımlarız: char karak[50];
devamında;
....
sprintf(karak,"i'NIN SON DEGERI=%d",i);
glcd_text57(1,1,karak,1,ON);
şeklinde yazdırabiliriz..
Hocam süpersin. Harika bi paylaşım olmuş. GLCD ye yeni başlayanlar için çok güzel bi kaynak..
beyinlerinize sağlık bir de asm de bir örnek bulabilsem minnettar kalacağım aylardan beri arıyorum başka dile de kafa artık basmıyor .yinede cok teşekkürler
Musa bey;
asm ile örnek var mı bilmiyorum ama oturup kendiniz yazarsanız gerçekten eziyet olur diye düşünüyorum onun yerine C ye birazcık başlasanız daha kolay.
Selamlar
Erhan bey ccs c ye başladım bayağı kolaymış
bir sayfayla her şey halloluyormuş ama ilk göz ağrım asm
Tebrikler :)
ASM ile bunları yazarsanız eğer bana gönderin sitede sergileyelim :) Sayfalarca kod hayal bile demiyorum :)
kolay olanı bilmezsen zor olanla yetinirsin ben kendi cabamla öğrenmeye çalışıyorum tabii sizlerin yardımıyla
Ben de ilk ASM ile başladım ancak PWM ve ADC sonrasında artık C ye atladım. Bir üst seviye dil ile yazmak aslında bzen işleri kolaylaştırıyoruz ancak hata bulmayı biraz zorlaştırıyor.
Hoş asm ile yazınca da bulamıyorum hatayı. Hatta yazdıkdan 1-2 ay sonra koda bakınca ne düşünmüş de böyle yazmışım diye düşünüyordum :)
merhaba Erhan bey aslında haklısınız asm de sanki kontrol bende gibi hissediyorum
ccs de hazır alt programlar işi kolaylaştırıyor.neyse ccs c ye başladım ilk glcd mi çalıştırdım
Bir sorum olacak ks108 li bir devreye t6963 lü glcd bağlasam çalışırmı tabii pinleri doğru bağlamak şartı ile ilk kurulum komutları aynımıdır teşekkürler.
merhaba bende bu uygulamayı yapmaya çalışıyorum ancak ekranda çıktı alamıyorun dümdüz mavi ekran geliyor osilatorü hangi frekansta kullanmalıyız ve kondansatörlerin değeri verimli çalışması için ne olmalı. glcd yi s6bo108 kontrollü almışım selanik pasajından ancak o seride kso108 ailesindenmiş.bu şekilde çalışmazsa acaba bu kontrollünün .h dosyası ccs c de varmı biliyormusunuz desteğiniz için teşekkürler ...glcd pgm12864a-nsw
ismail kardeşim birincisi glcd ks 108limi bilmiyorum öyle satmış olabilirler.ikincisi pin bağlandıların ücüncüsü kontrast ayarı gerekli yoksa benim gibi çok uğraşırsın ks 108 in ccs cde dosyası var ben çalıştırıyorum.web den pgm12864a ya bak işlemcisi ne diye
birde ben 16f877 kullandım 20mhz olanından
sorunsuz çalışıyor
kolay gelsin
musa kardeşim glcd işlemcisi (S6B0108 veya Eşdeğer) şeklinde yazıyor kataloğunda ancak araştırdım bi sitede bu işlemciyi de kso 108 ailesi içinde gösteriyor ancak hala daha bir sonuç elde edemedim :)
ismail kardeş glcdnin vo pinini şemadaki bağlantısını yaptınmı potu cevirerek ekranda siyaha kacan fon görmen lazım pin bağlantılarından eminmisin
erhan bey yardımınıza lütfen yardımınız lazım glcd ekranda analogdan okuduğum değeri yazıyorum fakat gözü çok rahatsız eden titreşimde çalışıyor sorunu bir türlü çözemedim yardım ederseniz minnettarım tşk.
while (1)
{
glcd_init(on);
deger=read adc();
delay_us(20);
sprintf(deger,"%d",1);
glcd_text57(1,1,deger,1,ON);
}
Merhaba Musa;
Evet çünkü glcd_init(0n) ile sürekli LCD ekranını temizleyip yeniden yükleme yapmaya çalıştığın için. Sonsuz döngünün üstüne koyarsan daha faydalı olur.
Son olarak Genelde Grafik LCD komple temizlenip yazmaya kalkarsanız o titreşim olur. Tavsiyem sadece ekranın neresine yaz yazacaksınız orayı silip değiştirmeniz.
Bir de :) 20Mhz kristal kullanırsanız sorun biraz daha azalır.
erhan bey ilgilendiğin için teşekkürler. acaba diğer progamlama dillerindede aynı sorun varmı mesela jal'da .
Musa Bey;
Olay şöyle aslında. CCS de hazır bir grafik sürücü kullandığımız için haliyle içine girip müdehale etmiyoruz. Sadece bilinen fonk. kullanıyoruz. İyi bir C & C++ ile bu kodlar incelenip size özelleştirilmiş bir kütüphane hazırlarsanız sanırım daha faydalı olur. Çünkü kütüphane kullanmanın en büyük dezavantajı işte kod satırı fazla olduğu için işlem süresi bir hayli uzuyor.
Ama benim dediğim gibi sadece güncellemek istediğiniz yeri belirtip orayaı siler ve üzerine yazarsanız o titreme olayından kurtulursunuz. Misal ben bu olayı (GLCD+PIC) bir de RFID ile birleştirmiştim. Orada ekran üzerinde bir de Tarih/Saat vardı.
Haliyle saniye bölümünün sürekli güncellenmesi gerekiyordu. İşte dediğim yöntemle yaptım. Videolardan izleyebilirsiniz.
Kolay gelsin
Erhan bey sorunumu dediğin gibi hallettim fonksiyonla pixel,pixsel sildim gayet güzel oldu yardımların için çok teşşekür ederim.
Musa kardeş proteusta pic in ürerine gelip 2 kere sağ tıklayıp açılan pencerede pic. in clock frekensını 20Mhz yaparsan düzelir
Merhabalar arkadaslar ilk once boyle bir devre için tesekkur etmek isterim fakat bu devrede bilmeyenler de olabilir.Misal ben bu işe baslarken hiçbirsey bilmiyordum devreyi yaptım baskıyı çıkardım devre çalışmadı cunku ne trimpot ne cristal nede diger elemanlar vardı.Bilmedigimiz için baglayamadık sonra ogrendik.Sorunum su burada malzeme listesini verirseniz çok sevinirim simdiden tesekkur ederim.
@cem
haklısınız aslında orası da eksik kalmış. Zaten bi ara bu devreyi toparlayıp içinde RS232+GLCD+SICAKLIK SENSORU+RTC Vs şeyler olan mini bir board hazırlamayı düşünüyorum sanırım o devre bütün sıkıntılarımızı çözmüş olacak :)
Piyasadaki Winstar WG12864C-TMI-V#N Glcd için yapılacak bir kod değişikliğine ihtiyaç olduğunu fark ettim. Bu Glcd ile çalışma yapacakların, glcd_text57 fonksiyonu için;
graphics.c kütüphanesinde Satır 546
-- glcd_pixel(x+m, y+k*size+l, color);
Aşağıdaki kod ile değiştirmeleri gerekmektedir.
-- glcd_pixel(x+m-64, y+k*size+l, color);
Tüm fonkisyonlar için ise HDM64GS12.c kütüphanesinde değişiklik yapmak gerekmektedir. Onunla ilgili tüm verileri denemediğim için yorum olarak şimdilik yazmıyorum.
İyi Çalışmalar,
Hayırlı teskereler :)