Gelişen mikrokontrol teknolojileri ve artan bilgi birikimi sayesinde geliştirici düzeyinde daha yaygın kullanımına olanak tanımıştır. Burada elimden geldiği kadar bazı örnekler sunmaya çalışacağım... Görüleceği gibi ilk örneklerimizde çoğunlukla ASM üzerinde iken daha sonraları C üzerinde örnekler yer almaktadır. Hatta ilerleyen zamanlarda Arduino örneklerinin yer alması kaçınılmaz olacaktır.

18 Nisan 2011 Pazartesi

Atmega32 ile Grafik LCD'nin Sürülmesi


LCD modüller mikrokontroller devrelerinin iletişim arayüz olarak vazgeçilmez birimlerdir. LCD modüllerin en yaygın olanları karakter LCD olarak bilinen tipleridir. Ekran üzerinde yazıdan farklı olarak şekil ve resimler gösterilmek istendiğinde karakter LCD modüllerin yetersiz kaldığı görülmektedir. Bu gibi durumlarda LCD modüllerin diğer bir tipi olan grafik LCD modülerin kullanımı söz konusu olur.

Bu projede bir ATMEGA32 işlemci ile bir grafik LCD modülün sürülmesi üzerinde çalışılacaktır.
Grafik LCD


Şekil-1 :GDM12864-pozitif, yeşil arkaplan aydınlatmalı.


Şekil-2 :PGM12864-Negatif, beyaz arkaplan aydınlatmalı.

LCD modüllerin nasıl çalıştığı ve görüntüyü nasıl oluşturduğunu internet ve diğer kaynaklar üzerinde bulabilirsiniz.

Şekil-3 :Grafik LCD ekran üzerindeki noktalar (pikseller) açıkça görülmektedir.

Öncelikle bu projede kullanılan LCD paralel bağlantı kullanan bir model, yani 8 bitlik veri iletişimi aynı anda yapılmakta. Bu projede kullanılan LCD modül 128x64. LCD ekran kontrol çipi olarak S6B0108 veya eşdeğeri kullanılmış o nedenle bir çip ile ilgili çalışma düzeni anlatılacaktır. Bunun anlamı yatayda 128 nokta düşeyde 64 ile toplamda 8192 nokta (piksel) nokta var demektir. Eğer bu noktalar tek tek sürülme (her bite bir bayt) durumu olsaydı işlemcinin epey zorlanacağı kesin.

Şekil-4 :Grafik LCD ekran üzerindeki bölümler.

İşte bu noktada işlemcinin göndereceği veriler 8 bitlik olduğunu biliniyor. Bu 8 bitlik veri (her bit bir noktaya karşılık geliyor) aynı anda 8 noktayı sürebiliyor. Yani işlemcinin tam ekran bir resim için LCD ekrana göndereceği veri 1024 bayt oluyor.

Ekran üretilirken yatay 128 nokta sürme açısından kolaylık olsun diye 64 noktalık 2 bölüme ayrılmış. Bu da LCD ekran üzerindeki 2 bacağın seçilmesi ile kontrol ediliyor. Örneğin CS1=1 ve CS2=0 ise sol bölüm kontrol edilirken, CS1=0 ve CS2=1 olması durumunda veri ve kontrol bilgisi açısından sağ taraf kontrol ediliyor.

8 bitlik verinin 8 düşey piksele karşılık geldiği belirtilmişti. İşte bu 8 pikseller sayesinde ekran ayrıca düşeyde 8 gruba ayrılmış ve sayfa olarak tanımlanmış. Bu durumda bir sayfanın 64 bayt olduğunu söylemeye gerek yok. LCD modüldeki komut adresi üst taraftan başlamak kaydı ile 0xB8 komut kodu ile başlayıp aşağı doğru artar ama otomatik değil (X adresi). Bu sayfa komutları sağ ve sol bölümler için aynıdır. Yani 2 tane 0xB8 komut kodu olduğunu belirtelim. (CS1 ve CS2 ayrı ayrı seçimleri sayesinde).

Her sayfa üzerine gönderiler veriler için 64 baytlık veri için de bir RAM adresi var. Bu parametrede Y adresi olarak tanımlanırsa elbetteki bir başlangıç adresi var ve 0x40 adresinden başlıyor. (Her sayfada aynı adreste)Veri yüklendikçe bu parametre otomatik olarak artıyor.

Şekil-5 :Grafik LCD ekran üzerindeki bir sayfa bölümünün üzerindekiler.

Ekranın kontrast ayarı için bir giriş bacağı var (Vo). Ek bir negatif gerilim gerekiyor. İsteyen bu ek gerilimi kendisi üretebilir ve bu bacağa uygulayabilir. Aynı zamanda bu ek negatif gerilim şu anda anlatılmakta olan proje için ekran üzerinde üretilmekte. (Vee) Bu bacak ile toprak (GND) hattı arasına bir trimpot bağlanır ve trimpotun orta ucu da Vo bacağına bağlanır. Bu trimpot üzerinden ekranın kontrast ayarı yapılabilir.

