CCS ile LCD ye gelen datayı okuyabilirmiyiz

Başlatan zcemix, 27 Haziran 2008, 20:15:04

zcemix

Arkadaşlar bir cihaz var ben bu cihazın 4-bit modunda sürülen lcd ekranına gelen datayı okuyup rs232 ile bilgisayara göndermek istiyorum bu datayı 16f877 nin herhangi 4 pininden nasıl okuyabiliriz. Şimdiden teşekkürler...

mucitotomasyon

css nin lcd driverinde zaten lcd yazılı olan  karakterleri okuya biliyorsun

zcemix

CCS ye yeni başladım öğrenmeye çalışıyorum bahsettiğiniz dosyayı inceledim fakat birşey anlayamadım yalnız yanlış anlatmış olabilirim lcd'ye karakterleri ben göndermiyorum lcd'ye paralel bağlanıp okuma yapmam gerekiyor yani başka bir cihazın gönderdiği karakterleri okuyup rs232 ile C#.net'le hazırlanmış yazılıma aktarmam gerekiyor rs232 ve yazılım işi tamam bide cihazla lcd arasındaki yazışmayı takip edip alabilirsem tam süper olacak ilginiz için teşekkürler...

ErsinErce



Lcdlerde de birer denetleyici bulunur, Read CGRAM ve Read DDRAM komutlarıyla yukardaki şemaya göre devre tasarlarsan lcd den istediğin bilgiyi çekebilirsin.

74hc245 teki çıkış yönünü belirleyen pinle data yönlerini belirle, okuma yapmak istediğin zaman output enable ile cihazın lcd ye bilgi basmasını engelle ve o sırada bilgiyi çek. RW pinine dikkat et genelde direk gnd ye bağlıdır bu pini kullanacağın için RW yi gnd ile cihaz bilgi yazarken birleştir.
Bu tabi karakter lcd için grafik lcd için olanı bu fikirle rahatlıkla bulabilirsin yapıları aynı....

iyi çalışmalar

mucitotomasyon

ögrenersin azim et
bu iş derya denizdir c de zaten fazla bilmene gerek yok cok esnek bir dildir kolaylıkla ögrenirsin

zcemix

cynetron kardeşim bilgiler için çok teşekkür ederim fakat küçük bir örnek gibi birşeyi nereden temin edebilirim yada internette ne olarak aramalıyım birde bizim cihaz yani yangın alarm sistemi paneli lcd'yi genelde olduğu gibi 4-bit olarak D4-D7 kullanarak sürmüş ben cihaza müdahale etmeden lcd gibi davranan bir kod geliştirebilirmiyim yani cihaz LCD'ye yaz diyince bende paralelinden aynı bilgiyi bir picle çekebilirmiyim en azından sizce böyle birşey mümkünmü yoksa boşuna uğraşmıyayım..Verdiğiniz bilgiler bayağı işime yarayacak en azından nereden başlamam gerektiğini anlar gibi oldum zahmet olmazsa biraz daha bilgi lütfen çalışmalarınızda başarılar....

ErsinErce

ramlerle çalıştın mı önceden bilmiyorum ama lcd yi ram gibi kullanacaksın, sen dışardaki bi cihazın iletişim hattını açıp lcd ye bilgiyi yazmasını sağlayacaksın sonra o iletişim hattını kesip kendi işlemcine yönlendireceksin okumanı yapıcaksın sonra tekrar diğer cihazın ordaki bilgiyi değiştirmesine izin vericeksin. Sonrası sana kalmış elindeki bilgileride ona göre değerlendirip işlemlerini gerçekleştireceksin.

o şema 8 bitlik veri yoluna göre, onu 4 bitlik yapıp 2 hc245 yerine tek 245 ile kendine göre değiştireceksin, genel olsun sonradan bakanlarda faydalansın diye 2 dk da öle çizdim. Lcdnin çalışma mantığına iyice hakim ol elektronik bilginde var sayıyorum rahatlıkla yapabilirsin

kullanacağın şema ile ilgili kısım yukarısı, C de hd44780 lcd control yada read cgram read ddram diye aratırsan belki bişeyler bulursun. program konusunda üstatlar yardımcı olacaktır
C ile fazla bir tecrübem yok bende yeni yeni ısınıyıorum :)

