This post is also available in: English

forum-banner


Forum Navigation
Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

MicroC i2c ile sabit bir yazıyı kayan yazı olarak değiştirme.

İyi günler, bugün son gönderdiklerinizi denedim. Sorunsuzca derlendi. Ancak kodlar ekrana yazı yazdırmadı. Ben şundan şüpheleniyorum: İlk gönderdiğim kodlarda ekrana yazılan yazı kısmında direkt harfler yoktu , onun yerine Hex kodları vardı. Bu kısmı tekrar aşağıya yazıyorum.

///DATA TO LCD
I2C1_Wr(0x57);    // Envia dato   W
I2C1_Wr(0x4E);    // Envia dato   E
I2C1_Wr(0x4C);    // Envia dato   L
I2C1_Wr(0x4C);    // Envia dato   L
I2C1_Wr(0x43);    // Envia dato   C
I2C1_Wr(0x4F);    // Envia dato   O
I2C1_Wr(0x4D);    // Envia dato   M
I2C1_Wr(0x4E);    // Envia dato   E

Sizin yazdığınız kısımda ise düz metin vardı :  unsigned char dizi[9]="WELCOME";

Bir ihtimal ekrana şu an yazı gelmesi için harflerin karşılığı olan hex kodlarını yazsak sorun ortadan kalkar mı?

 

Ayrıca orijinal dosyada DATA TO LCD yazan kısımdan önce

PORTb = 0x00;
delay_us(665);
I2C1_Start(); //Comienzo de la comunicación I2C ...
I2C1_Wr(0x46); //...con la dirección del PIC esclavo...
I2C1_Wr(0x0F); // Envia dato
I2C1_Wr(0x90); // Envia dato
I2C1_Wr(0x7F); // Envia dato
I2C1_Wr(0x55); // Envia dato
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0x60); // Envia dato
I2C1_Wr(0x01); // Envia dato
///DATA TO LCD

kısmı vardı. Bu LCD'nin yazı yazması için bu kısmın bulunması zorunluluğu vardı. Kodları bana veren kişi böyle belirtmişti. Aradan zaman geçtikten sonra kendisine tekrar yazmıştım ama bir daha dönüş yapmadı.

 

Harfin hex kodunuda yazsan. Hex kodunun karakterinide yazsan. sonucta o değer binary olarak I2C hattına basılacak fark eden bir şey yok. hex makinanın anladığı şey. Karakter ise senin anlayabileceğin şey. ama makina her ikisinide anlar :)

ASCII tablosuna baktığın zaman karakterlerin hex karşılıklarını göreceksin. ASCII tablosunu incelersen anlayacağını sanıyorum. öncelikle bu sorunu kafandan at. hiç gerek yok.

 

Send fonksiyonunda gözümden kacmadıysa. LCD kurduktan sonra I2C stop sinyali gönderilmiş. For icinde yazma yaparken. Start verilmeden veriler yazılmış. bu yüzden yazmıyor olabilir. ayrıca LCD kurulum kısmında sizin verdiğiniz kodda bir kaç işlem mevcut fakat ercan bey bunları yazma gereği duymamış bir bildiği vardır. eğer gözünden kaçtıysa sıkıntı oradan da kaynaklanabilir.

Çünkü LCD yazma yapmadan önce  satır ve sutunların adresleri gönderilip sonra bir bir peşi yazma yapılır her karakterden sonra zaten LCD sutunu 1 arttırır.

Send fonksiyonunda for dönngüsünün hemen üstüne I2C1_Start(); fonksiyonunu cağırarak bir dene. oda olmaz ise. ilkk verdiğin kod'da LCD kurmak icin gerekli dataları bu fonksiyon icinede alıp eksiklikleri gider.

 

Merhabalar

Şu kişiden alıntılanmıştır: malina45 

Sizin yazdığınız kısımda ise düz metin vardı :  unsigned char dizi[9]="WELCOME";