Şekil-6 :Kontrast ayarı için gereken bağlantı. Trimpot bağlantıları açıkça görülmektedir.

LCD ekran modülü üzerideki bağlantılardan bir de RS olarak tanımlanan bacak (register seçme). Eğer bu bacak RS=0 ise LCD modül kendisine gönderilen verinin veya yerine getirmesi gereken işlevin Komut ile ilgili olduğunu karar veriyor. RS=1 olması durumunda yapılan işlemin Veri ile ilgili olduğu ortaya konmuş oluyor. (Bazı bu konu ile ilgili belgelerde bu bacak farklı bir isim ile tanımlanmış).

Her elektronik alet gibi LCD ekranında nasıl iletişim kurması gerektiğini belirten bir bacak var. Bu bacak RW olarak tanımlanmış (oku/yaz) RW=0 olması durumunda alet yazma konumunda oluyor. Yani LCD ekrana gönderilen komut veya verileri kabul ediyor (meşgul değilse). RW=1 olursa bu durumda LCD modülün durumu hakkında bilgi almak için LCD ekranı okuma moduna geçiyor.Bazı uygulamalarda RW bacağı sürekli "0" seviyesinde tutulup yapılan işlemler için işlemcinin beklemesi sağlanıyor. Ekran yenilemesi kritik olmayan uygulamalar için olabilir.

Ortak veri hatlarını paylaşan aletlerin olduğu sistemlerde herbir birimin ayrı ayrı seçilmesi için genellikle en az bir bacak olur. LCD içinde böyle bir bacak mevcut bu bacak da E (izin). Yazma modu için E inen kenarda (1-0 geçişi) işlem yerine getiriliyor. Okuma modu için ise E=1 iken okuma verisi hatlarda oluyor.

LCD modül üzerinde besleme ilk verildiğinde üzerindeki kontrol birimleri ne yapmaları gerektiğini anlamayabilirler. Bunun için harici olarak bir sıfırlama bacağı var. Bu bacak "0" seviyesinde iken LCD modül sıfırlanır ,ekran kapanır ve durum oku komutundan başka işlem yapmaz. Bu bacak "1" olduğun zaman sistem normal olarak çalışır.

Şekil-7 :Arkaplan aydınlatması için kullanılan ışık kaynağı.

Karanlık ve yarı karanlık ortamlar için arkaplan aydınlatması ortam için ek ışık kaynağı ihtiyacını ortadan kaldırır.
PGM12864A-NSW


Şekil-8 :PGM12864A-NSW üzerinde oluşturulmuş bir görüntü.

"XIAMEN PRECISE DISPLAY CO., LTD." tarafından üretilmiş olan bu ürün mavi arkaplan aydınlatması beyaz LED'ler ile yapılan negatif bir grafik ekran. Normalde bir bit ile temsil edilen bir nokta pozitif ekranlarda bit "1" olduğu zaman nokta karır. Ama bu üründe tam tersi olarak bit "1" olduğu zaman sönerek normalde mavi olan ekranın arkaplanı beyaz olarak görülmektedir.(Tabii ki aynı üreticini bu LCD modeli için farklı alt tipleride var.)

