char degiskeni degistirme

Başlatan Karamel, 24 Ağustos 2014, 23:05:37

Karamel

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.

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

#17
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.

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mir_as82

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?

Karamel

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.

RaMu

#21
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.


Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

#22
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

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.

Karamel

ramu hocam sizin algoritmanizla 13kb yer acildi hafizadan. sizi tebrik ediyor ve size tesekkurlerimi sunuyorum  ::)

RaMu

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?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

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.

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

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?




RaMu

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+";
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Karamel

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.