KS0108/0107 Grafik LCD IAR Driver

Başlatan YARGICH, 22 Şubat 2006, 01:38:31

aYe

Selam,

Const diziler yukarda derleyiciye bildirilmediği için, taşımadığın yada önbildirme yapmadığın zaman hata vermesi çok doğal, zaten bende de yukarı kısımdaydı.
Kod'u bir kerede yazmama sitenin yapısı izin vermediği için üçe böldüm, o zaman da diziler sonradan gitti.
Yani o kısım da herşey normal...

"intrm16c.h" interrupt'la ilgili header
"bindef.c" benim kendi yazdiğim, ANSI C derleyicilerde "bin" formatta değer girmek için kullandığım bir C yada Header dosya.

Delay hesaplarına gelince; inan hiç bakmamışımdır çalışmayınca atmışımdır bir iki "nop" daha hesap kitaplara fazla dalınca iş bitmiyor, zaten bu KS0108'i elime alıp çalıştırmam arasında kalan 2 saatte yazdığım bir kod.
İçersinde mantıksız şeyler olabilir, önemli olan çalışan bir kod olması.
Crystal 16mhz.

Ram konusuna gelince kod Ram kullanmıyor. tabi bir kaç degişken dışında. Ordan kaynaklanan bir sorun olamaz.

Bence sizin ".xcl" dosyası probleminiz bütün hızıyla devam ediyor.
Bu konuya biraz daha yoğunlaşmanız lazım.

İyi çalışmalar.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Selam,

Dediğiniz gibi 'lnkm16c.xcl' dosyasına bakıyorum, ve içerisinde daha önce de anlattığınız yere bakıyorum.

//==========================================// Memory Definitions
//==============================================
// Memory areas available for the application
-D_USER_RAM_BEGIN=00400
-D_USER_RAM_END=07FFF
-D_USER_ROM_BEGIN=C0000
-D_USER_ROM_END=FFCFF
-D_CSTART_BEGIN=FBE00

// Relocatable "bit" segment (must be in near area).
// As BITVARS contains bit addresses, the address has to be recalculated.
// Byte address 400 --> 400 * 8 = bit address 2000
-D_BITVAR_BEGIN=2000 // address 400
-D_BITVAR_END=FFFF   // address 1FFF


Burda benim kullandığım 624'e göre bir hata göremiyorum. Ve Flasher'ın programlamaya başlamak istediği yer burada yazmıyor. Ama biraz aşağıya bakıyorum!

// =======================
//       DATA16 ROM
// =======================

// Constant segments (in ROM), reachable for near pointers
-Z(NEARCONST)DATA16_C=8000-FFFF

// User defined near CONST segments


Bu kısımda yazan 8000 dediği adresten başlıyor. Neden buraya baktığını bilmiyorum. In ROM yazmış. internal Rom demek istiyo herhalde ama???
Acaba diyorum 8000'den başlayarak programla dediğim zaman FFFF'i geçince mi hata veriyor. Neyse hata önemli değilde burdan başlamak istemesinde gariplik var.

Birde bu 'lnkm16c.xcl' dosyasını kullanıyoruz yaa. Herhalde bu genel bir dosya. Başka neler var diye baktım. İşlemcilerine göre de dosyalar varmış. Mesela benim kullandığıma uygun olarak 'lnkm30624fgp.xcl' dosyasına bakıyorum ve onda  DATA16 ROM denilen kısımda farklılık var.
// =======================
//       DATA16 ROM
// =======================

// Constant segments (in ROM), reachable for near pointers
// (Use declaration -Z(NEARCONST)DATA16_C if near ROM exists)

// User defined near CONST segments

Bu dosyayı kullandığım zaman DATA16 ile alakalı bir hata veriyor. Sorun dediğiniz gibi xcl dosyalarından kaynaklanıyor olabilir.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Selam,

Project ayarlarından pointer türünü HUGE olarak seçmelisiniz, sorun ordan kaynaklanıyor olmalı.

