GLCD Sağlamlık ve Reset Hakkında Sorular (WG12864B)

Başlatan Tagli, 25 Şubat 2011, 19:45:59

Tagli

Bir GLCD kütüphanesi yazmaya çalışıyorum ve elimde WG12864B var. Daha önce uğraşmamış olduğum için sorma gereği duydum: Karakter LCD'lerde olduğu gibi bunlarda da elektriği verince üst satırın yanması gibi bir durum var mı? Çünkü bendekinde üstteki 1x128 piksellik satır yanıyor. Bu iyiye işaret midir?

Test amacıyla ekranda birkaç piksel yakan bir kodu PIC Simulator IDE yazılımında denedim, çalışıyor gibi görünüyor. Ama fiziksel devrede hayat yok. Reset işlemini test etmek için bu bacağı kendim hem 0'a hem de 1'e vermeyi denedim, görünürde bir değişiklik olmadı. Resette iken bu en üstteki yanık olan satırın kaybolmasını beklerdim, acaba yanlış mı düşünüyorum?

Bacak bağlantılarını yanlış bir yerden bakmış olma olasılığını düşünerek diğer bacaklara da (besleme, kontrast, Vee hariç) 0 ve 1 verdim, görünürde bir değişiklik olmadı.

Konu hakkındaki yorumlarınızı ve önerilerinizi rica ediyorum.
Gökçe Tağlıoğlu

Tagli

Peki bildiğiniz çalışır durumda KS0108 kütüphanesi var mı C18 için?
Gökçe Tağlıoğlu

satilla

taglı hocam 1,128 in yanması iyi değil, normalde böyle bir durum söz konusu değildir
hitech ile istersen kütüphane dosyası paylaşabilirm senin için sende c18'e uyarlarsın


Tagli

Çok sevinirim hocam. Hatta doğrudan Hi-Tech ile derleyip de deneyebilirim.

Kontrast ayarıyla biraz oynayınca emin olmamakla birlikte şu sonuca vardım: Üst satır yanmıyor galiba ama kontrastı diğerlerine göre daha yüksek. Ekran mavi zeminli ve o üst satır potu çevirirken diğerlerinden önce beyazlaşıyor.

İnternette C18 için bulduğum bir kütüphaneyi denedim ama sonuç alamadım. Yarın sabah Karaköy'den başka bir GLCD alıp deneyeceğim.
Gökçe Tağlıoğlu

satilla

hocam buyrun bu header dosyası

/* www.FxDev.org
* KS0108 GLCD Kullanım Klavuzu
* ks0108_init(); ile ilk ayarları yap
* ks0108_write(0,0x55); seklinde veri yaz
* veri=ks0108_read(0); seklinde veri oku
* ks0108_pixel(1,1,1) seklinde herhangi bir pixeli aç ya da kapa
* ks0108_fill(1); seklinde tüm ekran pixelleri açılır ya da kapanır
* ks0108_line(10,10,20,50,1); seklinde belirtilen koordinatlarda çizgi
çiz
* ks0108_rect(10,10,20,20,1,1); seklinde belirtilen koordinatlarda
dikdörtgen çiz
* ks0108_circle(10,10,10,1,1); seklinde daire çiz
* www.FxDev.org
*/
#define TRIS_GLCD TRISC //Pin tanımlamaları
#define GLCD_PORT PORTC
#define CS1 RB0
#define CS2 RB1
#define DI RB2 // RS'de olabilir
#define RW RB3
#define EN RB4
#define RST RB5
extern void ks0108_init(void);
extern void ks0108_write(unsigned char chip, unsigned char veri);
extern unsigned char ks0108_read(unsigned char chip);
extern void ks0108_pixel(unsigned char x, unsigned char y, unsigned char
renk);
extern void ks0108_fill(unsigned char renk);
extern void ks0108_line(unsigned char x1,unsigned char y1,unsigned char
x2,unsigned char y2, unsigned char renk);
extern void ks0108_rect(unsigned char x1, unsigned char y1, unsigned char
x2, unsigned char y2, unsigned char dolu, unsigned char renk);
extern void ks0108_circle(unsigned char x,unsigned char y, unsigned char
r, unsigned char dolu, unsigned char renk);


