Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS'de String İşlemleri

Başlatan sercey, 20 Nisan 2014, 17:29:29

sercey

Merhaba,
PIC18F4620 ile KS0108 Grafik LCD sürüyorum. Amacım rotary encoder'dan gelen veriye göre ekrandaki veriyi değiştirmek.
KS0108 için orjinal CCS kütüphanesini kullanıyorum. Çizgiler, daireler vs. sorunsuz bir şekilde çiziliyor. Ancak kütüphanedeki glcd_text57 fonksiyonunu kullanabilmem için char tipinde dizi tanımlamam gerekli. Tanımları aşağıdaki şekilde yaparsam sorunsuz ekrana basabiliyorum. Fakat farklı türdeki (örneğin integer veya diğer tam sayı türleri) değişkenlerden dönüştürme yapmaya çalıştığımda "bazen" hatalı gösterim oluşuyor, yada dönüşüm gerçekleşmiyor.

Aynı projeyi ilk olarak 16F877 ile yapmaya başlamıştım. Ancak tutarsızlıklar artınca 18F4620'ye geçtim. Önceki PIC'e nazaran çok daha stabil çalışıyor aynı kodlarla. Yinede problem çıkartabiliyor.

char yazi[] = "Karakter Katari";
char *sayi;
int deger = 55;

sprintf(sayi, "%d", deger);
glcd_text57(0,0, yazi, 1, ON);
glcd_text57(0,20, sayi, 1, ON);


Yukarıdaki örnek kod parçası tek başına çalışıyor. Ancak dht11 gibi ısı/nem sensörleri vs eklendiğinde sisteme tutarsızlaşmaya başlıyor. sprintf yerine kullanabileceğim bir dönüştürme yöntemi var mıdır önerebileceğiniz ?

baran123

sorunu tam anlayamadım ama başlıktan anladığım kadarıyla string ifadeleri basamıyorsanız söyle bir şey mevcut diziye atanan değerleri tek tek çağıra bilirsiniz for döngüsü kullanarak biraz daha açarsanız yardımcı olmaya çalışırım kolay gelsin.

Gökhan BEKEN

Alıntı yapılan: sercey - 20 Nisan 2014, 17:29:29
Fakat farklı türdeki (örneğin integer veya diğer tam sayı türleri) değişkenlerden dönüştürme yapmaya çalıştığımda "bazen" hatalı gösterim oluşuyor, yada dönüşüm gerçekleşmiyor.
Sorunun, sprintte olduğuna nasıl kadar verdiniz?
Debug yaptınız mı?
Bence sorun glcd_text57 fonksiyonunda da olabilir. Siz mi yazdınız o fonksiyonu, yoksa ccs'e mi ait?
Özel mesaj okumuyorum, lütfen göndermeyin.

sercey

Alıntı yapılan: baranekrem9 - 20 Nisan 2014, 17:47:50
sorunu tam anlayamadım ama başlıktan anladığım kadarıyla string ifadeleri basamıyorsanız söyle bir şey mevcut diziye atanan değerleri tek tek çağıra bilirsiniz for döngüsü kullanarak biraz daha açarsanız yardımcı olmaya çalışırım kolay gelsin.

dönüşümler haricinde char dizi[] şeklinde tanımladıklarımda bir sorun yok. Tek tek döngü de çözmüyor. Tek basamaklı sayılar için de aynı sorun söz konusu.


Alıntı yapılan: meftun - 20 Nisan 2014, 17:57:30
Sorunun, sprintte olduğuna nasıl kadar verdiniz?
Debug yaptınız mı?
Bence sorun glcd_text57 fonksiyonunda da olabilir. Siz mi yazdınız o fonksiyonu, yoksa ccs'e mi ait?

Elimde Pickit 3 var. CCS ile debug yapamadım. glcd_text57 fonksiyonu ccs'nin kütüphanesindeki hazır fonksiyon.
Sorunun sprintf fonksiyonundan olduğunu tahmin etmemin birkaç sebebi var;
- Aynı kodlar(fuse vs farklı elbette) 16F877 ile çalıştığında takılma/donma sorunlarında bu fonksiyonu kaldırdığımda hiçbir sorun oluşmuyordu. 877'nin belleğinin yetmeyebileceğini düşünerek 18F4620'ye geçtim.
- char degisken[] = "string karakterler"; şeklinde tanımlama yaparsam bu değişkeni direkt olarak glcd_text57 ile sorunsuz basabiliyorum.

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

sadogan


char yazi[] = "Karakter Katari";
char *sayi;
int deger = 55;

sprintf(sayi, "%d", deger);
glcd_text57(0,0, yazi, 1, ON);
glcd_text57(0,20, sayi, 1, ON);

Sorun sayi pointerinin gösterdiği alanla ilgili olabilir.Derleyici yeterince uzunlukla alan ayırmıyor olabilir.
bir dizi tanımlayıp sayi pointerine bu dizinin adresini alarak deneyebilirmisiniz.

sercey

Alıntı yapılan: meftun - 20 Nisan 2014, 20:17:02
Şöyle birşey kullanmak ister misiniz?
http://gokhanbeken.com/sayi-tiplerini-katara-cevirme-fonksiyonu-yazalim

Hocam fonksiyonunuzu denedim. Ancak sonuç değişmedi. Teşekkürler.


Alıntı yapılan: sadogan - 20 Nisan 2014, 21:01:45
char yazi[] = "Karakter Katari";
char *sayi;
int deger = 55;

sprintf(sayi, "%d", deger);
glcd_text57(0,0, yazi, 1, ON);
glcd_text57(0,20, sayi, 1, ON);

Sorun sayi pointerinin gösterdiği alanla ilgili olabilir.Derleyici yeterince uzunlukla alan ayırmıyor olabilir.
bir dizi tanımlayıp sayi pointerine bu dizinin adresini alarak deneyebilirmisiniz.

char sayi[2];
int deger = 55;
sprintf(sayi, "%d", deger);


şeklinde tanımladığımda sorunsuz bir şekilde çalıştı. Teşekkür ederim yardımlarınız için.
Ancak merak ettiğim birşey var; Buradaki problem 2 karakterle çözülebileceği için(dht 11 ile okuduğum veri max 2 basamaklı) sorun yok. Ancak farklı bir projede dinamik bir alan gerekirse derleyicinin bu alanı doğru bir şekilde ayırması için ne yapabilirim ?