• LinkedIn
  • Join Us on Google Plus!
  • Subcribe to Our RSS Feed

Senin, 05 Oktober 2015

Menangani Interupsi pada Mikrokontroler AVR

00.20 // by Imam Firmansyah // No comments

Mikrokontroler tanpa interrupsi tidak akan bernilai apa apa. Rutin Interupsi dipanggil saat ada input yang menginterupsi alur program normal. Interrupsi tidak lebih dari subrutin yang menahan aliran program normal saat program tersebut di eksekusi. Setelah subrutin interrupt selesai, maka akan kembali ke titik terakhir program normal. Beberapa subrutin dipanggil interupt handler yang disebabkan oleh beberapa toggle pin eksternal atau beberapa nilai register seperti timer yang overflow dan lain sebagainya.

Mengapa interupsi begitu penting ? untuk kasus tanpa interupsi kamu akan melakukan looping untuk mencek satu atau lebih event yang terjadi. Operasi ini disebut polling. Namun polling mempunyai banyak kekurangan seperti program yang melakukan loop membutuhkan resources dari tugas yang mungkin perlu diselesaikan. Inilah mengapa mikrokontroler datang dengan banyak sumber interupsi. Sebagai ganti mengecek sebuah event, mikrokontroler mempunyai kemampuan  untuk menginterupsi program utama dan melompat ke subrutin interupsi dan kemudian kembali lagi ke pogram utama.

Apa yang terjadi saat interupsi terjadi? Setelah ada event interupsi mikrokontroler akan berhenti pada program utama, menyimpan informasi ke stack dan memberikan resourcenya ke subrutin interupsi. Saat subrutin interupsi selesai, alur program kembali ke titik terakhir program utama saat terhenti dan program terus berjalan.

Dalam Bahasa assembly program kamu biasanya akan mulai dengan table interupsi : 



Table ini mengindikasikan dimana semua subrutin interupsi diletakan. Setelah interupsi tertentu terjadi. Program pointer akan melompat ke lokasi subrutin interupsi.
Untuk contoh misalnya saat kamu memberi power ke mikrokontroler pointer akan melompat ke lokasi alamat $000 dimana itu merupakan lokasi RESET. Dalam bahasa C berarti akan di lokasikan ke fungsi main().
Compiler C akan membuat table ini saat mengkompilasi source code. Namun bagaimana akan menjabarkan penanganan rutin interupsi di Bahasa C menggunakan toolset WinAVR. Disepanjang waktu saat compiler di perbaiki terus menerus, disanan tidak ada perjanjian bagaimana untuk menangani kode interupsi. Sebagai compiler dia akan mencoba untuk tetap tidak bergantung pada detail mesin, setiap compiler di desain dengan metodenya sendiri sendiri. AVR-GCC tidak terkecuali. Disana setiap interupsi di pointing dengan nama yang telah didefinisikan sebelumnya – kamu akan menemukannya di file header definisi mikrokontroler seperti iom8.h
Pertama tama include library interupsi sehingga compiler mengerti makro perintah interupsi:
#include <avr/interrupt.h>
Semua interupsi kemudian dapat dijabarkan menggunakan perintah makro : ISR(), sebagai contoh :

ISR(ADC_vect)
{
//Kode kamu disini
}

Subrutin tersebut merupakan penanganan konversi ADC setelah selesai melakukan konversi. Perintah makro ISR() cukup mudah untuk menangani semua interupsi yang terjadi. Hanya membuat rutin seperti berikut :

ISR(_vector_default)
{
//Kode kamu disini
}

Jika kamu ingin untuk menjabarkan sebuah interupsi yang kosong pada kasus tertentu (menempatkan perintah “reti” di table interupsi)  kamu dapat menggunakan perintah berikut :
 EMPTY_INTERRUPT(ADC_vect)
Kasus ini akan diperlukan ketika kamu tidak memerlukan kode apapun yang diimplementasikan saat interupsi terjadi. perintah tersebut diatas perlu untuk dideklarasikan sehingga saat trigger interupsi terjadi tidak akan menjalankan kode BADISR_vect (yang mana secara default akan merestart program)

Berikut merupakan contoh program sederhana untuk menangani interupsi pada mikrokontroler.

#include <avr\io.h>
#include <avr\iom8.h>
#include <avr\interrupt.h>

#define outp(a, b) b = a
#define inp(a) a
uint8_t led;
typedef unsigned char  u08;
ISR(INT0_vect) { /* subrutin untuk int0 */
    led =  0x01;
   }
