Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: f628 - 20 Ağustos 2012, 17:35:41

Başlık: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 20 Ağustos 2012, 17:35:41
öncelikle merhaba arkadaşlar;

eğer değişkenimi char olarak tanımlar ve içine  tek harflik bir değer atarsam sıkıntı çıkmıyor, lcd'e yazabiliyorum lakin değişkenim 2 harf ve üstü olursa sorun çıkıyor, char tanımlasam kabul etmiyor, string zaten tanımlayamıyorum, ne yapacağımı bilemedim.

tavsiyesi olan birisi olur diye danışayım dedim.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: tacettin - 20 Ağustos 2012, 19:20:21
yazdığın programı eklersen yardım edecek çok hocam olacağına inanıyorum...
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 20 Ağustos 2012, 22:16:25
****

#include <16F628A.h>

#FUSES XT,NOWDT,INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOMCLR,NOLVP,NOCPD                   

#use delay(clock=4000000)

#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

char z='b';

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
    set_tris_b(0x00);
    lcd_init();
   
    basla:
   
      lcd_send_byte(0,0x0d);
      lcd_gotoxy(1,10);
      printf(lcd_putc,"\f %c ",z);
      delay_ms(200);
   
    goto basla;
}

****

bu program çalışıyor, lcd ekran da 'b' harfini görüyorum lakin z değişkenine herhangi bir kelime yazarsam program derlenmiyor.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 20 Ağustos 2012, 23:12:37
z değişkenini    char z[]="12345678" diye tanımla printf() fonksiyonunda     
for(i=0;i<8;i++)
printf(lcd_putc,"\f %c ",z);
yap tabi program içerisinde i değişkeninide tanımla.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 20 Ağustos 2012, 23:13:55
CCS C bilgim dışında. Ama bu compiler birazcık standartlara uyuyorsa, senin printf biraz garip geldi bana.
Şuraya bir göz atarsan:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/ (http://www.cplusplus.com/reference/clibrary/cstdio/printf/)
Onun dışında C'de goto komutu no-go! olarak sayılır. Hele hele bir döngü oluşturmak için kullanırsan, adamı döverler :)


while(1)
{
   bla bla;
   bla bla;
}


Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 20 Ağustos 2012, 23:18:27
tamamdır arkadaşlar, teşekkür ederim her iki cevap için de...
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 20 Ağustos 2012, 23:21:01
Alıntı yapılan: arm-beginner - 20 Ağustos 2012, 23:13:55
CCS C bilgim dışında. Ama bu compiler birazcık standartlara uyuyorsa, senin printf biraz garip geldi bana.
Şuraya bir göz atarsan:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/ (http://www.cplusplus.com/reference/clibrary/cstdio/printf/)
Onun dışında C'de goto komutu no-go! olarak sayılır. Hele hele bir döngü oluşturmak için kullanırsan, adamı döverler :)


while(1)
{
   bla bla;
   bla bla;
}

lcd_gotoxy   fonksiyonu ccs c nin lcd imleci için özelleştirdiği bir fonksiyon ccs c  de ki printf fonksiyonu standart kütüphaneden azcık farklı onu da lcd ye göre özelleştirmiş ccs c yi yazan elemanlar zaten forumda hi-tech ve c18 e geçişin başlıca sebepleri bunlar bu dil standartların dışına kaçabiliyor bazen.Altta ki goto ifadesi de arkadaş Asm den geçmiştir büyük ihtimal alışana kadar devam etsin bence öyle ne dersiniz ?
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: atomx - 21 Ağustos 2012, 16:59:44
Alıntı yapılan: f628 - 20 Ağustos 2012, 22:16:25
****

#include <16F628A.h>

#FUSES XT,NOWDT,INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOMCLR,NOLVP,NOCPD                   

#use delay(clock=4000000)

#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

char z='b';

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
    set_tris_b(0x00);
    lcd_init();
   
    basla:
   
      lcd_send_byte(0,0x0d);
      lcd_gotoxy(1,10);
      printf(lcd_putc,"\f %c ",z);
      delay_ms(200);
   
    goto basla;
}


****

bu program çalışıyor, lcd ekran da 'b' harfini görüyorum lakin z değişkenine herhangi bir kelime yazarsam program derlenmiyor.

sanırım söyle bi sorun var.


char z; ' tanımladıktan sonra

void main()
{
z="abc";
}


olmalı
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 21 Ağustos 2012, 19:14:00
Alıntı yapılan: atomx - 21 Ağustos 2012, 16:59:44
sanırım söyle bi sorun var.


char z; ' tanımladıktan sonra

void main()
{
z="abc";
}


olmalı

evet sorun buydu ve arkadaşların yardımıyla hallettim sorunu lakin şimdi de başka bir sorun açığa çıktı, tanımladığım değişkeni ekrana yazdıramıyorum. örneğin;


z="abc";

   while(1)
{
for(x=0;x<3;x++){
printf(lcd_putc,"\%c",z);}
}
}

yazınca karşıma çıkan ekranda doğal olarak 'abc' harflerini değil bütün ekranı kaplayan a harflerini görüyorum, yan harfe nasıl geçeceğimi bilemiyorum.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 21 Ağustos 2012, 19:39:11
Sende gitmişin C'nin en zor konularından birisine takılmışın: pointer işi. :)
Bence ilkönce şunları bir dene, sonra devam ederiz: (while döngeyi şu an kaldır.)


z="abc";  // eminmisin? Bence z[] = "abc" olmasi laizm, ama dedigim gibi CCS 'yi tanimiyorum
printf(lcd_putc,"\%c",z[0]);
printf(lcd_putc,"\%c",z[1]);
printf(lcd_putc,"\%c",z[2]);

Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 21 Ağustos 2012, 19:45:44
Merhaba,

CCS kullaniyorum. Ama C dilieyle bazı yanlış bilgiler var onları acıklayayım.

char z='b'; Bir byte bilgi tanımlamış sın.

'b' yerine bir sayı belirte bilirdin, bir fark olmazdı. Ancak z değişkene z="abc" şeklinde bir atama yapamazsın. Cünkü "abc" nin  türü char * dır. yani bir pointerdir. senin tanımladığın z nin türü ise char değişken dir. Eğer yazı saklamak istiyorsanız, o zaman söyle yazmalısınız.

char * z="b"; // burda string yanı yazı tanımlamışsın.

şeklinde olursa o zaman tamamen farklı bir tür olur. Onuda çok rahat ekrana basabilirsin.

O zaman şöyle yazabilirsin.

printf(lcd_putc,"\f %s ",z); // s parametresi string için kullanılıyor.

Selamlar

Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 21 Ağustos 2012, 20:20:23
PIC konusunda tamamen bilgisiz olduğum için soruyorum: C89 veya C99 standardına uygun bir compiler yokmu PIC dünyasında?
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 21 Ağustos 2012, 20:58:30
Alıntı yapılan: arm-beginner - 21 Ağustos 2012, 20:20:23
PIC konusunda tamamen bilgisiz olduğum için soruyorum: C89 veya C99 standardına uygun bir compiler yokmu PIC dünyasında?

Olmaz olur mu, elbette var.
Örneğin: Microchip'in kendi derleyicileri öyledir.
Veya IAR derleyicisi zaten ANSI-C derleyicisidir.

Hatta Microchip pic32 için kullandığı derleyicisinin ana cekirdeği, gcc den alınmadır.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 21 Ağustos 2012, 21:18:38
Hmmm, peki o zaman neden bu biraz standart dışı olan compiler'ı kullanıyorsunuz?
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 21 Ağustos 2012, 22:27:57
Alıntı yapılan: arm-beginner - 21 Ağustos 2012, 21:18:38
Hmmm, peki o zaman neden bu biraz standart dışı olan compiler'ı kullanıyorsunuz?

Alıntı yapılan: arslan74Merhaba,

CCS kullaniyorum. Ama C dilieyle bazı yanlış bilgiler var onları acıklayayım.

mesaj birleştirme:: 21 Ağustos 2012, 22:31:28

Merhaba,
Alıntı Yap
CCS kullaniyorum. Ama C dilieyle bazı yanlış bilgiler var onları acıklayayım.

Acele yazmadan bazı imla hatası yapmışım.
Düzeltilmiş hali.
Alıntı Yap
CCS kullanmıyorum. Ama C diliyle bazı yanlış bilgiler var onları acıklayayım.

