Anda di halaman 1dari 10

23

BAB IV
INTERUPSI
MIKROKONTROLLER
4.1. PENDAHULUAN
Interupsi adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler
berhenti sejenak untuk melayani interupsi tersebut. Program yang dijalankan pada saat
melayani interupsi disebut Interrupt Service Routine.
Pada sistem mikrokontroler yang sedang menjalankan programnya, saat terjadi
interupsi , program akan berhenti sesaat, melayani interupsi

tersebut dengan

menjalankan program yang berada pada alamat yang ditunjuk oleh vektor dari interupsi
yang terjadi hingga selesai dan kembali meneruskan program yang terhenti oleh
interupsi tadi.
Meskipun memerlukan pengertian yang lebih mendalam, pengetahuan mengenai
interupsi sangat membantu mengatasi masalah pemrograman mikroprosesor /
mikrokontroler dalam hal menangani banyak peralatan input/output. Pengetahuan
mengenai interupsi tidak cukup hanya dibahas secara teori saja, diperlukan contoh
program yang konkrit untuk memahami. ATMEGA16 memiliki 21 buah sumber
interupsi. Interupsi tersebut bekerja jika bit I pada Register status atau Status Register
(SREG) dan bit pada masing-masing register bernilai 1.

24

4.2. INTERUPSI EKTERNAL


Pengaturan kondisi keadaan yang menyebabkan terjadinya interupsi ekternal
diatur oleh registet MCUCR (MCU Control Register) tang terlihat seperti Gambar 4.1.
Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

SW2

SE

SW1

SW0

ISC11

ISC10

ISC01

ISC00

Gambar 4.1. Register MCUCR

Bit penyusunnya dapat dijelaskan sebagai berikut:


a.

Bit ISC11 dan ISC10 bersama-sama menentukan kondisi yang dapat


menyebabkan interupsi ekternal pada pin INT1. keadaan selengkapnya dapat
dilihat pada tabel 4.1

Tabel 4.1. Beberapa Setting yang menyebabkan Interupsi External 1


ISC11
0
0
1
1

b.

ISC10
0
1
0
1

Deskripsi
Logika 0 pada pin INT1 menyebabkan interupsi
Perubahan logika pada pin INT1 menyebabkan interupsi
Perubahan kondisi 1 ke 0 pada pin INT1 menyebabkan interupsi
Perubahan kondisi 0 ke 1 pada pin INT1 menyebabkan nterupsi

Bit ISC01 dan ISC00 bersama-sama menentukan kondisi yang dapat


menyebabkan interupsi ekternal pada pin INT0. keadaan selengkapnya dapat
dilihat pada tabel 4.2

Tabel 4.2. Beberapa Setting yang menyebabkan Interupsi External 0


ISC01
0
0
1
1

ISC00
0
1
0
1

Deskripsi
Logika 0 pada pin INT0 menyebabkan interupsi
Perubahan logika pada pin INT0 menyebabkan interupsi
Perubahan kondisi 1 ke 0 pada pin INT0 menyebabkan interupsi
Perubahan kondisi 0 ke 1 pada pin INT0 menyebabkan nterupsi

Pemilihan pengaktifan interupsi eksternal diatur oleh register GICR (General


Interupsi Control Register) yang terlihat pada Gambar 4.2

25

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

INT1

INT0

INT2

Bit 1

Bit 0

Gambar 4.2. Register GICR

Bit penyusunnya dapat dijelaskan sebagai berikut:


a. Bit INT1 adalah bit untuk mengaktifkan interupsi ekternal 1. Apabila bit
tersebut diberi logika 1 dan bit I pada SREG (status register) juga satu,
maka interupsi ekternalnya 1 akan aktif
b. Bit INT0 adalah bit untuk mengaktifkan interupsi ekternal 0. Apabila bit
tersebut diberi logika 1 dan bit I pada SREG (status register) juga satu,
maka interupsi ekternalnya 0 akan aktif
c. Bit INT2 adalah bit untuk mengaktifkan interupsi ekternal 2. Apabila bit
tersebut diberi logika 1 dan bit I pada SREG (status register) juga satu,
maka interupsi ekternalnya 2 akan aktif
Pemrograman interupsi dari masing masing jenis interupsi ekternal akan di mulai
dari vektor interupsi pada masing-masing jenis.