ISR(INT1_vect) {    /* subrutin untuk  int1 */
    led =  0x00;
   }
int main(void) {

    outp(0x01, DDRB);      /* PORTB.0 sebagai output (LED) */
    outp(0x00, DDRD);      /* PORTD sebagai input(saklar) */
    outp((1<<INT0)|(1<<INT1), GIMSK); // mengaktifkan eksternal int0, int1
    sei();       /* mengaktifkan interupsi*/
    led =  0x01;
    for (;;) {
    outp(led, PORTB);
    }                      /* looping seterusnya */
}

Di awal versi dari WinAVR makro yang digunakan yaitu SIGNAL(). Sekarang makro tersebut sama dengan ISR() dan tidak digunakan kembali.

Makro penanganan interupsi yang menarik lainnya yaitu ISR_ALIAS(vector, target_vector). Ini digunakan saat kamu membutuhkan untuk memindahkan satu vector ke vector yang lain. Ini cara dimana kamu dapat menangani banyak interupsi dengan single implementasi. Berikut contohnya :


ISR(INT0_vect)
    {
        PORTB = 42;
    }
 
    ISR_ALIAS(INT1_vect, INT0_vect);

dapat juga diartikan sebagai ISR yang di-link kan ke ISR yang lain yang ditentukan oleh parameter target vektor. pada contoh kode diatas, jika ada interupsi di INT1 maka akan di-link kan ke subrutin INT0, dimana akan membuat PORTB bernilai 42.



Referensi :


Sabtu, 03 Oktober 2015

Mengupload Program ke AVR

01.38 // by Imam Firmansyah // No comments

Avrdude

Salah satu tools yang terdapat dalam WinAVR yaitu AVRdude, tahukah kalian apa AVRdude itu? iya betul sekali. AVRdude digunakan untuk mengupload program dalam bentuk file hex ke AVR. AVRdude pertama kali dibuat oleh Brian S. Dean sebagai project pribadi untuk ISP AVR sebagai bagian dari free software tools dan opensource. pertama kali dibuat untuk OS FreeBSD di maintenance dalam CVS repository private dan di distribusikan dengan nama avrprog. karena banyak yang tertarik dengan software tersebut. maka Brian memutuskan untuk membuat project umum yang di akses melalui savannah.nongnu.org. nama dirubah menjadi AVRDUDE untuk menghilangkan keambiguan dengan tool avrprog yang di distribusikan oleh atmel.

Ada beberapa cara atau teknik untuk mengupload program dengan AVRdude. secara teknis AVRdude merupakan program yang dijalankan dengan perintah di command prompt dengan beberapa parameter yang cukup banyak namun kita bisa secara praktis mengupload program dengan hanya satu klik di program programmers notepad. bagaimana caranya berikut akan dipaparkan dengan menggunakan Makefile.

Menggunakan Makefile

Karena avrdude merupakan program CLI (Command Line Interface) dengan parameter tertentu. maka perintah avrdude berserta parameternya dapat kita tambahkan pada Makefile. untuk mengedit Makefile yang telah dibuat dapat digunakan file teks editor notepad, wordpad, notepad++ atau dapat menggunakan fasilitas MFile di WinAVR. berikut cara mengedit menambahkan perintah avrdude di Makefile :

Buka program MFile, kemudian arahkan baris teks ke bagian AVRdude. pada tab AVRdude akan terdapat dua "parameter"  yaitu Programmer dan Port.  Programmer kita bisa memilih programmer apa yang digunakan. kali ini saya mempunyai programmer USBtiny saya dibuat sendiri dengan mudah. namun setelah saya lihat pada pilihan Programmer tidak ada untuk list USBtiny. 

Lalu, apakah AVRdude tidak mendukung programmer usbtiny. mari coba kita lihat. buka command prompt dan ketik avrdude -c asdf kemudian tekan enter, maka akan keluar list programmer yang didukung oleh AVRdude. seperti gambar berikut :



Ternyata usbtiny sebenarnya didukung oleh AVRdude, maka kita bisa menggunakannya pada avrdude, lalu bagaimana men-settingnya di Makefile dengan MFile, mudah iya jawabananya mudah. kita hanya perlu mengedit saja dengan manual, untuk itu perlu diaktifkan mode Enable Editing of Makefile.

lalu kita bisa mengedit isi Makefile. klik kembali Makefile kemudian pilih Programmer pilih saja sembarang dan kita akan diarahkan ke pengaturan programmer. ubah nama programmer sebelumnya dengan usbtiny  dan selesai programmer usbtiny sudah dimasukan ke Makefile, untuk mensetting fusebit (fusebit digunakan untuk mengatur sumber clock yang digunakan untuk AVR, apakah dari internal osilator atau eksternal dengan crystal) dapat mengedit baris berikut :



kali ini saya menggunakan LFuse = 0xEF dan Hfuse = 0xD9 karena sumber osilatornya menggunakan kristal 8MHz luar. hati hati untuk merubah fusebit karena dapat membuat AVR Anda tidak bisa digunakan kembali :). Untuk menghitung nilai fuse bit dengan mudah dapat mengunjungi link tersebut http://www.engbedded.com/fusecalc ketika selesai save file Makefile di satu folder dengan program utama. kemudian kembali ke programmers notepad. dan kita hanya perlu mengklik [WinAVR] Program. dan program akan terupload ke AVR. 

untuk membuat sendiri programmer usbtiny dapat mengunjungi blog berikut :

tahukan kamu ada berapa parameter pada perintah avrdude. iya ternyata lumayan ada banyak parameter. kamu bisa lihat parameternya di link berikut : http://www.nongnu.org/avrdude/user-manual/avrdude_4.html

namun untuk kebutuhan mengupload ke mikrokontroler AVR, kamu bisa menggunakan teknik sederhana diatas. demikian tutorial singkat, semoga berguna untuk eksperimennya.



Jumat, 02 Oktober 2015

Menggunakan WinAVR sebagai Tools AVR yang Free

01.37 // by Imam Firmansyah // No comments

Pengenalan WinAVR dan Cara Penggunaannya.

WinAVR dibaca dengan ejaan "whenever" menurut official situsnya merupakan sebuah kumpulan tools software untuk pemograman C di mikrokontroler jenis AVR yang open source. sehingga dapat digunakan tanpa memerlukan licensi khusus, sesuai dengan ejaannya "whenever" kapanpun kita bisa menggunakannya tanpa memerlukan lisense khusus.

WinAVR terdiri dari tool tool software untuk pemograman  C yaitu avr-gcc sebagai compiler, avrdude sebagai programmer dan avr-gdb sebagai debugger. software WinAVR dapat di-unduh pada link berikut : http://sourceforge.net/projects/winavr/. cara menginstal cukup mudah, hanya mengikut prosedur yang tidak sulit. tutorial cara menginstall dapat dilihat pada link berikut : http://www.ladyada.net/learn/avr/setup-win.html,

Lalu setelah install, bagaimana cara menggunakannya? pertanyaan bagus. ketika selesai menginstall, maka akan terdapat beberapa program yaitu Teks Editor berupa Programmers Noteped, Mfile, Avrdude, dan beberapa lainya seperti avr-insigt. Programmers Notepad digunakan sebagai teks editor untuk mengetik baris-baris program dalam bahasa C, MFile digunakan untuk membuat file Makefile (Makefile merupakan sebuah file berisikan perintah untuk meng-compile program dengan avr-gcc).AVRdude digunakan sebagai program untuk meng-upload program ke memori mikrokontroler AVR untuk mengenal dan menggunakan AVRdude dapat mengunjungi link berikut http://tutorialwinavr.blogspot.com/2015/10/mengupload-program-ke-avr.html

Sebenarnya dapat digunakan program teks editor yang lain tidak hanya Programmers Notepad, bisa menggunakan Notepad++, Synwrite atau program teks editor yang lain yang mempunyai tools untuk mejalankan perintah program make.exe. Di lain kesempatan akan dibahas bagaimana mengabungkan WinAVR dengan  program teks editor yang berbeda. 

Namun sebagai awalan alangkah lebih baiknya kita mengenal WinAVR dengan menggunakan Teks Editor Programmers Notepad. kelebihan yang dimiliki oleh Programmers Notepad adalah sudah disetting tiga tools untuk kebutuhan meng-compile syntak C yaitu dengan [WinAVR] Make All , meng-clean hasil compile dengan [WinAVR] Make Clean dan mengupload program Hex ke Mikrokontroler AVR dengan [WinAVR] Program. ketiga tools tersebut dapat ditemukan pada toolbar tool di Programmers Notepad.


sekilas pada tampilan Programmer's Notepad diatas bahwa intinya Programmer's Notepad mempunyai 3 tool yang sudah dipersiapkan sebelumnya untuk kebutuhan meng-compile kode C. untuk mulai mencoba WinAVR ini kita bisa langsung mengetikkan kode C pada Programmer's Notepad. kita buat baris program yang simple. misal kita hanya ingin membuat PORTA bernilai High di semua PINnya. berikut baris programnya :

