Bu yazdırdığın 8 bitlik değerler. Float'lar 32 bittir. (https://en.wikipedia.org/wiki/Single-precision_floating-point_format ) Doğrudan bellekten okuyup kopyala:
& degisken diyerek adresini belirttim, sonra (char*) ile burayı bir 8 bitlik bir veri olarak görmesini sağladım. Bundan sonra 32 bitlik verinin başlangıcı olarak sıradan bir array gibi (örnekteki gibi) [] kullanabilirsin veya + - ile pointer aritmetiği uygulayabilirsin. |
teşekkür ederim ilginiz için. A+x neyi ifade ediyor . amacım birazda nedenleri ve mantıklarıda öğrenmek. birde neden 3 defa tekrarlattık? |
A+x olarak kabul etmiyor.. bende for(int x=0;x<4;x++){ EEPROM.write(x,((char*) & degisken } yaptım fakat kabul olmuyor alakasız sayılar çıkıyor . Setup Bölümüne de for(int x=0;x<4;x++){ degisken=EEPROM.read(x); } yaptım. Ama olmuyor. 29.1 gelmiyor. float olarakda yazmıyor kendi yaptığımda . Bi çare derdime bi çare :D |
Değişkenin 0-99.9 arası ise sayi=değişken*10 yap. tam=sayi/10; sonra onda=sayi%10; yani tam=23 ve onda=2 olacaktır. lcd ekranında şöyle yap ("%d,%d",tam,onda) yaparsan ekranında gözükür. |
Arduino ile ilgili Türkçe kaynaklarda EEPROM ile ilgili kısımları okuyun. EEPROM.put() ve EEPROM.get() fonksiyonları ile istediginiz veri turunu EEPROM'a aktarabilirsiniz. Ben kullanmaniz gereken yontemlerden en kolay olani yazayim. float var = 3.14f; EEPROM.put(adres, var); Yukaridaki kisim gerekli veriyi yaziyor. float okunan; EEPROM.get(adres, okunan); Bu da okumak icin gerekli. Eger float degerini daha once o adrese yazmadan okuma yaparsaniz, hatali veya gecersiz float degeri okuyabilir ve bu haliyle programda kullanmaya calisirsaniz kritik hatalara meydan verebilirsiniz. https://www.arduino.cc/en/Reference/EEPROMGet Suna da goz atin bence |
teşekkür ederim az sonra deneyecem fakat bu float değerinin sonuna ^f^ eklememiz gerekiyor dimi . bende degisken =29.1f;gibi sonuçta ben bu değeri buton ile değiştireceğim |
nan değeri yazıyor |
Aslında 2. mesajda arkadaş oldukça güzel anlatmış ama bende göstereyim. Çalışacak olan kod bu; #include <EEPROM.h> "sayi" değişkeni bizim eeproma yazacağımız float değer. Unutmayalım float değer 32bittir yani 4byte yer kaplar. EEPROM'lar ise haliyle dijital cihazlar ve virgüllü sayıyı doğrudan yazmaya müsait değillerdir. O yüzden ondalık sayıları parçalamamız gerekir. Bu kodda tam olarak yaptığımız şey ise float olan 4bytelık veriyi char türünde array olarak ifade ettmek. Bir nevi eeproma yazılabilecek 1 bytelık(8 bitlik) parçalara ayırmak. İstersen bu char* yerine uint8_t* filanda olabilirdi. Gerisi kodu anlayıp anlamamana kalmış. Arkadaşın paylaştığı kodda sormuşsun "A+x" kabul etmiyor diye. Aslında orada "A" eeproma hangi adresten yazılmaya başlanacağı x ise yazılacak 4 byte'ı ifade eden değişken.(1.byte, 2.byte, 3.byte, 4.byte gibi) Kod şunu yapıyor: sayının adresini temp'in adresine eşitliyor. Böylelikle temp içinde float olan sayıyı 4 byte olarak görebileceğiz. İlk for döngüsünde 0. eeprom adresinden başlamak üzere 4 hamlede 4 byte veriyi eeproma yazıyor, seri porttan dışarıya hangi datayı yazdığını gösteriyor ve 4 byte'ı da sıfıra eşitliyor yazdıktan sonra. Temp ile sayi artık aynı adresi paylaşıyor demiştik. Temp'in tüm byteları sıfırlanınca sayı'nında değerinin sıfır olduğunu görmek için seri porttan bakıyor. 2. for döngüsünde eeproma yazdığı 4 byte'ı aynı adreslerden okuyup seri porttan her okuduğu byte'ı gösteriyor. En sonda sayi'nin sahip olduğu değeri seri porttan gösteriyor ve görüyoruz ki ilk değeri ile aynı. Yani eeproma yazıp geri okuyabildik. |
Anlatımlarınız çok güzel. sizin verdiğiniz kodun aynısını da yaptım fakat olmuyor . bu sefer menüler arası hızla geçiş oluyor.vede kaydedileni okumuyor. sizin aynısnı da yaptup setup daki ni değiştirerek de yaptım ne yaptıysam LCD ye yazmıyor ve kaydetmiyor. ya 0.0 gösteriyor ya da nan Hemen Kodların hepsini veriyorum. Belki benimkilerle çakışıyordur. bilmiyorum..
|
loop kısmına for(int x=4;x<8;x++) EEPROM.write(0+x, ((char*) & sicaklik)[x] ); setup kısmına ise for(unsigned int x=4;x<8;x++) *((char*)&sicaklik+x)=EEPROM.read(0+x); yaptım fakat ilk çalıştırdığımda oluyor fakat sonra menüler arası geçiş yapmıyor. acaba LCD ye yazdırırken mi hata yapıyorum. lcd.print(sicaklik,1) denedim lcd.print(sicaklik,DEC) denedim. Ne yapmalıyım üstteki mesajda bütün kodlar var. |
Liu Kang'ın yazdigi gibi yapin. x=4ten <8e kadar ifadesi yanlis. Float zaten 32 bit. Siz baska bellek bolgelerine erisiyorsunuz.EEPROMda baska adrese yazmak icin 0+x yerine de mesela 11+x yazin. |
olayı şimdi anladım 0+x deki 0 adres for döngüsü içindeki x=0 x <4 ün amacı ise 0 adresine float yazması. benim baştan beri anladığım ise float 4 hane x adres 4 den küçük 4 bit e göre kaydetmesi olarak anlamıştım . inşallah bu sefer olur . sabah ilk işim denemek :-) |
o şekilde denedim "nan" değeri çıkıyor. setup kısmına for(unsigned int x=0;x<4;x++) *((char*)&sicaklik+x)=EEPROM.read(0+x); loop kısmına for(int x=0;x<4;x++) EEPROM.write(0+x, ((char*) & sicaklik)[x] ); lcd.print(sicaklik,1); |
İkinci kisimda & isaretinden sonra bosluk koymayin. |
Şu iki fonksiyonu koduna ekle. Her türde veriyi okur yazarsın. bir değişkenin başına & işareti geldiğinde bu değişkenin hafıza adresine gider, adresteki veri ile işlem yapar. * olanlar ise pointer işaretidir. pointer bir değişken türüdür. pointer türü değişkenler hafıza adresi saklayan değişkenlerdir. template ile özel değişken sınıfı tanımlaması yaparak her türde değişkeni alabilirsin diyebilirsin. 8 bit yerine 32 bitlik bir veriyi okuyup yazmak için 4 hafıza adresi kullanırsın. *p değişkeninin değerini artırarak hedef hafıza konumundaki değeri aynen kullanabilirsin. her adres 8 bit taşırken her farklı 8 bitlik değere direkt ulaşmak bu durumda daha elverişlidir. c++ kaynaklarına biraz göz atın derim. bazı kullanımlar kodu epey kolaylaştırır. Uyarı: veri tipinin genişliğini bilerek veri yazdırın. eğer 4 byte uzunluğunda veriyi 10 adresine yazdırıyorsanız bir sonraki veriyi 14 adresinden başlayarak yazdırın. 10-13 arası veri doldurulmuş olur. Bu adresleri değiştirirseniz eski veriniz bozulur. |
teşekkür ederim yardımınız için yazarken setup a EpromOku(adres,veri); loop a EpromYaz(adres,veri); şeklinde yaptım ilk başta oldu yazdı eeprom a fakat 2.de yine nan hatası verdi ? bir de şu şeilde yaptım bundada aynı void EEPROM_Write(float *num, int MemPos) { //float 4byte'lık yer kapsadığı için //float değerini 4 byte'a ayır //ve başlangıç adresinden itibaren // 4 ardışık adrese kaydet byte ByteArray[4]; memcpy(ByteArray, num, 4); for(int x = 0; x < 4; x++) { EEPROM.write((MemPos * 4) + x, ByteArray[x]); } } void EEPROM_Read(float *num, int MemPos) { //float 4 byte'lık yer kapsadığı için //başlangıç adresinden itibaren 4 ardışık adresi oku //ve hedef gösterilen değişkene kaydet byte ByteArray[4]; for(int x = 0; x < 4; x++) { ByteArray[x] = EEPROM.read((MemPos * 4) + x); } memcpy(num, ByteArray, 4); } |
eprom yazma süreci işlemci içinde biraz uzun sürer. bir byte uno da yaklaşık 4ms civarında yaılır. yazma ve okuma arasında biraz bekleme yapman şart. kodu dağınık hale getirip sadece yazma gereken yerde eprom yazmayı kullanırsan hata kalkacaktır. ayrıca eproma sürekli yazma işlemi yapmamalısın. eprom ömrü kısıtlıdır. bir bellek adresi bozulduysa, yazma işlemi gerçekleşemiyorsa farklı bir adresi kullanmaya başlamalısın. |
Bu kullandığınız hangi kütüphane, ne ortamında çalışıyorsunuz, hepsi muğlak bunlardan hiç bahsetmemişsiniz. Öyle zannediyorum ki siz henüz başlangıç aşamasındasınız (ve belli ki yalnış gidiyorsunuz*). Daha önce lucky16'nın bahsettiği fonksiyonlar kütüphanede varsa onları kullanın, bu for döngüleriyle anlamadan uğraşmayın. Yaşadığınız problem lcd.print fonksiyonundadır, bunun hakkındaki açıklamaları incelediniz mi? Girdi parametrelerinin türleri nedir? * Yalnış gidiyorsunuz dedim ya, bana kırılmayın, basitçe izah edeyim. Arduino sendromu dediğim bir durum var. Arduino modası rüzgar gibi eserken kendinizi buna bırakıp savrulmak zorunda değilsiniz. Bu esasen bir kod paylaşım sistemidir ve buna gerçekten hakim olmak isterseniz, dışarda esaslarını bağımsız bir şekilde öğrenmeniz gerekir. Önce C öğrenin. Bunu bilgisayarda bilgisayar için yazılım üreterek öğrenin. Çok iyi Türkçe kaynaklar vardır. Kolayca bulup kurabileceğiniz ve hiç baş ağırtan görsel pencerelerle uğraşmadan basitçe komut satırından kullanabileceğiniz açık kaynak kodlu özgür yazılımlarla, mesela GCC ile derlemeyi öğrenin, GDB ile hata gidermeyi öğrenin, çalıştırılabilir dosyanın içeriğini gösterecek araçlar vardır açın bakın sembolleri anlayın. Bunlarla uğraşırken ayrıca donanımı da anlama fırsatı bulacaksınız ki çok şey öğrenirsiniz. Geçer-orta seviye İngilizce varsa daha iyidir, yoksa bir paralel işlem olarak da İngilizce öğrenmeyi başlatın ![]() |
Teşekkür ederim. yardımınız için. Dediğiniz gibi Bu şekilde örnekleme sistemi bana da yanlış gelmeye başladı artık. C yazılım dünyasına baştan başlamak lazım dediğiniz gibi. Ondan sonra C++ diye sürüp gider. ingilizcde bilgim orta düzeyde bu da yeterli gelir muhtemelen . çok fazla terim olduğunu zannetmiyorum . . . Doğru adımdamıyım acaba , C yazılımına başlamak mu yoksa farklı Farklı kodlar mı Gelecek hitap ediyor. Sizce. |
Örneği gelişi güzel yaptım. Şu anda Kod yanımda olmadığı için.
örnek olarak
float degisken=23,2;
void setup (){
degisken=EEPROM.read(3);
}
void loop(){
while(menubuton==1){
EEPROM.write(3,degisken);
}
}
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.