I2C LCD kullanımı

Başlatan alien876, 18 Temmuz 2017, 21:17:15

alien876

Merhaba arkadaşlar birşey danışmak istiyorum arduinoda i2c lcd modulü bulunuyor bunu pbp de kullanan varmı varsa arkadaşlar nasıl kullanıldığını anlatabilirmi yabancı forumlarda var fakat ingilizce eksikliğinden olayı anlayamadım hem benim gibi ihtiyacı olan arkadaşlarada yardım olur herkese kolay gelsin

bu linkde kütüphaneside bulunuyor
http://support.melabs.com/forum/picbasic-pro-compiler-3-0-and-later/pbp3-picbasic-pro-3-0/773-i2c-pcf8574-20x4-lcd

ete

Orada bulunan bir I2C LCD modül değildir. PCF8574 I2C, Bus genişletici olarak adlandırılan standart bir I2C port çoğaltıcısı diyebiliriz. Asıl kullanım alanı seri datayı parelel'e çevirmek. Bu sistemdeki kullanım amacı da  Paralel çalışan bir LCD yi seri yolla (I2C mantığı ile) kontrol etmek olmuş.

Bu sistemi iyi anlamak için kullandılan LCD nin data sheet'ini iyi incelemek ve bu LCD yi en azından standart LCD komutlarını kullanmadan kontrol etmeyi başarmak gerekir. Zira işin temelinde bu yatmaktadır. Verdiğin linkteki mesajları okudum. Genel anlamda bir I2C kontrol edresi problemi yaşandığı açıklanmış. Her bir I2C elemanı mutlaka bir kontrol adresine sahip olması gerekir. PCF8574 ün data sheet'inde bu adres değeri $40 olarak verilmiş. Ancak sürekli yaşanan haberleşme problemlerinden bahsedilmektedir. Zira PCF8574'ün iki ayrı versiyonu olduğu belirtilmiş birisi (A) versiyonu diğeride (A olmayan) versiyonu. Bu ikisi kontrol adresi açısından farklılıklar gösteriyormuş. Birisinde adres $40 olurken diğerinde $70 oluyormuş.
Onun dışında normal LCD kontrol işlemi diyebiliriz. Tabiiki bir diğer sıkıntı da 8 bitlik data ve kontrol değerlerinin 4'er bitlik iki ayrı parça (nibble) şeklinde LCD ye verilmesi sorunu. Elbette işi bu kadar basite indirgememek gerekiyor. LCD komutları olmadan işin kontrolünü yapmak için bir araba kod yazmak gerekiyor. Linkteki bahsi geçen kontrol mekanizması tamamen PBP3 derleyici temeline dayanmakta ve bu derleyicinin yeteneklerinden birisi olan ARRAYWRITE komutuna dayanmaktadır.
Bu komut dahilinde parametre olarak verilen birden fazla elemanın bir komutla LCD ye yollanması mümkün olabilmektedir.
ARRAYWRITE LCD_Buff,[$FE,$40,$00,$04,$0A,$04,$0E,$15,$0A,$11] komut satırına bakarsanız 10 adet elemanın bir seferde LCD ye yollandığını görebilirsiniz. Bu işi normal PBP derleyici ile yapmak isterseniz işiniz zor gerçekten. Ne kadar zor olduğunu tespit etmek için bile bir inceleme yapmak gerek.
Ama PBP3 temelinde verilen kütüphanede işler kolaylaşmış gözüküyor. Örnekle açıklamak gerekir ise;
Normal LCD komutları ile ;
LCDOUT $FE,Line2,"Count = ",DEC LoopCount,"   " şeklinde bir yazdırma komutu

ARRAYWRITE LCD_Buff,[$FE,Line2,"Count = ",DEC LoopCount,"   "]
şeklinde yazdırılabiliyor. İki komut arasındaki farka bakarsanız LCDOUT kalkmış yerine ARRAYWRITE LCD_Buff komutu gelmiş oluyor.

Ete



hasanemmii