Sanırım seçili pointer türü FAR veya NEAR tam olarak aklımda değil ama bir tanesi 64K'nin üzerini adresleyemediği için C derleyici CONST değerleri ilk 64K dahilinde kalan RAM üzerinden adreslemeye çalışıyor.
Aslında buraya kadar sorun yok hız düşer ram telef olur ama yine çalışır da teorik olarak RAM'de const değer varsalıyamayacağı için yine rom'dan ram'e aktaran bir kısım gerekiyor ve kaos, bak anlatırken bile kafam karıştı  :roll:  :roll:  :roll:  HUGE yap işte   :lol:
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Selam,
 
   Hocam Tamamdır Huge yaptım. Tekrar eskisi gibi doğru yere bakarak programlamaya başlayacağı noktaya gidiyor. Programınızıda çalıştırdım. Görüntülerde biraz bozukluk var. Zannetmiyorum ki sizin datalarda da bu görüntüler bozuk olsun. Yalnız sizin yazılımınızda bir şeyi farkettim. En azından bunun için konuşuyorum. Bütün resimleri 0,0 dan başlayarak çiziyorsunuz. Yani ilk adres olarak 0,0 veriyorsunuz ve ondan sonra sırayla dataları gönderiyorsunuz. Her data gönderdiğinizde LCD kendisi otomataik olarak bir sonraki adrese konumlanıyor. O yüzden bende düzgün çalışıyor gibi görünüyor. Yalnız 0,0 yerine 0,10 dan başla dediğim zaman bendeki sorunun aynısı ortaya çıkıyor.

Kısaca özetlemem gerekirse, 0,0 gibi bazı noktaları bende doğru konumlayabiliyorum ve konumladıktan sonra sırayla dataları göndererek LCD ekrana doğru verileri yazabiliyorum. Yalnız İstediğim adrese konumlamayı başaramıyorum. Sizin yazılım ile de aynı sorunu çıkarınca artık ben donanımdan şüphelenmeye başlayacağım. Ama hala anlamsız geliyor. Neden belli başlı kordinatlarda 32 piksel kayıyor anlamadım. Donanımla ne alakası var diyorum kendi kendime :roll: Bi şey daha var; en son satırı benim yazılım ilede sizin yazılımınız ilede kontrol edemiyorum. Yani en belirgin olarak yüz resimlerinde herşey çok güzel ama son 8 piksellik satırda farklı bilgiler var. Bir önceki resimden parça veya anlamız şeyler de olabilir.

Buarada resimler güzelmiş. Özellikle yüz resimlerine uzaktan bakınca çok hoş görünüyor.

Yardımlarınız için Teşekkürler,
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Selam,

Ben anlamıştım zaten pointer tip sorunu olduğunu :D

Yalniz sorunun devam etmesine anlam veremedim
Kod da 0,0'dan başlamayan yerlerde var, ki bende sorunsuz çalışıyor;
Lcd_Write(Stop,Stop+15,1,2,(unsigned char*)Oval,Normal);


Kodu hiç değiştirmeden derlediğinize emin misiniz?

Birde kod sıkıştırmayla ilgili tüm optimizasyon seviyelerini kapatın.
Olmadık yerleri siliyor olabilir.

İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Selam,

Tam üstüne bastınız hocam gösterdiğiniz kod çalışmıyor. Şimdi optimizasyonu "none (best Debug optimization)" haline getirdim. Yazılımdan kapattığım yerler var. Mesela While(1)'den önceki kısımı kapattım. Çünkü hiç bir şey gelmediği için ekrana, while içerisindeki ilk görüntü olan Familiy  görüntüsünün gelmesi için bayağı zaman geçiyo. Hatta önce yazılımı hiç çalıştıramadım zannettim ama yazılım akışını çıkıştaki ledlerde izleyince nerelerde takılıp takılmadığını gördüm. Şimdi tekrar bu komutu denedim ama olmadı. Ekrana hiç bir şey gelmiyor. Diğer görüntüler son satırdaki sorun dışında görüntü geliyo. Bir şey soracağım. Acaba bu görüntülerden mesela Mapus1 resmindeki parmaklıklar ve ranza aşağıya doğru indikçe sola doğru bir çaprazlık varmı. Bunu Family resminde de görüyorum da. Yani her bir satırda parmaklıklar bir piksel solda çiziliyo. Böylece bir çağrazlık oluşuyo. Satır dediğim 8 bitliklik satır. Zaten başka bir şekilde kontrol edilmiyo. Bu 8 bitlik satırların kendi içerisinde çaprazlık olmadığını, oraların düz olduğunu da belirteyim. Ayrıca şimdi farkettim sola kaydıkça kayan bilgi 64. sutundan beliriyor. Anladığım kadarıyla parmaklıklar da düz.