Şekil-9 :Grafik LCD bacak bağlantıları. (Bu resim GDM12864'e ait olmakla birlikte PGM12864 içinde geçerlidir, sadece PGM12864 üzerinde bu bacak isimleri yazmıyor). Kablo renkleri kullanıldığı işe göre sınıflandırılmıştır.

BacakSimgeİşlevi
1VssToprak
2VddBesleme
3V0LCD için besleme (kontrast)
4RSRegister seç(1:veri ,0:komut)
5RWOku/Yaz (1:oku ,0:yaz)
6Eİzin sinyali
7D0veri hattı
8D1veri hattı
9D2veri hattı
10D3veri hattı
11D4veri hattı
12D5veri hattı
13D6veri hattı
14D7veri hattı
15CS1IC1 seçme (sol taraf)
16CS2IC2 seçme (sağ taraf)
17RSTSıfırlama sinyali
18VeeNegatif gerilim çıkışı
19Aarkaplan aydınlatma
20Karkaplan aydınlatma

Bu bacak bağlantılarının (Vss,Vdd,V0,Vee,A,K) beslemeler haricindeki tüm bağlantılar işlemciye bağlı olup işlemci üzerinden kontrol edilmektedir. Bu şekilde işlemci üzerinde kayıtlı olan resim verileri ve ekran komutları grafik LCD ekran modülüne gönderilmektedir.

Şekil-10 :Grafik LCD üzerindeki komutlar

Devre

Devrede basitçe üç ana bölümü ayrılabilir. İşlemci kartı, grafik LCD ve buton. İşlemci kartı haricindekilerin fazla bir ayrıntısı yok.İşlemci kartı üzerinde besleme, ekran parlaklık ayarı ve işlemciyi süren ATMEGA32 var. Ekran ile işlemcinin bağlanması konnektör üzerinden yapılması planlansa da kartın yapılında bazı aceleye getirme sorunları nedeniyle kablo ile yapılması gerekti.(Zaten görüldüğü üzere konnektör bağlantı konumu kaymış durumda.

Şekil-11 :İşlemci kartı şu hali ile Grafik LCD ekrana kablolar ile lehimli.


Şekil-12 :İşlemci kartından ekrandaki görüntüyü değiştirmek için kullanılan buton kartı. (Aslında sadece bir buton kullanılıyor)


Şekil-13 :İşlemci kartınını görüntüsü (ayrıca verilmiştir.)

Şema

Sistemin kalbini IC1 ile ATMEGA32 oluşturuyor. Aslında kristale gerek olmasada kesin zamanlama ihtiyacını karşılamak için XT1(3.6864MHz) kristal ile C6 ve C7 (27pF) kondansatörler ile birlikte işlemci için gereken zamanlama frekansını üretirler. R1 (1K) ve LED1 (LED) ile devrenin çalışmasını izlemek üzere kullanılsada bu bölümde ihtiyaç olmadığından devre dışı bırakılmıştır. Grafik LCD ekran şemada gösterilmese de P3 konnektör bağlatısı üzerinden kablo ile bağlanmaktadır. R3 (10K) trimpot grafik LCD'nin kontrast ayarı için kullanılmaktadır.

Devrenin beslemesi P1 konnnektörü üzerinden D1 (2W10M) köprü diyodu üzerinden IC2 (7805)regüle edilerek devrelinin ihtiyacı olan beslemeyi oluşturur.

Burada BUT1,BUT2 ve BUT3 olarak belirtilen bas bırak butonlardan aslında sadece BUT1 butonu kullanılmakta ve bir kablo üzerinden ISP konnektörüne bağlanmaktadır. ISP içinse işlemcinin programlama işlemi için kullanılmakla birlikte şu hali ile butonlar için bağlantı noktası işlevini yerine getirmektedir.

Belirtilmeyen geri kalan kondansatörler filtre amaçlıdır.

Şekil-14:Blok şeması


Şekil-15:Devre şeması (isp ve P1 haricindeki konnektörler gösterilmemiştir)


Şekil-16:Butonların bağlantı şeması)

Devre Yapımı

Devre montajı açısından kritik bir durum yoktur. Görüldüğü gibi devre son derece sadedir. Sadece kabloları karta lehimlerken kısa devre olmamaları için dikkatli olmak yerinde olacaktır.

Şekil-17:Grafik LCD sürücü kartı ve buton kartı yollar


Şekil-18:Grafik LCD sürücü kartı ve buton kartı eleman yerleşimi


Şekil-19:Grafik LCD sürücü kartı ve buton kartı yolları birlikte eleman yerleşimi


Şekil-20:Buton kartı üzerindeki bacak bağlantıları

Devre Elemanları

1KR1
27RR2
10K yatık trimpotR3
27pFC6,C7
100nFC1,C2,C4,C5,C8
10µF/25VC3
3mm yeşil LEDLED1
ATMEGA32 (DIL)IC1
7805IC2
2W10M veya benzeriD1
3,6864 Mhz kristalXT1
2x3Header (ISP6)isp
2'li klemensP1
Bas bırak butonbut1, but2, but3
40 bacaklı entegre soketi (DIL)-
PGM12864-

Besleme için 9V'luk adaptör, buton kartı ile işlemci kartı arasındaki kablo ve konnektörü ve LCD ekran ile işlemci kartı arasındaki kablolar unutulmamalıdır.
Ayar ve kullanım

Ayar için devreye ilk enerji verildiğinde ekranın görülebilecek şekilde trimpot ile ayarlanır. Daha sonra bir daha dokunmaya gerek olmaksızın çalışır.

Kullanım olarak ekranı değistirmek için sadece BUT1 butonuna basılıp bırakılacak. Buton bırakldığı zaman ekran güncellenecek. Son görüntüye gelindiğinde başa dönülecektir.

Şekil-21:Grafik ekran üzerinde ilk çıkacak görüntü.

Hali hazırda LCD ekran için işlemci üzerinde 12 tane görüntü kaydedilmiş durumdadır. İstendiği takdirde bu program üzerinde değişiklik yapılarak artırılabilir. Şu anki programda 13Kbayt civarında program alanı kullanılmış durumdadır. Geri kalan 19Kbaytlık'lık bölümü boş olduğu anlaşılır. Her resim 1K civarında olduğuna göre daha 19 resim tane eklenebilir demektir. ("G_LCD.asm" programında gerekli değişiklik yapılırsa tabii. Program şu hali ile sadece 12 resim gösterebilecek kapasitededir.)

Şekil-22:Programında kayıtlı olan resimler.

Program

LCD ekrana gönderilecek verinin hex biçiminde veya rakamlara dönüştürülmesi gerekiyor. Bu işlem için kendimizde yapabiliriz, belki? Ama epey uğraştırıcı bir iş olacağı kesin. O nedenle BMP dosyalarını HEX biçimine dönüştüren Delphi 7 ile yazılmış "BMP_GLCD.exe" programı oluşturuldu. (Program XP işletim sisteminde test edildi.)

Program penceresi üzerindeki öğeler kısaca:

Şekil-23:"BMP_GLCD.exe" programı ve üzerindeki öğeler.

  1. Dönüştürülecek resmin görüntüsü
  2. (1 nolu alandaki) resmin negatifini oluşturan buton.
  3. Dönüştürülecek resmi seçmek ve yüklemek için buton. Yüklenen resim 1 nolu alanda gösterilir.
  4. 1 nolu alanda gösterilen resmi assembler programına eklenecek biçimde kodunu oluşturur ve 6 nolu alan üzerine yazan buton.
  5. 6 nolu alanda oluşturulmuş bir kodu "dosyaadı.asm" biçiminde kaydetmek için buton.
  6. 1 nolu alandaki resimden kod oluşturulduğu zaman kod burada oluşturulur ve görüntülenir. Daha sonra kaydet işleminde bu alandaki veri kullanılarak kaydedilir.

Bu programa yüklenecek görüntüler konusunda bazı sınırlamalar olduğunu belirtmekte fayda var. Yoksa istenilen sonuç elde edilemeyebilir. Öncelikle görüntü siyah ve beyaz olmalıdır, yani resim üzerinde gri tonlama ve renkli bölümler bulunmamalıdır(en iyisi bitmap biçiminde).Resim "negatif" butonu kullanılarak negatif işlemi uygulandığında görüntüde veri kaybı olmaması gerekir. Resim 128x64 piksel boyutlarında olmalıdır. Aksi takdirde resmin sadece sol üst köşesi eşlenerek kırpma meydana getirir. En önemlisi resim BMP uzantısı ile kaydedilmiş olmalıdır(Program sadece bu dosya biçimini destekliyor).

Şekil-24:Görüntüden oluşturulmuş hex kod.

"BMP_GLCD.exe" programı ile kod oluşturmak işin yarısıdır. Şimdi bu oluşturulmuş ve kaydedilmiş belge açılırsa "resim1:" etiketi ile karşılaşılır. Bu assemler programı tarafından kullanılacak bir etikettir. Bu oluşturulan kod hangi sırada kullanılacaksa önce bu etiketteki 1 silinir ve yerine o rakam yazılır. Bu belge kaydedilir ve kapatılır.

Grafik LCD için oluşturulan "G_LCD.asm" dosyası açılır ve en sonda yer alan .include "dosyaadı.asm" satırlara kaydedilmiş dosyanın adı yazılır. (Aynı resim etiketi taşıyan dosya olmadığına emin olunmalıdır; yani iki tane resim1 veya resim2 etiketli dosya eklendiğinde derleme işleminde sorun çıkabilir). Program derlenir ve sorun yoksa işlemciye "G_LCD.hex" dosyası yüklenir.

Şekil-25:Kabaca asm dosyalardaki resim etiketi.

Şekil-25 üzerindeki örnekte (.include "yunus.asm") kod satı "yunus.asm" dosyasını belirtir. "Yunus.asm" dosyası açıldığında kodların en üst satırında görülen "resim12:" etiketi işlemci üzerinden LCD'de gösterilecek 12. sıradaki resim olduğunu belirtir. Buraya başka bir dosya adı eklendiğinde ikinci bir "resim12:" etiketi taşıyamaz. Tabbi ki (.include "yunus.asm") kodu değiştirilmedikçe veya "yunus.asm" dosyasındaki "resim12:" etiketi değiştirilmedikçe.



Ekler:

ATMEGA32 hakkında bilgi için

"Atmega32 ile Grafik LCD'nin Sürülmesi" için dosyalar-birleşik

Bu kart programı ile denenmiş Grafik LCD ekranlar
GDM12864
PGM12864
JHD12864

Bu devrenin yapım sorumluluğu size aittir. Devre yapıldı ve çalışıyor. K.A....

Hiç yorum yok:

Translate

Sayfalar

Etiketler

İzleyiciler