Arduino’da Hafıza ÇeÅŸitleri

Arduino’larda 3 hafıza havuzu bulunur:
Flash: Arduino programlarının bulunduğu bölümdür.
SRAM (static random access memory): Program çalıştığında değişkenleri yarattığı ve gerektiğinde değerlerini değiştirdi bölümdür.
EEPROM: Programcının uzun dönemli değişkenleri sakladığı bölümdür.

Flash ve EEPROM bölümleri geçici değildir ve buralarda saklanan veriler güç kesildiğinde silinmez. SRAM bölümünde saklanan veriler güç kesildiğinde silinir.

ATmega168 yongasında bu hafıza bölümlerinin boyutları aşağıdaki gibidir:
Flash: 16kB (2kB kadarını bootloader kullanır)
SRAM: 1024 Byte
EEPROM: 512 Byte

Burada dikkat etmeniz gereken husus SRAM belliÄŸin fazla olmamasıdır. EÄŸer yazdığınız programda ekranda görüntülenecek yazılar gibi fazla deÄŸiÅŸkeniniz varsa 1024 Byte çabuk dolacaktır. Yazığınız program Arduino’nuza baÅŸarılı bir ÅŸekilde yüklenebilir, fakat daha sonra programın istediÄŸiniz gibi çalışmadığını gözlemleyebilirsiniz.

SRAM belliğin yetmemesi durumunda şunları uygulayabilirsiniz:

  • Yazdığınız programda Arduino’nuz bilgisayarla iletiÅŸim halinde ise, hesaplamaları ve yer kaplayan fazladan datayı bilgisayarınızda bulundurabilirsiniz. Bu sayede Arduino’nun yükünü hafifletmiÅŸ olursunuz.
  •  Tablo veya uzun dizileriniz varsa yapabiliyorsanız en küçük veri yapısını kullanın. ÖrneÄŸin bir int 2 byte yer kaplar, byte tipi ise adı gibi 1 byte yer kaplar.
  • EÄŸer programınız çalışırken deÄŸiÅŸkenlerinizi deÄŸiÅŸtirmiyorsa (örneÄŸin LCD’de gösterilecek metinler) deÄŸiÅŸkenlerinizi SRAM yerinde EEPROM’da tutabilirsiniz.

Hakan Ä°yice

Bilgisayar mühendisi, web yazılım uzmanı, hobi elektroniği meraklısı

