Grafik LCD sorunu

Başlatan abdullahmk, 16 Şubat 2012, 14:11:44

abdullahmk

Merhaba arkadaşlar.
PIC programlamaya yeni başlamış biri olarak ben de Serdar Çiçek'in kitabını takip ediyorum.
Grafik LCD uygulamasında sorun yaşıyorum. Basit bir çizgiyi bile çizemiyorum. Proteus'da simulasyonu başlattığımda ekranda saçmasapan pikseller beliriyor. Proteus'da işlemci (16F877) frekansını 20MHz yaptım. Programda da delay clock 20MHz fakat buna rağmen yine de düzelmiyor. Nerede eksiğim veya hatam var?
Bir de kafama takılan bir soru var belki tam olarak yeri değil ama şöyle ki; CCS C'de PIC Wizard'dan yeni proje açarken işlemci seçiminin yanında frekans seçimi var. Bu tam olarak neyi ifade ediyor? Ayrıca programı yazarken başında #use delay(clock=4000000) gibi bir komut kullanıyoruz. Bunun amacı tam olarak nedir? Ve son olarak Proteus'da işlemcinin özelliklerine geldiğimizde orada da frekansı var ve bunu değiştirebiliyoruz. Bu uç frekans arasında kaldım ve kafam çok karıştı. Beni aydınlatacak arkadaştan Allah razı olsun.

Program kodlarım şöyle:

#include <16F877.h>
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>

void main()
{
   glcd_init(ON);
   char yazi[]="ABDULLAH";
   glcd_text57(39,5,yazi,2,ON);
}

kaypic38

Kodlar tamamen bunlar mı ?
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

abdullahmk


haydarpasamikro

#use delay(clock=20000000) satırı kristal değerini bildirmemizi sağlar. 20000000 Hz veya 20Mhz demektir.


#include <16F877.h>
#use delay(clock=20000000)
#include <HDM64GS12.c>
#include <graphics.c>

char yazi[]="ABDULLAH";

void main()
{

   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   glcd_init(ON); // Grafik LCD hazırlanıyor ve ekran siliniyor
   
   glcd_text57(39,5,yazi,2,ON);

   while(1){;}        // program sonu kör döngü sonsuz bekleme
}
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

abdullahmk

@haydarpasamikro
Hocam teşekkür ederim ama hangi komutun ne işe yaradığını biliyorum. Benim sıkıntım ekranda yazı yerine rastgele piksellerin görünüyor olması.

cemilkendir

işlemci hızını 4 Mhz ye düşür yada glcd driveri içerisindeki ekrana veri yazma fonksiyonun içindeki delay sürelerini uzat

void glcd_writeByte(int1 side, BYTE data)
{
   set_tris_d(0x00);
   
   output_low(GLCD_RW);       // Set for writing

    if(side)                   // Choose which side to write to
      output_high(GLCD_CS2);
   else
      output_high(GLCD_CS1);

    delay_us(1);

   output_d(data);            // Put the data on the port
   delay_us(1);
   output_high(GLCD_E);       // Pulse the enable pin
   delay_us(1);///////////////////////////////////BU KISIMDAKİ SÜRELERİ  YANLIŞ HATIRLAMIYORSAM BURADA ORJİNAL KODDA delay_cycles (); KOMUTU YAZLIMIŞ OLMASI LAZIM 
   output_low(GLCD_E);

   output_low(GLCD_CS1);      // Reset the chip select lines
   output_low(GLCD_CS2);
}


aynı şekilde  glcd_readByte(int1 side) fonksiyonu içerisindeki delay sürelerini uzat

bende senin gibi ilk glcd kulladığımda bununla çok uğraşmıştım ben sorunu bu şekilde çözdüm

şimdilerde ise şu şekilde yapıyorum

#use delay(clock=20000000) satırı kristal değerini bildirmemizi sağlar. 20000000 Hz veya 20Mhz demektir.


#include <16F877.h>
#use delay(clock=20000000)
#define FAST_GLCD////////hızlı ekran kullanacağını belirtir ama bununda dez avantajı 1kb lık ram harcaması 
#include <HDM64GS12.c>
#include <graphics.c>

char yazi[]="ABDULLAH";

void main()
{

   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   glcd_init(ON); // Grafik LCD hazırlanıyor ve ekran siliniyor
   
   glcd_text57(39,5,yazi,2,ON);
   glcd_update();/////fast lcd kullandığın zaman ekrana verinin gelmesi için bunu kullanman lazım


   while(1){;}        // program sonu kör döngü sonsuz bekleme
}


kolay gelsin

abdullahmk

Hocam dediklerini yaptım. writeByte ve readByte fonksiyonlarındaki gecikmeler 2 us idi. Ben onları önce 20 sonra da 200 us yaptım fakat değişen hiçbir şey olmadı. Ayrıca fast glcd kullanınca hata veriyor. Belki de ben Proteus devresinde bacak bağlantılarında yanlış yapıyorumdur. Devre şemamı ekliyorum.


cemilkendir

6. pin DI pinini bağlamamışsın birde driver dosyasında pinleri doğru olarak yönlendirdin mi


aşağıdaki kod parcası HDM64GS12.C driver dosyasının içerisindedir
buradaki tanımlamalardan sen hangi pini nereye taktığını belirtmelisin
sen DI pininide bağlamamışsın onu takıp doğru bir şekilde portları yönlendirirsen çalışır
#ifndef GLCD_CS1
#define GLCD_CS1     PIN_B0   // Chip Selection 1
#endif

#ifndef GLCD_CS2
#define GLCD_CS2     PIN_B1   // Chip Selection 2
#endif

#ifndef GLCD_DI
#define GLCD_DI      PIN_B2   // Data or Instruction input
#endif

#ifndef GLCD_RW
#define GLCD_RW      PIN_B4   // Read/Write
#endif

#ifndef GLCD_E
#define GLCD_E       PIN_B5   // Enable
#endif

#ifndef GLCD_RST
#define GLCD_RST     PIN_C0   // Reset

abdullahmk

@cemilkendir
Hocam çok teşekkür ederim. Sen mesaj yazmadan 1 dakika önce hatamı gördüm, düzelttim ve çalıştı. Kütüphane dosyalarında herhangi bir değişklik yapmaya gerek yokmuş. Sorun sadece DI pininin bağlanmamış olmasıymış  :-[ Dünden beri boşa tırmalamışım  ::)

cemilkendir

 ;D olur öyle daha ne hatalar yapacaksın