Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => Konuyu başlatan: Karamel - 24 Ağustos 2014, 23:05:37

Başlık: char degiskeni degistirme
Gönderen: Karamel - 24 Ağustos 2014, 23:05:37
merhaba. mikroc de char txt1[] = "mikroElektronika"; seklinde tanimladigim txt1 degiskenini Lcd_Out(1,1,txt1);  ile ekrana basabiliyorum. programin icersinde txt1 degiskenini  txt1[] = "PicProje"; diye degistirmek istedigimde invalid expression hatasi veriyor. bu degiskenin icersini yazilim icersinde degistirme sansim yokmu?
Başlık: Ynt: char degiskeni degistirme
Gönderen: baran123 - 24 Ağustos 2014, 23:28:51
 txt1[] = "PicProje"; yerine  txt1 = "PicProje"; yaparsan hata vermez ama bu şekildede string yapmış olursun biraz araştır bence
Başlık: Ynt: char degiskeni degistirme
Gönderen: MrDarK - 24 Ağustos 2014, 23:31:24
strcpy gibi fonksiyonlar var onları kullanmanı tavsiye ederim. Bu arada da txt array'in uzunluk sayısını yazsan iyi olur.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 24 Ağustos 2014, 23:39:05
Hocam uzunluk yazinca lcd deki karakerler sacmaliyor. İlginc bir durum. yarin txt1="picproje"; yi bir deniyeyim.

mesaj birleştirme:: 25 Ağustos 2014, 00:36:42

Alıntı yapılan: baranekrem9 - 24 Ağustos 2014, 23:28:51
txt1[] = "PicProje"; yerine  txt1 = "PicProje"; yaparsan hata vermez ama bu şekildede string yapmış olursun biraz araştır bence

hocam dayanamadim ve kalktim denedim.   txt1 = "PicProje"; seklinde yazinca non-Ivalue hatasi veriyor. yani icerik istiyor. icerik yaziyorum bu seferde sacmaliyor. ilginc bir durum.

mesaj birleştirme:: 25 Ağustos 2014, 00:42:28

Alıntı yapılan: MrDarK - 24 Ağustos 2014, 23:31:24
strcpy gibi fonksiyonlar var onları kullanmanı tavsiye ederim. Bu arada da txt array'in uzunluk sayısını yazsan iyi olur.

hocam strcpy de iki adet char array i birbirine kopyalamak icin. benim zaten char txt1[] = "mikroElektronika";  ben bu degiskenin icersini "abcdefgha"; seklinde kolayca degistirebilmek istiyorum.

son olarak degiskeni su sekil yazinca derleyici sorun cikartmiyor.  txt1[15] = "mikroElektronika";  bu seferde bazi karakterler bozulmus oluyor. mesela ekrana mikroElektronika degilde mipooElektr7/ka seklinde cikiyor.

mesaj birleştirme:: 25 Ağustos 2014, 01:12:34

sorumun cevabini buldum. http://stackoverflow.com/questions/14396202/cannot-modify-char-array (http://stackoverflow.com/questions/14396202/cannot-modify-char-array) surada anlatiliyor. cozum mesajida su:

You cannot use character array like that after declaration. If you want to assign new value to your character array, you can do it like this: -

strcpy(message, "bar");


mesaj diyor ki, tanimlamadan sonra bu sekil yazayim degissin olmuyor. eger degistirmek istiyorsak yukaridaki ornek gibi yapmaliyiz.

mesaj birleştirme:: 25 Ağustos 2014, 01:26:35

bu sekilde yapincada bir kisimda yine sorunlar cikmaya basliyor. amazim lcd menusunu secenek ile ingilizceye dondurmek. eger degiskene dokumazsam hic sorun yok. degiskene txt1[0] = 'A'; seklinde dokunursam yine sorun yok. boyle cevirme yapamam. 60 civarinda menu icin tanimlanmis degiskenler var. bunlari "abcdefgh"; seklinde cevirmem gerekli. asagiya beceremedigim basit bir ornegi yaziyorum.


char txt1[] = "mikroElektronika1";
char txt2[] = "mikroElektronika2";
char txt3[] = "mikroElektronika3";
char txt4[] = "mikroElektronika4";
char txt5[] = "mikroElektronika5";
char txt6[] = "mikroElektronika6";
char txt7[] = "mikroElektronika7";
char txt8[] = "mikroElektronika8";