4.3. RANGKAIAN INTERUPSI EKTERNAL


Rangkaian berikut digunakan untuk

interupsi ekternal mikrokontroller.

Rangkaian tersebut menggunakan interupsi eksternal 0, 1, dan 2 yang menggunakan


tampilan LED yang dihubungkan pada Port A.

26

VCC

VCC

P0
P1
P2
P3
P4
P5
P6
P7

INT2

VCC

R1
RST
VCC

C 1 22pF
C 3 100nF1

SW 2

X1
C 2 22pF

VCC

INT1

VCC

INT0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

L1

U4
P B 0 (X C K /T 0 )
P B 1 (T 1 )
P B 2 (IN T 2 /A IN 0 )
P B 3 (O C 0 /A IN 1 )
P B 4 (S S )
P B 5 (M O S I)
P B 6 [M IS O )
P B 7 [S C K )
RESET
VCC
GND
XTA L2
P
XTA L1
P
P D 0 (R X D )
P D 1 (T X D )
P D 2 (IN T 0 )
P D 3 (IN T 1 )
P D 4 (O C 1 B )
P D 5 (O C 1 A )
P D 6 (IC P )

P
P
P
P
P
P
P
P

A
A
A
A
A
A
A
A

0 (A
1 (A
2 (A
3 (A
4 (A
5 (A
6 (A
7 (A

D C 0)
D C 1)
D C 2)
D C 3)
D C 4)
D C 5)
D C 6)
D C 7)
AREF
AGND
AVCC
C 7 (T O S C 2 )
C 6 (T O S C 1 )
PC5
PC4
PC3
PC2
P C 1 (S D A )
P C 0 (S C L )
P D 7 (O C 2 )

40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21

2
2
2
2
2
2
2
2

1
1
1
1
1
1
1
1

VCC

A TM E G A 16

HEADER 5
1
2
3
4
5

P5
P6
P7
RST
GND

J IS P

Gambar 4.3. Rangkaian interupsi ekternal mikrokontroller

4.3.1. PEMROGRAMAN INTERUPSI EKTERNAL INT0


Setelah membuat rangkaian interupsi ekternal untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi external 0.
Program sebagai berikut ini
//-----------------------------------------------------//Program rutin interupsi eksternal 0
//-----------------------------------------------------//-----------------------------------------------------//EKLARASI HEADER
//-----------------------------------------------------#include <mega16.h>
#include <delay.h>
#include <stdio.h>

27

//-----------------------------------------------------//EKLARASI VARIABEL
//-----------------------------------------------------unsigned char dt=0x01;
//-----------------------------------------------------//DEKLARASI SUB RUTIN
//-----------------------------------------------------void InisialisasiINT0();
//-----------------------------------------------------//PROGRAM UTAMA
//-----------------------------------------------------void main (void)
{
DDRA=0xff; InisialisasiINT0();
#asm ("sei");
while(1)
{
PORTA=dt;
delay_ms(100);
dt=dt<<1;
if (dt==0) {dt=0x01;}
}
}
//-----------------------------------------------------//SUB RUTIN INTERUPSI EXTERNAL0
//-----------------------------------------------------interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char rr=0;
while (rr<5)
{
PORTA=0x0f;
delay_ms(5);
PORTA=0xf0;
delay_ms(5);
++rr;
}
}
//-----------------------------------------------------//SUB RUTIN INISIALISASI INTERUPSI EXTERNAL0
//-----------------------------------------------------void InisialisasiINT0 ()
{
GICR|=0x80;
MCUCR=0x0C;

28

MCUCSR=0x00;
GIFR=0x80;
}

4.4. RANGKAIAN INTERUPSI TIMER MIKROKONTROLLER