Bir ihtimal ekrana şu an yazı gelmesi için harflerin karşılığı olan hex kodlarını yazsak sorun ortadan kalkar mı?

  • hex kodu yazmak yada "welcome" yazmak arasında görünüş dışında bir fark yok.
  • Ancak dediğiniz gibi orjinalde LCD ye göndermeden önce bir kod grubu var şu an onuda ekledim.
  • Fakat şu da var sizin kullandığınız PIC modeli hangisi dediğiniz gibi PIC16f877A ile derleme yapınca kod içinde ki  ANSEL = 0; ve ANSELH = 0; hata veriyor. Bende bu sebeple bunları devre dışı bıraktım.
  • Ekranı bağladığınız pinlerden bazıları AN - analog pinlere denk geliyorsa bu ayarları PIC16f877A ya göre yapılması gerekli yada sizin kullandığınız PIC hangisi ise söylerseniz ayarlara bakalım
  • Ayrıca elinizdeki devre şeması ile yazılım tutarlımı yani yazılımda portlar belirtilmiş, doğru porta doğru pini bağladığınızı tekrar kontrol edebilirseniz iyi olur.
  • Aşağıda eksik kod öbeğini eklediğim yeni kodlar bulunmaktadır. Bunu da deneyebilirseniz sevinirim

Şu kişiden alıntılanmıştır: Furkan_Geri_Geldi 

Send fonksiyonunda gözümden kacmadıysa. LCD kurduktan sonra I2C stop sinyali gönderilmiş. For icinde yazma yaparken. Start verilmeden veriler yazılmış. bu yüzden yazmıyor olabilir.

  • Dediğin doğru ancak çözüm doğru değil. Fonksiyon öncesine I2C start koyasada fonksiyona girince bir start ve stop döngüsü oluşuyor sonrası start fonksiyonu çağırılmamış
  • Son ekleme ile dediğin yere I2C_Start eklendi.

İyi Çalışmalar

unsigned short take;
void send()
{
unsigned char dizi[9]="WELCOME";
unsigned char i=0;
PORTb = 0x00;
I2C1_Start(); //Comienzo de la comunicación I2C ...
I2C1_Wr(0x46); //...con la dirección del PIC esclavo...
I2C1_Wr(0x01); // Envia dato
I2C1_Wr(0x11); // Envia dato
I2C1_Stop(); // issue I2C stop signal
delay_us(125);
PORTb = 0x01;
delay_us(2000);
PORTb = 0x00;
delay_us(665);
I2C1_Start(); //Comienzo de la comunicación I2C ...
I2C1_Wr(0x46); //...con la dirección del PIC esclavo...
I2C1_Wr(0x0F); // Envia dato
I2C1_Wr(0x90); // Envia dato
I2C1_Wr(0x7F); // Envia dato
I2C1_Wr(0x55); // Envia dato
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0x60); // Envia dato
I2C1_Wr(0x01); // Envia dato
///DATA TO LCD
/*
  Not: döngü ilerledikçe "i" değişkeni 0 dan başlar ve artar dizinin kaçıncı elemanı olacağını [] içerisinde belirttik
buna göre döngü ilk başladığında dizi[0] olacak ve her döngü tekrar edince bir sefer artacak
bu mantık ile her seferinde sırası ile dizinin bir elemanı I2C fonksiyonu ile yazdırılacaktır.
*/
for(i=0;i<9;i++)
  {
     I2C1_Wr(dizi[i]);
  }
I2C1_Stop(); // issue I2C stop signal
delay_us(125);
}
void main(){
//ANSEL = 0; // Configure AN pins as digital I/O
//ANSELH = 0;
PORTb = 0x01; //=0000 0001 MRQ UCU
TRISb = 0x00; // Configure PORTB as output
PORTD = 0;
TRISD = 0x01;
PORTE = 0;
TRISE = 0x00;
I2C1_Init(12500); //I2C1_Init(10000); initialize I2C communication
while (1) {
if (RD0_bit==0)
{
send();//başta belirtilen fonksiyon burada çağırılmaktadır
}
PORTE = 0x04;
delay_ms(200);
PORTE = 0x00;
delay_ms(200); }
}

 

Pinlerle ilgili sorun yok.Hafta sonuna kadar uğraşacağım. Olmazsa yardımınızı tekrar talep edeceğim.

 


Hiçbir şahsi sosyal medya hesabım yoktur
Yanlızca tanıtım amaçlı sosyal hesaplar kullanılmaktadır
İletişim için sadece soru-cevap forumunu kullanınız