Dinamik const dizi oluşturulabilir mi?

Başlatan musti463, 23 Ekim 2013, 14:39:32

musti463

Merhaba,CCS C de bir kereliğine mahsus analog girişten okunacak 70 değer sırayla const float türünde bir dizi içerisine atılabilir mi?
Mustafa Emir SADE

yldzelektronik

const neden?

Const sabit, değiştirilemez değişkenler için diye biliyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

fatih6761

Bir kereye dediğinizden benim anladığım şu:
Program ilk çalışmasında değerleri okuyacak. Sonraki her açılmasında bu değerleri kullanacak.
Doğru mudur? Böyleyse flash alanına veya eeprom'a yazarak yapabilirsiniz.

musti463

#3
Alıntı yapılan: fatih6761 - 23 Ekim 2013, 15:45:31
Bir kereye dediğinizden benim anladığım şu:
Program ilk çalışmasında değerleri okuyacak. Sonraki her açılmasında bu değerleri kullanacak.
Doğru mudur? Böyleyse flash alanına veya eeprom'a yazarak yapabilirsiniz.

Evet aynen anladığınız gibi.Fakat okuduğu değerleri const dizi içine atmasını istiyorum.Daha önceki denemelerimde diziyi const olarak tanımlamadığım zaman işlem sonucunda hatalar oluşuyordu.Dizi nin başına const koyunca düzelmişti bu yüzden const dizi içinde tanımlamak istiyorum zaten const dizi tanımlandıktan sonra kesinlikle değişmemesi gerekiyor.

örnek kod şöyle
  
const float32 anlik_degerler[]={};

for(int x=0;x<5;x++)
   {  
      set_adc_channel(0);
      delay_us(20);      
      uzunluk=read_adc();     
      anlik_degerler[x]=uzunluk*0.0048828125;
      delay_ms(500);
   }

Mustafa Emir SADE

Mr.Java

#4
const olarak tanımlanan dizinde başlangıçta değer verilmediğinden dizinin tüm elemanları default olarak 0 olur ve değişmez. Bunu bu şekilde yapacağına 1 defa oku eeproma yaz gitsin sonra kullan.Ayrıca programın çok kötü kodlanmış.O döngüde ki 500 ms nedir ? float32 ? float tanımlamalar picte adeta katliam yapar.Yerinde olsam hazır bir macro yazardım direk hesaplamaları yapardım.Hem daha stabil hemde yerden kazanmış olurdum.

yldzelektronik

Alıntı yapılan: Fkarizmatik - 23 Ekim 2013, 20:37:00
Yerinde olsam hazır bir macro yazardım direk hesaplamaları yapardım.Hem daha stabil hemde yerden kazanmış olurdum.

Örnek kod paylaşabilir misin?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

kurumahmut

const degiskenler kodun icerisine gomulen degerdir. Kodun kod alanini degistirmesi gerekir ki mevcut teknolojide mumkun değil. Cunku flashlar sektor sektor silinir.

Arkadaslarin flash, eeprom gibi onerilerini kullanabilirsin.

"const olarak tanımlanan dizinde başlangıçta değer verilmediğinden dizinin tüm elemanları default olarak 0 olur ve değişmez." seklinde bir cumle yanlis.

Tagli

Alıntı yapılan: kurumahmut - 24 Ekim 2013, 12:21:54
const degiskenler kodun icerisine gomulen degerdir. Kodun kod alanini degistirmesi gerekir ki mevcut teknolojide mumkun değil. Cunku flashlar sektor sektor silinir.
Mümkün. Pek çok model bunu destekliyor. Flash denilen yer orası zaten. Doğrudur, bloklar halinde silinip yazılır ama bu bir engel değil, sadece biraz uğraştırır.

Alıntı yapılan: kurumahmut - 24 Ekim 2013, 12:21:54
"const olarak tanımlanan dizinde başlangıçta değer verilmediğinden dizinin tüm elemanları default olarak 0 olur ve değişmez." seklinde bir cumle yanlis.
Benim de aklımda 0 olur diye kalmış. Ama bu derleyiciye de bağlı.

const değişkeni hafızada istediğin bir yere yerleştirebilirsin, derleyeciler bunu destekler. Daha sonra da adresi bilinen bu yeri flash yazma yöntemleri ile değiştirebilirsin. Ama burada şöyle bir sorun çıkabilir: Örneğin a const bir eleman ise, derleyici a * 5 gibi bir ifadeyi derleme sırasında hesaplayıp koda o şekilde gömebilir. Bu durumda çalışma anında a'nın değeri değişirse, a* 5 ifadesi eski değeri vermeye devam edecektir.
Gökçe Tağlıoğlu

musti463

#8
peki cevaplar için teşekkürler o zaman elle girecez const dizinin değerlerini,Peki analog girişten 140 tane ondalıklı sayıyı PIC'e okutup bu değerleri metin belgesi şeklinde PC ortamına nasıl aktarabilirim?Hazır devre proje var mı?