Dayanamadım LCD'yi çıkartıp tekrar yanındaki PIC'li devrede test ettim ve orda çalışıyo. Bir sorun yok. Bende anlamadım. Acaba M16C deki özel pinleri kullanıyorum da onlar mı sorun yapıyo diye bakıyorum, zaten kontrol uçlarında sizin gibi bende P4 portunu kullanmışım. Data olarak ta ben P3 portunu kullanmışım. Bu portda da özel olarak birtek analog girişler var. Sorun olacağını düşünmüyorum. Donanımı tekrar kontrol ediyorum ama yok. LCD'den işlemcinin o ufacık pinlerine kadar olan yollarda sorun yok. Hepside doğru yerlere gidiyo. Bi sorun olsun diye de o kadar dua etmiştim. Zaten belli başlı konumlara doğru veri gittiğinde data uçlarında ve kontrol uçlarında bir sorun olmadığı görülüyor.

Hocam bu konum atlamalarındaki 32 sayısı size bişeyi ifade ediyor mu acaba. Yani ilk 8 sutuna veri yazıyo 9. sutuna yazacağı veriyi 32 sutun atlayarak yazıyo. Benim bildiğim kadarıyla bu LCD, Data uçlarındaki veriyi Satıra yazıyo, yani 8 sutunla LCD nin bir alakası yok gibi. Acaba diyorum bizim kullandığımız bir değişken 8 den sonra farklı değer alıyor diyeceğim ama zaten ben sutun bilgisinide LED lerde görmüştüm. Yanlış bir veri gitmiyor. Burda da sorun yok gibi.

Benim korkum geçen sefer ki gibi donanımdan olması. Zaten bu şirketin yaptığı kartlardaki soketlerin içine lehimler akmış. Soketleri söktüm içlerini hep temizledim. Hatta bizi ilgilendirmeyen bir yerde kısa devre vardı. Akan lehimler bir birine değmiş. Neyse ordan da kaynaklanmıyor gibi.

Sizin yazılımınızda yaptığım değişikler;
- başlangıçta animasyon var herhalde, orayı gösteremiyor orayı kapattım,
- pin tanımlamalarını değiştirdim,
- While(1) içerisindeki Lcd_write komutlarına verdiğiniz parametrelerde farklılık vardı. onlar da;
       Lcd_Write(0,0,128,8,(unsigned char*)Family,Normal); 
        DelayMs(750); 
        Lcd_Write(0,127,0,7,(unsigned char*)Family,Mirror); 
        DelayMs(750); 
        Lcd_Write(0,127,0,7,(unsigned char*)Usa,Normal); 
        DelayMs(750);

Burda ilk görüntüden sonraki parametreler farklı ve bunları göstermiyor. Sadece ilkini gösteriyor. Bende diğerlerinide ilki gibi yaptım. Yani;
       Lcd_Write(0,0,128,8,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,128,8,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,128,8,(unsigned char*)Usa,Normal);
        DelayMs(750);

Böylece her görüntüyü gösteriyor. Bilmiyorum yanlış mı yaptım. Y başlangıcı olarak 127 girmişsiniz. Yani son sutun. İlk veriden sonra bir alttaki satıra geçecek ve satır değeri olarakta 1 eksiği olan 7 girmişsiniz. Acaba parametre doğruda bendeki sorun o parametrenin çalışmasına izin vermiyor mu?

Yazdıklarımı tekrar okudumda biraz karışık mı oldu ne :) Şimdi Saat de gece 3'ü geçiyo. Cümleler devrik olabilir birde size anlatırken başkalarıda anlayabilsin diye bazı detayları sürekli tekrarlıyorum yanlış anlamazsınız umarım. Olmazsa ben sabah tekrar okurum düzenlerim.

Hocam, Teşekkürler.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

Selam,

    Şimdi bir şey daha denedim. Bir önceki yazıdan silmedim yaptığım değişikliker belli olsun diye. Sizin yazılımınızda Lcd_Write altrutini parametraleri ile tekrar oynadım ve o çaprazlık sorunu, son satırdaki sorun ve oval çıkmama sorunu gitti. Sorun değilmiş tabi, çizmesi için verilen sutun sayısı ve satır sayısı 1 fazla olduğu için 1 alt satıra kayıyormuş.

