Anda di halaman 1dari 50

Interupsi

Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler


berhenti sejenak untuk melayani interrupt tersebut.

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 .

Interrupt Service Routine.


Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak
telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan pekerjaan
mengetik dan mengangkat telephone. Setelah pembicaraan telephone yang dalam hal ini
adalah merupakan analogi dari Interrupt Service Routine selesai maka orang tersebut kembali
meneruskan pekerjaanya mengetik. Demikian pula pada sistem mikrokontroler yang sedang
menjalankan programnya, saat terjadi interrupt, program akan berhenti sesaat, melayani
interrupt tersebut dengan menjalankan program yang berada pada alamat yang ditunjuk oleh
vektor dari interrupt yang terjadi hingga selesai dan kembali meneruskan program yang
terhenti oleh interrupt tadi. Seperti yang terlihat Gambar di bawah, sebuah program yang
seharusnya berjalan terus lurus, tiba-tiba terjadi interrupt dan harus melayani interrupt
tersebut terlebih dahulu hingga selesai sebelum ia kembali meneruskan pekerjaannya.
AVR menyediakan beberapa sumber interupsi yang berbeda. Tiap-tiap interupsi dan
reset memiliki vektor program yang berbeda. Semua interupsi didasari satu bit tunggal
yang harus diberi logika tinggi sebagai Global Interrupt Enable pada Status Register
untuk mengaktifkan interupsi.
Atmega8535 menyediakan 21 macam sumber interupsi yang masing-masing memiliki
alamata vektor interupsi seperti pada tabel 19. Setiap interupsi yang aktif akan dilayani segera
setelah terjadi permintaan interupsi, tapi jika dalam waktu bersamaan terjadi lebih dari satu
interupsi maka perioritas yang akan diselesaikan terlebih dahulu adalah interupsi yang
memiliki urut lebih kecil sesuai tabel 19 berikut.

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 :

ISCx1 ISCx0 Pemicu interupsi


0 0 Level rendah pada pin INT0 atau INT1
0 1 Perubahan level pada pin INT0 atau INT1
1 0 Transisi turun pada pin INT0 atau INT1
1 1 Transisi naik pada pin INT0 atau INT1

MCUCSR ( MCU Control and Status Register)

Bit 6 – ISC2 : interrupt sense control INT2

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 penyusunnya dapat dijelaskan sebagai 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.

SREG (Status Register)

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 7 – I : Global interrupt enable

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)
{;}
}

interrupt [2] void interupsi_ext0(void)


{
PORTC=0xF0;
}
interrupt [3] void interupsi_ext1(void)
{
PORTC=0x0F;
}
Penjelasan :
 Angka 2 dan 3 adalah nomor vector intrupsi dapat dilihat pada table di atas.

Contoh lain
#include <mega8535.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
PORTC=0xf0;
}

// External Interrupt 1 service routine


interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
PORTC=0x0f;
}

// External Interrupt 2 service routine


interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here
PORTC=0x55;
}

// Declare your global variables here

void main(void)
{
PORTD=0x00;
DDRD=0x00;
DDRC=0xff;
PORTC=0xff;

// External Interrupt(s) initialization


// INT0: On // INT0 Mode: Low level
// INT1: On // INT1 Mode: Low level
// INT2: On // INT2 Mode: Falling Edge
GICR|=0xE0; //aktifkan semua external interupsi
MCUCR=0x00; //level rendah INT0 dan INT1
MCUCSR=0x00;//Falling edge, transisi turun
GIFR=0xE0;

// Global enable interrupts


#asm("sei")

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

Timer/Counter 0 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk

Timer/Counter 0 pada ATmega 8535 adalah sebagai berikut:

a. Sebagai Counter 1 kanal.

b. Timer di-nol-kan saat match compare (auto reload).

c. Dapat menghasilkan gelombang PWM dengan glitch-free.

d. Frekuensi generator.

e. Prescaler 10 bit untuk timer.

f. Interupsi timer yang disebabkan timer overflow dan match compare.

Pengaturan Timer/Counter 0 diatur oleh TCCR0 (Timer/Counter kontrol Register 0)

yang dapat dilihat pada Gambar 2.5.

Gambar 2.5 Register TCCR0


Penjelasan untuk tiap bit-bitnya:

a. Bit 7 – FOC0: Force Output Compare.

b. Bit 6,3 –WGM0:WGM00:Waveform generation Unit.

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

adalah setting pada bit ini untuk menghasilkan mode tertentu.


Tabel 2.2 Konfigurasi Bit WGM01 dan WGM00

Mode 0 (Normal): Timer/counter 0 berfungsi sebagai pencacah tungggal yang dapat

mencacah dari 0x00 sampai dengan 0xff. Setelah mencapai nilai maximum yaitu 0xff maka

register counter (TCNT0) akan reset atau kembali 0x00.

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

foc0= frekuensi output 0C0 mode PCP


fosc=frekuensi kristal
N=scala clock Tabel 2.6

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))