tam burada yazilanlari 1 sn ara ile lcd ye basmayi deneyin. sorun yok. hepsi normal gozukur.


strcpy(txt1,   "      Pic Proje       ");
strcpy(txt2,   "      Pic Proje       ");
strcpy(txt3,   "      Pic Proje       ");
strcpy(txt4,   "      Pic Proje       ");
strcpy(txt5,   "      Pic Proje       ");
strcpy(txt6,   "      Pic Proje       ");
strcpy(txt7,   "      Pic Proje       ");
strcpy(txt8,   "      Pic Proje       ");


simdi burada lcd ye basmayi deneyin.  "      Pic Proje       " icerigi  "  7i Pic Pzdje       " gibi bozuluyor.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Gökhan BEKEN - 25 Ağustos 2014, 01:32:36
Alıntı yapılan: Karamel - 24 Ağustos 2014, 23:05:37
txt1 degiskenini  txt1[] = "PicProje"; diye degistirmek istedigimde invalid expression hatasi veriyor.
c dilinde böyle birşey mümkün değil. C++ gibi üst seviye dillerde string değişken türü vardır ama c dilinde yoktur. Bu yüzden dizi işlemleri ile kendiniz yapmalısınız veya standart "string.h" fonksiyonlarını kullanmalısınız.
Örneğin değişkeni şöyle tanımladınız txt1[]="hede";
içeriği "picproje" yapmak için şunu yazmanız yeter: değiştirmek için sprintf(txt1,"picproje");
strcpy fonksiyonunu da kullanabilirsiniz: strcpy (txt1,"picproje");

eğer eski veri silinmesin, peşine eklesin isterseniz: strcat(txt1,"picproje");
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 25 Ağustos 2014, 01:34:24
hocam strcpy (txt1,"picproje"); te sorunlar oluyor bazi karakterler bozuluyor.

mesaj birleştirme:: 25 Ağustos 2014, 01:43:00

hocam sprintf(txt1,"picproje"); te bozulmalar daha az ama yinede var. cok ilginc bir durum. 60 degiskenin 40 i normal degistiriliyor. kalan 20 sinin icersi bozuluyor. sanirim mikroc bu konuda sinifta kaldi.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Gökhan BEKEN - 25 Ağustos 2014, 01:50:41
tanımlarken boyut belirtmeniz gerekiyor. char dizi[32]="asdasdas"; yapın mesela
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 25 Ağustos 2014, 02:13:20
hocam  o zamanda yine sikinti cikiyor. acayip bir sorun. olmamasi gereken birsey. yani diyorum ya. %80 i normal ama kalan degiskenler bozuluyor. yarin bunu duzgun kafa ile bir dusuneyim ben. belki bir yerlerde hata yapiyorumdur. cozum bulamazsak mikroe ye de yazarim.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Gökhan BEKEN - 25 Ağustos 2014, 02:19:27
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/lcd_library.htm (http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/lcd_library.htm)
adresinde prototip olarak şöyle yazmış: void Lcd_Out(char row, char column, char *text);
şöyle denermisiniz:
char* txt1="deneme";
sprintf(txt1,"picproje");
Lcd_Out(1,1,txt1);

sorunun sprintf veya başka bir string fonksiyonundan kaynaklanıp kaynaklanmadığından emin olmak için şunu da deneyebilirsiniz:
txt1[0]='p'; txt1[1]='i'; txt1[2]='c'; txt1[3]='p'; txt1[4]='r'; txt1[5]='o'; txt1[6]='j'; txt1[7]='e'; txt1[8]=0;
Başlık: Ynt: char degiskeni degistirme
Gönderen: MrDarK - 25 Ağustos 2014, 07:24:49
Bazen bu tarz hazır fonksiyonları kullanmak başa bela olabiliyor Karamel ; sana tekrar tavsiyem txt buffer uzunluğunu sabit tut, buffer güncellemeden önce tüm mevcut bufferin tüm elemanlarına 0x00 yükle, sonra str fonksiyonlarıni dene, yine problem çıkarsa özel bir fonksiyon yazıp buffer temizlendikten sonra verileri tek tek girecek şekilde alt program yazarız
Başlık: Ynt: char degiskeni degistirme
Gönderen: kimlenbu - 25 Ağustos 2014, 09:08:38
Buffer'ı karakter sayısından 1 fazla yap. Buffer'ın son karakterini '\0' olarak atayıp dene. Hatalı karakterlerin kaybolması gerekiyor.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 25 Ağustos 2014, 10:06:42
hocam simdi cok ilginc birsey paylasacagim. bahsettigim uzere 2x16 lcd uzerindeki menuyu Turkce yada Ingilizce yapmaya calisiyordum. bu yuzden 2 adet 16 lik icerigi olan degiskenlerim hep vardi. yani asagidaki gibi.

