beginning microcontroller : memprogram atmega16a dengan USBasp


Dari arduino yang merupakan sistem avr yang telah 'di paketkan' beralih ke stand alone avr untuk mempelajari embedded system lebih dalam lagi. Jadi, tidak seperti arduino yang memprogramnya cukup instan tinggal colok kabel USB dan upload programnya lewat software arduino, avr (merujuk pada stand alone avr a.k.a tidak 'dipaketkan' seperti arduino) ini dalam memprogramnya butuh rangkaian minimum dan downloader untuk transfer kode dari komputer desktop ke avr. 

Desain sirkuit dari rangkaian minimum bisa dilihat di google kalau mau buat sendiri atau kalau tidak mau buat sendiri bisa di beli rangkaian minimum yang sudah jadi, karena saya tidak punya basic elektronika sama sekali saya beli yang sudah jadi saja (sebenarnya tanpa basic elektronika pun buat sendiri bisa kalau meniru rangkaian minimum di google). Namanya development board atmega16 (saya tidak tau nama resminya apa).
Development board ini tentunya tidak termasuk dengan IC micro controllernya. Board ini hanya cocok untuk atmega16 dan atmega 32. Board ini bagus menurut saya karena di lengkapi juga dengan penjepit kaki-kai IC yang akan di develop yang bisa di kencangkan dan lepaskan, sehingga memasukkan dan mengeluarkan AVR-nya mudah dan tidak merusak kaki-kakinya.


Untuk avr, sesuai judulnya saya memakai atmega16a untuk percobaan pertama saya dengan avr. Apa bedanya atmega16 dan atmega16a ini ? 'a' disini menujukkan kalau versi atmega yang saya gunakan ini adalah revisi dari atmega16 yang original. Apanya yang di revisi saya kurang tahu dan belum menggali informasi tentang itu.
Dan untuk downloader (untuk transfer program dari komputer desktop ke avr) saya menggunakan USBasp.
Begitu saja untuk hardwarenya, sekarang untuk bagian software seperti biasa saya menggunakan linux ubuntu tinggal menginstall software arduino dengan :
sudo apt-get install arduino
kenapa arduino ? karena di paket software arduino ini sudah terinclude semua program yang kita butuhkan untuk mengupload kode kita ke avr yang akan kita program. Setelah ini buka gedit atau text editor lainnya favorit anda untuk membuat programnnya, program pertama kita hanya untuk menyalakan lampu led saja yaitu :
#include <avr/io.h>
#include <util/delay.h>
#include <avr/fuse.h>

#define F_CPU 16000000UL

int main (void)
{
    int i;
// set PORTD for output
    DDRD = 0xFF;
    while(1) {
        PORTD = 0xff;
        _delay_loop_2(30000);
        PORTD = 0x00;
        _delay_loop_2(30000);
    }
    return 1;
}

setelah itu save dengan nama avr.c . Di terminal masukkan perintah
avr-gcc -mmcu=atmega16a -Wall -Os -o avr.elf avr.c
avr-objcopy -j .text -j .data -O ihex avr.elf avr.hex
Setelah ini waktunya mebuat rangkaian led sederhana. Seperti rangkaian led biasanya, led kita harus di lindungi resistor agar tidak rusak (resistor disini untuk mengurangi voltase dari sumber). Sumber tegangan dari port D pin sembarang (pin port D ini di tandai dengan pin yang di tandai di board dengan nama PD0, PD1, PD2 dan seterusnya) dan groundingnya di pin yang bertanda GND di development board kita. Sebagai ilustrasi (kita tidak menggunakan baterai 9 volt dan resistor yang kita gunakan sembarang) rangkaian led sederhana jika tidak tau seperti gambar di bawah ini 
http://www.electroschematics.com/wp-content/uploads/2009/04/led-circuit.gif
Colok kabel jumper yang berkepala 10 dari USBasp ke development board kita sehingga terhubung dan colok juga USBasp ke komputer kita. setelah itu masukkan perintah ini ke terminal
sudo avrdude -c usbasp -p m16 -D -U flash:w:avr.hex -v

dan output di terminal
 avrdude: Version 6.1, compiled on Oct 24 2014 at 10:33:03
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/home/ryan/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATmega16
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom         4    10   128    0 no        512    4      0  9000  9000 0xff 0xff
           flash         33     6   128    0 yes     16384  128    128  4500  4500 0xff 0xff
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9403
avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as 99
avrdude: reading input file "avr.hex"
avrdude: input file avr.hex auto detected as Intel Hex
avrdude: writing flash (194 bytes):