0CR0= isi register 0CR0

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

WGM00 dan WGM01.

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

Timer/Counter, Tabel 2.6 berikut menampilkan konfigurasi pemilihan sumber detak.

Tabel 2.6 Konfigurasi Bit Clock Select untuk memilih sumber detak

TCNTO (Timer/Counter Register 0)

Register TCNT0 berfungsi untuk menyimpan data cacahan timer/counter0. Karena ukuran

register TCNT0 hanya 8bit maka hanya dapat melakukan cacahan 0x00-0xff.

OCR0 (Output Compare Register0)

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

dengan mode yang telah ditentukan pada register TCCR0.


Timer/Counter1

Timer/Counter1 adalah 16-bit Timer/Counter yang memungkinkan program

pewaktuan lebih akurat.

Berbagai fitur dari Timer/Counter1 sebagai berikut:

a. Desain 16 bit (juga memungkinkan 16 bit PWM).

b. Dua unit compare .

c. Dua unit register pembanding.

d. Satu unit input capture.

e. Timer dinolkan saat match compare (autoreload).

f. Dapat menghasilkan gelombang PWM dengan glitch-free.

g. Periode PWM yang dapat diubah-ubah.

h. Pembangkit frekuensi.

i. Empat buah sumber interupsi (TOV1, OCF1A, OCF1B dan ICF1).

Pengaturan Timer/Counter 1 diatur melalui register TCCR1A yang dapat dilihat pada

Gambar 2.6.

Gambar 2.6 Register TCCR1A


Penjelasan untuk tiap bit-bitnya:

a. Bit 7:6 – COM1A1:0: Compare Output Mode untuk channel A.

Bit 5:4 – COM1B1:0: Compare Output Mode untuk channel B.

Register COM1A1:0 dan COM1B1:0 mengontrol kondisi Pin Output

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.

b. Bit 3 – FOC1A: Force Output Compare untuk channel A.

Bit 2 – FOC1B: Force Output Compare untuk channel B.

c. Bit 1:0 – WGM1 1:0: Waveform Generation Mode.

Dikombinasikan dengan bit WGM13:2 yang terdapat pada register TCCR1B,

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.

Setingan mode dapat dilihat pada tabel berikut:


Tabel 2.7 Konfigurasi Bit Compare Output Mode non PWM

Tabel 2.8 Konfigurasi Bit Compare Output Mode Fast 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

pada Gambar 2.7.

Gambar 2.7 Register TCCR1B

Penjelasan untuk tiap bit-bitnya:

a. Bit 7 – ICNC1: Input Capture Noise Canceller.

b. Bit 6 – ICES1: Input Capture Edge Select.

c. Bit 5 : Tidak digunakan.

d. Bit 4:3 – WGM13:2: Waveform Generation Mode.


e. Bit 2:0 – CS12:0: Clock Select.

Ketiga bit ini mengatur sumber detak yang digunakan untuk Timer/Counter1.

Untuk setingannya dapat dilihat pada Tabel 2.11.

Tabel 2.11 Konfigurasi bit Clock Select untuk memilih sumber detak

Timer/Counter2

