Arduino Mega SRAM expansion shield

Version 2 - 512 KB SRAM

Accessible as 8 banks of 64KB RAM

In actual fact, the expansion 512 KB of additional RAM is accessible as 8 banks of 64KB RAM - but always minus 8 KB built-in SRAM memory (that overlap expansion memory), so 8x56KB is "only" 448KB RAM.

Osmibitové mikroprocesory mají zpravidla adresní sběrnici širokou 16 bitů a tak jsou schopny obsáhnout adresní prostor 64 KB, tj. 0000h až FFFFh. Podobně je tomu i u mikrokontroléru Atmel AVR ATmega2560. Pokud se k tomuto mikrokontroléru připojí externí paměť (v tomto případě Static RAM - SRAM), zvětší se využitelná RAM z 8KB na 64KB. Pokud je i to málo, lze paměť stránkovat (po takzvaných bankách), ale v každé takovéto bance bude vždy neměnných prvních 8KB, což je právě ta interní RAM mikrokontroléru. Arduino Mega 512 KB SRAM expansion shield V2 umí stránkovat po 64KB, tedy je dostupných 8 bank po 56KB, což je oněch 448KB RAM navíc, oproti "holému" mikrokontroléru a tedy i oproti Arduino Mega 2560.

Arduino Mega 512 KB SRAM expansion shield V2 se prodává buď jako samotná deska plošných spojů (PCB), nebo jako stavebnice (kit), kterou si uživatel sletuje sám. Bývá dobrým zvykem, že i u kitů bývají SMD součástky již přiletované. Pozor! V tomto případě však nikoli! A protože přiletovat SMD čipy s mnoha vývody není pro každého, je zapotřebí najít firmu, která je patřičně vybavená.

Já jsem se obrátil na společnost EverMAX s.r.o. - díky její až neuvěřitelné vstřícnosti a ochotě jsem měl SMD přiletované k PCB již druhý den, pak už jen stačilo připájet konektory a tlačítko reset a prakticky jsem měl kit provozuschopný za 48 hodin po té, co jsem si ho vyzvedl ze schránky.

Memory check and Memory dump
// working under Arduino IDE 1.0.5

#include "xmem.h"
// download: http://andybrown.me.uk/wk/2011/08/28/512kb-sram-expansion-for-the-arduino-mega-software

int led = 13;

void print4hex(unsigned int adr){
  Serial.print(F("Address: "));
  if (adr<0x1000){
    Serial.print("0");
  };
  if (adr<0x0100){
    Serial.print("0");
  };
  if (adr<0x0010){
    Serial.print("0");
  };
  Serial.print(adr, HEX);
};

void print2hex(unsigned int val){
  if (val<0x0010){
    Serial.print("0");
  };
  Serial.print(val, HEX);
  Serial.print(" ");
};

void setup() {
  delay(2000);
  unsigned int memaddress;
  uint8_t banki,readValue;
  volatile uint8_t *ptr;
  pinMode(led, OUTPUT);
  Serial.begin(115200);
  Serial.println(F("Arduino Mega 512 KB SRAM expansion shield V2 - memory test"));
  xmem::begin(false);
  xmem::SelfTestResults results;
  results=xmem::selfTest();
  if(!results.succeeded){
    Serial.println("Memory test failed!");
    memaddress = (unsigned int)results.failedAddress;
    banki = results.failedBank;
    Serial.print(F("Memory bank: "));
    Serial.println(banki);
    print4hex(memaddress);
    Serial.println();
  }
  else{
    Serial.println(F("Memory test succeed"));
  };
  for(banki=0;banki<8;banki++){
    xmem::setMemoryBank(banki);
    Serial.println();
    Serial.print(F("Memory bank: "));
    Serial.println(banki);
    for(ptr=reinterpret_cast<uint8_t *> (0xFFFF);ptr>=reinterpret_cast<uint8_t *> (0x2200);ptr--){
      readValue = *ptr;
      memaddress = (unsigned int)ptr;
      if ((memaddress % 0x0100)==0){
        digitalWrite(led, !digitalRead(led));
      };
      if ((memaddress % 0x0010)==15){
        Serial.println();
        Serial.print(banki);
        Serial.print(" ");
        print4hex(memaddress);
        Serial.print(" ");
      };
      print2hex(readValue);
    };
    Serial.println();
  };
  Serial.println("Dump is complete");
};

void loop() {
  digitalWrite(led, !digitalRead(led));
  delay(100);
};

 

Zpět na hlavní stranu

 

© 2013, Roman Štec