Mikrokontroler Minggu Kelima Interupsi Dan Timer

59
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.

description

Mikrokontroler Minggu Kelima Interupsi Dan Timer

Transcript of Mikrokontroler Minggu Kelima Interupsi Dan Timer

Page 1: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 2: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 3: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

terupsi eksternal pada pin INT1. Dan Bit ISC01 dan ISC00 bersama-sama menen-

tukan kodisi yang dapat menyebakan interupsi eksternal pada pin INT0. keadaan se-

lengkapnya 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

Page 4: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

nal 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 ekster-

nal 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 ekster-

nal 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

Page 5: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 6: Mikrokontroler Minggu Kelima Interupsi Dan Timer

Contoh lain

#include <mega8535.h>

// External Interrupt 0 service routineinterrupt [EXT_INT0] void ext_int0_isr(void){// Place your code herePORTC=0xf0;}

// External Interrupt 1 service routineinterrupt [EXT_INT1] void ext_int1_isr(void){// Place your code herePORTC=0x0f;}

// External Interrupt 2 service routineinterrupt [EXT_INT2] void ext_int2_isr(void){// Place your code herePORTC=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 EdgeGICR|=0xE0; //aktifkan semua external interupsiMCUCR=0x00; //level rendah INT0 dan INT1MCUCSR=0x00;//Falling edge, transisi turunGIFR=0xE0;

// Global enable interrupts#asm("sei")

while (1) { };}

Page 7: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.4.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

Page 8: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 9: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 10: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 11: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 12: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 13: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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:

Page 14: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 15: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 16: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 17: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 18: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 19: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 20: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 21: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

}

Page 22: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

}

Page 23: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 24: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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;

Page 25: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 26: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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;

Page 27: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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)

Page 28: Mikrokontroler Minggu Kelima Interupsi Dan Timer

{

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;

Page 29: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 30: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 31: Mikrokontroler Minggu Kelima Interupsi Dan Timer

}

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;

Page 32: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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;

Page 33: Mikrokontroler Minggu Kelima Interupsi Dan Timer

}

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

Page 34: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

} ;

}}

Page 35: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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.

Page 36: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 37: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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:

Page 38: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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)

Page 39: Mikrokontroler Minggu Kelima Interupsi Dan Timer

{

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

}

Page 40: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

}

}

Page 41: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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>

Page 42: Mikrokontroler Minggu Kelima Interupsi Dan Timer

#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

Page 43: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 44: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 45: Mikrokontroler Minggu Kelima Interupsi Dan Timer

sprintf(lcd_buffer,"Tegangan=%2.2f V",data);

lcd_puts(lcd_buffer);

delay_ms(50);

};

}

Page 46: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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

Page 47: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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;

Page 48: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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)

{

Page 49: Mikrokontroler Minggu Kelima Interupsi Dan Timer

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;

};

}

Page 50: Mikrokontroler Minggu Kelima Interupsi Dan Timer