Rangkaian berikut digunakan untuk

interupsi ekternal mikrokontroller.

Rangkaian tersebut menggunakan interupsi timer 0 dan 1 yang menggunakan tampilan


LED yang dihubungkan pada Port D.
H EAD ER 5
VC C

1
2
3
4
5

R 1
R ST

J IS P
VC C

C 1 22pF

P0
P1
P2
P3
P4
P5
P6
P7

P5
P6
P7
R ST
GN D

L1

C 3 100nF 1
SW 2

X1
C 2 22pF

1
1
1
1
1
1
1
1

2
2
2
2
2
2
2
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

U 4
P B 0 (XC K /T 0 )
P A 0 (A D C 0 )
P B 1 (T 1 )
P A 1 (A D C 1 )
P B 2 (IN T 2 /A IN 0 ) P A 2 (A D C 2 )
P B 3 (O C 0 /A IN 1 ) P A 3 (A D C 3 )
P B 4 (S S )
P A 4 (A D C 4 )
P B 5 (M O S I)
P A 5 (A D C 5 )
P B 6 [M IS O )
P A 6 (A D C 6 )
P B 7 [S C K )
P A 7 (A D C 7 )
R ESET
AR EF
VC C
AGN D
GN D
AVC C
XTA L2
P C 7 (T O S C 2 )
XTA L1
P C 6 (T O S C 1 )
P D 0 (R X D )
PC 5
P D 1 (T X D )
PC 4
P D 2 (IN T 0 )
PC 3
P D 3 (IN T 1 )
PC 2
P D 4 (O C 1 B )
P C 1 (S D A )
P D 5 (O C 1 A )
P C 0 (S C L )
P D 6 (IC P )
P D 7 (O C 2 )

40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21

VC C

ATM EG A16

Gambar 4.4. Rangkaian interupsi timer mikrokontroller

4.4.1. PEMROGRAMAN INTERUPSI TIMER 0


Setelah membuat rangkaian interupsi timer untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi timer 0.
Program sebagai berikut ini
//------------------------------------------------------

29

// Program INTERUPSI TIMER 0


//-----------------------------------------------------//-----------------------------------------------------//DEKLARASI HEADER
//-----------------------------------------------------#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//-----------------------------------------------------//DEKLARASI VARIABEL
//-----------------------------------------------------unsigned char led=0xfe;
//-----------------------------------------------------//DEKLARASI SUB RUTIN Inisialisasi TIMER0
//-----------------------------------------------------void InisialisasiTIMER0();
//-----------------------------------------------------//PROGRAM UTAMA
//-----------------------------------------------------void main (void)
{
DDRD=0xff; InisialisasiTIMER0();
#asm ("sei");
while(1);
}
//-----------------------------------------------------//SUB RUTIN INTERUPSI TIMER0
//-----------------------------------------------------interrupt [TIM0_OVF] void timer0_overflow(void)
{
TCNT0=0x00;
led<<=1;
led|=1;
if (led==0xff) led=0xfe;
PORTD=led;
}
//-----------------------------------------------------//SUB RUTIN INISIALISASI TIMER0
//-----------------------------------------------------void InisialisasiTIMER0()
{
TCNT0=0x00; TCCR0=0x05;
TIMSK=0x01; TIFR=0x01;
}

30

4.5. RANGKAIAN INTERUPSI SERIAL


Rangkaian berikut digunakan untuk interupsi serial mikrokontroller. Rangkaian
tersebut menggunakan interupsi serial yang menggunakan tampilan LED yang
dihubungkan pada Port A.
H EAD ER 5
VC C

P
P
P
R
G

1
2
3
4
5

R 1
J IS P

P0
P1
P2
P3
P4
P5
P6
P7

5
6
7
ST
N D

R ST

VC C

C 1 22pF
C 3 100nF1

SW 2

P
P
P
P
P
P
P

X1
C 2 22pF

D
D
D
D
D
D
D

0
1
2
3
4
5
6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

VC C

L1