char Dil[]             = "<      Dil     >";
char Dil2[]            = "                ";


mesela yukaridaki menu dil menusunun. dil2 degiskenine ne gerek var diyebilirsiniz. Turkcede Dil kelimesi uc harfli olabilir ama farkli bir dilde 14 harften daha fazla olabilir. benim her zaman ozgurce kullanabilecegim alt satirimin olmasi gerekir. Yani Turkce secili iken alt satir bosluk olarak kullaniliyor olmasi mantiksiz bir hareket degil. gelelim sorunun kaynagina. Dil2 degiskeni gibi icersinde sadece bosluk olan degiskenleri sprintf yapmayinca sorun ortadan kalkti. eger bunlarida sprintf yaparsam degiskenlerin icersi bozuluyorlar. bunun deneyini yapmak isteyen arkadaslar 3-5 degisken ile denerlerse sorun olusmayabilir. soyle 50-60 degisken uzerinde oynayinca tamami bosluktan olusan degiskenlerde sorunlar oluyor. cok acayip bir durum oyle degilmi?

mesaj birleştirme:: 25 Ağustos 2014, 11:13:15

simdi daha farkli bir sorun var. uarti programimin initialize kisminda soyle UART1_Init(9600); aciyorum. sonra programimin herhangi bir yerine. bakin burasi cok onemli. mesela butonun basildiginda aktif olan fonksiyonun icersine yaziyorum ama butona hic basmadigim icin dolayisi ile icersindeki kodlar hic islenmiyor. herhangi bir yere UART1_Write('A'); yazdigim zaman yine lcd icin kullandigim degiskenler sacmaliyor. UART1_Write('A'); yi kaldirinca hersey normale donuyor.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 31 Ağustos 2014, 20:07:36
birsey daha sormak istiyorum. sprintf i kullaninca mcu nun rom undan 8234 byte kullaniliyor. buda hafizamin %20 si gibi birsey. sprintf e bir cozum getirmek gerekli. bu isi nasil halledebilirim?
Başlık: Ynt: char degiskeni degistirme
Gönderen: kimlenbu - 31 Ağustos 2014, 20:17:18
Kendi fonksiyonu yazabilirsin anca, sprintf i bir kere kullandığında 8k gider, sonraki her kullanımında bu kadar gitmez, defalarca kullanabilirsin. Eğer kendin yazmayacaksan 8k'yı gözden çıkaracaksın.
Başlık: Ynt: char degiskeni degistirme
Gönderen: engerex - 31 Ağustos 2014, 20:38:28
MikroPascal kullanırken bende de şöyle bir şey oluyordu.

int1 := 123;
if i1 = 123 then UART1_Write('A');

normalde koşul %100 yerine gelmesi gerekiyor. Görünürde öyle ama her zaman öyle olmayabiliyor. Araya alttaki gibi alakasız bir satır eklersem koşul yerine geliyor. Çok ilginç. Çok eksi versiyonlarda karşıma çıkıyordu. Şu an düzelmiştir diye umut ediyorum.

int1 := 123;
int99 := 5;
if i1 = 123 then UART1_Write('A');
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 31 Ağustos 2014, 20:42:33
Alıntı yapılan: kimlenbu - 31 Ağustos 2014, 20:17:18
Kendi fonksiyonu yazabilirsin anca, sprintf i bir kere kullandığında 8k gider, sonraki her kullanımında bu kadar gitmez, defalarca kullanabilirsin. Eğer kendin yazmayacaksan 8k'yı gözden çıkaracaksın.

hocam nasil fonksiyon yazabilirim? c dilini bu kadar iyi bilmiyorum.
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 31 Ağustos 2014, 21:59:36
Programı gerçek devrede mi
yoksa simulasyonda mı deniyorsun?

Birde örnek vereyim,
biraz önce denediğim, (mikroc for pic)
iki dizinin içeriğini basitçe değiştirmek için
kullanılabilecek bir yöntem;


//16f877a için derlendi
//RaMu picproje.org

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
             //123456789abcdef   her mesaj 16 karakterli