Selamlar
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 22 Ağustos 2012, 00:35:58
Alıntı yapılan: AsHeS35 - 20 Ağustos 2012, 23:12:37
z değişkenini    char z[]="12345678" diye tanımla printf() fonksiyonunda     
for(i=0;i<8;i++)
printf(lcd_putc,"\f %c ",z);
yap tabi program içerisinde i değişkeninide tanımla.
köşeli parantezlerin içinde ki [ i ] kayboylmuş kod eksik gözüküyor benim yazdığım doğrusu şöyle olacak:
char z[]="12345678" diye tanımla
for(i=0;i<8;i++)
printf(lcd_putc,"\f %c ",z[ i ]);
----------------------------
köşeli parantezler içerisinde ki z[ i ] olacak forumda sanırım bir karaktere denk gelmiş o alıntı yaparak bakarsan göreceksin.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 22 Ağustos 2012, 10:02:28
@arslan74
:D
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 22 Ağustos 2012, 10:49:16
Alıntı yapılan: AsHeS35 - 22 Ağustos 2012, 00:35:58
köşeli parantezlerin içinde ki [ i ] kayboylmuş kod eksik gözüküyor benim yazdığım doğrusu şöyle olacak:
char z[]="12345678" diye tanımla
for(i=0;i<8;i++)
printf(lcd_putc,"\f %c ",z[ i ]);

----------------------------
köşeli parantezler içerisinde ki z[ i ] olacak forumda sanırım bir karaktere denk gelmiş o alıntı yaparak bakarsan göreceksin.

O şekilde yazmak karışık ve zahmetli.
char z[]="12345678";
printf(lcd_putc,"\f %s ",z);


Bu şekilde daha basit, ayrıca yazının uzunluğu değişse bile kendisi bütün yazıyı yazacaktır. Yukardaki koddaki gibi yazının uzunluğuna göre for döngüsünü ayarlamak zorunda kalmassın.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arm-beginner - 22 Ağustos 2012, 13:04:14
@arlan74
AsHeS35 isimli üyeyi adım adım pointer konusuna yakınlaştıracatım.
Hep unutuyorum: biz Türkler her zaman kısa ve kolay yolu kullanırız. Zahmetli yol diğerler için tasarlanmıştır ;)


Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 22 Ağustos 2012, 16:29:50
Alıntı yapılan: arm-beginner - 22 Ağustos 2012, 13:04:14
@arlan74
AsHeS35 isimli üyeyi adım adım pointer konusuna yakınlaştıracatım.
Hep unutuyorum: biz Türkler her zaman kısa ve kolay yolu kullanırız. Zahmetli yol diğerler için tasarlanmıştır ;)

Sen yine arkadaşımızı pointer konusuna yakınlaştırabilir sin, bu konuda seni engelleyen hiçbir şey yok.

Unutkanlık, dalgınlık ve işin kolayını seçmek bütün insanların genel özelliğidir. Bunu sadece Türklere özgü olarak indirgeme,aksi takdirde çok büyük hata yapmış olursun.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 22 Ağustos 2012, 16:53:48
Alıntı yapılan: arm-beginner - 22 Ağustos 2012, 13:04:14
@arlan74
AsHeS35 isimli üyeyi adım adım pointer konusuna yakınlaştıracatım.
Hep unutuyorum: biz Türkler her zaman kısa ve kolay yolu kullanırız. Zahmetli yol diğerler için tasarlanmıştır ;)
Bilginin kötüsü olmaz anlatın hocam dinliyorum.

mesaj birleştirme:: 22 Ağustos 2012, 16:55:57

Alıntı yapılan: arslan74 - 22 Ağustos 2012, 10:49:16
O şekilde yazmak karışık ve zahmetli.
char z[]="12345678";
printf(lcd_putc,"\f %s ",z);


Bu şekilde daha basit, ayrıca yazının uzunluğu değişse bile kendisi bütün yazıyı yazacaktır. Yukardaki koddaki gibi yazının uzunluğuna göre for döngüsünü ayarlamak zorunda kalmassın.
Hocam %s çağırım şekli için "string.h" kütüphanesini dahil edip etmediğimizi hatırlayamadım o yüzden öyle hızlıca karaladım.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: arslan74 - 22 Ağustos 2012, 19:26:09
Merhaba,