Timer/ counter2 sama persis dengan timer/counter 0.

Timer/Counter 2 adalah 8-bit Timer/Counter yang multifungsi. Deskripsi untuk

Timer/Counter 0 pada ATmega 16 adalah sebagai berikut:

a. Sebagai Counter 1 kanal.

b. Pewaktu di-nol-kan saat match compare (autoreload).

c. Dapat mengahasilkan gelombang PWM dengan glitch-free.

d. Frekuensi generator.

e. Prescaler 10 bit untuk pewaktu.

f. Intrupsi timer yang disebabkan timer overflow dan match compare.


Pengaturan Timer/Counter 2 diatur oleh TCCR2 (Timer/Counter kontrol Register 0)

yang dapat dilihat pada Gambar 2.8.

Gambar 2.8 Register TCCR2

Penjelasan untuk tiap bit-bitnya:

a. Bit 7 – FOC2: Force Output Compare.

b. Bit 6,3 –WGM21:WGM20: Waveform Generation Unit.

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

seting pada bit ini untuk menghasilkan mode tertentu.

Tabel 2.12 Konfigurasi Bit WGM21 dan WGM20

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 dari seting bit pada WGM00 dan WGM01. Berikut daftar

tabel setting bit ini sesuai seting bit pada WGM00 dan WGM01.

d. Bit 2, 1, 0 – CS22; CS21, CS20: Clock Select.

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

Masing-masing timer/counter memiliki register tertentu yang digunakan untuk mengatur


mode dan cara kerja nya tetapi ada dua register yang digunakan bersamaan yaitu Register
TIMSK dan TIFR

Register TIMSK

Bit0 – Timer/Counter0 Overflow Interrupt Enable

jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable interupsi
overflow Timer/Counter0

Bit1- Timer/Counter0 Output Compere Match Interrupt Enable

jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
Interupsi Output Compere Match

Bit2- Timer/Counter1 Overflow Interrupt Enable

jika bit tersebut diberi logika satu dan I SREG juga set, maka bisa dilakukan enable
interupsi overflow Timer/Counter1

Bit3- Timer/Counter1 Output Compere B Match Interrupt Enable

Bit4- Timer/Counter1 Output Compere A Match Interrupt Enable

Bit5- Timer/Counter1 Input Capture interupt enable


Bit6- Timer/Counter2 overflow interupt enable

Bit7- Timer/Counter2 Output Compere Match Interrupt Enable

Register TIFR

Bit0 – Timer/Counter0 Overflow Flag

Bit akan bernilai satu jika Timer/Counter0 Overflow. Bit dapat dinolkan lagi dengan
memberikan logika satu ke bit Flag ini.

Bit1- Output Comapre Flag 0

Bit akan berniali satu jika nilai pada Timer/Counter0 sama dengan nilai pada OCR0 –
Output Comapre
Contoh program COUNTER:

//COUNTER 0 DITAMPILKAN KE PORTC

#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>

unsigned char led=0xfe;

void main (void)

DDRC=0xff; // port C sebagai output

PORTC=led;

TCNT0=0x00;// setting inisial counter0

TCCR0=0x05; // setting skala clock

TIMSK=0x01; // aktifkan interrupt timer0

TIFR=0x00; // hapus bendera interrupt timer0

#asm ("sei");

while(1)

{PORTC=led;}

interrupt [TIM0_OVF] void timer0_overflow(void)

{ TCNT0=0x00; // setting inisial counter0

led<<=1; // geser data led ke kiri 1 kali

led|=1; // led di-OR-kan dengan data 1

if (led==0xff) {led=0xfe;}

PORTC=led; // keluarkan data led ke port C

}
Contoh lagi, led on OFF dengan timer

#include<mega8535.h>

Unsigned char led=0;

Interrupt [TIM0_OVF] void timer0_overflow(void){

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){

}}

Secara umum interval waktu timer yang dihasilkan dirumuskan

Ttimer0 = Tosc * (256-TCNT0)*N

Ttimer1= Tosc * (65536-TCNT1) * N

Tosc=1/fosc
Contoh program jam digital;