#include <avr/io.h>
int main() {
DDRA = 0xff;    //mengatur PORTA sebagai output
PORTA = 0xff;   //mengeluarkan nilai High disemua pin portA
return 0;
}


Simpan file tersebut dengan nama *.C dan gunakan folder baru sebagai tempat file .C tersebut, dengan nama folder yang mencirikan nama project. pada kali ini akan disimpan pada folder belajarWinAVR dan nama filenya io.c. itu adalah cara yang cukup mudah untuk membuat project AVR di Programmer's Notepad .

Selanjutnya tidak bisa langsung meng-compile kode C tersebut. perlu dibuat sebuah file dengan nama Makefile. apa itu Makefile? secara singkat, Makefile merupakan sebuah file yang berisi perintah perintah dalam mencompile kode C yang kita buat. kode C yang dibuat perlu perintah detail untuk mengcompilenya, detailnya berupa jenis mikrokontroler yang digunakan, nama file .C , berapa Hz frekuensi yang digunakan sebagai osilator, dan lain sebagainya. perintahnya jika ditulis agak sedikit banyak dan rumit. namun sudah ada fasilitas di WinAVR yang memudahkan dalam pembuatan Makefile tersebut. tool yang digunakan yaitu MFile.


Ada banyak Option di Makefile mulai dari Main file name .. sampai External RAM Options namun untuk meng-compile program sederhana hanya dibutuhka dua parameter saja untuk di isi, sisanya biarkan mengikuti pilahan defaultnya. dua parameter tersebut yaitu : Main file name dan MCU type isikan Main file name dengan nama program tanpa .c. jika namanya io.c artinya hanya perlu di-isikan io dan MCU typenya sesuaikan dengan mikrokontroler yang dibuat. setelah selesai simpan Makefile tersebut satu folder dengan program utama dengan nama Makefile, secara default sudah ditulis sehingga tidak perlu menuliskan namanya kembali. 

kemudian kembali ke Programmer's Notepad dan compile program tersebut dengan menggunaka Tool [WinAVR] Make Alljika berhasil maka tidak ada error pada tampilan output seperti gambar berikut :



artinya di folder program sudah dibuat file .hex yang siap untuk di upload ke mikrokontroler. Demikian tutorial singkat penggunaan WinAVR untuk pemograman AVR, semoga berguna. selamat bereksperimen.





Kamis, 01 Oktober 2015

Mengakses PORT I/O pada AVR

08.23 // by Imam Firmansyah // No comments

WinAVR


WinAVR merupakan kumpulan tools software untuk pemograman mikrokontroler AVR open source di  OS Microsoft Windows. kumpulan tools software tersebut meliputi: Teks Editor dengan Programmers Notepad, MFile software untuk membuat file Makefile,  compiler C untuk AVR menggunakan AVR-GCC dan Avrdude software untuk meng-upload file hex ke dalam memory flash mikrokontroler. berikut pemograman basic AVR dengan AVR-GCC.


Pemograman Basic I/O 

Setiap port pada mikrokontroler AVR dapat ditulis dan dibaca. sebuah port pada mikrokontroler umumnya mempunyai 8 (delapan) I/O atau PIN, dimana tiap I/O atau PIN dinamakan dengan nama PORT.no urut pin. contoh pada ATmega8535 mempunyai 4 port yaitu PORTA, PORTB, PORTC dan PORTD. pada PORTA mempunyai 8 I/O atau PIN yaitu PORTA.0 (PA0), PORTA.1 (PA1), PORTA.2 (PA2) sampai dengan PORTA.7 (PA7) dan begitu pula dengan PORT yang lain. berikut gambar dari susunan mikrokontroler AVR ATmega 8535.

setiap  PORT pada mikrokontroler AVR mempunyai tiga register yaitu DDRx, PORTx, dan PINx,

DDRx

DDRx merupakan register 8 bit yang mengatur arah dari port mikrokontroler apakah port mikrokontroler tersebut digunakan sebagai input atau output. jika ditulis 1 (satu) atau High maka PORTx tersebut akan menjadi keluaran atau output. sebaliknya jika ditulis 0 (nol) atau Low maka PORTx tersebut akan menjadi input. berikut adalah contoh

jika 4 bit lower pada PORTB digunakan sebagai input dan 4 bit upper digunakan sebagai output maka nilai susunan register DDRB yaitu :

DDRB = 0b11110000

0b diatas menyatakan bahwa format nilai adalah format biner. jika dalam format hexa maka

DDRB = 0xf0
0x menyatakan format hexa.