char txt1[] = "Birinci Mesaj+++";
char txt2[] = "ikinci Mesaj++++";
char txt3[] = "ücüncü mesaj++++";
char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";

char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main(){


  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
   Lcd_Out(1,1,"gecici dizisi");                 // ilk satıra açıklama yazıyoruz
 
  Lcd_Out(2,1,gecici);                 // gecici dizisinin ilk içeriğini yazdırıyoruz    alt satır
  //satır, sutun, mesaj
  Delay_ms(1000);                         //1 saniye bekle

 
  while(1) {                         // sonsuz döngü
   
    for(i=0; i<17; i++)             //txt1 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt1[i];
    }
   
     //Lcd_Cmd(_LCD_CLEAR);               // Clear display  ilk satırdaki açıklama silinmesin
     Lcd_Out(2,1,gecici);               // gecici dizisinin ilk yeni içeriğini yazdırıyoruz  alt satır
     Delay_ms(1000);                    //1 saniye bekle

//-----------------------------------------------------------------------------

     for(i=0; i<17; i++)             //txt2 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt2[i];
    }

     //Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

//------------------------------------------------------------------------------
//program içinde atama
strcpy (gecici,"program iciatama");
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

  } //ilk while   parantezi

} //main parantezi

//gerekirse isis simulasyon ve mikroc proje dosyasınıda paylaşabilirim.

Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 31 Ağustos 2014, 22:52:16
Alıntı yapılan: RaMu - 31 Ağustos 2014, 21:59:36
Programı gerçek devrede mi
yoksa simulasyonda mı deniyorsun?

Birde örnek vereyim,
biraz önce denediğim, (mikroc for pic)
iki dizinin içeriğini basitçe değiştirmek için
kullanılabilecek bir yöntem;


//16f877a için derlendi
//RaMu picproje.org

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
             //123456789abcdef   her mesaj 16 karakterli
char txt1[] = "Birinci Mesaj+++";
char txt2[] = "ikinci Mesaj++++";
char txt3[] = "ücüncü mesaj++++";
char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";

char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main(){


  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
   Lcd_Out(1,1,"gecici dizisi");                 // ilk satıra açıklama yazıyoruz
 
  Lcd_Out(2,1,gecici);                 // gecici dizisinin ilk içeriğini yazdırıyoruz    alt satır
  //satır, sutun, mesaj
  Delay_ms(1000);                         //1 saniye bekle

 
  while(1) {                         // sonsuz döngü
   
    for(i=0; i<17; i++)             //txt1 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt1[i];
    }
   
     //Lcd_Cmd(_LCD_CLEAR);               // Clear display  ilk satırdaki açıklama silinmesin
     Lcd_Out(2,1,gecici);               // gecici dizisinin ilk yeni içeriğini yazdırıyoruz  alt satır
     Delay_ms(1000);                    //1 saniye bekle

//-----------------------------------------------------------------------------

     for(i=0; i<17; i++)             //txt2 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt2[i];
    }

     //Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

//------------------------------------------------------------------------------
//program içinde atama
strcpy (gecici,"program iciatama");
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

  } //ilk while   parantezi

} //main parantezi

//gerekirse isis simulasyon ve mikroc proje dosyasınıda paylaşabilirim.




hocam bu degisim islemi mantikli degil. nedeni ise su. benim menu icin 60 kadar 16 byte lik char array im var. buda ortalama 1kbyte gibi birsey eder. her dil icin ayri ayri ram e karakter atarsam ram cabucak biter. halbuki sprintf ten kurtulsam ve daha az hafiza kaplayan bir yontem bulsam rom a 8 adet dil daha gomebilirim.

mesaj birleştirme:: 31 Ağustos 2014, 23:03:42

Hocam.birde gercek devre ile calisiyorum. proteus degil.
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 31 Ağustos 2014, 23:25:37
1 kbyte sıkıntı değil,
şöyle yaparsın;



char txt1[] = "Birinci Mesaj+++";
char txt2[] = "ikinci Mesaj++++";
char txt3[] = "ücüncü mesaj++++";
char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";

/*  // yukarıyı şu şekilde tanımlayıp derleyip
//ram rom kullanım farkını gözlemleyin
const char txt1[] = "Birinci Mesaj+++";
const char txt2[] = "ikinci Mesaj++++";
const char txt3[] = "ücüncü mesaj++++";
const char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";          //bu const yapılmayacak
*/



Gerçek devrende problem olabilir bence,
LCD nin RW bacağını kullanmıyorsan,
220 ohm ile GND ye bağla,
1-2-10 k gibi dirençlerle GND ye bağlıyorsan
daha önce bahsettiğin gibi problemler olabilir,
ayrıca işlemci frekansın yüksekse yine problem olabilir,
deneme amaçlı 4MHz kristal ile uygula, yüksekse,
yani sorun biraz donanımsalda olabilir,
beslemede sağlam olsun.
Başlık: Ynt: char degiskeni degistirme
Gönderen: mir_as82 - 31 Ağustos 2014, 23:44:23
Hocam 2 dilde dil başina 30 farklı degişkeni toplamda 60 degiskeni, her bir değişken max 16 karakter uzunlukta olacak şekilde LCD ye yazdirmaya mi calisiyorsun?
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 01 Eylül 2014, 00:16:47
hocam iste bu kesin cozum! en mantiklisi bu. 16 ya kadar sayan tek for dongusu ile bir kerede dili degistirebilirim. hafizadanda %30 gibi bir kazanim saglarim. hocam devrede donanimsal sorun yok. nasil bu kadar emin konusabiliyorum?

birincisi bircok sema inceledim. semalarimi tekrar tekrar kontrol ettim ve burada semalar uzerinden sorular sorup uzman ustadlardan yardim aldim. devremin regulatorunu ve filtrelerini duzgunce ayarladim ve cizdim.

ikincisi karakterlerdeki bozulmalar proteustada oluyor. sprintf ile duzgunce kopyalama yapmiyor mikroc. buda dedigim gibi 3-5 array de degil. 60-70 arrayde 3-5 tanesinin icersi bozuluyor. ilginc bir durum. bu arada program pic18f2525 in rom unun %89 u kullaniyor. program 1750. kod satirinda suan. menuler cok yer kapliyor. ana menuler, alt menuler ve onlarin alt meleri ile iste toplam 30 lcd page i var. bu sorun isler komplike hal almaya baslayinca oldu. yani basit bir lcd ye yazi yazdirma sonrasinda olmus birsey degil.

bende yani programda hata olmadigini nasil anliyorum? sprintf leri

/* 


*/


seklinde kapatinca yani hicbir dil degisimi yapmayip arraylerin icerigini degistirmeye kalkmayinca karakterlerin hicbirisi bozulmuyor. mikroe ye bu konuda bir mail yazmak lazim.
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 01 Eylül 2014, 02:27:59
const ın ne yaptığını çözdün mü?
Hafıza derken başına hangisinden bahsediyorsan onu getir,
yoksa kafa karıştırıcı oluyor.

1700 satır kod olması birşey ifade etmez,
900 satırlık bir kod ile yazdığım programı
aradan zaman geçipte biraz öğrenmeye başlayınca
110 satırlık kod ile yazdım,
bu gibi örnekler çok.


Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 01 Eylül 2014, 02:32:45
hocam suan kodlarda duzenleme yapiyorum. daha anca ingilizceyi yapalidim ve ingilizcede hic sorun cikmadi. sprintf ile 10kb kadar hafiza bosa gidiyordu. string.h icin asagidaki sarkiyi caliyorum. :)

lanet olsun bu hayat (http://www.youtube.com/watch?v=RBN7wyNWgpw#)

mesaj birleştirme:: 01 Eylül 2014, 02:52:35

hocam 1750 satir kod yazmissam demekki cok kotu algoritma ve optimizasyon yapmisim. ben rakam vererek sadece mikroc nin buyuk bir derleme yapmaya calistigini ifade etmek istedim ve sanirim beceremedim. dusunsenize bircok kod satiri, registerlar vs bir bitte sikinti olsa hersey mahvolabilir.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 02 Eylül 2014, 03:42:33
ramu hocam sizin algoritmanizla 13kb yer acildi hafizadan. sizi tebrik ediyor ve size tesekkurlerimi sunuyorum  ::)
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 02 Eylül 2014, 04:26:00
Kullanığın picde orman gibi hafıza var,
48kbyte program, 3.968 byte ram,
13kbyte ın lafı olmaz :)

Programın tamamını gönder bir bakalım.

Karakterlerin bozulması ne durumda?
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 02 Eylül 2014, 04:47:44
hocam proje minik bir ticari proje oldugundan programi buraya yazmam simdilik mumkun degil ama ilkerki zamanlarda minik ticariligi ortadan kalkacak. o zaman yayinlayabilirim programimi :)