%s parametresi printf fonksiyonula ilgili dir. Eğer printf 'i kullanabiliyorsa o zaman %s parametresini de kullanabilir.

<string.h> kütüphanesi string ve memory işlemleri yapmak için gerekli.

Aşağıdaki linke ayrıntılı acıklamış:
http://www.cplusplus.com/reference/clibrary/cstring/ (http://www.cplusplus.com/reference/clibrary/cstring/)

Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 23 Ağustos 2012, 11:47:30
teşşekkürler arkadaşlar, sorun;

char z[]="12345678" diye tanımla
for(i=0;i<16;i++)
printf(lcd_putc,"\%c ",z[ i ]);

şeklinde halloldu.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: fatih6761 - 23 Ağustos 2012, 12:56:11
CCS de char 1 byte'lık değişkendir.16 adet karakter indekslemeye kalkarsanız bellek sorunuyla karşılaşırsınız.PIC te bellek koruma ünitesi olmadığı için Z işaretçisinin belirttiği adresten sonraki 8 byte "12345678" iken, geriye kalan 8 bytelık alanda "â?^1%&3=" gibi bir veride olabilir.En uygun yöntem printf'nın %s parametresini kullanmaktır.

char z[] = "12345678";
printf(lcd_putc, "%s", z);

dir.CCS de bu şekilde çok uygulama yaptım.Hepside gayet güzel çalıştı.En kötü uygulamanızı yapabilirsiniz.Printf nin yaptığı şeyde pointer'dan okunan veri 0x0 olana kadar ekrana( veya LCD'ye) karakter yazdırmaktır.Sondaki '\0' karakterini ( bu 0x0 demektir ) C derleyicileri otomatik yerleştiririr.Assembly dillerinde de kendiniz en sona bir 0 karakteri koyarsınız...
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 23 Ağustos 2012, 16:46:25
Alıntı yapılan: f628 - 23 Ağustos 2012, 11:47:30
teşşekkürler arkadaşlar, sorun;

char z[]="12345678" diye tanımla
for(i=0;i<16;i++)
printf(lcd_putc,"\%c ",z[ i ]);

şeklinde halloldu.
Bu kullanım çok doğru bir kullanım değil haberiniz olsun string uzunluğunu kafanızda tutmak istemiyorsanız şöyle yapabilirsiniz:
char z[]="12345678"
int uzunluk;
uzunluk=sizeof(z)/sizeof(char);
for(i=0;i<uzunluk;i++)
printf(lcd_putc,"\%c ",z[ i ]);
ya da
char z[]="12345678"
for(i=0;i<100;i++)
{
if(z[ i ] ==\0)
break;
printf(lcd_putc,"\%c ",z[ i ]);
}

şeklinde olabilir lakin 1. kullanım istediğiniz gibidir ikincisi hoş değildir ama en garantisi
char z[]="12345678"
printf(lcd_putc,"\%s",z);
dir
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: f628 - 23 Ağustos 2012, 19:40:12
sorun daha önce attığım mesajda ki programla hallolmuştu lakin madem 'o çok güvenilir değil bunları kullan' diyorsunuz, tamamdır onları kullanırım bundan sonra. teşekkürler tekrardan yardımlarınız için.
Başlık: Ynt: lcd ye sözel değişken yazdırma sorunu
Gönderen: AsHeS - 23 Ağustos 2012, 20:13:57
Alıntı yapılan: f628 - 23 Ağustos 2012, 19:40:12
sorun daha önce attığım mesajda ki programla hallolmuştu lakin madem 'o çok güvenilir değil bunları kullan' diyorsunuz, tamamdır onları kullanırım bundan sonra. teşekkürler tekrardan yardımlarınız için.
Deitel&Deitel C ve C++ diye bir kitabı var ANSI C yi ben dahil çoğu öğrenci o kitaptan sökmüştür size de tavsiye ederim güzel kitaptır sorularını falanda oturun çözün öyle boş beleş sorular yoktur içerisinde kaliteli sorular mevcuttur öneririm hatta o kitaptan sonra CCS yi bırakıp Hi-Tech ya da C18 e geçmenizi öneririm çünkü CCS standartlardan biraz farklı.