"Kembali Ke Dasar Elektronika Digital ... "

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Tampilkan postingan dengan label gcc. Tampilkan semua postingan
Tampilkan postingan dengan label gcc. Tampilkan semua postingan

Kamis, 20 Juni 2013

Tutorial: Menghemat memory Statis dengan PROGMEM dan EEPROM



Anda mungkin akan terkejut ketika melihat kenyataan terbatasnya jumlah memory yang disediakan oleh ic avr yang tersedia di pasaran. Bayangkan saja ATTINY2313 hanya memiliky 128 byte memory (lebar 8 bit) sedangkan ATMega8535 memiliki 512 byte saja. Setiap data variabel statis, semisal data text yang akan dikirim menuju lcd kadang menyebabkan memory RAM menjadi habis, padahal harus ada space RAM yang cukup untuk menampung data-data dinamis yg berubah sesuai jalannya program. Untuk itu data statis ini dapat disimpan ke dalam FLASH (PROGMEM) atau EEPROM.


PROGMEM

Progmem merupakan pemanfaatan memory flash / program sebagai penyimpan data statis. Pada mode scripting GCC inisialisasi awal yang harus di deklarasikan adalah #include <avr/pgmspace.h>. Pemanfaatan progmem cukup membantu menghemat RAM akan tetapi sebelum menuangkannnya ke dalam perhitungan atau penulisan ke lcd / UART, isi dari memory flash perlu dipindahkan ke memory RAM. Perhatikan contoh berikut ini.

contoh 1

char angka = 30;
char angka2;

Variable angka diatas berada di RAM, jika ingin memanfaatkan variabel diatas cukup gampang.

angka2 = angka * 2;

Jika variabel angka dirubah dirubah berada di FLASH , maka perubahannya seperti berikut:

contoh 2

const char angka PROGMEM= 30;
char angka2,angka3;

untuk mendapatkan hasil perhitungan yang sama maka harus ada variabel angka3 yang akan memindahkan data dari variabel angka (yang berada di flash) menuju RAM.

angka3 = pgm_read_byte(&angka);  //yg dimaksud &angka adalah alamat memory
angka2= angka3 * 2;


Tentunya contoh diatas tidak menggambarkan penghematan memory, tapi perhatikanlah contoh penulisan variabel array tulisan yang panjang ke UART berikut ini:

const char tulisan[] PROGMEM= "ahocool hebat sekali lo broo";


void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} 
   UDR = data; 
}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));


Dari fungsi diatas , routine kirim_text akan mengirimkan isi dari memory flash satu persatu ke UART, sehingga tidak perlu memindahkan semua data tulisan  ke RAM cukup hanya dipindahkan secara berurutan. Perintah untuk mengirim text ascii ke UART seperti berikut ini :


kirim_text(tulisan);


Apabila pembaca sering memperhatikan script yang ditulis diblog ini, terutama yang berhubungan dengan LCD maka penulisan teks variable tulisan seperti contoh diatas, cukup menuliskan seperti ini:


lcd_puts_P(tulisan)


untuk lebih lengkapnya dapat membaca penjelasan mengenai library pgmspace.h disini


EEPROM

Salah satu keunggulan dari microcontroller AVR adalah adanya memory non volatile (tidak akan hilang saat tidak ada power) yang berupa EEPROM. Biasanya penggunaanya adalah sebagai penyimpan data statis seperti halnya PROGMEM dan yang paling penting adalah variabel dinamis yang akan berubah nilainya dan kemudian nilainya akan disimpan seterusnya walau saat microcontroller dimatikan. Inisialisasi librarynya dilakukan dengan menuliskan #include <avr/eeprom.h>

Beberapa perintah script EEPROM yang paling penting adalah :

  • uint8_t eeprom_read_byte (const uint8_t *addr) 
  • void eeprom_write_byte (uint8_t *addr, uint8_t value) 
  • uint16_t eeprom_read_word (const uint16_t *addr) 
  • void eeprom_write_word (uint16_t *addr, uint16_t value) 
  • void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n) 
  • void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom, size_t n)



Contoh paling sederhana adalah pembacaan dan penyimpanan data kalibrasi seperti contoh berikut:


uint8_t EEMEM kalibrasi=100;
char berubah;


untuk membaca nilai EEPROM dan memindahkan ke RAM seperti ini :


berubah=eeprom_read_byte(&kalibrasi);


semisal nilai variabel "berubah" memang berubah karena perjalanan dari aplikasi, maka ketika ingin menyimpannya ke EEPROM tuliskan script seperti berikut:


eeprom_write_byte(&kalibrasi,berubah);


cukup mudah bukan? Bagaimana jika ingin menuliskan data EEPROM ke LCD atau UART ? contohnya seperti berikut ini :


uint8_t EEMEM edit_tgl[]=  " *EDIT KALENDER*$";

void tulis_ee(uint8_t *eem)
{

uint8_t a=0;


while(eeprom_read_byte(eem + a) != '$')
{
lcd_putc(eeprom_read_byte(eem + a));
a++;
}

}

contoh diatas sering digunakan oleh penulis untuk menyimpan data-data teks yg akan ditulis ke LCD, dengan sebuah trick menempatkan tanda $ sebagai penanda akhir kalimat (tentunya karakter lain bisa saja, asal karakternya jarang digunakan). untuk menulis ke LCD cukup menuliskan script berikut:


tulis_ee(edit_tgl);


Bagaimana dengan mengirim UART ? Perhatikan contoh berikut:


uint8_t EEMEM tulisan[]= "ahocool memang ganteng banget broo !!";

void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} 
    UDR = data; 
}

void kirim_text_ee(const char *data)
{
   while (eeprom_read_byte(data) != 0x00)
     USART_Tx(eeprom_read_byte(data++));


Dan selanjutnya sangat mudah hanya cukup menuliskan :

kirim_text_ee(tulisan);




SELAMAT MENCOBA 
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (38) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (72) television (5) transistor (1) troubleshoot (3) tulisan (59) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika