
ATMega8535 adalah merupakan mikrokontroler keluarga AVR yaitu keluarga mikrokontroler produksi Atmel yang menggunakan RISC CPU (Reduced Instruction Set Computing Central Processing Unit) yaitu teknologi pengkode-an yang lebih efisien dari mikrokontroler konvensional yang menggunakan CISC CPU (Complex Instruction Set Computing Central Processing Unit) hingga 10 kali lebih cepat.
Mikrokontroler ini memiliki 8Kb Flash PEROM untuk penyimpanan kode program yang dapat diisikan dengan menggunakan teknik ISP (In System Programming) sehingga tidak memerlukan unit programmer yang kompleks dalam proses pengisian ini. Juga tersedia 512 byte EEPROM untuk penyimpanan data, 512 byte SRAM untuk variabel, 32 I/O, 3 timer/counter yang fleksibel, serial USART, 8 channel 10 bit ADC.
Dengan kemampuan menjalankan instruksi hanya dalam satu siklus clock saja maka hal ini merupakan optimasi kecepatan dan konsumsi daya dari mikrokontroler ini.
PortX Driver
Adalah bagian rangkaian kendali dari I/O-I/O ATMega8535 yaitu Port A, Port B, Port C dan Port D.
Data Dir PortX
Bagian pengatur arah dari port-port ATMega8535 yaitu sebagai input atau sebagai output
Oscillator
Merupakan jantung dari mikrokontroler yang berdetak di mana setiap detaknya adalah merupakan siklus kerja dari mikrokontroler tersebut.
Program Counter
Merupakan register yang menyimpan alamat dari kode program yang sedang dijalankan atau dieksekusi saat itu.
Stack Pointer
Merupakan register yang menunjukkan poisisi stack saat ini berada.
Program Flash
Lokasi tempat penyimpanan kode-kode program yang didownload secara In System Programming ke dalam mikrokontroler ini. Di sinilah tempat pengguna mikrokontroler mengisikan program rancangannya.
Instruction Register
Lokasi tempat penyimpanan kode-kode instruksi ATMega8535. Kode-kode ini akan didecode atau diterjemahkan saat program counter menunjuk ke lokasi penyimpanannya.
SRAM
Static RAM adalah merupakan lokasi penyimpanan variabel-variabel dalam suatu program yang dirancang di mana SRAM mempunyai kecepatan baca tulis yang sangat cepat.
General Purpose Register
Register-register untuk keperluan umum di mana pengguna juga dapat menyimpan variabel ke dalamnya.
Timer/Counter
Timer adalah merupakan pewaktu yang berfungsi menghitung lama waktu dalam sebuah event yang terjadi sedangkan counter berfungsi menghitung jumlah pulsa selama periode waktu tertentu.
Interrupt
Interrupt adalah merupakan suatu kejadian di mana jalannya program harus terhenti sesaat untuk menjalankan kode-kode program yang ada dalam vektor interupsi tersebut.
EEPROM
Merupakan memory yang tetap menyimpan data walau power supply dinon aktifkan. Memory ini hanya terhapus bila terjadi penumpukkan data pada lokasi tersebut.
USART
Merupakan antarmuka ATTMega8535 ini dengan port serial PC di mana komunikasi dapat dilakukan secara Duplex
SPI
Serial Peripheral Interface adalah merupakan teknik akses I/O dengan menggunakan metode 3 wire yaitu SI/SO (Serial In / Serial Out), SCK (Serial Clock), SS (Slave select).
ADC Interface
Merupakan bagian pengkonversi sinyal analog ke digital sebanyak 8 channel dan terletak di PortA
I/O Mikrokontroler
Tabel 1.1 Deskripsi Pin ATMega8535
| Kaki | Deskripsi |
| VCC | Input sumber tegangan positif |
| GND | Ground atau input sumber tegangan negatif |
| Port A (PA0 – PA2) | Port A terdiri dari 3 bit dan bersifat bidirectional sehingga dapat digunakan sebagai input maupun output. Masing-masing pin dalam port tersebut dapat diatur agar terhubung dengan internal pull up ataupun tidak.
Sebagai output, port ini memiliki karakteristik yang sama baik sebagai current sink ataupun current source. Sebagai input, port ini akan mengalirkan arus apabila terhubung ke ground melalui resistansi (pull down) dan internal pull up aktif (Gambar 1.2). Port ini akan berada pada kondisi tri-state saat kondisi reset aktif walaupun pulsa clock belum aktif. Port ini juga memiliki fungsi alternatif seperti yang dijelaskan pada Tabel 1.3 |
| Port B (PB0 – PB7) | Port B terdiri dari 8 bit dan bersifat bidirectional sehingga dapat digunakan sebagai input maupun output. Masing-masing pin dalam port tersebut dapat diatur agar terhubung dengan internal pull up ataupun tidak.
Sebagai output, port ini memiliki karakteristik yang sama baik sebagai current sink ataupun current source. Sebagai input, port ini akan mengalirkan arus apabila terhubung ke ground melalui resistansi (pull down) dan internal pull up aktif (Gambar 1.2). Port ini akan berada pada kondisi tri-state saat kondisi reset aktif walaupun pulsa clock belum aktif. Port ini juga memiliki fungsi alternatif seperti yang dijelaskan pada Tabel 1.3 |
| Port D (PD0 – PD6) | Port A terdiri dari 7 bit dan bersifat bidirectional sehingga dapat digunakan sebagai input maupun output. Masing-masing pin dalam port tersebut dapat diatur agar terhubung dengan internal pull up ataupun tidak.
Sebagai output, port ini memiliki karakteristik yang sama baik sebagai current sink ataupun current source. Sebagai input, port ini akan mengalirkan arus apabila terhubung ke ground melalui resistansi (pull down) dan internal pull up aktif (Gambar 1.2). Port ini akan berada pada kondisi tri-state saat kondisi reset aktif walaupun pulsa clock belum aktif. Port ini juga memiliki fungsi alternatif seperti yang dijelaskan pada Tabel 1.3 |
| Reset | Kondisi logika rendah dengan waktu yang lebih lama dari minimum lebar pulsa akan membangkitkan kondisi reset walaupun clock tidak aktif. Input reset ini adalah fungsi alternatif dari PA2 dan dW |
| Xtal1 | Pin ini berfungsi sebagai alternatif dari PA0 atau sebagai input internal clock |
| Xtal2 | Pin ini berfungsi sebagai alternatif dari PA1 atau sebagai output osilator yang tela |

Gambar 1.2
Aliran arus saat internal pull up aktif dan external pull down terpasang
Masing-masing port dari ATMega8535 dilengkapi dengan dua buah dioda yang terhubung antara kaki port dengan ground dan kaki port dengan VCC untuk memproteksi port tersebut dari tegangan berlebih yang biasa ditimbulkan oleh noise ataupun elektro statis. Masing-masing port ini juga mempunyai arus yang mampu mengaktifkan LED secara langsung.

Gambar 1.3 Rangkaian Ekivalen Pin I/O
Pxn adalah merupakan kaki I/O dari ATMega8535 di mana x adalah nama port (Port A, Port B atau Port D) dan n adalah nomor urutnya. Masing-masing port memiliki tiga buah register yaitu Data Register (Portx), Data Direction Register (DDRx) dan Port Input Pin (PINx)
Portx atau Data Register berfungsi sebagai register data keluaran dari port. Apabila port diatur sebagai output atau keluaran maka kondisi data pada register ini akan merupakan kondisi logika dari kaki-kaki port tersebut.
Sedangkan Data Direction Register berfungsi sebagai register pengatur arah dari port. Logika 0 pada register ini adalah merupakan indikasi port sebagai input atau masukan dan logika 1 merupakan indikasi port sebagai output atau keluaran. Port ini dapat diatur secara terpisah untuk setiap bitnya. Contoh untuk data 81h atau 1000 0001 biner maka dalam hal ini Px7 dan Px0 adalah keluaran dan Px6 hingga Px1 adalah masukan.
Port Input Pin (PinX) adalah merupakan register yang menyimpan kondisi masukan dari port.
Masing-masing port memiliki internal pull up yang dapat diatur berdasarkan kondisi logika pada bit PUD (Pull up disable) yang ada di register MCUCR. Apabila bit ini berlogika 1 maka dinyatakan bahwa internal pull up disable atau tidak aktif sedangkan bila bit ini berlogika 0 maka dinyatakan bahwa internal pull up aktif.