30 comments

  1. murat dedi ki:

    ARDUÄ°NO NUN HAFIZASININ DOLMASI GÄ°BÄ° BÄ° DURUM VAR MI?

    • Ömer Koman dedi ki:

      arduino hafızası flash/rom ve ram olarak ıkı bolumdur programlar flash/rom kısmına yuklenır program ıcınde hesaplama yaptıgınız değişkenler ise ram de saklanır çok uzun detaylı programlar yazdığınızda flash/rom a program kaydedılemez ayrıca cok fazla uzun hesaplama için tutulan dişkenler de ram i tuketebılır. uno da hafıza yetmedıgı zaman bır ust borda geçip projenızı orada bıtırmenız gerekır.

      • Serkan Kaan dedi ki:

        Bir üst board derken ne demek istediniz ? Yazdığım kod UNO için fazla geliyor ve yükleme yapamıyorum.

        • Ömer Koman dedi ki:

          daha geniş flash olan modele geç demek istiyorum megaya geç mesela yada esp32 ye geçersin.
          hafızayı dolduracak kadar uzun program yazmışsan bir şeyler doğru değil demektir. yazdığın kodu kısaltsan iyi edersin. daha basit düşün

  2. ERDOÄžAN ACUN dedi ki:

    merhabalar ardunio ile p10 çalışmamasıyla uğraşıyorum fakat ekrandaki veriyi enerji kesildiğinde saklamıyor yani sıfıra düşüyorum eproma yazdıracağım kod için yardımcı olurmusunuz ve hangi satıra eklemem gerekiyor

    • Ömer Koman dedi ki:

      foruma gelin sorun. veya inmternette arduino eeprom diye aratın gelen ornekleri deneyin. yapacağınız şey arduinoya yolladığınız her p10 mesajını once eeproma kaydetmeniz ve her elektrik geldiğinde en başta eepromdan bu mesajı okuyup ondan sonra p10 a yollamanız.

  3. Tolga Keskin dedi ki:

    Ömer bey,iyi günler.
    Arduino uno seri portta sırasıyla servo motorları çalıtırması için …bir sayı dizisi yüklüyorum (ör:12222133433221111……….)ancak 64 karakterden sonrasında çalışmıyor.
    Acaba bir çözümü vae mı..ya da arduino megada bu çözülebir mi?
    Teşekkür ederim

    • Ömer Koman dedi ki:

      64 luk bloklar halinde arka arkaya alın arduıno hafızasında saklayın, yontemınızı değiştirn. işlemciyi buyutmeniz sorunu çözmeyecek.

  4. Tolga Keskin dedi ki:

    Ömer bey ilginize teşekkür ederim.
    Yazdığım program aşağıda.
    Serial porta girdiÄŸimde (11222321345562…..) serial porta copy paste yapıyorum..ancak 64.datadan sonra duruyor tekar gerini yazmak zorunda kalıyorum..
    yaptığım skeç üzerinde bunu nasıl halledebileceğimi gösterebilir misiniz.
    Teşekkür ederim.
    Tolga Keskin
    05322121612
    __________

    #include

    #include

    AF_Stepper motor1(800,1);
    Servo sln_servo;
    Servo arn_servo;
    Servo sbn_servo;

    int sln_servo_position=90;
    int arn_servo_position=90;
    int sbn_servo_position=90;

    int gelenVeri;

    void setup() {

    arn_servo.attach(10);
    sbn_servo.attach(9);

    Serial.begin(9600);

    }

    void loop() {

    if (Serial.available()) {
    gelenVeri=Serial.read();

    if(gelenVeri==’2′){
    arn_servo.write(20);
    delay(250);
    arn_servo.write(90);
    delay(250);

    Serial.print (“2”);
    }
    else if(gelenVeri==’1′){

    arn_servo.write(180);
    delay(250);
    arn_servo.write(90);
    delay(250);
    Serial.print (“1”);
    }

    else if(gelenVeri==’4′){

    sbn_servo.write(20);
    delay(250);
    sbn_servo.write(90);
    delay(250);

    Serial.print (“4”);
    }
    else if(gelenVeri==’3′){

    sbn_servo.write(170);
    delay(250);
    sbn_servo.write(90);
    delay(250);
    Serial.print (“3”);
    }
    if(gelenVeri==’6′){

    sln_servo.write(20);
    delay(250);
    sln_servo.write(90);
    delay(250);

    Serial.print (“6”);
    }
    else if(gelenVeri==’5′){

    sln_servo.write(170);
    delay(250);
    sln_servo.write(90);
    delay(250);
    Serial.print (“5”);
    }

    else if (gelenVeri==’8′){

    motor1.step(420, FORWARD, MICROSTEP);

    delay(10);

    Serial.print (“f”);
    }
    else if (gelenVeri==’9′){

    motor1.step(420, BACKWARD, MICROSTEP);

    delay(10);

    Serial.print (“b”);
    }
    else if (gelenVeri==’0′){

    motor1.step(20, BACKWARD, MICROSTEP);

    delay(10);

    Serial.print (“g”);
    }

    }

    }

  5. Tolga Keskin dedi ki:

    #include
    #include
    olacaktı çıkmamış

  6. Tolga Keskin dedi ki:

    include Servo.h
    inculede AFMotor.h

  7. Ömer Koman dedi ki:

    sizin anlamadıgınız nokta şu arduıno buffer ancak 64 karakter alıyor. bunu siz de söylüyordunuz ya 64 karakterden fazla yollamayacaksınız yada gelen karakterleri bir şekılde bu bufferi geçmeyecek şekılde ıslemenın yontemını geliştirin. mesela string değişken tanımlayın ve bu veriyinın başına A1223334242B şeklinde yollayın sistem A harfını gordugunde bu verıyı once string ıcıne sırasıyla kopyalasın taki B karakterini görene kadar. B karakterini gördünğzde ise komutları işlemey başlayın.

  8. Mehmet dedi ki:

    Merhabalar Ömer Bey, Ardunio da hafıza adresini bit,byte veya word olarak nasıl rezerve edebiliriz. PLC de olduğu gibi, (örneğin M0 gibi İç kontak)

  9. Ömer Koman dedi ki:

    arduinoda program içinde değişebilen değerler ram de tutulur, basitçe değişken tanımladığınızda program boyunca değikenin adını kullandığınız her yerde işleme sokabilirsiniz
    int M0=12

    int hesap=M0*123

    **************************
    program boyunca hiç değişmeyen sabit veriler ramde değil program kodunun gömülü oldugu flash hafıza bölümünde tutulur ve saklanacak değer constant tanımlaması ile kullanılır

    const myPi=3.1
    https://www.arduino.cc/reference/en/language/variables/variable-scope–qualifiers/const/

    ****************************
    bir diğer ramde veri tutulması kullanımı Structure tanımlaması olabilir
    struct RGB {
    byte r;
    byte g;
    byte b;
    };

    veya
    struct Makina {
    byte Tipi;
    word yeri;
    char operatoradi[16];
    };
    structure karışık veya değişik tiplerdeki verileri bir arada tutmaya veya ulaşamada iyi bir yöntemdir ramde tanımlı durur
    https://playground.arduino.cc/Code/Struct

    ******************************

    bir diğer yöntem epromda veri saklanması olabilir eprom 1000byte uzunlukta olabiliyor ve arduinoda elektrık kesildiğinde ve tekrar açtığınızda verilere ve sakladığınız değerlere tekrar ulaşabilirsiniz içini değiştirebilirsiniz.
    https://www.arduino.cc/en/Tutorial/EEPROMWrite
    **********************************
    ayrıca bir değişkeni adı ie çağırmak yerine direk hafıza adresinden ulaşmak isterseniz pointer kullanabilirsiniz. kullanımı zordur dikkat gerektirir okuyacağınız verinin uzunluğunu bilmeniz ve ne yaptığınızı bilmek zorundasınız.
    https://playground.arduino.cc/Code/Struct

    kolay gelsin

  10. Tekin Tosun dedi ki:

    Ömer bey merhabalar.
    Arduino uno da denediğim bir yazılımın derlenmiş boyutu 3kb. Dışarıya hex dosyası olarak kaydederek başka bir mikrodenetleyicide kullanmak istediğimde dosya boyutu 16kb olmakta. Yapmak istediğim arduino kit kullanmadan sadece mikrodenetleyiciyi kendi elektronik devreme monte ederek kendi tasarımımı yapmak. Bunun için 2 in 1 out çıkışlı mikrodenetleyici chip bana yeterli ancak dosya boyutu konusunda ne çeşit veya model mikrodenetleyici chip kullanmalıyım. Mesela attiniy 85 tarzı chip kullanmak istiyorum.

    • Ömer Koman dedi ki:

      kolay gelsin. kendi tasarımınız arduino kullanabilirsiniz internette minimum arduino diye aratırsanız şemalar bulabilirsiniz. ihtiyacınız olan bir reset direnci kristal ve 3-4 kondansatörden başka bir şeye ihtiyacınız yok. ihtiyacınıza göre seri dönüştürücü ve 5v güç devresini de eklersiniz. işlemci boyutları sizin seçinizie kalmış ileriye yönelik olarak düşünün kodunuzun boyutları büyüyelir yada başka bir projede daha detaylı kod yazmanız gerekebilir. minimum atmega328 ile ilerleyin derim. atmel işlemcileri programlama için icsp programlayıcı almanız gerekir. icsp programlayıcı ile hex kodunuzu arduinoya direk atabilirsiniz.
      diğer sorduğunuz program uzunluğu ile ilgili konu, sizin 3-5k olarak gördüğünüz kod uzunluğu byte olarak hesaplanmış binary kod uzunluğudur, hex kodlarda bir bytelık değer 2 karakterle gösterildiğinden kod uzunluğu en az 2 kat fazla görünür, ayrıca hex dosyanın içinde yazılacak kodun adres bilgisi de yer aldığından size daha uzun görünür, ayrıca hex dosynın içinde boş da olsa tüm programlanabilir hafızanın tamamı da gösterilmiş olabilir.

      • Mehmet Tosun dedi ki:

        Merhaba ömer bey,
        Bir arduino projemde yüksek boyutlu bir dizi tanımlamam gerekiyor. Bu dizinin boyutu ram belleğindende fazla olduğu için proje bu noktada tıkandı. Ne yapmam gerekiyor ? Bu konuda tavsiyeleriniz varsa yardımcı olabilir misiniz ?

        • Mehmet Tosun dedi ki:

          Konunun daha da anlaşılması için ekleme yapıyorum. PROGMEM olarak kaydetsem bile yinede dizi boyutu fazla geliyor.(yaklaşık [2074][4] gibi bir boyut) SD kart bu sorunu halledebilir mi ? Ram arttırmak için entegre gibi birşey var mı ? Yardımcı olabilirseniz çok memnun olurum.

          • Ömer Koman dedi ki:

            sd kart a yazabilirsiniz sd kullanmanız daha kolay ama genelde sd kart mantığında veriyi dosyaya yazıp oradan okumak için dosyayı baştan açıp ilgili yere kadar taramanız gerekecek.

        • Ömer Koman dedi ki:

          arduino kodunu kullanabileceğiniz daha yuksem ram i olan bir işlemciye geçin, esp32 veya stm32duino/blue pill bordlardan faydalanın başka çözümler ek hafıza lar olabilir ama kullanışsız ve programlamanız zaman alacak kodun hızı düşecek yada kodunuzu kucultun yada elinizdeki ile yetinecek bir kodlama yontemi geliştirin.

  11. Mehmet Tosun dedi ki:

    Konunun daha anlaşılır olması için ekleme yapıyorum. Dizi boyutu([2074][4]) olduğu için ram ve flash belleği yetersiz geliyor. Bu durumda kullanabileceğim sd kart harici ram gibi birşeyler var mıdır? Yardımcı olursanız çok sevinirim.

  12. ahmet dedi ki:

    ömer bey merhaba
    arduino da nasıl fazla kod yaza bilirim .şerit led ım de daha çok effect vermek istiyorum ama arduino nun hafızası yetmiyor
    bu konuda sizden yardım istiyorum
    saygılarımla

    • Ömer Koman dedi ki:

      donanımsal olarak yapabileceğiniz şeylerin başında işlemci veya arduino platformunu değiştirmeyi deneyin mesela esp32 platformuna geçerseniz çok fazla hafızanız olur, yada arm işlemci kullanan bluepill stm32 veya stm32duino platformuna geçebilirsiniz(bu işlemciler arduinodan daha düşük voltaj ve kendine özgü farklılıkları olduğundan platformları da iyi incelemeniz lazım).
      yazılımsal olarak mevcut arduinonuzda yapabileceğiniz şeyler de var mesela yazılım içinde tekrarladığınız şeyleri fonksiyon haline getirin onları kodun içinden çağırın efektif programlama yapabilmeniz lazım bu zamanla olur. animasyonları basit komutlara dönüştürüp onları işleyecek bir program yazabilirsiniz. yazılım tarafında geliştirmelere yönelin bence donanıma hakim değilseniz çok zamanınızı alır kodlarınızı yeniden gözden geçirin kopyala yapıştır şeyleri sadeleştirin daha kısa nasıl ifade ederime kafa yorun. kolay gelsin

  13. hakan dedi ki:

    merhaba, unoya bağladığım gps verilerinden enlem ve boylamı float olarak 3 günlük tutmak istiyorum. bunun için eeprom yeter mi? yoksa sd kart modülü alıp oraya mı kaydedeyim. teşekkürler

    • Ömer Koman dedi ki:

      yeni gördüm mesajı kusura bakmayın. float 4byte genişlikte, konum için en az 2 tane float tutmak gerekiyor 8 byte bir konum için gerekecek. dakikada 60 tane konumdan 3 günde 259bin 200 byte eeproma ihtiyacınız var. siz karar verin bu büyüklükte bir eeprom varmı varsa kaç para. ayrıca eepromlar çok sık değişen veri için kullanmak makul değil genelde parametre saklama için düşünülmüş mekanizma. deneme için yapın bence fikriniz olur. önemli olan proje. sd kartlarda sektör böyutu 512 byte, 512byte dolmadan byte byte yazmaya çalışırsanız sd kart ömrü de dayanmıyor. 512 byte dolmadan elektrik kesilirse blok veri kaybınız da olur önlem almanız lazım.

  14. Murat Yaman dedi ki:

    Ömer bey iyi günler dilerim
    arduino da kodlar yazıyorum. işlemler yaptırıyorum. Bir süre sonra kodlar dengesiz çalışıyor. Örneğin sırasıile led yakıyorum. Sonra sırası ile söndürüyorum. Ve bunun gibi bir yığın varyasyon yapıyorum. int for if parametrelerini kullanıyorum. Kodlarım kısa olduğu halde . Bir süre sonra (45- 50 sn kadar) ledler alakasız yanmaya sönmeye veya olduğu gibi hepsi yanmaya başlıyor. Kaçırdığım bir nokta varmıdır.Yardımcı olursanız sevinirim.Teşekkürler.

    • Ömer Koman dedi ki:

      değişkenlere bağlı bir işlem yapıyorsanız değişkenlerin değerleri bir aşamadan sonra başa dönüyordur yada değeri aşıyordur. bu kontrol değerleri kontrol edin.

  15. Melihcan Çiltaş dedi ki:

    Hocam iyi günler. 6 farklı sensörü arduinoya bağlayıp sensörlerden ölçtüğüm değerleri bir ekran üzerinde gösterme gerekiyor. Tüm Türkçe ve yabancı kaynakları taradım böyle bir projeye rastlamadım. Bana ne önerirsiniz nasıl yapabilirim bu projeyi?

    • Ömer Koman dedi ki:

      sensörler ne tip acaba? sadece adc ile okunabilien analog sensörler mi, i2c ile okunan mı, spi ile okunan mı onları da saysaydınız yazardım yöntemini. bu ÅŸekilde zor olur. siz teker teker baÄŸlayarak ilereyin bence sıkıştığınız noktada yazın bakalım tekrar…

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal AÄŸlar