#include <mega8535.h>

#asm

.equ __lcd_port=0x15

#endasm

/* now you can include the LCD Functions */

#include <lcd.h>

#include <delay.h>

#include <stdio.h>

#define sw_ok PINB.0

#define sw_cancel PINB.1

#define sw_up PINB.2

#define sw_down PINB.3

unsigned char detik=0,menit=0,jam=0;

unsigned char buffer1=0,buffer2=0,buffer3=0;

long int data;


unsigned char lcd_buffer[33];

void inisialisasi_tim0_on()

TCNT0=0x00; // setting inisial counter0

TCCR0=0x05;

TIMSK=0x01; // aktifkan interrupt timer0

TIFR=0x00; // hapus bendera interrupt timer0

#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);

interrupt [TIM0_OVF] void timer0_overflow(void)


{

TCNT0=0x00;

data=data+1;

PWM (Pulse Width Modulation)

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.

PWM dengan timer/counter1

timer/counter1 dapat digunakan untuk membangkitkan 2 channel PWM yang masing-masing


berdiri sendiri atau tidak tergantung satu sama lain. Berikut adalah contoh listing program
PWM 10bit. Keluaran OC1A merupakan PWM A dan keluaran OC1B merupakan PWM B.

#include <mega8535.h>

void main(void)

DDRD=0xff;

//inisialisasi timer1 sebagai fast pwm 10bit

TCCR1A=0xA3;
TCCR1B=0X0B;

TCNT1=0x0000;

OCR1A=0x0100; //setting duty cycle 25% (PWMA)

OCR1B=0x0300; //setting duty cycle 75% (PWMB)

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= 8000000 / (64*(1+1023))

fpwm=122Hz

atau dinyatakan periode adalah

Tpwm=1/fpwm

Tpwm=(1+TOP) *Tosc *N

Tpwm=(1+1023) * 0.125us *64


Tpwm=8.192ms

Duty cycle = OCR1A /TOP *100%

256/1023 *100% =25%

OCR1B /TOP *100% == 768/1023 *100% =75%

Contoh lain, PWM 8bit dengan timer/counter1

#include <mega8535.h>

#include <lcd.h>

#include <stdio.h>

#include <delay.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#define ADC_VREF_TYPE 0x60

unsigned char data1,data2;

char lcd_buffer[33];

void inisialisasi_PORT()

//PORT initialization as input or output

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;

void pwm1(unsigned char satu)

OCR1AL=satu;

PORTD.0=0;

PORTD.1=1;

void pwm2(unsigned char dua)

OCR1BL=dua;
PORTD.2=1;

PORTD.3=0;

void inisialisasi_LCD()

// LCD module initialization

lcd_init (16);

unsigned char read_adc(unsigned char input_adc)

ADMUX=input_adc|ADC_VREF_TYPE;

ADCSRA|=0x40;

while ((ADCSRA & 0x10)==0);

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();

lcd_putsf("fast PWM 8-bit");


lcd_gotoxy(0,1);

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.

USART memungkinkan transmisi data baik secara synchronous maupun asynchronous


sehingga dengan demikian USART pasti kompatible dengan UART. Pada atmega8535,
secara umum pengaturan mode komunikasi baik synchronous maupun asynchronous adalah
sama. Perbedaan hanyalah terletak pada sumber clock saja. Jika pada mode asynchronous
masing-masing peripheral memiliki sumber clock sendiri maka pada mode synchronous
hanya ada satu clock sumber yang digunakan bersama-sama. Dengan demikian secara
hardware untuk mode asynchronous hanya membutuhkan 2 pin yaitu TXD dan RXD
sedangkan untuk asynchronous harus 3pin yaitu TXD,RXD, dan XCK.

USART Data Register (UDR)

Digunakan sebagai buffer untuk menyimpan data baik yang akan dikirimkan maupun yang
diterima dalam komunikasi USART.

Berikut adalah contoh program komunikasi 2 buah mikrokontroller

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>

const long int osilator = 8000000;

unsigned long int UBRR;

unsigned char data;

void inisialisasiuart (unsigned long int baud_rate)

UBRR=(osilator/(16*baud_rate))-1;

UBRRL=UBRR;

UBRRH=UBRR>>8;

UCSRB=0b00011000;

UCSRC=0x8e;

void kirim()

while(!(UCSRA & 0x20));

UDR=data;

void check()

while(!(UCSRA & 0x20));

UDR='*';

void main(void){

DDRA=0x00;

PORTA=0xff;

inisialisasiuart(9600);

while(1){
data=PINA;

check();

kirim();

Program mikrkontroller2

#include<mega8535.h>

#include<delay.h>

const long int osilator = 8000000;

unsigned long int UBRR;

unsigned char data,check;

void inisialisasiuart (unsigned long int baud_rate)

UBRR=(osilator/(16*baud_rate))-1;

UBRRL=UBRR;

UBRRH=UBRR>>8;

UCSRB=0b00011000;

UCSRC=0x8e;

unsigned char terima_byte(void)

while(!(UCSRA & 0x80));

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;

Komunikasi dengan komputer

Komunikasi komputer dengan mikrokontroller membutuhkan hardware tambahan yaitu


dengan menggunakan max232 yang berfungsi sebagai penyama level tegangan antara
komputer dan mikrokontroller. Sedangkan tuk penyambungannya sama yaitu TXD mikro
dengan RXD komputer dan sebaliknya. Berikut contoh program kirim data serial komputer
yang disimulasikan dengan proteus melalui virtual terminal.

#include<mega8535.h>

#include<stdio.h>

#include<delay.h>

const long int osilator=8000000;

unsigned long int UBRR;

unsigned char data;

unsigned char pesan[ ]={"\n TEST SERIAL\n\r"};

/*fungsi Inisialisasi UART*/

void InisialisasiUART ( unsigned long int baud_rate)


{

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;

void KirimByte( unsigned char data)

while (!(UCSRA & 0x20));// tunggu data yang lalu selesai

UDR = data;

void tampilan(){

putsf("*********************************************");

putchar(13);

putsf(" program terminal komunikasi serial UART ");

putchar(13);

putsf(" Micro club dte ");

putchar(13);

putsf(" ganbatte kudasaii... ");

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>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x15 ;PORTC

#endasm

#include <lcd.h>
#define ADC_VREF_TYPE 0x40

float data,data2,data3,data4,hasil;

char lcd_buffer[30];

// Read the AD conversion result

unsigned int read_adc(unsigned char adc_input)

ADMUX=adc_input|ADC_VREF_TYPE;

// Start the AD conversion

ADCSRA|=0x40;

// Wait for the AD conversion to complete

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

void adc_init(){

// ADC initialization

// ADC Clock frequency: 1000.000 kHz

// ADC Voltage Reference: AVCC pin

// ADC High Speed Mode: On

// ADC Auto Trigger Source: None


ADMUX=ADC_VREF_TYPE;

ADCSRA=0x83;

SFIOR&=0xEF;

SFIOR|=0x10;

void io_init(){

DDRA=0x00;

DDRC=0xff;

void main(void)

io_init();

adc_init();

// LCD module initialization

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

/* now you can include the LCD Functions */

#include <lcd.h>

#include <delay.h>

#include <stdio.h>

unsigned long int data,nilai;

float hasil;

char lcd_buffer[33];
bit tanda;

void inisialisasi_tim0(){

TCNT0=0;

TCCR0=0x05;

TIMSK=0x01;

TIFR=0x00;

void inisialisasi_int(){

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// 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)

{};

interrupt [TIM0_OVF] void timer0_overflow(void)

TCNT0=0;

data=data+1;

// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

// Place your code here

tanda=~tanda;

if(tanda==1)

{
MCUCR=0x03; //interupt diganti dengan transisi naik

inisialisasi_tim0(); //timer on, mulai mencacah

else {

TCCR0=0x00; //timer off, berhenti mencacah

MCUCR=0x02; //interupt diganti dengan transisi turun

//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;

};

Anda mungkin juga menyukai