Gambar 1.4 Konstruksi I/O Digital
Dari gambar 1.4 terlihat bahwa internal pull up diatur oleh kondisi bit PUD, DDRxn dan Portxn. Apabila PUD berlogika 0 , DDRxn berlogika 0 (sebagai masukan) dan Portxn berlogika 1 maka internal pull up akan aktif.
Apabila kondisi Sleep/Reset terjadi dan DDRxn = 1 maka Pxn akan berada dalam kondisi tri-state..
Dengan memberikan logika 1 pada Portxn pada saat DDRx = 1 (sebagai keluaran) maka Pxn akan terhubung ke VCC dan logika 0 akan membuat Pxn terhubung ke ground.
Pxn dapat diubah kondisinya secara toggle (dari 0 ke 1 atau sebaliknya dari 1 ke 0) dengan menuliskan logika 1 pada PINx.
Dengan konstruksi I/O seperti pada gambar 1.4 maka ada beberapa hal yang perlu diperhatikan pada saat melakukan perubahan konfigurasi dari masukan menjadi keluaran. Pada saat Pxn berada pada konfigurasi sebagai masukan dengan internal pull up dan akan diubah menjadi keluaran dengan logika 0, Pxn akan melewati kondisi tertentu sebagai berikut.
– Pada saat kondisi input dengan internal pull up, maka Portxn akan berlogika 1 dan DDRxn berlogika 0
– Untuk mengubah menjadi keluaran dengan logika 0 maka terlebih dahulu DDRxn diubah menjadi logika 1. Pada saat tersebut, Pxn akan terhubung ke VCC sehingga menjadi logika 1 terlebih dahulu sebelum PortXn diubah menjadi logika 0 (gambar 1.5a)
– Atau bila dilakukan dengan mengubah Portxn menjadi logika 0 maka Pxn akan berada pada kondisi tri-state terlebih dahulu sebelum DDRxn diatur menjadi keluaran (logika 1) (gambar 1.5b)
– Pxn akan berlogika 0 saat DDRxn berlogika 1 dan Portxn berlogika 0.

Gambar 1.5 Perubahan dari input dengan internal pull up menjadi output logika 0
Kondisi-kondisi ini perlu diketahui sebagai pertimbangan dalam merancang antarmuka dengan I/O ATMega8535.
Pada saat Pxn berada pada konfigurasi masukan dengan tri-state dan akan diubah menjadi keluaran dengan logika 1 maka akan terjadi kondisi sebagai berikut.
– Pada saat kondisi input dengan kondisi tri-state, maka Portxn akan berlogika 1 dan DDRxn berlogika 0
– Untuk mengubah menjadi keluaran dengan logika 1 maka terlebih dahulu DDRxn diubah menjadi logika 1. Pada saat tersebut, Pxn akan terhubung ke ground terlebih dahulu sebelum PortXn diubah menjadi logika 1
– Atau bila diletakkan dengan mengubah Portxn menjadi logika 1 maka Pxn akan berada pada kondisi internal pull up terlebih dahulu sebelum DDRxn diatur menjadi keluaran (logika 1), kecuali bila PUD bit diatur pada kondisi logika 0.
– Pxn akan berlogika 1 saat DDRxn berlogika 1 dan Portxn berlogika 1

Gambar 1.6 perubahan dari input tri-state menjadi output dengan logika 1
Tabel 1.2 Konfigurasi Port Pin
| DDRxn | Portxn | PUD | I/O | Pull up | Keterangan |
| 0 | 0 | X | Input | Tidak | Tri-state |
| 0 | 1 | 0 | Input | Ya | Akan menjadi sumber arus apabila diberi beban |
| 0 | 1 | 1 | Input | Tidak | Tri-state |
| 1 | 0 | X | Output | Tidak | Keluaran 0 |
| 1 | 1 | X | Output | Tidak | Keluaran 1 |
Pemrograman Port I/O
Pada bagian berikut ini kita akan membahas contoh-contoh program yang mengakses Port I/O ATMega8535. Untuk pemrograman ini kita butuhkan:
– 8 buah LED yang terhubung pada Port B (digunakan Modul 8 bit LED Logic Tester)
– 8 buah switch yang terhubung pada Port C (digunakan Modul 8 bit Switch Logic)
– 1 buah system minimum ATMega8535 (digunakan ST-8535)
Rangkaian tersebut akan membentuk skema sebagai berikut:

Listing C 1.1
PORTB=0x55; // PB0=1,PB1=0,PB2=1,PB3=0,PB4=1,PB5=0,PB6=1,PB7=0
Listing tersebut adalah contoh untuk memberikan kondisi keluaran pada PortB secara parallel
Tampilan pada LED akan terlihat sebagai berikut:

Gambar 1.7 kondisi LED pada keluaran 0x55 atau 01010101b
8 bit LED Logic Tester mempunyai common yang terhubung ke anoda (VCC) dan input yang terhubung ke katoda LED melalui resistor, oleh karena itu logic 0 (tegangan 0 volt) akan diwakili dengan nyala LED dan logic 1 (tegangan 5 volt) akan diwakili dengan LED yang padam
Listing C 1.2
int main(void)
{
unsigned char data_port;
data_port=0xAA;
PORTB=data_port;
while(1);
}
Listing program di atas adalah contoh untuk memberikan kondisi keluaran yang berasal dari sebuah variable di mana dalam hal ini adalah variable data_port.
Hasil output pada LED adalah sebagai berikut

Listing C 1.3
int main(void)
{
unsigned char data_port;
DDRB=0xFF;
data_port=0x1;
PORTB=data_port;
_delay_ms(1000);
while(1){
PORTB=data_port;
for (int i=0;i<8;i++){
PORTB<<=1; //Geser Port B ke kiri
_delay_ms(1000);
}
}
}
Pada listing program di atas adalah contoh melakukan pergeseran data pada Port mikrokontroler. Instruksi PORTB <<=1 adalah instruksi untuk menggeser 8 bit data pada PORTB ke kiri dan hasilnya disimpan lagi ke PORTB.
– Pada awalnya variable data_port diberi nilai awal 0x1
– Kemudian setelah data_port dikirim ke PORTB, data di PORTB digeser 1 bit ke kiri sebanyak 8 kali
– Hasilnya LED Logic Tester yang terpasang di PORTB akan bergeser ke kiri setiap 1000 mS atau 1 detik
Listing C1.4
DDRB=0xFF; // set direction port B sebagai output
DDRC=0x00; //set direction port C sebagai input
while(1) // ambil data di Port C dan kirim ke Port B terus menerus
PORTB=PINC; //
Pada listing program ini, data apapun yang ada di PortC akan langsung ditampilkan di PortB
– Pasang LED Logic Tester di PortB
– Pasang 8 bit Switch input di PortC
– Tekan tombol-tombol yang ada di 8 bit switch
– Tampak setiap penekanan tombol akan ditampilkan di Port B dalam nyala LED pada LED logic tester.
Listing C1.5
#define TOMBOLSTART 0
#define PORTIN PINC
void runled(){
PORTB=0x1;
for (int i=0;i<8;i++){
PORTB<<=1;
_delay_ms(1000);
}
}
int main(void)
{
unsigned char data_port;
DDRB=0xFF;
DDRC=0x00;
while(1){
if (!(PORTIN&(1<<TOMBOLSTART)))
runled();
PORTB=PINC;
}
}
Pada listing C1.5 kita mempelajari bagaimana masukan port diambil secara per bit, yaitu hanya di PC0 saja yang terhubung pada saklar. Pada saat saklar di PC0 ditekan maka fungsi running led akan diaktifkan dan LED di LED Logic Tester akan bergeser. Apabila saklar-saklar lain selain PC0 maka, kondisi PortC akan langsung ditampilkan di LED Logic Tester melalui PORTB
Akses Port secara bit
Kadang-kadang dibutuhkan untuk mengakses I/O secara bit di mana akses tersebut tidak akan mengganggu bit-bit yang lain.
Contoh Listing C1.6 pada saat kondisi PORTD = 0xFF dan ingin meng-clear PD0.
Assembler:
CBI PortD,0
C:
PortD&=~(1<<0);
Contoh Listing C1.7 pada saat kondisi PORTD = 0x00 dan ingin men-set PD0
Assembler:
SBI PortD,0
C:
PortD|=(1<<0);
Sedangkan untuk mendeteksi input secara per bit dapat dilihat pada listing C1.5 pada syntax if(!(PORTIN&(1<<TOMBOLSTART)))
runled;
Di sini PORTIN telah didefinisikan sebagai PINC dan TOMBOLSTART = 0, maka di sini berarti instruksi if berlaku pada saat kondisi adalah invers dari kondisi (PINC&(1<<0)), yaitu kondisi input Port C yang di AND dengan nilai 1 yang digeser kiri sebanyak 0x. Maka di sini apabila input PC0:
!(xxxxxx0 AND (1<<0))
!(xxxxxx0 AND 00000001)
!0 = 1
Jadi instruksi runled akan dijalankan bila diperoleh kondisi PC0 adalah 0.
Dalam source assembler syntaxnya adalah sebagai berikut
TungguPD0:
SBIC PortD,0 ;Skip instruksi dibawah apabila PD0 clear
Rjmp tungguPD0 ;Kembali tunggu PD0 apabila PD0 masih set
Rcall Runled ;Runled dijalankan setelah PD0 clear dan instruksi Rjmp dilewati
DELTA ELECTRONIC
Paulus Andi Nalwan, ST