«

»

Jan 01

Memori AVR ATmega16

Terdapat tiga kelompok memori dalam mikrokontroler AVR ATmega16:

  • Flash memory (ruang program), ruang dimana program disimpan.
  • SRAM (static random access memory), ruang dimana program membuat dan me-manipulasi variabel ketika program berjalan.
  • EEPROM merupakan ruang memori dimana programmer dalam menyimpan informasi dalam waktu yang panjang (permanen).

Memori Flash dan EEPROM bersifat non-volatile (informasi tetap ada walaupun catu daya diputus). SRAM bersifat volatile, informasi akan hilang ketika catu daya diputus.

Chip ATmega16 memiliki memori Flash 16k, SRAM 1024 byte dan EEPROM 512 byte.

Harap diperhatikan jumlah SRAM yang terbatas. Sangat mudah untuk mengisinya hingga maksimal, dengan menyimpan sejumlah besar data string dalam program. Sebagai contoh, sebuah deklarasi seperti:

char message[] = "I support the Cape Wind project.";

memerlukan 32 byte SRAM (setiap karakter memerlukan satu byte). Jumlah 1024 byte tidak terlalu besar, khususnya ketika memerlukan sejumlah teks untuk ditampilkan pada sebuah display atau lookup tabel.

Bila ruang SRAM “habis”, program akan gagal operasi. Proses upload berjalan dengan mulus, namun program tidak jalan atau berjalan dengan “aneh”. Untuk memeriksa, bila hal ini terjadi, kita dapat memberikan tanda comment atau memotong data string. Bila setelah itu program berjalan dengan baik, mungkin penyebabnya adalah kekurangan ruang SRAM. Ada sejumlah hal kecil yang dapat kita lakukan untuk menelusuri masalah demikian:

  • Bila program yang dibuat, berkomunikasi dengan program yang berjalan di komputer, kita dapat memindahkan beban ke sisi komputer. Hal ini akan mengurangi beban pada chip.
  • Bila kita memiliki lookup table atau array yang cukup besar, gunakan tipe data terkecil untuk menyimpannya. Sebagai contoh, tipe int memerlukan 2 byte, sementara byte memerlukan 1 byte.
  • Bila kita tidak memerlukan perubahan terhadap string atau data ketika program berjalan, kita dapat menyimpannya di dalam Flash. Untuk melakukan hal ini, gunakan keyword PROGMEM.
#include <avr/pgmspace.h>

// save some unsigned ints
PROGMEM  prog_uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};

// save some chars
prog_uchar signMessage[] PROGMEM  = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};