Writing | ################################################## | 100% 0.14s

avrdude: 194 bytes of flash written
avrdude: verifying flash memory against avr.hex:
avrdude: load data flash data from input file avr.hex:
avrdude: input file avr.hex auto detected as Intel Hex
avrdude: input file avr.hex contains 194 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.10s

avrdude: verifying ...
avrdude: 194 bytes of flash verified

avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as 99
avrdude: safemode: Fuses OK (E:FF, H:99, L:E1)

avrdude done.  Thank you.

dan voila, led kita sekarang kedip-kedip, itu berarti percobaan pertama kita sukses. Jika tidak led-nya tidak menyala sama sekali, coba periksa rangkaian led anda, karena led hanay bisa menyala dengan 1 arah arus yaitu arusnya mengalir dari kaki panjang ke kaki yang rendah, jika sebaliknya arusnya tidak akan jalan dan led wajar jika tidak menyala.

Sekarang saya akan menjelaskan proses dari program pertama kita ini, pertama ada :

#include <avr/io.h>
#include <util/delay.h>
#include <avr/fuse.h>
  Ini adalah lib yang kita include untuk memprogram avr, kemudian

#define F_CPU 16000000UL
Menurut forum avrfreaks, saya akan kutip langsung penjelasan dari sana
It is simply your way to tell some of the library code how many CPU cycles per second the processor is executing.
Kesimpulannya itu adalah kecepatan CPU pada avr. Setelah ini kita masuk ke program inti, sebagai langkah awal pada program inti kita akan menset port D sebagai output (sehingga bisa mengaliri arus listrik) dengan
DDRD = 0xFF;
 0xFF disini, artinya dari PD0 sampai PD7 (PD0 dan PD7 merujuk ke kode nama di development board kita) atau seluruh pin di port D kita set sebagai output. Oh ya, DDRD ini merupakan kependekan dari data direction register D (dengan kata lain port D).

Nilai 0xFF yang di jadikan nilai dari DDRD merujuk pada pin apa saja yang ingin di jadikan output. 0xFF jika di konversi ke bit maka akan senilai dengan
11111111
Dan kita tau dalam port D ada 8 pin, jadi bit paling kiri (penjelasan mengenai operasi bit pernah di bahas sebelumnya disini) merujuk ke PD0 dan paling kanan ke PD7 (perhitungan penomoran pin port disini dimulai dari 0). Jadi, kalau hanya ingin menjadikan pin 0 dari pord D atau PD0 sebagai output, maka nilai yang di masukkan ke DDRD adalah 
DDRD = 0x01
Setelah di jadikan statusnya sebagai output, kita akan menngaliri dan tidak mengaliri listrik di seluruh pin ini secara bergantian dan berulang-ulang selamanya dengan :
 while(1) {
        PORTD = 0xff;
        _delay_loop_2(30000);
        PORTD = 0x00;
        _delay_loop_2(30000);
    }
_delay_loop_2 ini lah yang berperan memberi jeda antara hidup dan matinya lampu led agar kita bisa melihat jelas proses mati dan hidupnya, lamanya delay dari function delay ini tergantu dari F_CPU tadi yang sudah di jelaskan. penjelasan dari nilai 0xff dan 0x00 di kode sektor ini sama analog dengan penjelasan saya sebelumnya di bagian DDRD tadi.

Dan begitulah program pertama kita selesai. Sebenarnya proses pembuatan program avr ini adalah dari source code tadi di compile ke file *.elf --> kemudian di perintah ke2 file *.elf ini di rubah ke file intel HEX, file inilah yang sebenarnya di upload ke memory flash avr menggunakan avrdude dan di jalankan oleh atmega16a dalam percobaan kali ini. Ada beberapa hal yang belum saya pahami dalam proses  upload kode ke avr yaitu, option -D harus di masukkan juga agar programnnya bisa jalan, jika tidak maka akan terjadi missmatch error (pengecekan program avr oleh komputer kita menyatakan kalau program yang di masukkan tidak cocok dengan yang telah masuk di avr) padahal option -D hanya memberi pilihan kalau kita akan mendisable auto erase memory flash sebelum program yang kita upload masuk. Cukup sekian, jika ada yang tahu jawaban dari pertanyaan saya silahkan masukkan di komentar, terima kasih.

Komentar