Benim çapraz iken ve son satır bozuk iken çalışan kod;
       Lcd_Write(0,0,128,8,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,128,8,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,128,8,(unsigned char*)Usa,Normal);
        DelayMs(750)


Bunu bu şekilde değiştirdim;
       Lcd_Write(0,0,127,7,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,127,7,(unsigned char*)Family,Normal);
        DelayMs(750);
        Lcd_Write(0,0,127,7,(unsigned char*)Usa,Normal);
        DelayMs(750)


Meğer parmaklıklar düzmüş :) ve en altta asm yazıyormuş :)
//--------------------------------------------------------------------------------
Oval çizemediğim zaman ki animasyon kodu;
while(Temp!=0){
       for(Stop=0;Stop!=(128-15);Stop++){   
     Lcd_Write(Stop,Stop+15,0,1,(unsigned char*)Oval,Normal);
        DelayMs(30);
   Lcd_Clear();       
   }   
   Stop=Stop-1;
   Lcd_Write(Stop,Stop+15,1,2,(unsigned char*)Oval,Normal);
        DelayMs(30);
   Lcd_Clear();
        for(;Stop!=255;Stop--){               
        Lcd_Write(Stop,Stop+15,1,2,(unsigned char*)Oval,Normal);
        DelayMs(50);
   Lcd_Clear();       
   }
        Temp--;
   }


Oval çizebildiğim animasyon kodu;
       while(Temp!=0){
       for(Stop=0;Stop!=(128-15);Stop++)
        {
         Lcd_Write(Stop,0,Stop+15,1,(unsigned char*)Oval,Normal);
         DelayMs(30);
         Lcd_Clear();
        }
   Stop=Stop-1;
   Lcd_Write(Stop,1,Stop+15,2,(unsigned char*)Oval,Normal);
        DelayMs(30);
   Lcd_Clear();
        for(;Stop!=255;Stop--){
        Lcd_Write(Stop,1,Stop+15,2,(unsigned char*)Oval,Normal);
        DelayMs(50);
   Lcd_Clear();
   }
       Temp--;
   }

//-----------------------------------------------------------------------------

Acaba taşırken bozuldumu, yada başka bir şeyi mi yazdınız yanlışlıkla veya siz kendi Lcd_Write altrutuninizi sonradan değiştirdiniz mi bilmiyorum ama;
Alıntı yapılan: "tatlisukurnazi"
Lcd_Write(Stop,Stop+15,1,2,(unsigned char*)Oval,Normal);
Lcd_Write altrutuninde ilk parametre X'in ikinci parametre de Y'nin başlangıcı olduğunu sanıyorum. Ama burda ilki X'in başlanagıcı, ikincisi X'in bitişi olarak düşünülmüş. Altrutine göre Stop değeri eğerki 1 den büyük bir değer gösterirse X'in bitiş noktası 1 olduğu için çizim için for döngüsüne girmeyecek bile. Ayrıca satır değeride 7 den büyük olduğu için "(Stop+15) mod 7 = Satır" değeri olarak yeni bir satır değeri elde edecek.
//------------------------------------------------------

Yalnız donanımı tekrar kontrol ettim ve adaptor kartındaki soketin plastik kısmını çıkarttım ve ordan soketin içerisine akan lehimlerden LCD'nin 3. ve 5. data ucunu kısa devre eden bir lehim parçasının soketin plastik kısmına yapıştığını farkettim. Bu pinleri daha önce test ettim ama adaptor kartını tam bastırmadığım zaman kısa devre olmadığını gördüm. Sağlam otursun diye tam basıyordum bende :x  Hocam siz bu adaptor kartını yapan şirketi biliyorsunuz. Ben bunu arkadaşa da söyleyeyim. Zaten bana şey demişti bizim elemanlar kartı takıyorlar çalışmazsa bi kenara atıyorlar diye. Acaba o kartlardan birine mi denk geldim. 3 kart var bir tek bunda sorun var. Ve trajik bir şekilde bu kısa devre her 8 sutundan sonra 32 sutun atlamasına neden olacak bir etki yaratıyor.

Sonuç olarak sizin gönderdiğiniz kod şuan çalışıyor. Baştaki Oval animasyonuna bakılırsa konumlama hatası yapmıyor gibi. Kısa devre edince buda yapıyor. Afedersiniz ama anlaşılan günlerdir salak bir sorun yüzünden uğraşıyorum. Belki benim yazdıklarımda çalışıyordu. İnsan geçen zamana yanıyor. Ama sizin yazılımınız daha güzel olmuş, o yüzden ben şimdi onu bi h dosyası haline getiririm. Sonuçta üstad eli değimiş :D Ben bu kartlardaki montaj hatasından dolayı basit bir programlamada bile sorun yaşadım. Bu Renesas'a yeni başlayacak arkadaşlar, kendi kartınız kullanın! Başkasının kartını kullanıyorsanız soketin deliklerine kadar kontrol edin yoksa işiniz var benim gibi. Bir an önce kendi adaptor kartımı ve deneme bordumu yapacam. Tamamen zarar oldu benim için. Ancak yukarıdaki değişiklikerin donanımla bir alakası yok. Onları yapmadığım zaman başka sorunlar ortaya çıkıyor. Zaten hocam Lcd_Write altrutini içerisinde parametrelerin ne olacağını belirtmiş. Ona göre yaptım. Yeni bir şey yapmadım.

Amma geveledim, saatde 5 olmuş ama olsun. şimdi rahat uyuyacam :D


Hocam, Yardımlarınız için Teşekkürler.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Selam,

Evet YARGICH haklısın adreslemedeki 128'ler sorun kaynağı ama bende bu tip lcd için yazılmış bir sürü lcd.c isimli driver var.
Bıkmamış usanmamış yazmışım :D
Hangisini niye yazdim bende hatirlamiyorum ama bu kodun içindeki tabloları ve çalıştığını hatırlayınca onu veriyim demiştim.
Demekki bununla da sonradan bazi denemeler yapmisim  :oops:  :oops:  :oops:
Ama içersinde hatalar olabilir demişimdir, dememişmiyimdir ki :roll:

Yaşadıklarının donanım sorunu olduğunu biliyordum ama, kartını görmediğim için şuraya bak, buraya bak da diyemedim.
Daha dikkatli çalışmalısın, küçük bir ilk deneme heycanı, birazcık acele sonuç olarak kaybedilmiş 2-3 hafta.

Neyse nasilsa çalışmış, hadi geçmiş olsuın :)

İyi çalışmalar.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Selam,

   Tahmin etmiştim yazılımınızı daha sonradan değişikliğe neden olduğu için böyle olduğunu. Zaten sorunda sadece parametre giriş şekli ile alakalı. Ama dediğiniz gibi donanım yaktı beni. Daha dikkatli olmam lazım  :oops:  Bugün kartı getiren arkadaşla konuştum dedim bu IDC soketi olsa gerek bunların içine lehim akmış dedim ordan kısa devre olmuş dedim. Sizin başınız gelmedi mi dedim. Bana dediki "vah vah demek senin de başına geldi" dedi. Onlar için sorun yok çalışmayanı at gitsin hemen bi tane daha tak. Bende uğraş uğraş bi oldum  :x

Şimdi bunu kütüphaneye atmak için düzenliyorum. ufak tefek bi şeyler ekliyorum. Birde Font eklemem lazım. Onlarıda sizin Const lar gibi bende program içerisine eklemeyi düşünüyorum, harici eeprom kullanmayayım şimdi, bakalım bir deneyeyim  :roll:

Teşekkürler, İyi Çalışmalar.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Font'ları hazırlarken şu arkadaşı kullanabilirsin;

http://www.fastavr.com/fastlcd.zip

İyi çalışmalar.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Hocam Teşekkürler, güzel program, özellikle .bas dosyasını oluşturması iyi olmuş. Banada böyle bişi lazımdı. Eskiden kendi yaptığım PC yazılımıyla doğruca eeproma atıyordum. Şimdi Const dizisi oluşturması için tekrar elden geçirmem gerekecekti ama gerek kalmadı. Yalnız onda fontlarım hazırdı. Bu beni çok uğraştırırsa kolları sıvayıp delphi programıyla biraz daha oynamam gerekebilir. Ama bu program işimi görür gibi.


Teşekkürler, İyi Çalışmalar.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.