Arduino IDE, EEPROM, Bug... Bugs !
  • Merhaba, arduino ile tanışmak adına kendi yazdığım kütüphaneleri ve mikrokontrolleri bir kenara bıraktım ve 3 gündür ara ara uno ile ilgileniyorum.

    İlk olarak çoğunlukla tasarladığım gibi LCDnin 4 data hattı ile çıkış olarak kullanılan keypad sütunlarını ortak kullanmak üzere kurguladım ancak LCD çalışmadı. Ufak bir inceleme sonrası LiquidCrystal kütüphanesinde portların durumu kontrol edilmeden veri yazıldığını farkettim ve düzelttim. Aynı konuda sıkıntı yaşayan olursa aşağıdaki kodu LiquidCrystal.cpp dosyasında send fonksiyonunun başına ekleyebilirler.

    for (int i=0; i<((_displayfunction & LCD_8BITMODE) ? 8 : 4); ++i)<br /> {
    pinMode(_data_pins[i], OUTPUT);
    }

    Diğer konu gömülü sistem tasarımında olmazsa olmaz eeprom kullanımı hakkında... Yazılım yüklemeyle birlikte eeprom a veri (örneğin menü metinleri, varsayılan değerler) kaydetme problemi arduino.cc forumdaki 2013 yılından beri devam eden tartışmaların gösterdiğine göre 5 yıldır çözülememiş hatta forumlarda "led yakıp söndürmekten bu konuya el atmaya vakit kalmadı" gibi dalga geçen insanlar var ! Bulabildiğim son tartışma linki; https://forum.arduino.cc/index.php?topic=481559.0

    Dökümanlarda EEMEM direktifi kısaca "EEMEM ile tanımlanan veri EEPROM da konumlandırılan değişkendir" diye açıklanmıştır. Yani mikrokontrole yazılım yüklenirken EEMEM ile tanımlanan değişken değerlerinin EEPROM a yüklenmesi doğal olan yoldur aksi düşünüldüğünde çalışmayacak bir yazılım mikrokontrole yüklenmektedir. Arduino IDE (derleyicisi) bu direktifin kullanılmasına itiraz etmemekte ne var ki EEMEM ile tanımlanan veri miktarı ve içeriği farketmeksizin oluşturduğu eeproma yazılacak veri dosyası olan xxxx.ino.epp içeriğine her derlemede :00000001FF bilgisini yazmaktadır.

    Sadede gelmek gerekirse; başka bir program kullanmadan, arduino çerçevesi içinde derleyicinin EEMEM direktifini görmezden gelip eeprom için hex dosyası oluşturmaması ve programla birlikte eeprom verisini mikrokontrole yüklememesi konusunda ülkemde çözüm üreten birileri var mı ?

    Saygılar...
  • genelde proramlayıcıda eprom bolgesıne yazma işini komut satırına girilen komutla engelleyebılıyoruz, arduınoda da kodu ıcıne yazarken bunu yoneten bır yazılım anahtarı vardır onu araştırsanız. sonucta gcc compiler kullanıyor bunun komut satırına ulaşabılırsınız orada epromu guncellemeyı dısable etmenın yolu bulunabılır. yada compiler dırektıfınden eprom ıcın kod uretme gibi bir direktıf verılebılıyordur muhakkak onlar denenebılır
  • ayrıca bootloader bır kere yuklenıyor o durumda herseyı sılmesı normal. ama yenı program atarken serıportu kullanıyor ve eepromla ılgılı herhangi bir komut yoksa programda eproma dokunmaması lazım bootloaderın. direk programlayıcı ıle program atıyorsanız onun komut satırı yonergelerıne bır bakın derım
  • @okoman cevap için teşekkürler.

    Yurt dışından bir kaç kişiyle yazışmam sonrası arduino kartlardaki bootloaderin programlama aşamasında eeproma veri yüklemeyi desteklemediğini, bu nedenle derleme aşamasında EEMEM direktifinin görmezden gelindiğini öğrendim. Arduino geliştirme ortamında yazılan program karta yüklendikten sonra sonra başka bir programlayıcı kullanarak eeproma veri yazıyorlarmış. Bir rus vatandaş ise atmelde yüklü gelen bootloaderi değiştirerek bu eksikliği kendine göre çözmüş.

    Sanırım eepromu kullanmayan, en azından hard reset (başlangıç/varsayılan/fabrika ayarları denilen olay) sonrası ön tanım değerlerine dönmek için programlama aşamasında eeproma bir kaç byte bile olsa veri kaydetmeyen tek bir yazılımcı yoktur ve hızlı prototipleme aracı olarak lanse edilen bir üründe mantık sınırlarını zorlayan hatta mantık dışı olarak tanımlanabilecek büyük bir eksiklik. Sonuç olarak prototip PCB üretmeye devam... Arduino yu bir kaç yıl sonra tekrar denerim artık :)
  • ....veri kaydetmeyen tek bir yazılımcı yoktur ve hızlı prototipleme aracı....

    demişsiniz.. cümlenizin içinde geçen :::yazılımcı::: kelimesini yazarken, aklınızdan geçen şahıslar sanırım arduino ide kullanmıyorlardır (ufak tefek şeyler hariç ) . Bu IDE nin birçok eksiği var malesef.. son aşamada Atmel studio ile derlemede fayda var bence. Klasik hex loader ile birlikte tabii.. Arduinoyu geliştiren arkadaşlara bug report yapsak düzeltirlermi acep?
  • ben bu olayı bu şekilde kullanıyorum, ilk EEPROM yani 0 olanı fabrika ayarı sayarak feda ediyorum

    void setup() {
    //açılışta ve ilk defa kod yüklendiğinde ayar yoksa yazdır
    if (EEPROM.read(0) != 1) { // fabrika ayarları 1 değilse
    EEPROM.update(0, 1); //fabrika ayarlarını 1 yapalım
    // fabrika ayarlarında kullanılacak varsayılan değerler
    EEPROM.update(1, 1); // 1. ayar değeri
    EEPROM.update(2, 1); // 2. ayar değeri
    EEPROM.update(3, 1); // 3. ayar değeri
    }
    }

    void loop() {

    //menüye girdiğinde fabrika ayarları seçince
    if (fabrika_ayarlari) {
    //fabrika ayarlarını 0 yapalım ve yeniden başlatınca setup() taki değerleri alır
    EEPROM.update(0, 0);
    }

    }

    kısaca setupta EEPROM.read(0) ile EEPROMda kayıt varmı yokmu kontrol ediyorum ilk defa kod yüklendiyse veya menüden fabrika ayarları ile EEPROM değeri 0 yazıldıysa EEPROMu güncelliyorum
  • Gayet mantıklı..:)
  • EEMEM direktifi ile oluşturulan dosyayı ancak harici bir programlayıcı yazabilir. Burada anormal olan bişey yok. EEPROM'a veri yazmak için basit bir fonksiyon yazabilirsiniz. Veri girişi için serial monitor kullanabilirsiniz. Bunlar eften püften şeyler nesini dert ettiniz anlamadım.
  • sanırım yeni program yuklendıgınde epromun temızlenmesını ıstemıyorlar, eski degerlerı korumak ıstenıyor mesela makina numarası veye bır key yuklenmıstır programı guncelleyınce bu bılgıler kayboldugunda sıstem butunlugu kaybolur bundan kurtulmaya çalışıyor
  • @okoman hocam zaten eeprom değişmiyor yani kod yazdık arduino çalıştı eeproma veri kaydettik koda eklemeler yaptik degistirdik yeni kodu bilgisayardan yukledik eski eeprom kayitlari aynen onceden ne kayitli ise duruyor
  • bunu denemedim ben program yenılendıgınde eepromu bozmuyorsa ıyı sayılır ama bunu aşabılır isterse kolayca bir eprom hucresını bunu kontrol amacıyla tutmak yeterli program ılk çalıştıgında bır değer yazarsın sonrakı her yenı yukledıgın programda ılk bunu kontrol edersın silmen gerekıyorsa epromu sıldırırsın olur bıter.
  • Aynen program yenılendiğinde eepromu bozmuyor en azından ATmega kendi eepromu birde yetersiz kaldığında harici eepromlar var onlarda durumu bilmiyorum.
    Bir eprom hücresini bunu kontrol amacıyla tutmak için de üstte verdiğim kodlar işe yarıyor

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.