( Lcd nin denetleyicisi hd44780 diye var sayıyorum, eğer farklı bir denetleyici ise ona göre şema program değişikliği yapman gerekiyor )

ferdem

Tabii ki yapabilirsiniz zcemix, lcd hem yazılabilir hem de okunabilir bir bellek gibi(ram gibi) çalışır. Unutmadan vereyim geçtiğimiz haftalara kadar lcd leri sadece mikro ile sürüyordum, bu iki pdf doküman lcd ler hakkında epeyce bilgi verdi(ingilizce, everyday practical electronics 1997 den), 4shared e yüklüyorum:
http://www.4shared.com/file/53685016/97d5a16/lcd_dokuman.html?dirPwdVerified=1229a23a

Şimdi, lcd ye yazılmış veriyi de okuyabilirsiniz lcd ye yazılırken de okuyabilirsiniz. Yazılma esnasında veri bir anda geçeceği için yakalamak zor olabilir(rb0 kesmesi kullanarak yapılabilir sanırım) ancak lcd ye yazılmışsa okumak kolay. Okumak istediğiniz adresi veri yolundan gönderiyorsunuz, sonra oku derseniz o adresteki veri veri yolunda belirir ancak okuma sırasında lcd sürücüsü ile lcd arasındaki bağlantıların izole olmazı lazım, yoksa lcd nin çıkardığı veriyle lcd sürücüsü çakışır.

Atıyorum LCD yi herhangi bir devre sürüyor, bir şeyler yazdı. Siz pic li bir devreyle yazılmış olanı okumak istiyorsunuz.
1) Besleme uçları ve contrast pinleri hariç lcd yi sürücüsünden izole edip PIC in kullanımına bırakmanız lazım.

2) RS=0(komut gonderimi), RW=0 yapıp veri yoluna 10000000 komutunu gönderirseniz(enable yi 0 a çekerek) imlec 0,0 adresine konumlanır.

3)RS=1, RW=1 veri okuma moduna geçip(enable yi 1 e çekerek) o adresteki veriyi okuyabilirsiniz. 0,0 daki karakter veri yolunda belirir(pic le okuyabilirsiniz) ve imleç bir yana geçer, enable 0 1 yaparak sıradaki karakterleri okuyabilirsiniz.

CCS de bunun için özel komut var mı bilmiyorum ama yapılacak işler bazı pinleri 1, 0 yapmak ve bir portu okumak kadar temel işlemler. Her mikro ve her dille yapılabilecek gibi.

Ben bunları henüz gerçeklemedim, isis simülasyonda çalıştırdım. Anlatmaya çalıştıklarımı verdiğim dokümandan güzelce anlayabilirsiniz. İyi çalışmalar dilerim.

zcemix

Arkadaşlar cevaplar için teşekkür ederim forum kapalıydı geç oldu kusura bakmayın.Çalışmamım sonuçlarını buradan sizlere bildiricem inşaallah çalışmalarınızda başarılar...

zcemix

Arkadaşlar bayağı karışık bir devre ve ilave bir lcd ile birşeyler yaptım fakat şimdiki sorun şu lcd ben lcd'yi

void lcd_oku()
{
output_high(pin_b3);
lcdy=1;lcdx=1;lcdharf=0;
lcdgonder=1;
  for(lcdy=1;lcdy<5;lcdx++)
  {
  if(lcdx>20)
  {
  lcdx=1;
  lcdy++;
  }
  if(lcdy<5)
  {
  lcdekran[lcdharf]=lcd_getc(lcdx,lcdy);
  //printf("  %d%d%c",lcdx,lcdy,lcdekran[lcdharf]);
  //delay_ms(2);
  lcdharf++;
  }
  }
 if(input(pin_A0)==1)fire='1';else fire='0'; 
 if(input(pin_A1)==1)disable='1';else disable='0';
 if(input(pin_A2)==1)fault='1';else fault='0'; 
 if(input(pin_A3)==1)buzzer='1';else buzzer='0'; 
  lcdekran[80]=',';lcdekran[81]=fire;lcdekran[82]=disable;lcdekran[83]=fault;lcdekran[84]=buzzer;
 if(lcdgonder==1)
  {
   printf("display,%s",lcdekran);
   lcdgonder=0;
  }
   
}



