Selasa, 20 September 2011

Pemograman Bahasa C Pada Mikrokontroler AVR ATMega

Pemrograman Bahasa C pada Mikrokontroler AVR ATMega 8535 by. Sukandar S.
Referensi :
Nana Suryana, S.Pd : SMTAVR V2.0 TRAINER MIKROKONTROLER ATMEGA 8535


BAGIAN 1
1. MINIMUM SYSTEM ATMEGA 8535

Gambar 1. Minimum System ATMEGA 8535


2. DIGITAL INPUT
Modul digital input ini terdiri dari delapan buah push button aktif low dengan logik default high. Push button dihubungkan dengan resistor Pull Up, sehingga ketika push button tidak ditekan bit pada PORTx berlogik satu (1), dan ketika push button ditekan bit pada PORTx berlogik nol (0). PORTx yang dimaksud yaitu salah satu dari PORTA, PORTB, PORTC dan PORTD yang digunakan sesuai dengan tuntutan sistem yang kita bangun.
Gambar 2. Skema Digital Input

3. DIGITAL OUTPUT
Modul digital output ini terdiri dari delapan buah LED aktif low dan satu buah buzer aktif low. LED akan menyala ketika data yang dikeluarkan dari mikrokontroler berlogik 0, demikian juga dengan buzer, akan berbunyi ketika diberi logik 0.

Gambar 3. Skema Digital Output


BAGIAN II
MIKROKONTROLER ATMEGA 8535
A. Pendahuluan
Mikrokontroller adalah piranti elektronik berupa IC (Integrated Circuit) yang memiliki kemampuan manipulasi data (informasi) berdasarkan suatu urutan instruksi (program) yang dibuat oleh programmer. Mikrokontroller merupakan contoh suatu sistem komputer sederhana yang masuk dalam kategori embedded komputer. Dalam sebuah struktur mikrokontroller akan kita temukan juga komponenkomponen seperti: processor, memory, clock dll.
Atmega 8535/16/32 merupakan mikrokontroler CMOS 8 bit yang dibangun dengan arsitektur AVR enhanced RICS. Dengan eksekusi instruksi dalam satu siklus clock.
Pada modul ini dipilih mikrokontroller jenis ATMEL AVR RISC dengan pertimbangan sebagai berikut:
• ATMEL AVR RISC memiliki fasilitas dan kefungsian yang lengkap dengan harga yang
relatif murah.
• Kecepatan maksimum eksekusi instruksi mikrokontroller mencapai 16 MIPS (Million
Instruction per Second), yang berarti hanya dibutuhkan 1 clock untuk 1 eksekusi
instruksi.
• Konsumsi daya yang rendah jika dibandingkan dengan kecepatan eksekusi instruksi.
• Ketersediaan kompiler C (CV AVR) yang memudahkan user memprogram menggunakan
bahasa C.


Berikut ini tabel perbandingan kecepatan processor dan efisiensi eksekusi beberapa mikrokontroller:

Dari tabel diatas dapat dilihat, ketika bekerja dengan kecepatan clock yang sama AVR 7 kali lebih cepat dibandingkan dengan PIC16C74, 15 kali lebih cepat daripada 68 HC11, dan 28 kali lebih cepat dibanding 8051. Dari kemampuan dan fasilitas yang dimiliki, AVR RISC cocok dipilih sebagai mikrokontroller untuk membangun bermacam-macam aplikasi embedded sistem. Dalam modul trainer ini dipilih salah satu jenis AVR RISC yaitu ATmega 8535.

B. Fitur ATmega8535
ATmega8535 memiliki fitur sebagai berikut :
• Saluran I/O sebanyak 32 buah, yaitu PORTA, PORTB, PORTC dan PORTD
• 8 kanal ADC dengan resolusi 10 bit
• 3 buah Timer/Counter
• Watchdog timer dengan oscilator internal
• SRAM sebesar 512 byte
• Memori flash sebesar 8k
• Unit interupsi internal dan eksternal
• Port antarmuka SPI
• EEPROM sebesar 512 byte
• Antarmuka komparator analog
• Port USART untuk komunikasi serial


C. Konfigurasi Pin ATmega8535
ATmega 8535 memiliki 40 pin kaki, berikut skema kaki ATmega8535,

Fungsi Pin
• VCC merupakan pin masukan untuk catu daya
• GND merupakan pin ground
• PORTA(PA0..PA7) merupakan pin I/O dua arah dan pin masukan ADC
• PORTB(PB0..PB7) merupakan pin I/O dua arah dan pin fungsi khusus(timer/counter,
komparator analog dan SPI)
• PORTC(PC0..PC7) merupakan pin I/O dua arah dan fungsi khusus (TWI, komparator
analog dan timer oscilator)
• PORTD(PD0..PD7) merupakan pin I/O dua arah dan fungsi khusus (komparator analog,
interupsi eksternal dan komunikasi serial)
• RESET merupakan pin yang digunakan untuk me-reset mikrokontroler
• XTAL1 dan XTAL2 merupakan pin masukan clock eksternal
• AVCC merupakan pin masukan tegangan untuk ADC
• AREF merupakan pin masukan tegangan referensi ADC

D. Organisasi memori
ATMega8535 memiliki ruang pengalamatan memori data dan memori program yang terpisah. Sebagai tambahan, ATmega8535memiliki fitur suatu EEPROM Memori untuk penyimpanan data.

