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ı

11 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.

  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.

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

*



Sosyal Ağlar