128x64 GLCD hakkinda yardim

Başlatan nusyil, 26 Nisan 2012, 07:34:44

nusyil

Herkese Merhaba!!

Kullandigim islemci Atmel 89s52, dil Assembly, 128x64 GLCD marka ve modeli Microtips NMTG-S12864BFYHSGY-B. Uzerinde calistigim programin ana hatlari soyle: Buton ile start verdikten sonra bir pompa calismaya basliyor, belirli bir zaman sonra baska motorlar, selenoid valfler vb.devreye giriyor. Hepsi kendilerine belirlenen sure icerisinde calisip-duruyorlar. Toplam islem ornegin 10 dakika aliyor. Butun islemler duz bir cizgi gibi 0-10 dk.arasi baslayip bitiyor.

Her yeni isleme basladiginda ve bittiginde; Ornegin 1.Motor devreye girdiginde GLCD ekraninda "1.Motor calismaya basladi" veya "1.Motor durdu"seklinde birer satirlik mesajlar yazdiriyorum. Boylece kullanici o anda sistemin hangi isi yaptigini okuyabiliyor.
Sistem herhangi bir anda durdurulmak istendiginde bir kesme'ye atadigim stop butonuna basiliyor ve  ekrana " Emin misin? Durdur -----Devam et" seklinde iki secenek sunan bir mesaj cikiyor.

Simdi gelelim benim sorunuma: Normalde makina calisirken herhangi bir anda ekranda degisik sayida bazen 3 satir bazen 5 satir vb.mesajlar bulunuyor. Stop butonuna basilip "Emin misin..." mesaji ciktiginda haliyle ekrandaki bu mesajlarin uzerine yaziliyor. Benim istedigim, "Devam et" secenegini sectigimde ekrandaki mesajin silinip, arka plandaki yazilarin ise kaldigi yerden devam etmesi. Cunku "Emin misin.."menusunu ya satir silme altyordamiyla, yada ekran silme altyordami ile kaldirabilirim. Ancak her iki durumda da arka planda kalan yazilar ya eksik gorunecek(Satir silme altyordamini kullanirsam) ya da tamamen silinecek(Ekran silme altyordamini kullanirsam). Bu sorunu halletmek icin ne yapabilirim??

Aklima stop butonu kesme programina girer girmez "Emin misin.."mensunu yazdirmadan once ekran goruntusunun yedegini EEPROM'a kaydedip, menu ile isim bittikten sonra cikista verileri tekrar EEPROM'dan geri alip ekrana yazdirmak gibi bir fikir geldi. Bunu yapmak icin de zannedersem GLCD icerigini okumak gerekiyor. Ekrana yazdirmayi biliyorum ama okumayi nasil yapacagim konusunda bir fikrim yok. Datasheet'i inceledim ama acikcasi okuma islemi biraz kafami karistirdi.
Ya da sizlerin onerileri nelerdir?? Daha basit olarak bu islemi nasil gerceklestirebilirim??

Cevaplariniz icin simdiden tesekkur ederim.

Kabil ATICI

Uygun alet RAM olmalı.EEprom erişim hızı yavaştır. Ekrana gönderilecek verinin RAM üzerinde oluşturulup ekrana öyle gönderilmesi gerekiyor.( Ama bu işlemcinde bu yükü kaldıracak ram yok diye biliyorum.) Yani  senin ekrandan veriyi tekrar okumak yerine ekrana gönderdiğin veriyi önce ram(veya eeprom) kaydedilip ondan sonra ekrana göndermen daha uygun olur. Bu sayede ekranı istediğin zaman yenileyebilirsin.
ambar7

tmhzkhzhz

iyi gunler

veri yazarken r/w ucu low da iken x ve y adresi set edip  veri yaziyorsunuz
veri okurken  r/w ucu low  iken  x ve y adresi set edip r/w ucu high yapip biraz bekleyip portlari okuyorsunuz rs ucu zaten high da kaliyor
bekleme suresini tam bilmiyorum 10 us deneyin

nusyil

Merhaba Ambar7,dediginiz dogru ancak islemcide su an RAM'e ayirabilecegim bos bacak yok.Oneriniz cok mantikli geldi.Ekrana gondermeden once EEPROM'a kaydetmek,daha sonra geri okumak.Bunu deneyip sonucunu paylasacagim.Tek endisem hiz.Gerci cok yavas kalacagini zannetmiyorum ama dedigim gibi denemek lazim.Degerli onerileriniz icin cok tesekkur ederim.

nusyil

Merhaba tmhzkhzhz

Dediginiz dogru datasheetler'de de bu sekilde soyluyor.Benim anlamak istedigim nasil bir algoritma ile "Ekran_oku" gibi bir altyordam yazmaliyim?? Bildigim kadariyla herhangi bir anda GLCD'nin hafizasindaki bilgi 1Kbayt buyuklugunde.Buradan yola cikarak mesela 128'lik bir cevrim yazip 8'er bitlik paketler halinde bir okuma altprogrami olusturmak gibi bir yol mu izlemeliyim? Elinizde ornek bir program parcasi (Assembly) var mi??

Yardiminiz icin cok tesekkur ederim..

tmhzkhzhz

iyi gunler

Assembly cok fazla bilmiyorum bilsem bile sizin programiniza uygun yazmam gerekir  ilk mesajinizi tekrar okudum aklima sonradan bir fikir
geldi siz ekrani tek seferde komple yaziyorsunuz anladigim kadariyla bu sekilde yapmak sart degil x ve y adreslerini set etmeyi biliyorsunuz
bunlari 0 set edip ekrani komple yaziyorsunuz bunun yerine ornek secim butonu x 23  y 2 set edip sadece o bolgeyi yazarsiniz  daha sonra
yine bir buton yazmaniz gerektiginde  adresleri set ettiginizde bir onceki set iptal olur yani ekranin istedigniz bolumunu istediginiz kadar
degistirebilirsisiniz ornek secim butonunu ciz daha sonra secim butonunun yerine bir onceki veya sonraki butonu ciz gibi adres set edildiginde otomatik adres arttirmada devrede olacagi icin her bayt icin tek tek adres set etmek gerekmez bir defa set edin ve x adedi kadar gonderin
aslinda sorun cok buyuk degil fakat programlama dili Assembly lcd 2 adet ks0108 64*64 piksel den olusmus lcd ve proje baslangicindan itibaren konuyu takip etmeden yardimci olmak gerekince   projeye sonradan cozum uretmek biraz zor oluyor
eger anlattigim cozumler sizin icin sorunun cozumu degilse siz sadece Assembly olarak lcd yi acan sag ve sol chip lere x=0 y=0 adres set
edip 255 yazan bir program yazin isis de bulunan bir mikrodenetleyiciyle lcd ekrani cizip asm , hex, isis dosyalarini foruma ekleyin ben okuma
bolumunu yazmaya calisiyim

siz konuyu takip ettiginiz surece bende takip ediyorum


bocek

#6
ekranı okuyup, saklayıp tekrar yazmakla uğraşacağınıza 'Ekran_Tazele' gibi bir fonksiyon tanımlayıp butonlar gittikten sonra sil baştan ekranı yazdırsanız daha kolay olmaz mı?
sonuçta ekrana yazacağın her bilgi zaten bir şekilde değişkenler vasıtasıyla hafızada mevcut bulunmaktadır. aynı veriler için ayrıca hafıza ayırıp, bunları okuyup/yazmakla uğraşmak programlama tekniği açısından pek mantıklı gibi gelmiyor bence.
kurduğunuz algoritmayı bilmiyorum ama "emin misiniz" yazısı ekrandan kaybolduktan sonra tek yapacağınız ekrana verileri sil baştan yazdırmak.
ya da şöyle olabilir:
mesaj1, mesaj2, mesaj3.. diye kaç tane mesaj satırı varsa o kadar değişken tanımlayıp ekrana yazdırırken bu değişkenleri kullanmak. böylece ekranda yazanla bellekteki mesajlar aynı olur. siz de ekranı okumakla uğraşmazsınız.
1 ya da 0. işte 'bit'ün mesele..

nusyil

Merhaba Ambar7
Onerdiginiz sekilde bir deneme yaptim.Bilgileri once EEPROM'a,sonra ekrana yazdirdim."Ekranagonder" adli altprograma bir ekleme yaparak yazilacak bilgiyi bayt bayt once EEPROM'a daha sonra ekrana gonderdim.Sonucta oneriniz dogru,calisiyor fakat gozle gorulur bir sekilde ekrana yazma islemi yavasladi.Bilemiyorum ben mi bir yerde hata yaptim,yanlis bir mantik kurdum ama acikcasi sonuc cok tatmin edici degil.Baska onerileriniz olursa memnuniyetle denemeye hazirim.Cok tesekkur ederim.

nusyil

Merhaba tmhzkhzhz,