bu şekilde okuyup seri porttan gönderiyorum fakat lcd'yi okuduktan sonra imlec 1.satırın 1.sütununa konumlanıyor sonradan gelen karakteri buraya yazıyor.Benim yapmam gereken imleci hangi konumdan aldığımı  öğrenip okuma bittiğinde aynı konuma bırakmak bunu nasıl yapabilirim lcd'nin böyle bir komutu varmı (imlec hangi satırda ve hangi sütunda) yardımlarınız için teşekkürler....

ferdem

Datayı nasıl okuyorsanız aynı şekilde "lcd status" ü de okuyabilirsiniz, yapılması gereken tek değişiklik "register select" i lojik 0 a almak. Lojik 1 de iken data okuyordunuz, lojik 0 da "lcd status" ü okuyabilirsiniz. 8 bitlik lcd statusun ilk 7 biti imlecin ("cursor"un) o anki adresini veriyor (0H 7FH arasında bir değer). Yazma moduna geçmeden "set display address" komutuyla imleci konumlandırıp yazma işlemine kaldığı yerden devam edebilirsiniz. İyi çalışmalar.

zcemix

Yani şöyle birşeymi demek istediniz lcd'den bir karakter almak için

lcdekran=lcd_getc(lcdx,lcdy);  // LCD420.c Driver'ının içindeki fonksiyonu çağırıyoruz 

char lcd_getc( BYTE x, BYTE y) {
   char value;
    lcd_gotoxy(x,y);                   //imleci  okumak istediğimiz konuma gönderiyoruz 
    lcd.rs=1;                             //Sizin bahsettiğiniz Register Select Biti 
    value = lcd_read_byte();      //Lcd'den 1 byte'lık veri okunuyor
    lcd.rs=0;
    return(value);                     //okunan byte karakter olarak geri dönüyor
}


Driver'ın içine Aşağıdaki şekilde bir fonksiyonmu yazmamız lazım
int8 lcd_cursor_position( ) {
   int value;             
    lcd.rs=0;                           //Register Select Biti 0 olucak
    value = lcd_read_byte();
    return(value);
}


Edit:code tag kullanırsak yazdığımız kod olduğu , yazdıklarımızın anlaşılabilirliği artacaktır. ground.

ve bu fonksiyonu cursorpozisyon=lcd_cursor_position( ); bu şekilde çağırdığımızda dönen bilgi imlecin yerimi olur... şayet buraya kadar doğru anlamışsam set display address komutuna cursorpozisyon değişkenine aktardığım bilgiyi nasıl gönderebilirim yardımlarınız için teşekkürler çalışmalarınızda kolaylıklar ve başarılar diliyorum iyi akşamlar..

ferdem

Yazdığınız fonksiyon bana gayet mantıklı geldi, ancak küçük bir ekleme yapmakta fayda var: İmlecin adresi ilk 7 bitte saklı, "lcd_read_byte" fonksiyonu 8 biti de okuyor, bunun için sonucu 127 (decimal) ile VE işlemine tâbi tutarak sadece ilk 7 biti alıyoruz (8. bit busy flag, garanti olması açısından ilk 7 biti maskelemek daha iyi olur). Fonksiyonun değiştirilmiş hâli:

int8 lcd_cursor_position() {
   int value;
    lcd.rs=0;                           //Register Select Biti 0 olucak
    value = (lcd_read_byte()&127);
    return(value);
}


İmleç adresini aldıktan sonra herhangi bir zamanda imleci istediğiniz adrese gönderebileceğiniz "lcd_send_byte(0,0x80|adres);" fonksiyonunu kullanabilirsiniz, bu fonksiyonu CCS C nin "lcd_gotoxy" fonksiyonun içinde gördüm, istediğimiz gibi çalışıyor.
Özetle LCD ye okuma-yazma yapmak ve yazma işlemine kaldığı yerden devam etmek için şöyle bir akış izlenebilir:
LCD yazma işlemleri....
imlec=lcd_cursor_position() ; //okumaya geçmeden önce imlec adresini sakla
LCD okuma işlemleri... imleci başa alıp(adres:0) okumak daha uygun...
lcd_send_byte(0,0x80|imlec); //kaldığımız yere dönelim
LCD yazma işlemlerine kaldığı yerden devam...

Umarım yardımcı olur, iyi çalışmalar...

zcemix

Yardımlarınız için çok teşekkür ederim sizede çalışmalarınızda başarılar dilerim...