hocam birde menuler cok yer kapliyor. 30 sayfa menu icin yazdigim algoritmalar(her sayfada sadece lcd ye yazi yazdirilmiyor. ayrica islemler vs de var.) yaklasik 17kb yer tututor. simdi yaklasik 19kb hafizam var. burayada nrf24L01 haberlesmesi ve ondanda arda kalan kisimlara birkac dil daha eklemek istiyorum.

karakter bozulmasi kalmadi hocam. simdi sizin yonteminizle karakterleri teker teker degistirdigimizden sorun olmuyor. diger turlu sprintf arka planda ne yapiyor bilmiyoruz.
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 02 Eylül 2014, 05:56:59
Peki.
Paylaşmaman senin zararına olur,
ama anlatması zor,
şimdi üstüne düşersemde kokakolanın şifresini buldun
bizde çalmaya çalışıyoruz gibi paranoyaya kapılabilirsin,
durum şu ki aslında daha önce söyleyecektim,
kullandığın picin Türkiye fiyatı 20tl,
devreyi yapıp kullanmayacaksan
hobi eğitim amaçlıysa uygun
ama kullanılacaksa israf
yukarıdada bahsettiğim gibi
aynı işi çok daha ucuz md. ile yapabilirsin
bu konuda kodları paylaşsaydın
kabaca bakıp nelerden kurtarabileceğini göstermeye çalışırdık,
birnevi minik ticari projeye
bedava çalışma arkadaşı oluyor,
ama nedense
bilmiyorum bunu söylemem doğru olurmu ama
bu ticari  kod paylaşamam lafı Türkiyede çok dönüyor,
yabancı forumlarda adam zaten ticari projeyi yapmış
kodları paylaşmış birde
utanmadan böyle yapılıyor diye anlatıyor,
bizdeki durumda senin yaptığın gibi işte,
bana komik geliyor.
Neyse kod senin kalem senin
ben sadece naçizane fikrimi belirttim,
tabiki sende haklısın,
söylediklerimide yanlış anlamayasın,
kötü niyetli anlaşılacak birşey varsa
kötü görmek isteyen gözdendir,
yinede haddimi aştıysam peşinen özür dilerim.
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 03 Eylül 2014, 03:48:02
hocam estagfurullah. hocam proje ticari derken bir iddia meselesi var ortada. yoksa ben daha elektronik proje yapip bu isten para kazanabilecek seviyede degilim. kodlari burada simdi yayimlarsam iddiayi kaybedebilirim. eger ben kendimi yanlis ifade edip sizi uzduysem ozur dilerim....

hocam size birsey daha danismak istiyorum.ana degiskenlerimiz + 3 tane const dil degiskenleri ile topmamda 240 array im oldu. ayrica Dil_Sec(); fonksiyonumda

if(Cihazin_Dili == 1)
{
   burada for ile birlikte convert edilen 60 satir kod

}

ayni bunun 2 si ve 3 u ile suan 3 dil convert edilebiliyor. yalniz bunlar taktir edersiniz ki main.c yi cok sisirdi. bunlari farkli bir c dosyasina kaydedip kutuphane yazmak istedim. Diller.c ve Diller.h yaptim kendime.

diller.c nin icersine,

const char Baslatiliyort[]    = "Baslatiliyor";
.
.
.

seklinde degiskenlerimi tanimladim.


diller.h nin icersinede,

extern const char Baslatiliyort[];
.
.
.

seklinde tanimladim.

programi compile ettigimde asagidaki uyariyi veriyor. painter gerekli falan diyor. ne yapmam lazim hocam?