#2
5 yıldır konuya yazan olmamış ama 900 civarında bakılmış. I2C ile lcd kullanımı PBP da kolayca kulanılamıyor sanırım. Ben de 16f886 ile devre tasarımı yaptığımda sonradan bir pine daha ihtiyaç oldu ve sadece 4 bit bağlı LCD yi IC2 ile kullanırsam pin elde edebiliyorum. Çok araştırdım düzenli bir örnek bulamadım. LCDOUT komutunu kolayca kullandığımız gibi IC2 nin bir kullanım şekli yok mudur arkadaşlar?

Hattuşa

proton plusda tek pinle 2x16,4x16 vb LCD ler kullanılabiliyor, PBP ve proton aynı sayılır, karmaşık bir kodunuz yoksa protona çevirip devam edebilirsiniz
https://etepic.com/index.php/topic,3469.msg44543.html#msg44543

hasanemmii

Bir ara çizgi izleyen robotla uğraşırken, pbp nin hesaplama eksikliğinden dolayı protonla çalışmıştım. Ben biraz daha uğraşacağım. Başaramazsam dediğiniz gibi protona bakayım.  Arduino ile bile çatır çatır Data ve Clock pinlerini kullanıp LCD ye hükmediyorlar. PBP ile nasıl kolayca yapılamıyor inanamıyorum. Cevap için teşekkürler.

ete

Daha önce açıklama yapmışım ama anlaşılmamış gözüküyor. Yeniden açıklayayım.
I2C bir seri haberleşme tekniğidir. Teknik komutlara dayanır. Komutun kullanım formatı aşağıdaki gibidir.
I2CREAD DataPin,ClockPin,Control,{Address,}[Var{,Var...}]{,Label}

Bu bir I2C okuma komutudur. Tek tek parametreleri açıklayacak olursak;
DataPin adı üzerinde Data bilgisinin verildiği yada alındığı işlemci yad I2C cihazının pini oluyor .
Aynı şekilde ClockPin de CLK pulsinin verildiği pin oluyor.
Control ise önemli bir parametre olup her bir I2C ile çalışan aletin bir Control adresi olmak zorunda. Bu sayede aynı Data ve Clok pinine bağlı birden fazla I2C cihazı olabiliyor. Kime yada kimden bilgi alınacağına verileceğine Control adresi ile karar veriliyor. Bu olmadan I2C haberleşmesi olamıyor maalesef.
Address, Cihaz içindeki hangi adrese ulaşılacağına işaret ediyor. Bir eprom düşünü onun hangi adresinden bilgi okuyacaksanız adres yerine o bilgiyi veriyorsunuz.
Ardından gelen Var lar değişkenleri ifade ediyor. Kaç bilgi okuyacaksanız o kadar da bilgi (değişken yada Var)olmalı.

I2CWRITE da aynı parametrelerle kullanılan yazma komutudur. Burada dikkat edilecek husus Control rakam değerinin sıfır nolu biti Okuma yada yazma yapılacağına işaret eder. Burada okuma yapılacağı zaman bu bit "1" yazma yapılacağı zaman ise "0" olmaktadır. Basic bu işi otomatik yapar. Sizin bit değiştirmeniz gerekmez. Siz hep aynı Control değerini kullanırsınız o derleme esnasında gereken biti 1 yada sıfır yapar. Buda önemli bir kolaylık.
I2C ile haberleşirken en çok yapılan hatalardan birisi genelde 7 bit olarak verilen Control byte değerinin yanlış olarak komuta yerleştirilmesi oluyor. 7 bit olarak verilen bilgi %xxxxxxx0 şeklinde veriliyor. Mesela diyorki Control =%1100100 dir. Bunun desimal karşılığı 100 dür.
BU sayıyı Control Byte değerine çevirmek için sonuna bir sıfır eklemeniz ve sonra sayıyı okumanız gerekiyor şöyle %11001000 bu sayının desimal değeri ise 200 oluyor. İşte şaşırtan kısım burası. Doğru değer 200 olmalıdır daima. Bu zyüden 7 bit olarak verilen Control değerlerine dikkat etmenizi öneririm.

Şimdi bu işin LCD ile olan alakasına tekrar bakalım. Normal LCD lerde 14 pin bulunur ve bu pinler sayesinde paralel haberleşme yapılır. LCD bir I2C cihazı değildir. Olması için ona bir chip eklenmeli. Chip I2C ile seri (2 pin) yoldan bilgi almalı ve bu bilgiyi paralel bilgiye çevirerek LCD pinlerine sanki İşlemci ile paralel haberleşiyormuş gibi vermelidir.
Bu şekilde hazırlanmış satılan Seri LCD ler mevcut bunu zaman zaman görüyorum. Ama nadiren kullanıldıkları için bulunması zor oluyor. Bir ara aramış bizim piyasada bulamamış idim. Şimdi varmıdır bilemiyorum. Bu durumda illa I2C ile LCD yi haberleştireceğim diye normal bir LCD yi I2C ile çalışacak hale getirmek çok mantıklı olmuyor. İşlemciyi değiştirip kullanmak daha ucuz ve mantıklı oluyor.
Olay bundan ibarettir.

Ete

hasanemmii

#6
Erol hocam zaman ayırmışsınız teşekkürler. Yazınızı büyük bir dikkatle okudum. Yazınızda önceden öğrenmiş olduğum kısımlar da var, bilmediğim kısımlar da var. Her yeni bilgi beni bir adım daha ileriye götürüyor.
Paralel çalışan lcd için ek elemanlarla uğraşmak yerine hazır PCF8574 çipli seri paralel  dönüştürücüler bol miktarda ve 12 TL civarında bulunabiliyor. 
16F876 kullanırken belki 1 pin yetersizliğinden 16F877 ye geçmek pek mantıklı olmuyor. Fiyat farkı neredeyse iki katı. Daha uygun pic ler de vardır belki. Ama LCD için neredeyse B portunun tamamını kaybetmek de bana mantıksız geliyor. Ayrıca LCD yi 12F675 de niye kullanmayalım diye düşünüyorum?
Tüm bunlar bir araya gelince I2C desteğiyle LCD yi kontrol edebilmek büyük avantaj olacaktır.
Her şey bir tarafa, seri haberleşmeyle LCD kontrolünü yapabilmeyi istiyorum. Takıntı gibi bir şey. Aralık ayında WS2812b şerit ledine taktım. Hiç bir yerde açıklayıcı ve yardımcı olacak doğru düzgün bir kod bulamadım. Ama WS nin datasheet ini dikkatli inceleyince ve yeterli OSC frekansı kullanınca, İsis yardımıyla da mikrosaniye değerlerini gözlemleyince işi çödüm ve 14 bant toplam 280 ledli müzik analizörümü tamamladım. Yani söylemek istediğim takıntı işi bende biraz sıkıntılı hocam. İşime yarasın yaramasın çözmem lazım yoksa rüyamda satırlar dolusu komut yazıyorum.
Şu an bunu çözmeye ve anlamaya çalışıyorum. Sanırım dediğiniz gibi öncelikle LCD çipini çözmek gerekecek.  LCD nin 4 pinine gidecek data hangi sırayla gönderilecek. Datalar gönderilince LCD nin işleme alması için  Enable ne zaman gönderilecek RS nin fonksiyonu tam olarak nedir? Örneğin A karakteri veya bir değişkenin değeri için nasıl bir data, kaç bit şeklinde gönderilecek. Bu haberleşme protokolüne uzak olduğum sanırım ortada. Bu nedenle yardım istedim. Sanırım bu konuda yardım bekleyen çok insan vardır. Ben hazır kod peşinde olanlardan değilim. Algoritma mantığım da sizin kadar olmasa da iyi sayılır. Yol gösterilsin, parçaları birleştirebilirim. Her şey için teşekkürler.

Powered by EzPortal