Yang harus diperhatikan untuk menguanakan interupsi adalah, kita harus tau sumber-sumber
interupsi, vektor layanan interupsi dan yang terpenting rutin lyanan interupsi, yaitu subrutin
yang akan dikerjakan bila terjadi interupsi .
Pada AVR terdapat 3 pin interupsi eksternal, yaitu INT0,INT1,dan INT2. Interupsi
eksternal dapat dibangkitkan apabila ada perubahan logika baik transisi naik (rising edge)
maupun transisi turun (falling edge) pada pin interupsi. Pengaturan kondisi keadaan yang
menyebabkan terjadinya interupsi eksternal diatur oleh 2 buah register I/O yaitu MCUCR dan
register MCUCSR
MCUCR ( MCU Control Register), mengatur pemicu interupsi dan fungsi MCU secara
umum.
Bit penyusunnya:
Bit ISC11 dan ISC10 bersama-sama menentukan kodisi yang dapat menyebakan
interupsi eksternal pada pin INT1. Dan Bit ISC01 dan ISC00 bersama-sama
menentukan kodisi yang dapat menyebakan interupsi eksternal pada pin INT0.
keadaan selengkapnya terlihat pada table berikut :
Untuk interupsi INT2 hanya memiliki satu bit ISC, sehingga hanya memiliki 2 kondisi
pemicu interupsi yaitu:
‘0’ = interupsi terjadi jika terjadi transisi turun pada pin INT2
‘1’= interupsi terjadi jika terjadi transisi naik pada pin INT2
Untuk sumber interupsi INT2, perubahan/transisi sinyal yang dapat membangkitkan intrupsi
harus memiliki lebar pulsa minimal sekitar 50ns.
GICR
Pemilihan pengaktifan interupsi eksternal diatur oleh register GICR ( General Interrupt
Control Register ) yang terlihat pada gambar berikut :
Bit INT1 adalah bit untuk mengaktifkan interupsi eksternal 1. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 1 akan aktif.
Bit INT0 adalah bit untuk mengaktifkan interupsi eksternal 0. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 0 akan aktif.
Bit INT2 adalah bit untuk mengaktifkan interupsi eksternal 2. Apabila bit tersebut
diberi logika 1 dan bit I pada SREG (status register) juga satu , maka interupsi
eksternal 2 akan aktif.
Digunakan untuk menyimpan informasi dan hasil operasi aritmatika terakhir. Data SREG
selalu berubah setiap instruksi atau operasi pad ALU dan datanya tidak otomatis tersimpan
apabila terjadi instruksi percabangan baik karena interupsi maupun lompatan.
Bit I digunakan untuk mengaktifkan interupsi secara umum (interupsi global). Jika bit I
bernilai ‘1’ maka interupsi secara umum aktif, tetapi jika ‘0’ maka tidak satupun interupsi
yang aktif.
Contoh Programnya:
//INTERUPSI EKSTERNAL 0 DAN EKSTERNAL 1
#include<mega8535.h>
void main()
{
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0xff;
GICR=0b11000000;
#asm("sei")
while(1)
{;}
}
Contoh lain
#include <mega8535.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
PORTC=0xf0;
}
void main(void)
{
PORTD=0x00;
DDRD=0x00;
DDRC=0xff;
PORTC=0xff;
while (1)
{
};}
TIMER/COUNTER
Timer/Counter pada AT Mega 8535 terdiri dari 3 buah. Yaitu Timer/Counter0 ( 8bit ),
Timer/Counter1 ( 16 bit ), dan Timer/Counter2 ( 8 Bit ).
2.2.3.1 Timer/Counter0
d. Frekuensi generator.
Bit ini mengontrol kenaikan isi counter, sumber nilai maksimum counter dan
tipe jenis Timer/Counter yang dihasilkan, yaitu mode normal, clear timer, mode
compare match, dan dua tipe dari PWM (Pulse Width Modulation). Tabel 2.2 berikut
mencacah dari 0x00 sampai dengan 0xff. Setelah mencapai nilai maximum yaitu 0xff maka
Mode 1: Timer/counter 0 berfungsi sebagai phase correct PWM (PCP). Mode ini
digunakan untuk menghasilkan sinyal PWM dimana nilai register counter (TCNT0) yang
mencacah naik dan turun secara terus menerus akan selalu dibandingkan dengan register
pembanding 0CR0. Hasil pembandingan register TCNT0 dan OCR0 digunakan untuk
membangkitkan sinyal PWM yang dikeluarkan pada pin OC0 seperti gambar
Frekuensi dan duty cycle PWM yang dihasilkan pada mode ini adalah
foc0= fosc/(N*512)
D=OCR0/255 *100%
Dimana
Mode 2: Timer/counter 0 sebagai clear timer on compare match (CTC). Maksudnya adalah
register counter (TCNT0) akan mencacah naik kemudian akan direset atau kembali manjadi
0x00 pada saat nilai TCNT0 sama dengan OCR0. Dengan mengatur keluaran OC0 bergulir
(toggle) dapat membangkitkan gelombang kotak dengan frekuensi:
foc0=fosc/(2*N* (1+OCR0))
Mode 3: timer /counter berfungsi sebagai fast PWM. Mode ini hampir sama dengan mode
phase correct PWM, hanya perbedaaanya adalah register TCNT0 mencacah naik saja dan
tidak pernah mencacah turun
Frekuensi dan duty cycle PWM yang dihasilkan pada mode fast PWM ini
foc0= fosc/(N*256)
D=OCR0/255 *100%
c. Bit 5, 4 – COM01:COM00: Compare Match Output Mode.
Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini nol
atau clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah satu bit set.
Maka fungsi pin ini tergantung pada setting bit pada WGM00 dan WGM01. Berikut
Tabel 2.3 sampai dengan Tabel 2.5 adalah tabel setting bit ini sesuai setting bit pada
Tabel 2.3 Konfigurasi Bit COM01 dan COM00 Compare Output Mode non PWM
Tabel 2.4Konfigurasi Bit COM01 dan COM00 Compare Output Mode Fast PWM
Tabel 2.5 Konfigurasi Bit COM01 dan COM00 Compare Output Mode Phase
Correct PWM
d. Bit 2, 1, 0 – CS02; CS01, CS00: Clock Select.
Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh
Tabel 2.6 Konfigurasi Bit Clock Select untuk memilih sumber detak
Register TCNT0 berfungsi untuk menyimpan data cacahan timer/counter0. Karena ukuran
register TCNT0 hanya 8bit maka hanya dapat melakukan cacahan 0x00-0xff.
Register OCR0 berfungsi untuk menyimpan data pembanding yang akan selalu dibandingkan
dengan isi register TCNT0. Jika TCNT0 sama dengan OCR0 maka akan terjadi event sesuai
h. Pembangkit frekuensi.
Pengaturan Timer/Counter 1 diatur melalui register TCCR1A yang dapat dilihat pada
Gambar 2.6.
Compare (OC1A dan OC1B). Jika salah satu atau kedua bit pada register COM1A1:0
ditulis menjadi satu maka kaki pin OC1A tidak berfungsi normal sebagai port I/O.
Begitu juga pada register COM1B1:0 ditulis menjadi satu maka kaki pin OC1B juga
tidak berfungsi normal sebagai port I/O. Fungsi pada pin OC1A dan OC1B tergantung
pada setting bit pada register WGM13:0 diset sebagai mode PWM atau mode non-
PWM.
bit ini mengontrol urutan pencacah dari counter, sumber maksimum (TOP) nilai
counter, dan tipe dari gelombang yang dibangkitkan. Mode yang dapat dilakukan
antara lain: mode normal, mode Clear Timer on Compare Match (CTC) dan tiga tipe
mode PWM.
Tabel 2.9 Konfigurasi Bit Compare Output Mode Phase Correct dan Frequency
Correct PWM
Tabel 2.10 Konfigurasi mode PWM
Pengaturan Timer/Counter 1 juga diatur melalui register TCCR1B yang dapat dilihat
Ketiga bit ini mengatur sumber detak yang digunakan untuk Timer/Counter1.
Tabel 2.11 Konfigurasi bit Clock Select untuk memilih sumber detak
Timer/Counter2
d. Frekuensi generator.
Bit ini mengontrol kenaikan dari counter, sumber dari nilai maksimum counter, dan
tipe dari jenis Timer/Counter yang dihasilkan yaitu mode normal, clear timer, mode
compare match, dan dua tipe dari PWM (Pulse Width Modulation). Berikut tabel
Bit ini mengontrol pin OC0 (Output Compare pin). Apabila kedua bit ini nol atau
clear maka pin OC0 berfungsi sebagai pin biasa tetapi bila salah satu bit set. Maka
fungsi pin ini tergantung dari seting bit pada WGM00 dan WGM01. Berikut daftar
tabel setting bit ini sesuai seting bit pada WGM00 dan WGM01.
Ketiga bit ini untuk memilih sumber detak yang akan digunakan oleh Timer/Counter .
Tabel 2.13 Konfigurasi Bit COM21 dan COM20 Compare Output Mode nonPWM
Tabel 2.14 Konfigurasi Bit COM21 dan COM20 Compare Output Mode Fast PWM
Tabel 2.15 Konfigurasi Bit COM21 dan COM20 Compare Output ModePhase Correct
PWM
Tabel 2.16 Konfigurasi Bit Clock Select untuk memilih sumber detak
Register TIMSK
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable interupsi
overflow Timer/Counter0
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
Interupsi Output Compere Match
jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
interupsi overflow Timer/Counter1
Register TIFR
Bit akan bernilai satu jika Timer/Counter0 Overflow. Bit dapat dinolkan lagi dengan
memberikan logika satu ke bit Flag ini.
Bit akan berniali satu jika nilai pada Timer/Counter0 sama dengan nilai pada OCR0 –
Output Comapre
Contoh program COUNTER:
#include<mega8535.h>
void main()
PORTC=0xFF;
DDRC=0xFF;
PORTB=0XFF;
DDRB=0;
TCCR0=0b00000110;
TCNT0=0;
while(1)
{PORTC=~TCNT0;}
}
TIMER0
#include <mega8535.h>
PORTC=led;
#asm ("sei");
while(1)
{PORTC=led;}
if (led==0xff) {led=0xfe;}
}
Contoh lagi, led on OFF dengan timer
#include<mega8535.h>
TCNT0=0x00;
Led=~led;
PORTC=led;
Void main(void){
DDRC=0cff;
PORTC=led;
TCNT0=0c00;
TCCR0=0x05;
TIMSK=0x01;
TIFR=0x00;
#asm(“sei”)
While(1){
}}
Tosc=1/fosc
Contoh program jam digital;
#include <mega8535.h>
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
void inisialisasi_tim0_on()
TCCR0=0x05;
#asm ("sei");
void inisialisasi_tim0_off(){
TCCR0=0x00;
#asm ("cli");
void atur()
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf("atur== ");
buffer1=detik;
buffer2=menit;
buffer3=jam;
set1:
if(sw_cancel==0){goto selesei;};
if(sw_ok==0){delay_ms(500);goto set2;};
if(sw_up==0){buffer1++;delay_ms(50);};
if(sw_down==0){buffer1--;delay_ms(50);};
if(buffer1>=60){buffer1=0;};
lcd_gotoxy(7,1);
lcd_putsf("detik");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set1;
set2:
if(sw_cancel==0){goto set1;};
if(sw_ok==0){delay_ms(500);goto set3;};
if(sw_up==0){buffer2++;delay_ms(50);};
if(sw_down==0){buffer2--;delay_ms(50);};
if(buffer2>=60){buffer2=0;};
lcd_gotoxy(7,1);
lcd_putsf("menit");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set2;
set3:
if(sw_cancel==0){goto set2;};
if(sw_ok==0){delay_ms(500);goto selesei;};
if(sw_up==0){buffer3++;delay_ms(50);};
if(sw_down==0){buffer3--;delay_ms(50);};
if(buffer3>=12){buffer3=0;};
lcd_gotoxy(7,1);
lcd_putsf("jam ");
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",buffer3,buffer2,buffer1);
lcd_puts(lcd_buffer);
goto set3;
selesei:
menit=detik=jam=data=0;
menit=buffer2;
jam=buffer3;
lcd_clear();
inisialisasi_tim0_on();
data=(int)buffer1*10;
return;
void main()
DDRB=0x00;
PORTB=0xff;
lcd_init(16);
inisialisasi_tim0_on();
lcd_clear();
while(1)
if(PINB.3==0){inisialisasi_tim0_off();delay_ms(500);atur();}
detik=data/10;
if(detik>=60) {detik=0;data=0;menit=menit+1;};
if(menit>=60){menit=0;jam=jam+1;};
if(jam>=12){jam=0;};
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%i : %i : %i",jam,menit,detik);
lcd_puts(lcd_buffer);
delay_ms(100);
TCNT0=0x00;
data=data+1;
PWM (Pulse Width Modulation) atau modulasi lebar pulsa adalah salah satu keunggulan
Timer/Counter yang terdapat pada Atmega8535. Ketiga jenis Timer/Counter pada
Atmega8535 dapat menghasilkan pulsa PWM. Pulsa PWM adalah sederetan pulsa yang lebar
pulsanya dapat diatur. Pulsa PWM berfungsi mengatur kecepatan motor DC, mengatur gelap
terang LED dan aplikasi lainnya. PWM adalah Timer mode Output Compare yang canggih.
Mode PWM Timer juga dapat mencacah turun yang berlawanan dengan mode Timer lainnya
yang hanya mencacah naik. Pada mode PWM tersebut, Timer mencacah naik hingga
mencapai nilai TOP, yaitu 0xFF (255) untuk PWM 8 bit dan 0x3FF (1023) untuk PWM 10
bit atau 0x1ff untuk PWM 9bit. Timer/Counter 0 dan Timer/Counter 2 hanya memiliki
PWM 8 bit, sedangkan pada Timer/Counter 1 memiliki 8 bit, 9bit dan PWM 10 bit.
Pemilihan mode PWM diatur oleh register-register Timer/counter seperti yang sudah di
jelaskan sebelumnya.
#include <mega8535.h>
void main(void)
DDRD=0xff;
TCCR1A=0xA3;
TCCR1B=0X0B;
TCNT1=0x0000;
while(1);}
penjelasan:
secara garis besar, cara kerja mode fast pwm 10-bit pada program diatas adalah dengan
membandingkan isi register TCNT1 dengan register OCR1A dan OCR1B untuk
menghasilkan keluaran PWM. Isi register TCNT1 akan mencacah naik setiap interval waktu
tertentu detak clock kristal sesuai pengaturan register TCCR1B sampai bernilai maksimum
0x03ff (1023). Selama nilai register TCNT1 lebih kecil dari data pembanding yaiut OCR1A
atau OCR1B maka keluaran pin OC1A dan OC1B akan high dan jika TCNT1 sudah melebihi
data pembanding OCR1A atau OCR1B maka keluaran OC1A dan OC1B akan low. Jika nilai
TCNT1 sudah mencapai maksimum yaitu 0x03ff maka nilai TCNT1 akan reset kembali ke
0x0000.
Pada program diatas TCCR1A diisi 0xA3 berarti mode fast PWM 10bit dengan pola keluaran
OC1A dan OC1B adalah high selama TCNT1 lebih kecil dari OCR1A-OCR1B dan low
setelah TCNT1 melebihi OCR1A-OCR1B. Register TCCR1B diisi 0x0b berarti sekala clock
64. Sehingga jika kristal yang digunakan 8MHZ maka
fpwm=fosc / (N * (1+TOP))
fpwm=122Hz
Tpwm=1/fpwm
Tpwm=(1+TOP) *Tosc *N
#include <mega8535.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#asm
#endasm
char lcd_buffer[33];
void inisialisasi_PORT()
DDRA=DDRB=0x00; //input
DDRC=DDRD=0xFF; //output
PORTB=0xff;//pull up
}
void inisialisasi_PWM_on()
TCCR1A=0xA1;
TCCR1B=0x0c;
void inisialisasi_PWM_off()
TCCR1A=0x00;
TCCR1B=0x00;
OCR1AL=satu;
PORTD.0=0;
PORTD.1=1;
OCR1BL=dua;
PORTD.2=1;
PORTD.3=0;
void inisialisasi_LCD()
lcd_init (16);
ADMUX=input_adc|ADC_VREF_TYPE;
ADCSRA|=0x40;
ADCSRA|=0x10;
return ADCH;
void inisialisasi_ADC()
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
}
void main(void)
//Panggil Fungsi
inisialisasi_PORT();
inisialisasi_ADC();
inisialisasi_LCD();
inisialisasi_PWM_on();
while(1){
data1=read_adc(0);
data2=read_adc(1);
pwm1(data1);
pwm2(data2);
if(PINB.0==0) {inisialisasi_PWM_off();
lcd_clear();
lcd_putsf("pwm off");
delay_ms(100);
else {inisialisasi_PWM_on();
lcd_clear();
sprintf(lcd_buffer,"PWM1=%i",data1);
lcd_puts(lcd_buffer);
lcd_gotoxy(8,1);
sprintf(lcd_buffer,"PWM2=%i",data2);
lcd_puts(lcd_buffer);
delay_ms(100);
};
}}
Serial communication
USART (universal synchronous and asynchronous serial receiver and transmitter) juga
merupakan salah satu mode komunikasi serial yang dimiliki atmega8535. USART memiliki
fleksibilitas yang tinggi, yang dapat digunakan untuk melakukan transfer data baik antar
mikrokontroller maupun dengan modul-modul ekternal termasuk PC yang memiliki fitur
UART.
Digunakan sebagai buffer untuk menyimpan data baik yang akan dikirimkan maupun yang
diterima dalam komunikasi USART.
Pada program ini, mikrokontroller1 akan mengirimkan data sesuai penekanan tombol pada
PORTA, dan mikrokontroller2 menerima data kemudian mengeluarkan ke PORTA. Dalam
penyambungan antara 2 mikrokontroller ini, TXD mikro1 dihubungkan dengan RXD mikro2
dan RXD mikro1 dihubungkan dengan TXD mikro2.
Program mikrokontroller1
#include<mega8535.h>
#include<delay.h>
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
void kirim()
UDR=data;
void check()
UDR='*';
void main(void){
DDRA=0x00;
PORTA=0xff;
inisialisasiuart(9600);
while(1){
data=PINA;
check();
kirim();
Program mikrkontroller2
#include<mega8535.h>
#include<delay.h>
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
return UDR;
void main(void){
DDRA=0xff;
PORTA=0;
inisialisasiuart(9600);
while(1){
ulangi:
check=terima_byte();
if(check=='*')goto lanjut;
else{goto ulangi;};
lanjut:
data=terima_byte();
PORTA=data;
#include<mega8535.h>
#include<stdio.h>
#include<delay.h>
UBRR=(osilator/(16*baud_rate))-1;
UBRRL=UBRR;
UBRRH=UBRR>>8;
UCSRB=0b00011000;
UCSRC=0x8e;
void inisialisasi_io()
DDRA=0x00; //input
PORTA=PORTB=0xff; //pull up
DDRC=DDRB=DDRD=0xff; //output
PORTD=PORTC=0xff;
UDR = data;
void tampilan(){
putsf("*********************************************");
putchar(13);
putchar(13);
putchar(13);
putchar(13);
}
void send_message()
int i=0;
for(i=0;i<15;i++)
UDR=pesan[i];
while(!UCSRA.5)
{;}
void main(void){
inisialisasi_io();
InisialisasiUART(9600);
while(1){
data='u';
KirimByte(data);
send_message();
tampilan();
delay_ms(100);
}
Multimeter digital (voltmeter dan ohm meter)
#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
#asm
#endasm
#include <lcd.h>
#define ADC_VREF_TYPE 0x40
float data,data2,data3,data4,hasil;
char lcd_buffer[30];
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
ADCSRA|=0x10;
return ADCW;
void adc_init(){
// ADC initialization
ADCSRA=0x83;
SFIOR&=0xEF;
SFIOR|=0x10;
void io_init(){
DDRA=0x00;
DDRC=0xff;
void main(void)
io_init();
adc_init();
lcd_init(16);
PORTA.1=1;
while (1)
awal:
data=read_adc(0);
data2=read_adc(2);
data3=read_adc(3);
data4=read_adc(4);
if(PINA.1==0){
data=(float)data/1023*5;
hasil=(float)((float)400*data)-1000;
lcd_clear();
lcd_putsf("multimtr digital");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"R=%4.0f ohm",hasil);
lcd_puts(lcd_buffer);
delay_ms(50);
goto awal;
};
if(data==data2){data=data;};
if(data==data3){data=data*2;};
if(data==data4){data=data*4;};
data=(float)data/1023*5;
lcd_clear();
lcd_putsf("multimtr digital");
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"Tegangan=%2.2f V",data);
lcd_puts(lcd_buffer);
delay_ms(50);
};
}
Frekuensi meter digital (10Hz-1kHz), only for sinyal kotak[pulse]
#include <mega8535.h>
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
float hasil;
char lcd_buffer[33];
bit tanda;
void inisialisasi_tim0(){
TCNT0=0;
TCCR0=0x05;
TIMSK=0x01;
TIFR=0x00;
void inisialisasi_int(){
// INT0: On
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x02;
void main()
DDRA=0x00;PORTA=0xff;
DDRD=0x00;PORTD=0xff;
tanda=0;
lcd_init(16);
lcd_clear();
inisialisasi_int();
#asm ("sei");
while(1)
{};
TCNT0=0;
data=data+1;
tanda=~tanda;
if(tanda==1)
{
MCUCR=0x03; //interupt diganti dengan transisi naik
else {
//nilai=data;
nilai=(int)((int)data*256)+TCNT0;
hasil=(float)7813/nilai;
hasil=hasil/2;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"data=%3.1f Hz",hasil);
lcd_puts(lcd_buffer);
delay_ms(100);
data=0;
};