buda c dosyası
#include <pic.h>
#include "ks0108.h"
#include "delay.h"
#define EKRANAC 0x3F
#define EKRANKAPA 0x3E
#define sag 1
#define sol 0
void ks0108_init(void)
{
RST=1;
EN=0;
CS1=0;
CS2=0;
DI=0; //Komut verilecek
ks0108_write(sag, 0xC0); //En üst RAM'in ilk RAM olduğu belirleniyor
ks0108_write(sol, 0xC0);
ks0108_write(sag, 0x40); //Sütunun en basına gidiliyor, Y=0
ks0108_write(sol, 0x40);
ks0108_write(sag, 0xB8); //Satırın en basına gidiliyor, X=0
ks0108_write(sol, 0xB8);
ks0108_write(sag, EKRANAC); //Ekranı aç
ks0108_write(sol, EKRANAC);
ks0108_fill(0);
}
void ks0108_write(unsigned char chip, unsigned char veri)
{
if(chip)
{
CS1=0;
CS2=1;
}
else
{
CS1=1;
CS2=0;
}
RW=0; // Veri yazma moduna alındı
GLCD_PORT=veri;
DelayUs(10);
EN=1; // Düsen kenar tetiklemeli
DelayUs(10);
EN=0;
CS1=0; // Chip seçim alanları temizleniyor
CS2=0;
}
unsigned char ks0108_read(unsigned char chip)
{
unsigned char veri;
TRIS_GLCD=0xFF;
RW=1;
if(chip)
{
CS1=0;
CS2=1;
}
else
{
CS1=1;
CS2=0;
}
DelayUs(10);
EN=1;
DelayUs(10);
veri=GLCD_PORT;
EN=0;
TRIS_GLCD=0x00;
CS1=0;
CS2=0;
return veri;
}
void ks0108_pixel(unsigned char x, unsigned char y, unsigned char renk)
{
unsigned char veri, kay=1;
unsigned char chip=sol;
if(x>63) // 63'ten büyükse ikinci chipe geç
{
x=x-64;
chip=sag;
}
DI=0; // Komut verilecek
x=x&0x7F; // X için komutlar hazırlanıyor
x=x|0x40;
ks0108_write(chip,x); // X için komut veriliyor
ks0108_write(chip,(y/8 & 0xBF) | 0xB8); // Y için komut veriliyor
DI=1; // Veri okunup, yazılacak
ks0108_read(chip); // Yeni adres bilgisi için
veri=ks0108_read(chip); // GLCD iki kez okunuyor
if(renk) // Pixel açık mı kapalı mı
veri=veri | kay<<y%8;
else
veri=veri & (~(kay<<y%8));
DI=0; // Komut veriliyor
ks0108_write(chip,x);
DI=1; // Yazım yapılıyor
ks0108_write(chip,veri);
}
void ks0108_fill(unsigned char renk)
{
unsigned char i,j;
for(i=0;i<8;i++) // 8 sayfa var
{
DI=0; // Komut veriliyor
ks0108_write(sol,0x40);
ks0108_write(sag,0x40);
// Her seferinde, her sayfanın basına gidiliyor
ks0108_write(sol,i | 0xB8);
ks0108_write(sag,i | 0xB8);
DI=1; // Veri gönderilecek
for(j=0;j<64;j++) // 64 sütun var
{
if(renk)
{
ks0108_write(sag, 0xFF);
ks0108_write(sol, 0xFF);
}
else
{
ks0108_write(sag, 0x00);
ks0108_write(sol, 0x00);
}
}
}
}
void ks0108_line(unsigned char x1,unsigned char y1,unsigned char
x2,unsigned char y2, unsigned char renk)
{
int addx=1, addy=1, P;
unsigned char i, dy, dx, diff;
if(x2>x1)
dx = x2 - x1;
else
{
dx = x1 - x2;
addx = -1;
}
if(y2>y1)
dy = y2 - y1;
else
{
dy = y1 - y2;
addy = -1;
}
if(dx >= dy)
{
dy *= 2;
P = dy - dx;
diff = P - dx;
for(i=0; i<=dx; ++i)
{
ks0108_pixel(x1, y1, renk);
if(P < 0)
{
P += dy;
x1 += addx;
}
else
{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
else
{
dx *= 2;
P = dx - dy;
diff = P - dy;
for(i=0; i<=dy; ++i)
{
ks0108_pixel(x1, y1, renk);
if(P < 0)
{
P += dx;
y1 += addy;
}
else
{
P += diff;
x1 += addx;
y1 += addy;
}
}
}
}
void ks0108_rect(unsigned char x1, unsigned char y1, unsigned char x2,
unsigned char y2, unsigned char dolu, unsigned char renk)
{
if(dolu)
{
unsigned char i, xmin, xmax, ymin, ymax;
if(x1 < x2)
{
xmin = x1;
xmax = x2;
}
else
{
xmin = x2;
xmax = x1;
}
if(y1 < y2)
{
ymin = y1;
ymax = y2;
}
else
{
ymin = y2;
ymax = y1;
}
for(; xmin <= xmax; ++xmin)
{
for(i=ymin; i<=ymax; ++i)
{
ks0108_pixel(xmin, i, renk);
}
}
}
else
{
ks0108_line(x1, y1, x2, y1, renk);
ks0108_line(x1, y2, x2, y2, renk);
ks0108_line(x1, y1, x1, y2, renk);
ks0108_line(x2, y1, x2, y2, renk);
}
}
void ks0108_circle(unsigned char x,unsigned char y, unsigned char r,
unsigned char dolu, unsigned char renk)
{
unsigned char a,b;
int P;
a=0;
b=r;
P=1-r;
do
{
if(dolu)
{
ks0108_line(x-a, y+b, x+a, y+b, renk);
ks0108_line(x-a, y-b, x+a, y-b, renk);
ks0108_line(x-b, y+a, x+b, y+a, renk);
ks0108_line(x-b, y-a, x+b, y-a, renk);
}
else
{
ks0108_pixel(a+x, b+y, renk);
ks0108_pixel(b+x, a+y, renk);
ks0108_pixel(x-a, b+y, renk);
ks0108_pixel(x-b, a+y, renk);
ks0108_pixel(b+x, y-a, renk);
ks0108_pixel(a+x, y-b, renk);
ks0108_pixel(x-a, y-b, renk);
ks0108_pixel(x-b, y-a, renk);
}
if(P < 0)
P+= 3 + 2 * a++;
else
P+= 5 + 2 * (a++ - b--);
}while(a <= b);
}



Tagli

Teşekkürler. Ancak kütüphaneyi Hi-Tech'e olan uzaklığım yüzünden derleyemedim. Çalışır bir kod elde etmenin beni zorlayacağını düşündüğümden çok uğraşmadım.

Yeni bir GLCD alarak tekrardan bir deneme yaptım. Ekranın üst satırındaki 128 piksel aynı şekilde davranıyor. Ne yaptığımın çok da farkında değilim ama yazdığım asm kodu ile bir kaç pikseli ekrana bastırmayı başardım. Denemelerim sırasında GLCD'ye "aç" komutunu gönderen kısmı galiba koddan çıkarmışım, o yüzden çalışmıyormuş (ama daha öncesinde o bölüm varken de çalışmıyordu). Ayrıca GLCD'nin elektrik verildiğinde tüm pikselleri 1 oluyor, bunu da yeni farkettim.

Uzun lafın kısası, her ne kadar ne sorunu ne yapıp da düzelttiğimin farkında olmasam da sonuç elde etmeyi başardım ve kütüphane çalışmalarına başlayabilirim. Tamamlanınca forumda paylaşacağım, hatta tamamlanmadan da paylaşabilirim.

Sonuç olarak, üst satırdaki 128 pikselin diğerlerinden daha yüksek kontrastı olması bir sağlamlık ölçütü müdür bunu bilmiyorum. Şimdiye kadar iki tane GLCD denedim, ikisinde de durum böyle. Öte yandan ilk GLCD'yi tekrardan çalıştırmayı denemedim, malum kabloları bağlamak her insanın üşeneceği türden can sıkıcı bir iş. Reset davranışı hakkında ise bir sonuca varamadım ama şu durumda bunun bir önemi de kalmadı.
Gökçe Tağlıoğlu

satilla

hocam sizin PIC'e bağladıgınız bacakların listesini yazın ben sizin için bir kod derleyip göndereyim

picin hangi bacagına glcd'deki hangi pin denk geliyorsa...

Tagli

18F452 kullanıyorum. Kristal 20 MHz. PLL yok.

Data -> Port C
CS1 -> D5
CS2 -> D4
Reset -> D0
R/W -> D1
D/I -> D3
E -> D2

Şimdiden teşekkürler.
Gökçe Tağlıoğlu

satilla


Tagli

Ekranın sadece sağ yarısında üst satırda "deneme der" yazıyor. Sol taraf tamamen açıkken, sağ tarafın yazı yazmayan yerleri siyah. Doğru mudur hocam?
Gökçe Tağlıoğlu

satilla

cs1 ve cs2 pinlerinin picteki yerini değiştirerek deneyin

muhtemelen cs2 pini temas etmiyor

ekranda en üst satırda

deneme deneme deneme

yazacak hocam en üstteki 128 pikselde kontrast farklılığı yok değilmi?

Tagli

CS bacaklarını kontrol ettim bir değişiklik olmadı. Üst satırda bir kontrast farklılığı gözükmüyor.

Kendi kodumda da bir miktar ilerleme kaydettim. İlk elektrik verildiğinde dolu çıkan ekranı silip herhangi bir yerine piksel yazabiliyorum. Ancak piksel kodunun da elden geçmesi lazım, çünkü aynı byte üzerinde yazım yaptığında eski pikseli siliyor, ki bu istenmeyen bir durum. Bunu engellemek için ekrandan eski değeri de okuyup güncellemem gerekiyor.

Piksel yazma silme işini halledip bir de karakter yazma kodunu eklediğimde kütüphanenin ilk versiyonu yayınlanabilir kıvama gelecek. Gerçi PIC18 için olan assembly kodu pek fazla kimsenin işine yaramayacaktır ama olsun... Daha sonra C18'e de uyarlayacağım ama daha çok var oraya...

İlgin için tekrardan teşekkürler sinansinan09.
Gökçe Tağlıoğlu

satilla

yardımcı olabildiysem ne mutlu bana
benide çok uğraştırmıştı glcd o yüzden yardımcı olabileceğim herhangi birşey olursa yine burdayım :)