(http://s29.postimg.cc/jzjr39rar/pointer_soru.jpg) (http://postimg.cc/image/jzjr39rar/)
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 03 Eylül 2014, 05:54:35
Ana proje;
(ilk satırda hemen const ve değişkenlerimizi vs. tanımladığımız
ornek_disari.h dosyasını include ediyoruz)
(programın sonunda ornek_disari.h dosyasının içinde bulunan
ornek1 dizisi lcd ye yazdırılıyor,
include kısmını silip denersen derleme hatası verdiğiini görürsün)


#include "ornek_disari.h"

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
             //123456789abcdef   her mesaj 16 karakterli
             

char txt1[] = "Birinci Mesaj+++";
char txt2[] = "ikinci Mesaj++++";
char txt3[] = "ücüncü mesaj++++";
char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";

/*  // yukarıyı şu şekilde tanımlayıp derleyip
//ram rom kullanım farkını gözlemleyin
const char txt1[] = "Birinci Mesaj+++";
const char txt2[] = "ikinci Mesaj++++";
const char txt3[] = "ücüncü mesaj++++";
const char txt4[] = "sonuncu Mesaj+++";
char gecici[] = "normalde bos++++";          //bu const yapılmayacak
*/


char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main(){


  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
   Lcd_Out(1,1,"gecici dizisi");                 // ilk satıra açıklama yazıyoruz
 
  Lcd_Out(2,1,gecici);                 // gecici dizisinin ilk içeriğini yazdırıyoruz    alt satır
  //satır, sutun, mesaj
  Delay_ms(1000);                         //1 saniye bekle

 
  while(1) {                         // sonsuz döngü
   
    for(i=0; i<17; i++)             //txt1 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt1[i];
    }
   
     //Lcd_Cmd(_LCD_CLEAR);               // Clear display  ilk satırdaki açıklama silinmesin
     Lcd_Out(2,1,gecici);               // gecici dizisinin ilk yeni içeriğini yazdırıyoruz  alt satır
     Delay_ms(1000);                    //1 saniye bekle

//-----------------------------------------------------------------------------

     for(i=0; i<17; i++)             //txt2 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=txt2[i];
    }

     //Lcd_Cmd(_LCD_CLEAR);               // Clear display
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

//------------------------------------------------------------------------------
//program içinde atama
strcpy (gecici,"program iciatama");
     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle

//----------------- ornek dizi tanımları baska dosyada yapıldı -----------------

     for(i=0; i<17; i++)             //ornek1 dizisinin içeriğini, gecici dizisine kopyalıyoruz
    {
    gecici[i]=ornek1[i];
    }

     Lcd_Out(2,1,gecici);               // gecici dizisinin 2. yeni içeriğini yazdırıyoruz
     Delay_ms(1000);                    //1 saniye bekle
//==============================================================================

  } //ilk while   parantezi

} //main parantezi


Yeni eklenecek değişkenlerin bulunduğu .h dosyası içeriği;
(.h dosyası project manager menüsünden
header files kısmında
değişkenlerin tutulduğu bilmemne.h olarak projeye eklenmelidir)
const char ornek1[] = "Dis dosya ornek+";
Başlık: Ynt: char degiskeni degistirme
Gönderen: Karamel - 03 Eylül 2014, 06:24:43
hocam programin basina include etmeyi unutmusum. 20 saatten fazla uykusuz kalmamak lazim. buradan bunu anladim.... :) hocam bu arada ben parca parca c kodu yazmayi bilmiyorum. mesela main.c, adc.c, pwm.c vs vs. anca boyle main sisince bir kismini baska bir yere atiyorum o kadar. onumuzdeki sene icin dusundugunuz derslere bu konuyuda eklermisiniz? bu benim cok sorun yasadigim bir konudur.
Başlık: Ynt: char degiskeni degistirme
Gönderen: RaMu - 03 Eylül 2014, 19:16:54
Tamam önerini yazıyorum kenara,
bununla ilgili anlatım olur.

Benim ihtiyacım olmadığı için pek kullandığım bir yöntem değil,
ama bu yöntemle yazmayı sevenler var,
yinede çok fazla bir etkisi olacağını sanmıyorum,
bence kodu şişirmeden programı yazmak lazım.

Dediğini yapabilmek için bence en kolay yol
öncelikle fonksiyon yazmayı iyi kavramak,
misal dil değiştirme işlemini yapan kodları yazdın,
bunu bir fonksiyon haline getireceksin,
misal şöyle tanımlanacak
dil_degistir(...parametreler...)
{
... dil değiştirme işlemleri...
}

daha sonra bunu bir kütüphane imiş gibi programına ekleyeceksin
ve program içinde
dil_degistir(...parametreler...);
dediğinde dili değiştirmiş olacaksın.
Benim aklıma gelen bu,
mikroc zorunda kaldıkça kullanıyorum,
bence biraz birşeyler öğrendikten sonra hemen ccsc ye geç,
oradanda fazla vakit kaybetmeden mplabx e geç
eğerki bu işi detaylıca iyi seviyede öğrenmek istiyorsan mplabx in çok faydası olur.