U 4
P B 0 (XC K /T 0 )
P A 0 (A D C 0 )
P B 1 (T 1 )
P A 1 (A D C 1 )
P B 2 (IN T 2 /A IN 0 ) P A 2 (A D C 2 )
P B 3 (O C 0 /A IN 1 ) P A 3 (A D C 3 )
P B 4 (S S )
P A 4 (A D C 4 )
P B 5 (M O S I)
P A 5 (A D C 5 )
P B 6 [M IS O )
P A 6 (A D C 6 )
P B 7 [S C K )
P A 7 (A D C 7 )
R ESET
AR EF
VC C
AG N D
G N D
AVC C
XTA L2
P C 7 (T O S C 2 )
XTA L1
P C 6 (T O S C 1 )
P D 0 (R XD )
PC 5
P D 1 (T X D )
PC 4
P D 2 (IN T 0 )
PC 3
P D 3 (IN T 1 )
PC 2
P D 4 (O C 1 B )
P C 1 (S D A )
P D 5 (O C 1 A )
P C 0 (S C L )
P D 6 (IC P )
P D 7 (O C 2 )

40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21

D
D
D
D
D
D
D
D

A
A
A
A
A
A
A
A

TA
TA
TA
TA
TA
TA
TA
TA

A
A
A
A
A
A
A
A

D
D
D
D
D
D
D
D

D
D
D
D
D
D
D
D

0
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
PD 7

2
2
2
2
2
2
2
2

1
1
1
1
1
1
1
1

VC C

A TM E G A16

H EAD ER 3

J S e r ia l1

TX1

1 u F 1 6 1V

U 6
R 2 IN
R 1 IN
T2O U T
T1O U T
C +

T 1 IN
R 1O U T
T 2 IN
R 2O U T
C 2+

11
12
10
9
4

+ C 4

+ C 5
3

1uF 16V

1uF 16V

+ C 8

C 1V+
M A X232

C 2V-

5
6

1uF 16V
C 9
+

1
2
3

8
13
7
14

R X1

Gambar 4.5. Rangkaian interupsi serial mikrokontroller

7.5.1. PEMROGRAMAN INTERUPSI SERIAL


Setelah membuat rangkaian interupsi serial untuk menghidupkan LED, maka
sekarang saatnya Anda membuat program yang digunakan untuk menghidupkan LED
dengan menggunakan interupsi serial.
Program sebagai berikut ini
//------------------------------------------------------

31

// Program INTERUPSI SERIAL


//-----------------------------------------------------//-----------------------------------------------------//DEKLARASI HEADER
//-----------------------------------------------------#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//-----------------------------------------------------//DEFINISI VARIABEL
//-----------------------------------------------------#define RXC 7
#define FE 4
#define UPE 2
#define OVR 3
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define RX_BUFFER_SIZE 8
//-----------------------------------------------------//DEKLARASI VARIABEL
//-----------------------------------------------------char rx_buffer[RX_BUFFER_SIZE];
unsigned char led=0xfe;
const long int osilator = 12000000;
unsigned long int UBRR;
//-----------------------------------------------------//DEFINISI VARIABEL
//-----------------------------------------------------#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
bit rx_buffer_overflow;
//-----------------------------------------------------//SUBRUTIN INTERUPSI SERIAL
//-----------------------------------------------------interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if
((status
&
(FRAMING_ERROR
|
PARITY_ERROR
|

32

DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
PORTA = data;
}
//-----------------------------------------------------//DEKLARASI SUB RUTIN SERIAL
//-----------------------------------------------------void InisialisasiUSART (unsigned long int baud_rate);
//-----------------------------------------------------//PROGRAM UTAMA
//-----------------------------------------------------void main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto");
#asm("sei")
while (1)
{
led<<=1; led|=1;
delay_ms(100);
if (led==0xff) led=0xfe; PORTA=led;
};
}
//-----------------------------------------------------//SUB RUTIN SERIAL
//-----------------------------------------------------void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
}

Anda mungkin juga menyukai