Memori Data
Memori data terbagi menjadi 3 bagian, yaitu 32 register umum, 64 buah register I/O,dan 512 byte SRAM Internal. Register keperluan umum menempati space data pada alamat terbawah, yaitu $00 sampai $1F. Sementara itu, register khusus untuk menangani I/O dan control terhadap mikrokontroler menempati 64 alamat berikutnya, yaitu mulai dari $20 hingga $5F. Register tersebut merupakan register yang khusus digunakan untuk mengatur fungsi terhadap berbagai peripheral mikrokontroler, seperti kontrol register, timer/counter, fungsi–fungsi I/O, dan sebagainya. Alamat memori berikutnya digunakan untuk SRAM 512 byte, yaitu pada lokasi $60 sampai dengan $25F. Konfigurasi memori data ditunjukkan pada gambar di bawah ini.

Memori Program
ATmega8535 berisi 8K bytes On-Chip di dalam sistem Memori flash Reprogrammable untuk penyimpanan program. Karena semua AVR instruksi adalah 16 atau 32 bits lebar, Flash adalah berbentuk 4K x16. Untuk keamanan perangkat lunak, Flash Ruang program memori adalah dibagi menjadi dua bagian, bagian boot program dan bagian aplikasi program dengan alamat mulai dari $000 sampai $FFF.Flash Memori mempunyai suatu daya tahan sedikitnya 10,000write/erase Cycles. ATmega8535 Program Counter (PC) adalah 12 bitlebar, alamat ini 4K lokasi program memori.

E. Port Sebagai Input / Output Digital
ATmega8535 mempunyai empat buah port yang bernama PortA, PortB, PortC, dan PortD. empat port tersebut merupakan jalur bi-directional dengan pilihan internal pull-up. Tiap port mempunyai tiga buah register bit, yaitu DDxn, PORTxn, dan PINxn. Huruf ‘x’ mewakili nama huruf dari port sedangkan huruf ‘n’ mewakili nomor bit. Bit DDxn terdapat pada I/O address DDRx, bit PORTxn terdapat pada I/O address PORTx, dan bit PINxn terdapat pada I/O address PINx. Bit DDxn dalam regiter DDRx (Data Direction Register) menentukan arah pin. Bila DDxn diset 1 maka Px berfungsi sebagai pin output. Bila DDxn diset 0 maka Px berfungsi sebagai pin input. Bila PORTxn diset 1 pada saat pin terkonfigurasi sebagai pin input, maka resistor pullup akan diaktifkan. Untuk mematikan resistor pullup, PORTxn harus diset 0 atau pin dikonfigurasi sebagai pin output. Pin port adalah tri-state setelah kondisi reset. Bila PORTxn diset 1 pada saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 1. Dan bila PORTxn diset 0 pada saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 0. Saat mengubah kondisi port dari kondisi tri-state (DDxn=0, PORTxn=0) ke kondisi output high (DDxn=1, PORTxn=1) maka harus ada kondisi peralihan apakah itu kondisi pull-up enabled (DDxn=0, PORTxn=1)atau kondisi output low (DDxn=1, PORTxn=0). Biasanya, kondisi pull-up enabled dapat diterima sepenuhnya, selama lingkungan impedansi tinggi tidak memperhatikan perbedaan antara sebuah strong high driver dengan sebuah pull-up. Jika ini bukan suatu masalah, maka bit PUD pada register SFIOR dapat diset 1 untuk mematikan semua pull-up dalam semua port. Peralihan dari kondisi input dengan pull-up ke kondisi output low juga menimbulkan masalah yang sama. Maka harus menggunakan kondisi tri-state (DDxn=0, PORTxn=0) atau kondisi output high (DDxn=1, PORTxn=0) sebagai kondisi transisi. Lebih detil mengenai port ini dapat dilihat pada manual datasheet dari IC ATmega8535.
Konfigurasi Pin Port


Bit 2 – PUD : Pull-up Disable
Bila bit diset bernilai 1 maka pull-up pada port I/O akan dimatikan walaupun register DDxn dan PORTxn dikonfigurasikan untuk menyalakan pull-up (DDxn=0, PORTxn=1).

F. Mengakses PORT


Menyalakan LED di PORTC
Prinsip kerja Hardware, yaitu saat kita memberikan logika 0 pada port C maka kita akan mendapatkan led menyala. Hal ini dikarenakan terjadi perbedaan tegangan pada kaki anoda dan katoda, saat kita memberikan logika 1, maka Led akan padam karena disana kita menggunakan conmmon anoda yang terhubung dengan VCC.

Contoh Program :
1. Menyalakan LED berkedip-kedip selama 1 detik
#include
#include
void main(void)
{
DDRA=0xFF; //Port A sebagai output
//Aplikasi lampu nyala-padam 8 buah
//masing-masing 1 detik
while (1)
{PORTA=0xFF; // lampu padam
delay_ms(1000); // jeda 1 detik
PORTA=0x00; // lampu nyala
delay_ms(1000); } // jeda 1 detik
}

2. LED menyala berjalan
#include
#include
void main()
{
DDRA=0xFF;//Port A sebagai output
while (1)
{PORTA=0b01111111; delay_ms(100);
PORTA=0b10111111; delay_ms(100);
PORTA=0b11011111; delay_ms(100);
PORTA=0b11101111; delay_ms(100);
PORTA=0b11110111; delay_ms(100);
PORTA=0b11111011; delay_ms(100);
PORTA=0b11111101; delay_ms(100);
PORTA=0b11111110; delay_ms(100);}
}