mesaj birleştirme:: 24 Ekim 2013, 13:37:40

Alıntı yapılan: Fkarizmatik - 23 Ekim 2013, 20:37:00
const olarak tanımlanan dizinde başlangıçta değer verilmediğinden dizinin tüm elemanları default olarak 0 olur ve değişmez. Bunu bu şekilde yapacağına 1 defa oku eeproma yaz gitsin sonra kullan.Ayrıca programın çok kötü kodlanmış.O döngüde ki 500 ms nedir ? float32 ? float tanımlamalar picte adeta katliam yapar.Yerinde olsam hazır bir macro yazardım direk hesaplamaları yapardım.Hem daha stabil hemde yerden kazanmış olurdum.

öncelikle oradaki gecikme gerekli 500ms lik aralıklarla örnek alınması gerek.float32 ile float zaten eşdeğer neden herkes float'a takmış durumda anlamadım neyin katliamını yapıyor? ROM'un mu?.Hazır makro dediğiniz nedir örnek kod verebilirmisiniz?
Mustafa Emir SADE

yldzelektronik

#9
Alıntı yapılan: musti463 - 24 Ekim 2013, 13:28:53
peki cevaplar için teşekkürler o zaman başka bir yönteme geçmem gerek.O zaman elle girecez const dizinin değerlerini,Peki analog girişten 140 tane ondalıklı sayıyı PIC'e okutup bu değerleri metin belgesi şeklinde PC ortamına nasıl aktarabilirim?Hazır devre proje var mı?

mesaj birleştirme:: 24 Ekim 2013, 13:37:40

öncelikle oradaki gecikme gerekli 500ms lik aralıklarla örnek alınması gerek.float32 ile float zaten eşdeğer neden herkes float'a takmış durumda anlamadım neyin katliamını yapıyor? ROM'un mu?.Hazır makro dediğiniz nedir örnek kod verebilirmisiniz?

Yapmak istediğin bu değerleri log etmek ise seri port veya usb üzerinden -tercihine göre- pcye aktar.Metin belgesi haline getirmek pc tarafındaki programın işin.

Sen okuduğun değerleri ister anlık gönder.Toplam 140 gönderim yap ister hepsini diziye çek toptan diziyi gönder.Sana kalmış.

Pc tarafında seri port için gelen veriyi direkt log eden txt şeklinde kaydeden programlar var.Terminal programı basit bir örnek.

Devre tarafında seri port devresi kolayca bulursun nette.

https://www.google.com.tr/search?q=pic+serial+port&espv=210&es_sm=122&source=lnms&tbm=isch&sa=X&ei=GfloUouKMKiO4ATbzoGwDw&ved=0CAkQ_AUoAQ&biw=1858&bih=995#es_sm=122&espv=210&q=pic+max232&tbm=isch

Adc tarafında nasıl bir devren var bilmiyorum.0-5v range sinyalini direkt adc pinine gir okumanı yap.Okuğun digital değeri ister pc tarafında çevir, ister mcu tarafında.Mcu tarafında işlem yükün çoksa ve pc programını sen yazacaksan pc tarafında çevir.Mcuyu daha az yorarsın.Terminal gibi hazır bir şey kullanacaksan,ve bütün verileri tek seferde göndereceksen hepsini 16bit kaydet gönderirken tek bir kez formüle sok öyle gönder.Daha az yer tutar.
unsigned dizi[140];
float gerilim;

for(char i = 0;i<141;i++){
dizi[i] = read_adc();
gerilim = dizi[i] * 0.00bilmem kaç;
printf("%f",gerilim);
if(i == 139)
printf("\n\r");
}


Şuan aklıma bu geldi.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Alıntı yapılan: kurumahmut - 24 Ekim 2013, 12:21:54
"const olarak tanımlanan dizinde başlangıçta değer verilmediğinden dizinin tüm elemanları default olarak 0 olur ve değişmez." seklinde bir cumle yanlis.

C dil kurallarında başlangıçta değer verilmeyen dizi elemanları 0 olarak atanır.Const sabitinde ise değer başlangıçta ne ise o dur.Program içerisinde değiştirmeye kalktığınızda ise derleyici hata verir.Bu nedenle değeri 0 olur değişmez.

Diğer arkadaşlar ise macro olayini araştırabilirler basit bir konudur.Vaktim olursa eklerim buraya.Float'a neden taktınız diyen arkadaş ise zamanında forumda tartışılmıştı PIC'in belleğini katleden olaylar.Bulabilirseniz araştırın bir.

kantirici

#11
PIC mikrodenetleyicilerin rom hafızasını ram haıza gibi kullanmak için barışsamaıncının sitesinde döküman var oradan yararlanabilirsin.