Ekrana mesajlari tek seferde yazdirmiyorum. Soyle gozunuzun onunde canlandirin: Program ilk calistiginda ekrana alt alta 5 satirdan olusan bir menu geliyor. Ancak bu menu bir resim dosyasindan(bmp formatli)cevrilmis degil.Satir satir 5 ayri mesaj'in alt alta siralanmasiyla olusuyor. Yukari veya asagi ok tusu ile bu satirlarin uzerine gelip "Giris" adli diger bir butona basilinca,istenen satir (menu secenegi)secilip program baslatilmis oluyor. Program baslatildiktan sonra ise menu ekrani komple siliniyor ve o anda makina hangi islemi yapiyorsa ekrana onun bilgisini gosteren tek satirlik bir mesaj geliyor.Bu mesaj ekranin baslangicindan,1.sayfa 1.kolondan  basliyor( Ornek: 1.Motor calisiyor gibi). Mesajin yazilmasi bittikten sonra "Satirbasi" adini verdigim bir altprogram icra edilerek,bir sonraki yazilacak mesajin satir ve sutun numarasi belirleniyor(Ornegin 1.mesaj yazildiktan sonra ikinci mesajin baslangic yeri 2.sayfa(satir),1.kolon gibi)
Daha sonra 1.Motor'un calismasi bittiginde bu kez "1.Motor durdu"mesaji 2.satir,1.kolondan itibaren yine tek satiri gecmemek sartiyla yaziliyor ve islem satir satir ekranin en alt satirina kadar devam ediyor.Eger sayfa dolmus,fakat makinanin calismasi devam ediyor ve hala yazilacak satirlar varsa ekran bastan silinip tekrar 1.satir ve 1.kolondan itibaren mesajlar yazilmaya devam ediyor.Ta ki makinanin calismasi bittiginde tekrar baslangica, ana menuye geri donuluyor.Islem basamaklari bu sekilde.

Aslina bakarsaniz tek tek fotograf cekip uzerinden anlatilabilir belki ama yeni oldugum icin nasil yapacagimi bilemiyorum.Islem cok karmasik olmamakla birlikte dediginiz gibi bastan isin icine dahil olmayinca sonradan cozum uretmek biraz zor oluyor.Bu verdigim bilgiler dogrultusunda ne onerirsiniz? Tesekkurler,kolay gelsin!!

bocek

şöyle bir şey kullansanız (assembly bilmediğimden c dili ile yazıyorum)
#define MAX_SATIR_UZUNLUGU 16 // mesajlarınızın maksimum uzunluğuna göre ayarlanacak

unsigned char satir[4][MAX_SATIR_UZUNLUGU];

void display(void)
{
  char i;
   for(i=0; i < 5; i++)
  {
        satirbasi(i,0); // i. satır 0. kolona git
        ekrana_yaz(satir[i]);
  }
}

ekrana bir mesaj yazmak istediğinizde, mesajı önce satir dizisine yazın sonra da display fonksiyonunu çağırın.
ekrana yazma/silme ile ilgili bütün işlemleri satir dizisi üzerinde yapın.
mesela 3. satıra bir mesaj yazacaksınız:
satir[2] = "1. motor calisiyor         "; // (yeteri kadar boşluk vererek)
display();

programınızda satir dizisi için yeterli bellek kalıyor mu bilmiyorum.
1 ya da 0. işte 'bit'ün mesele..

nusyil

Merhaba Bocek,

Onerilerin icin tesekkur ederim. Ilk mesajindaki onerini denedim.Programda bulunan her hazir mesaj kalibina bir bayrak biti atadim.Ekrana gonderdikten sonra da bu biti set ettim.Yani mesajin ekran hafizasinda oldugunu belirttim.Ornegin assembly ifade su sekilde:

mesaj1_bayrak        BIT  20                                  ; Mesaj1'in ekrana gonderilip-gonderilmedigini gosteren bayrak biti tanimlama
mesaj1:   db   ' PNOMATIK VALF ACIK ',#99H ; Ekrana yazilacak mesaj.#99H, mesaj sonlandirma gostergesi olarak kullaniliyor.

GLCD1:   call   ekransil
   mov   dptr,#mesaj1                  ; PNOMATIK VALF ACIK MESAJINI EKRANA GONDER
   call          EKRANAGONDER                  ; GLCD EKRANA YAZDIRMA ALTPROGRAMI
   SETB       mesaj1_bayrak                      ; Mesaj1 ekrana gonderilmis durumda.   
               RET
Benzer sekilde diger mesajlar icin de GLCD2,GLCD3 vb..altprogramlar yazip yukaridaki islemlerin aynisini tekrarladim.

Daha sonra "Emin misin.." menusunu goruntuleyen kesme yordamindan cikmadan once bu bayrak bitlerini kontrol edip hangisi set edilmis ise onlari tekrar ekrana yazdirip kesmeden cikarttim. Sonuc: Calisiyor!!!!!   :)

Ikinci cevabin icin de tesekkurler, ama sorun cozuldugune gore simdilik gerek kalmadi :)

Sana ve onerilerini yazan diger arkadaslara: Ambar7,tmhzkhzhz'ye ayri ayri tesekkur ederim.Iste bu sekilde "Bilgi paylastikca degerlerir".

Herkese kolay gelsin!!!