jika ingin menset hanya PIN tertentu saja dari PORT, misal hanya PORTB.5 saja yang ingin diset menjadi output atau memberikan nilai 1(satu) atau High, maka dapat dilakukan perintah shift seperti berikut:

DDRB |= ( 1<<5)

artinya perintah diatas adalah nilai DDRB di OR kan dengan nilai 1 (dalam biner 0000 0001) yang digeser 5 kali ke kiri, sehingga menjadi 0010 0000 hasilnya disimpan pada register DDRB. perintah ini akan memaksa bit ke 5 dari DDRB menjadi nilai 1 (satu) atau High.

untuk menyederhanakan perintah, dalam header avr/io.h terdapat macro _BV(x) yang sama dengan perintah (1<<x) sehingga perintah diatas dapat disederhanakan dengan peritnah dibawah ini :

DDRB |= _BV(5)

jika ingin memberikan nilai 0 (nol) atau low pada PIN tertentu dapat digunakan teknik shift seperti berikut :

DDRB &= ~(1<<5)

artinya adalah nilai DDRB akan di ANDkan dengan nilai 1101 1111 didapat dengan menggeser nilai 1 kekiri tiga kali kemudian meng inversekannya. 

1 => 0000 0001 
(1 << PB5) => 0010 0000
~(1 << PB5) => 1101 1111

dengan menggunakan macro _BV(x) maka dapat disederhanakan seperti berikut :

DDRB&= ~_BV(5)


PORTx

PORTx merupakan register yang mempunyai dua fungsi tergantung port tersebut digunakan sebagai input atau output.
  1. jika digunakan sebagai input, maka memberi nilai 1 (satu) atau High pada register ini akan mengaktifkan Resistor Pull up pada Port, sebaliknya jika memberikan nilai 0 (nol) atau Low resistor pull up tidak diaktifkan. 
  2. jika digunakan pada port yang diset seebagai output, maka fungsinya yaitu untuk memberikan nilai keluaran jika diberi nilai 1 (satu) atau High maka output keluaran port tersebut akan High atau akan keluar tegangan sekitar +5V , sebaliknya jika memberi nilai 0 (nol) atau Low pada register ini akan memberikan keluaran low atau memberi tegangan nol volt atau memberikan jalur ground.
cara pemograman untuk memberi nilai ke register ini sama dengan cara memberikan nilai ke DDR diatas. berikut adalah contoh memberikan nilai ke PORTB

PORTB = 0b11111111 (dalam biner) sama dengan PORTB = 0xff (dalam hexa)  sama dengan PORTB = 255 (dalam dec)

pemograman per bit PORTx dapat dilakukan sama dengan DDRx diatas. contoh untuk memberikan PORTB.3 bernilai High dapat dilakukan dengan cara berikut :

PORTB |= _BV(3)

atau jika ingin membuat nilai nol atau low ke PIN tertentu. contoh untuk memberikan nilai PORTA.3 menjadi nol atau low, yaitu dapat dilakukan dengan cara berikut :

PORTA &= ~_BV(3)

PINx

PINx merupakan register yang digunakan untuk membaca nilai PORT dalam mikrokontroler. register ini umumnya digunakan untuk membaca keadaan suatu PORT atau PIN pada PORT di mikrokontontroler yang umumnya terhubung ke sebuah sensor atau inputan push button atau tombol yang lain. cara penggunaannya langsung dapat dimasukan ke sebuah variabel berukuran 8 bit. berikut contoh penggunaan register PINx untuk membaca nilai pada PORT.

unsigned char dataMasukanPortA;
dataMasukanPortA = PINA;

variabel dataMasukanPortA akan berisi nilai yang terdapat pada PORTA.

untuk pengecekan perPIN dari sebuah PORT dapat digunakan fungsi bit_is_clear(PINx, n) untuk mengecek sebuah PIN bernilai nol atau low atau bit_is_set(PINx, n).

contoh penggunaan yaitu sebagai berikut :

if (bit_is_clear(PINC, 7)  => untuk mencek apakah PIN di PORTC.7 bernilai low atau tidak
{
PORTB |= _BV(2);     => jika PIN di PORTC.7 bernilai low makan PORTB.2 akan diberi nilai High
}

atau penggunaan bit_is_set seperti dibawah ini

while (bit_is_set(PINB, 6)   => untuk mencek apakah PIN di PORTB.6 bernilai high atau tidak
{
PORTA |= _BV(3)
 _delay_ms(300);                                                  
PORTA &=~_BV(3)
_delay_ms(300);
}