Академический Документы
Профессиональный Документы
Культура Документы
MIKROKONTROLLER
Dibuat Oleh:
Iswanto, S.T, M.Eng
1
DAFTAR ISI
2
3.2.5. PEMROGRAMAN SEVENT SEGMENT ......................................................................... 15
3.3. PIN ........................................................................................................................................ 16
3.3.1. RANGKAIAN PEMBACAAN 8 TOMBOL................................................................ 17
3.3.2. PEMROGRAMAN PEMBACAAN 8 BUAH TOMBOL ............................................ 17
3.3.3. RANGKAIAN PEMBACAAN KEYPAD DENGAN LCD ........................................ 18
3.3.4. PEMROGRAMAN PEMBACAAN KEYPAD .................................................................. 19
BAB IV ANALOG TO DIGITAL CONVERTER (OK) ..................................................................... 22
4.1. PENDAHULUAN ..................................................................................................................... 22
4.2. RANGKAIAN ADC ATMEGA DENGAN LED ............................................................................. 23
4.3. PEMROGRAMAN ADC ATMEGA16 ........................................................................................ 23
BAB V TIMER / COUNTER (OK)...................................................................................................... 25
5.1. PENDAHULUAN ..................................................................................................................... 25
5.2. TIMING DIAGRAM TIMER/COUNTER .................................................................................... 25
5.3. RANGKAIAN MENCACAH COUNTER TIMER T0 ..................................................................... 27
5.4. PEMROGRAMAN MENCACAH COUNTER T0 ......................................................................... 28
5.5. PEMROGRAMAN MENCACAH COUNTER T0 ......................................................................... 29
BAB VI INTERUPSI (OK) .................................................................................................................. 31
6.1. PENDAHULUAN ................................................................................................................ 31
6.2. RANGKAIAN INTERUPSI EKTERNAL ....................................................................................... 32
6.3. PEMROGRAMAN INTERUPSI EKTERNAL INT0 ....................................................................... 32
6.4. PEMROGRAMAN INTERUPSI EKTERNAL INT1 ....................................................................... 34
6.5. RANGKAIAN INTERUPSI TIMER MIKROKONTROLLER ............................................................ 35
6.6. PEMROGRAMAN INTERUPSI TIMER 0 ................................................................................... 36
6.7. PEMROGRAMAN INTERUPSI TIMER 1 ................................................................................... 37
6.8. PEMROGRAMAN INTERUPSI TIMER 2 ................................................................................... 38
BAB VII SERIAL PORT(OK) ............................................................................................................. 40
7.1. PENDAHULUAN ................................................................................................................ 40
7.2. INISIALISASI USART ........................................................................................................ 40
7.3. RANGKAIAN SERIAL MIKROKONTROLLER............................................................... 41
7.4. PEMROGRAMAN PORT SERIAL MIKROKONTROLLER ............................................ 42
BAB VIII PWM(OK) ........................................................................................................................... 44
8.1. PENDAHULUAN ..................................................................................................................... 44
8.2. RANGKAIAN PWM MIKROKONTROLLER ............................................................................... 45
8.3. PEMROGRAMAN PWM MIKROKONTROLLER ....................................................................... 46
3
DAFTAR GAMBAR
4
BAB I PENGENALAN MIKROKONTROLER (OK)
1.1. PENDAHULUAN
Mikrokontroler, jika diterjemahkan secara harfiah, berarti pengendali yang berukuran mikro.
Sekilas mikrokontroler hampir sama dengan mikroprosesor. Namun mikrokontroler memiliki
banyak komponen yang terintegrasi didalamnya, misalnya timer/counter.Sedangkan pada
mikroprosesor, komponen tersebut tidak terintegrasi. Mikroprosesor umumnya terdapat pada
komputer dimana tugas dari mikroprosesor adalah untuk memproses berbagai macam data
input maupun output dari berbagai sumber. Mikrokontroler lebih sesuai untuk tugas-tugas
yang lebih spesifik.
1
Keuntungan arsitektur RISC
130 Instruksi yang hebat Kebanyakan satu detak untuk satu instruksi
32 x 8 General Purpose Fully Static Operation
Up to 16 MIPS Throughput at 16 MHz
On-chip 2-cycle Multiplier
Nonvolatile Program and Data Memories
8K Bytes of In-System Self-Programmable Flash
Optional Boot Code Section with Independent Lock Bits
512 Bytes EEPROM
512 Bytes Internal SRAM
Programming Lock for Software Security
Peripheral Features
Two 8-bit Timer/Counters with Separate Prescalers and Compare Mode
Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes
One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture
Mode
Real Time Counter with Separate Oscillator
Four PWM Channels
8-channel, 10-bit ADC
Byte-oriented Two-wire Serial Interface
Programmable Serial USART
Special Microcontroller Features
Power-on Reset and Programmable Brown-out Detection
Internal Calibrated RC Oscillator
External and Internal Interrupt Sources
Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby
and Extended Standby
5. I/O and Package
32 Programmable I/O Lines
40-pin PDIP, 44-lead TQFP, 44-lead PLCC, and 44-pad MLF
Operating Voltages
2.7 - 5.5V for ATmega16L
4.5 - 5.5V for Atmega16
2
Gambar 1.2 Arsitektur ATMEGA16
3
1.4. STRUKTUR MEMORI
Untuk memaksimalkan performa dan paralelisme, AVR menggunakan arsitektur
Harvard (dengan memori dan bus terpisah untuk program dan data). Instruksi pada memori
program dieksekusi dengan pipelining single level. Selagi sebuah instruksi sedang dikerjakan,
instruksi berikutnya diambil dari memori program.
1.4.1. FLASH MEMORI
ATmega16 memiliki 16K byte flash memori dengan lebar 16 atau 32 bit. Kapasitas memori
itu sendiri terbagi manjadi dua bagian yaitu bagian boot program dan bagian aplikasi
program. Flash memori memiliki kemampuan mencapai 10.000 write dan erase.
1.4.2. MEMORI SRAM
Penempatan memori data yang lebih rendah dari 1120 menunjukkan register, I/O memori,
dan data internal SRAM. 96 alamatmemori pertama untuk file register dan memori I/O, dan
1024 alamat memori berikutnya untuk data internal SRAM. Lima mode pengalamatan yang
berbeda pada data memori yaitu direct, indirect, indirect dis-placement, indirect pre-
decreament dan indirect post-increament .Pada file register, mode indirect mulai dari register
R26-R31.
Pengalamatan mode direct mencapai keseuruhan kapasitas data. Pengalamatan mode indirect
displacement mencapai 63 alamat memori dari register X atau Y. Ketika meggunakan mode
pengalamatan indirect dengan predecrement dan post increment register X, Y, dan Z akan di-
dicrement-kan atau di-increment-kan. Pada ATmega16 memiliki 32 register, 64 register I/O
dan 1024 data internal SRAM yang dapat mengakses semua mode-mode pengalamatan.
1.4.3. MEMORI EEPROM
Pada EEPROM ATmega16 memiliki memori. Memori yang dimiliki sebesar 512 byte.
Memori tersebut memiliki daya tahan 100.000 siklus write/read.
4
BAB II PENGENALAN BAHASA C
2.1. PENDAHULUAN
Bahasa pemrograman C adalah sebuah bahasa 'mid-level', namun memiliki fitur 'highlevel'
(seperti support pada fungsi dan modul) dan juga memiliki fitur 'lowlevel' (seperti mengakses
hardware melalui pointer). Dengan menggunakan bahasa C, kita dapat dengan mudah untuk
pindah ke jenis mikrokontroler yang lain, lebih mudah dan cepat dalam menulis kode
program, dan lebih mudah dimengerti, dan lebih mudah dalam melakukan debugging. Berikut
penjelasan kode kode dasar bahasa C untuk pemrograman mikrokontroler keluarga MCS51
yang sering digunakan:
2.2. PREPROSESOR
Merupakan bagian program yang digunakan untuk mendefenisikan library berupa file header
(*.h) yang ikutkan (include) ke dalam program. Beberapa contoh penggunaannya: #include
//mengikutsertakan file at89x51.h #include #include
8
2.9. OPERASI ARITMATIKA
9
BAB III PORT SEBAGAI INPUT/OUTPUT DIGITAL(OK)
3.1. PENDAHULUAN
ATmega16 mempunyai empat buah port yang bernama PortA, PortB, PortC, dan
PortD. Keempat port tersebut merupakan jalur bidirectional dengan pilihan internal pull-up.
Tiap port mempunyai tiga buah register bit, yaitu DDxn, PORTxn, dan PINxn. Huruf
xmewakili nama huruf dari port sedangkan huruf n mewakili nomor bit. Bit DDxn
terdapat pada I/O address DDRx, bit PORTxn terdapat pada I/O address PORTx, dan bit
PINxn terdapat pada I/O address PINx. Bit DDxn dalam regiter DDRx (Data Direction
Register) menentukan arah pin.
3.2. PORT
Bila DDxn diset 1 maka Px berfungsi sebagai pin output. Bila PORTxn diset 1 pada
saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 1. Dan bila PORTxn
diset 0 pada saat pin terkonfigurasi sebagai pin output maka pin port akan berlogika 0. Saat
mengubah kondisi port dari kondisi tri-state (DDxn=0, PORTxn=0) ke kondisi output high
(DDxn=1, PORTxn=1) maka harus ada kondisi peralihan apakah itu kondisi pull-up enabled
(DDxn=0, PORTxn=1) atau kondisi output low (DDxn=1, PORTxn=0).
Biasanya, kondisi pull-up enabled dapat diterima sepenuhnya, selama lingkungan
impedansi tinggi tidak memperhatikan perbedaan antara sebuah strong high driver dengan
sebuah pull-up. Jika ini bukan suatu masalah, maka bit PUD pada register SFIOR dapat diset
1 untuk mematikan semua pull-up dalam semua port. Peralihan dari kondisi input dengan
pullup ke kondisi output low juga menimbulkan masalah yang sama. Kita harus
menggunakan kondisi tri-state (DDxn=0, PORTxn=0) atau kondisi output high (DDxn=1,
PORTxn=0) sebagai kondisi transisi.
10
VCC
U1
VCC 1 40
2 PB0(XCK/T0) PA0(ADC0) 39
3 PB1(T1) PA1(ADC1) 38
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36
R1 6 PB4(SS) PA4(ADC4) 35
7 PB5(MOSI) PA5(ADC5) 34
8 PB6[MISO) PA6(ADC6) 33
9 PB7[SCK) PA7(ADC7) 32
C1 22pF RST VCC 10 RESET AREF 31
1
11 VCC AGND 30
GND AVCC VCC
C3 100nF 12 29
SW1 13 XTAL2 PC7(TOSC2) 28
X1 14 XTAL1 PC6(TOSC1) 27
15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
2
//-------------------------------------------------------
// Program LED Menyala
// DEKLARASI HEADER
//-------------------------------------------------------
#include <mega16.h>
#include <delay.h>
//-------------------------------------------------------
//RUTIN UTAMA
//-------------------------------------------------------
void main(void)
{
char a; a=0x000;
DDRB=0xFF;
while(1)
{
PORTB = a;
}
}
11
3.2.3. RANGKAIAN PEMBACAAN KEYPAD DENGAN LCD
Rangkaian tombol 4x4 adalah rangkaian untuk membaca tombol 4x4 dari port
keluaran mikrokontroller. Pada saat penekanan tombol key pad, data dari key pad akan
ditampilkan dengan port serial komputer.
VCC
J16.
1
J5 VCC 2
3
5k pinb.0 4
1 pinb.5 R9 pinb.1 5
2 pinb.6 pinb.2 6
3 pinb.7 7
4 RST 8
5 9
10
pinb.4 11
pinb.5 12
HEADER 5 pinb.6 13
U4 pinb.7 14
pinb.0 1 40 15
VCC pinb.1 2 PB0(XCK/T0) PA0(ADC0) 39 16
pinb.2 3 PB1(T1) PA1(ADC1) 38
C
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36 D3
pinb.5 6 PB4(SS) PA4(ADC4) 35 HEADER 16
R1 pinb.6 7 PB5(MOSI) PA5(ADC5) 34 1N4002
pinb.7 8 PB6[MISO) PA6(ADC6) 33
PB7[SCK) PA7(ADC7) VCC
9 32
A
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 PD0 14 XTAL1 PC6(TOSC1) 27
X1 PD1 15 PD0(RXD) PC5 26
PD2 16 PD1(TXD) PC4 25
PD3 17 PD2(INT0) PC3 24
2
S4 S8 S12 S16
SW SW SW SW
S5 S9 S13 S17
SW SW SW SW
PD0
PD1
PD2 SW SW SW SW
PD3
PD4
PD5 S7 S11 S15 S19
PD6
PD7
SW SW SW SW
//------------------------------------------------------
12
//Program KEYPAD LCD
//DEKLARASI HEADER
//------------------------------------------------------
#include <lcd.h>
#include <stdio.h>
#include <mega16.h>
#include <delay.h>
//------------------------------------------------------
//DEKLARASI PIN LCD
//------------------------------------------------------
#asm
.equ __lcd_port=0x18;PORTB
#endasm
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char dt, dtkey;
char buf[33];
//------------------------------------------------------
//DEKLARASI SUB RUTIN KEYPAD
//------------------------------------------------------
void inkey(void);
//------------------------------------------------------
//PROGRAM UTAMA
//------------------------------------------------------
void main()
{
PORTD = 0XFF;
DDRD=0xF0;
lcd_init(16);
lcd_gotoxy(0,1);
lcd_putsf("Hello world");
while(1)
{
inkey();
lcd_gotoxy(0,1);
sprintf(buf,"hex %x ",dtkey);
lcd_puts(buf);
}
}
//------------------------------------------------------
//SUB RUTIN KEYPAD
//------------------------------------------------------
void inkey(void)
{
PORTD.4 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x01;
break;
13
case 2:dtkey = 0x05;
break;
case 4:dtkey = 0x09;
break;
case 8:dtkey = 0x13;
break;
}
PORTD.4 = 1;PORTD.5 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x02;
break;
case 2:dtkey = 0x06;
break;
case 4:dtkey = 0x10;
break;
case 8:dtkey = 0x14;
break;
}
PORTD.5 = 1;PORTD.6 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x03;
break;
case 2:dtkey = 0x07;
break;
case 4:dtkey = 0x11;
break;
case 8:dtkey = 0x15;
break;
}
PORTD.6 = 1;PORTD.7 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x04;
break;
case 2:dtkey = 0x08;
break;
case 4:dtkey = 0x12;
break;
case 8:dtkey = 0x16;
break;
}
PORTD.7 = 1;
}
14
3.2.4. RANGKAIAN SEVEN SEGMENT
Rangkaian seven segment tunggal adalah rangkaian untuk menggerakkan penampil 7
segment secara langsung dari port keluaran mikrokontroller. Penampil seven segment yang
digunakan common anoda. Data yang digunakan untuk menghasilkan angka atau huruf
tertentu didapatkan dengan cara seperti pada Tabel 4.1
U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30 VCC
VCC
1
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 PD0 14 XTAL1 PC6(TOSC1) 27
6
X1 PD1 15 PD0(RXD) PC5 26
PD2 16 PD1(TXD) PC4 25
PD3 17 PD2(INT0) PC3 24
2
HEADER 5
10
1
2
3
4
5
8
9
P5 PD0
1 P6 PD1
2 P7 PD2
3 RST PD3
4 GND PD4
5 PD5
JISP PD6
PD7
//-------------------------------------------------------
// Program Sevent Segmen Tunggal
// DEKLARASI HEADER
//-------------------------------------------------------
#include <mega16.h>
#include <delay.h>
//-------------------------------------------------------
//SUB RUTIN
//-------------------------------------------------------
void bin7seg(unsigned char data1)
{
switch(data1)
{
case 0 :
PORTD = 0xc0;
break;
15
case 1 :
PORTD = 0xf9;
break;
case 2 :
PORTD = 0xa4;
break;
case 3 :
PORTD = 0xb0;
break;
case 4 :
PORTD = 0x99;
break;
case 5 :
PORTD = 0x92;
break;
case 6 :
PORTD = 0x82;
break;
case 7 :
PORTD = 0xf8;
break;
case 8 :
PORTD = 0x80;
break;
case 9 :
PORTD = 0x90;
break;
}
}
//-------------------------------------------------------
//RUTIN UTAMA
//-------------------------------------------------------
void main(void)
{
DDRD=0xFF;
while(1)
{
bin7seg(0); delay_ms(100);
bin7seg(2); delay_ms(100);
}
}
3.3. PIN
Bila DDxn diset 0 maka Px berfungsi sebagai pin input. Bila PORTxn diset 1 pada saat
pin terkonfigurasi sebagai pin input, maka resistor pull-up akan diaktifkan. Untuk mematikan
resistor pull-up, PORTxn harus diset 0 atau pin dikonfigurasi sebagai pin output. Pin port
adalah tri-state setelah kondisi reset. Bila PORTxn diset 1 pada saat pin terkonfigurasi
16
sebagai pin output maka pin port akan berlogika 1. Dan bila PORTxn diset 0 pada saat pin
terkonfigurasi sebagai pin output maka pin port akan berlogika 0. Saat mengubah kondisi
port dari kondisi tri-state (DDxn=0, PORTxn=0) ke kondisi output high (DDxn=1,
PORTxn=1) maka harus ada kondisi peralihan apakah itu kondisi pull-up enabled (DDxn=0,
PORTxn=1)atau kondisi output low (DDxn=1, PORTxn=0).
Biasanya, kondisi pull-up enabled dapat diterima sepenuhnya, selama lingkungan
impedansi tinggi tidak memperhatikan perbedaan antara sebuah strong high driver dengan
sebuah pull-up. Jika ini bukan suatu masalah, maka bit PUD pada register SFIOR dapat diset
1 untuk mematikan semua pull-up dalam semua port. Peralihan dari kondisi input dengan
pullup ke kondisi output low juga menimbulkan masalah yang sama. Kita harus
menggunakan kondisi tri-state (DDxn=0, PORTxn=0) atau kondisi output high (DDxn=1,
PORTxn=0) sebagai kondisi transisi.
Bit 2 PUD : Pull-up Disable. Bila bit diset bernilai 1 maka pull-up pada port I/O akan
dimatikan walaupun register DDxn dan PORTxn dikonfigurasikan untuk menyalakan pull-up
(DDxn=0, PORTxn=1).
U1 PORTC.7
VCC 1 40 PORTC.6
2 PB0(XCK/T0) PA0(ADC0) 39 PORTC.5
3 PB1(T1) PA1(ADC1) 38 PORTC.4
4 PB2(INT2/AIN0) PA2(ADC2) 37 PORTC.3
5 PB3(OC0/AIN1) PA3(ADC3) 36 PORTC.2
R1 6 PB4(SS) PA4(ADC4) 35 PORTC.1
7 PB5(MOSI) PA5(ADC5) 34 PORTC.0
8 PB6[MISO) PA6(ADC6) 33
9 PB7[SCK) PA7(ADC7) 32 VCC
C1 22pF RST VCC 10 RESET AREF 31 JP3
1
11 VCC AGND 30
GND AVCC VCC 1
C3 100nF 12 29 PORTC.7
SW1 13 XTAL2 PC7(TOSC2) 28 PORTC.6 2
X1 14 XTAL1 PC6(TOSC1) 27 PORTC.5 3
15 PD0(RXD) PC5 26 PORTC.4 4
16 PD1(TXD) PC4 25 PORTC.3 5
2
17
//-------------------------------------------------------
//Program Program pembacaan 8 buah tombol
//DEKLARASI HEADER
//-------------------------------------------------------
#include <mega16.h>
#include <delay.h>
//-------------------------------------------------------
//RUTIN UTAMA
//-------------------------------------------------------
void main(void)
{
DDRC=0x00;
DDRB=0xFF;
while(1)
{
PORTB = PINC;
}
}
18
VCC
J16.
1
J5 VCC 2
3
5k pinb.0 4
1 pinb.5 R9 pinb.1 5
2 pinb.6 pinb.2 6
3 pinb.7 7
4 RST 8
5 9
10
pinb.4 11
pinb.5 12
HEADER 5 pinb.6 13
U4 pinb.7 14
pinb.0 1 40 15
VCC pinb.1 2 PB0(XCK/T0) PA0(ADC0) 39 16
pinb.2 3 PB1(T1) PA1(ADC1) 38
C
4 PB2(INT2/AIN0) PA2(ADC2) 37
5 PB3(OC0/AIN1) PA3(ADC3) 36 D3
pinb.5 6 PB4(SS) PA4(ADC4) 35 HEADER 16
R1 pinb.6 7 PB5(MOSI) PA5(ADC5) 34 1N4002
pinb.7 8 PB6[MISO) PA6(ADC6) 33
PB7[SCK) PA7(ADC7) VCC
9 32
A
VCC 10 RESET AREF 31
C1 22pF 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 PD0 14 XTAL1 PC6(TOSC1) 27
X1 PD1 15 PD0(RXD) PC5 26
PD2 16 PD1(TXD) PC4 25
PD3 17 PD2(INT0) PC3 24
2
S4 S8 S12 S16
SW SW SW SW
S5 S9 S13 S17
SW SW SW SW
PD0
PD1
PD2 SW SW SW SW
PD3
PD4
PD5 S7 S11 S15 S19
PD6
PD7
SW SW SW SW
//------------------------------------------------------
//Program KEYPAD LCD
//DEKLARASI HEADER
//------------------------------------------------------
#include <lcd.h>
#include <stdio.h>
#include <mega16.h>
#include <delay.h>
//------------------------------------------------------
//DEKLARASI PIN LCD
19
//------------------------------------------------------
#asm
.equ __lcd_port=0x18;PORTB
#endasm
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char dt, dtkey;
char buf[33];
//------------------------------------------------------
//DEKLARASI SUB RUTIN KEYPAD
//------------------------------------------------------
void inkey(void);
//------------------------------------------------------
//PROGRAM UTAMA
//------------------------------------------------------
void main()
{
PORTD = 0XFF;
DDRD=0xF0;
lcd_init(16);
lcd_gotoxy(0,1);
lcd_putsf("Hello world");
while(1)
{
inkey();
lcd_gotoxy(0,1);
sprintf(buf,"hex %x ",dtkey);
lcd_puts(buf);
}
}
//------------------------------------------------------
//SUB RUTIN KEYPAD
//------------------------------------------------------
void inkey(void)
{
PORTD.4 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x01;
break;
case 2:dtkey = 0x05;
break;
case 4:dtkey = 0x09;
break;
case 8:dtkey = 0x13;
break;
}
PORTD.4 = 1;PORTD.5 = 0;
dt = (~PIND & 0x0F);
20
switch (dt)
{
case 1:dtkey = 0x02;
break;
case 2:dtkey = 0x06;
break;
case 4:dtkey = 0x10;
break;
case 8:dtkey = 0x14;
break;
}
PORTD.5 = 1;PORTD.6 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x03;
break;
case 2:dtkey = 0x07;
break;
case 4:dtkey = 0x11;
break;
case 8:dtkey = 0x15;
break;
}
PORTD.6 = 1;PORTD.7 = 0;
dt = (~PIND & 0x0F);
switch (dt)
{
case 1:dtkey = 0x04;
break;
case 2:dtkey = 0x08;
break;
case 4:dtkey = 0x12;
break;
case 8:dtkey = 0x16;
break;
}
PORTD.7 = 1;
}
21
BAB IV ANALOG TO DIGITAL CONVERTER (OK)
4.1. PENDAHULUAN
ATmega16 mempunyai ADC (Analog to Digital Converter) internal dengan fitur sebagai
berikut (untuk lebih detil dapat mengacu pada datasheet) :
10-bit Resolution
65 - 260 s Conversion Time
Up to 15 kSPS at Maximum Resolution
8 Multiplexed Single Ended Input Channels
Optional Left Adjustment for ADC Result Readout
0 - VCC ADC Input Voltage Range
Selectable 2.56V ADC Reference Voltage
Free Running or Single Conversion Mode ~ ADC Start Conversion by Auto
Triggering on Interrupt 9Ibit ha l 49 Sources
Interrupt on ADC Conversion Complete
Sleep Mode Noise Canceler
Dibawah ini gambar timing diagram untuk mode single convertion maksudnya hanya satu
input chanel saja yang dikonversi.
22
4.2. RANGKAIAN ADC ATMEGA DENGAN LED
Rangkaian minimum untuk membaca ADC dengan tempilan LED ditunjukan pada
Gambar 9.7 yang perlu diperhatikan adalah konfigurasi rangkaian LED yaitu Common Anode
(CA) artinya untuk menghidupkan LED pada Port D, port D harus dikirim atau diberi logika
0.
VCC
HEADER 5
3
P5
1 P6 R2
2 P7
3 RST 2 POT
4 GND
5
JISP U4
P0 1 40
1
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
//-------------------------------------------------------
//Program ADC LED
//-------------------------------------------------------
//-------------------------------------------------------
//DEKLARASI HEADER
//-------------------------------------------------------
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
//-------------------------------------------------------
//DEKLARASI VARIABEL
//-------------------------------------------------------
unsigned int data_adc;
23
int suhu;
//-------------------------------------------------------
//DEFINISI VARIABEL
//-------------------------------------------------------
#define ADC_VREF_TYPE 0x60
//-------------------------------------------------------
//SUB RUTIN ADC
//-------------------------------------------------------
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
//-------------------------------------------------------
//RUTIN UTAMA
//-------------------------------------------------------
void main(void)
{
DDRD = 0xFF;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;
SFIOR&=0xEF;
while (1)
{
data_adc=read_adc(0);
suhu=~data_adc;
PORTD = suhu;
}
}
24
BAB V TIMER / COUNTER (OK)
5.1. PENDAHULUAN
Timer/couter adalah tujuan umum single channel, module 8 bit timer/counter.
Beberapa fasilitas chanel dari timer counter antara lain:
Counter channel tunggal
Pengosongan data timer sesuai dengan data pembanding
Bebas -glitch, tahap yang tepat Pulse Width Modulator (PWM)
Pembangkit frekuensi
Event counter external
Gambar diagram block timer/counter 8 bit ditunjukan pada gambar di bawah ini.
Untuk penempatan pin I/O telah di jelaskan Ibit hal 67 pada bagian I/O di atas. CPU dapat
diakses register I/O, termasuk dalam pinpin I/O dan bit I/O. Device khusus register I/O dan
lokasi bit terdaftar pada deskripsi timer/counter 8 bit pada gambar 1.13
25
clock telah mencapai 8 kali pulsa dan sinyal clock pembagi aktif clock dan ketika telah
mencapai nilai maksimal maka nilai TCNTn akan kembali ke nol. Dan kondisi flag timer
akan aktif ketika TCNTn maksimal.
26
Sama halnya timing timer diatas, timing timer/counter dengan seting OCFO timer
mode ini memasukan data ORCn sebagai data input timer. Ketika nilai ORCn sama dengan
nilaiTCNTn maka pulsa flag timer akan aktif. TCNTn akan bertambah nilainya ketika
pulsa clock telah mencapai 8 pulsa. Dan kondisi flag akan berbalik (komplemen) kondisi
ketika nilai TCNTn kembali ke nilai 0 (overflow).
Ketika nilai ORCn sama dengan nilai TCNTn maka pulsa flag timer akan aktif.
TCNTn akan bertambah nilainya ketika pulsa clock telah mencapai 8 pulsa. Dan kondisi
flag akan berbalik (komplemen) kondisi ketika nilai TCNTn kembalimkenilai 0 (overflow).
VCC P5
1 P6
2 P7
3 RST
4 GND
5
JISP U4
P0 1 40
VCC P1 2 PB0(XCK/T0) PA0(ADC0) 39
P2 3 PB1(T1) PA1(ADC1) 38
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36
P5 6 PB4(SS) PA4(ADC4) 35
R1 P6 7 PB5(MOSI) PA5(ADC5) 34
P7 8 PB6[MISO) PA6(ADC6) 33
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
27
5.4. PEMROGRAMAN MENCACAH COUNTER T0
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mencacah. Program cacah
menggunakan port B.0 pada mikrokontroller.
Program sebagai berikut ini
//------------------------------------------------------
// Program MENCACAH COUNTER TIMER 0
//------------------------------------------------------
//------------------------------------------------------
//DEKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char led,a;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiTIMER ();
//------------------------------------------------------
//RUTIN UTAMA
//------------------------------------------------------
void main (void)
{
DDRD = 0xff;
led=0x00;
InisialisasiTIMER();
while(1)
{
a = TCNT0;
if (a == 0x06)
{
led = PIND;
PORTD=~led;
TCNT0=0x00;
}
}
}
28
//------------------------------------------------------
//SUB RUTIN INISIALISASI TIMER0
//------------------------------------------------------
void InisialisasiTIMER ()
{
TCNT0=0x00;
TCCR0=0x07;
}
//------------------------------------------------------
// Program MENCACAH COUNTER TIMER 0
//------------------------------------------------------
//------------------------------------------------------
//DEKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char led,a;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiTIMER ();
//------------------------------------------------------
//RUTIN UTAMA
//------------------------------------------------------
void main (void)
{
DDRD = 0xff;
led=0x00;
InisialisasiTIMER();
while(1)
{
a = TCNT0;
29
if (a == 0x06)
{
led = PIND;
PORTD=~led;
TCNT0=0x00;
}
}
}
//------------------------------------------------------
//SUB RUTIN INISIALISASI TIMER0
//------------------------------------------------------
void InisialisasiTIMER ()
{
TCNT0=0x00;
TCCR0=0x07;
}
30
BAB VI INTERUPSI (OK)
6.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.
Tabel 1. 1Interrupt vektor
31
6.2. 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.
VCC VCC
U4 L1
VCC
INT2 P0
P1
1
2 PB0(XCK/T0) PA0(ADC0)
40
39
2
2
1
1
P2 3 PB1(T1) PA1(ADC1) 38 2 1
P3 4 PB2(INT2/AIN0) PA2(ADC2) 37 2 1
P4 5 PB3(OC0/AIN1) PA3(ADC3) 36 2 1
P5 6 PB4(SS) PA4(ADC4) 35 2 1
R1 P6 7 PB5(MOSI) PA5(ADC5) 34 2 1
P7 8 PB6[MISO) PA6(ADC6) 33 2 1
RST 9 PB7[SCK) PA7(ADC7) 32
10 RESET AREF 31
C1 22pF VCC 11 VCC AGND 30 VCC
1
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
X1 15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
HEADER 5
INT1 INT0 P5
1 P6
2 P7
3 RST
4 GND
5
JISP
//------------------------------------------------------
//Program interupsi eksternal 0
//------------------------------------------------------
//------------------------------------------------------
//EKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
32
//------------------------------------------------------
//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;
MCUCSR=0x00;
33
GIFR=0x80;
}
//------------------------------------------------------
//Program interupsi eksternal 1
//------------------------------------------------------
//------------------------------------------------------
//EKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//------------------------------------------------------
//EKLARASI VARIABEL
//------------------------------------------------------
unsigned char dt=0x01;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiINT1();
//------------------------------------------------------
//PROGRAM UTAMA
//------------------------------------------------------
void main (void)
{
DDRA=0xff; InisialisasiINT1();
#asm ("sei");
while(1)
{
PORTA=dt; delay_ms(100);
dt=dt<<1;
if (dt==0) {dt=0x01;}
};
}
//------------------------------------------------------
34
//SUB RUTIN INTERUPSI EXTERNAL0
//------------------------------------------------------
interrupt [EXT_INT1] void ext_int1_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 InisialisasiINT1()
{
GICR|=0x80;
MCUCR=0x0C;
MCUCSR=0x00;
GIFR=0x80;
}
12 GND AVCC 29
C3 100nF1 L1 13 XTAL2 PC7(TOSC2) 28
SW2 1 2 14 XTAL1 PC6(TOSC1) 27
X1 1 2 15 PD0(RXD) PC5 26
1 2 16 PD1(TXD) PC4 25
1 2 17 PD2(INT0) PC3 24
2
35
6.6. 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
//------------------------------------------------------
// 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
//------------------------------------------------------
36
void InisialisasiTIMER0()
{
TCNT0=0x00; TCCR0=0x05;
TIMSK=0x01; TIFR=0x01;
}
//------------------------------------------------------
// Program INTERUPSI TIMER 1
//------------------------------------------------------
//------------------------------------------------------
//DEKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char led=0xfe;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiTIMER1();
//------------------------------------------------------
//PROGRAM UTAMA
//------------------------------------------------------
void main (void)
{
DDRD=0xff; InisialisasiTIMER1();
#asm ("sei"); while(1);
}
//------------------------------------------------------
//SUB RUTIN INTERUPSI TIMER 1
//------------------------------------------------------
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
37
{
TCNT1L=0x00; TCNT1H=0x00;
led<<=1;
led|=1; delay_ms(100);
if (led==0xff) led=0xfe;
PORTD=led;
}
//------------------------------------------------------
//SUB RUTIN INISIALISASI TIMER 1
//------------------------------------------------------
void InisialisasiTIMER1()
{
TCNT1L=0x00; TCNT1H=0x00; TCCR1A=0x00;
TCCR1B=0x01; TIMSK=0x04; TIFR=0x04;
}
//------------------------------------------------------
// Program INTERUPSI TIMER 2
//------------------------------------------------------
//------------------------------------------------------
//DEKLARASI HEADER
//------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
unsigned char led=0xfe;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiTIMER2();
//------------------------------------------------------
//PROGRAM UTAMA
38
//------------------------------------------------------
void main (void)
{
DDRD=0xff; InisialisasiTIMER2();
#asm ("sei"); while(1);
}
//------------------------------------------------------
//SUB RUTIN INTERUPSI TIMER2
//------------------------------------------------------
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=0x00; led<<=1; led|=1; delay_ms(100);
if (led==0xff) led=0xfe; PORTD=led;
}
//------------------------------------------------------
//SUB RUTIN INISIALISASI TIMER2
//------------------------------------------------------
void InisialisasiTIMER2()
{
TCCR2=0x05; TCNT2=0x00; TIMSK=0x40; TIFR=0x40;
}
39
BAB VII SERIAL PORT(OK)
7.1. PENDAHULUAN
Universal synchronous dan asynchronous pemancar dan penerima serial adalah suatu
alat komunikasi serial sangat fleksibel. Jenis yang utama adalah :
Operasi full duplex (register penerima dan pengirim dapat berdiri sendiri )
Operasi Asychronous atau synchronous
Master atau slave mendapat clock dengan operasi synchronous
Pembangkit boud rate dengan resolusi tinggi
Dukung frames serial dengan 5, 6, 7, 8 atau 9 Data bit dan 1 atau 2 Stop bit
Tahap odd atau even parity dan parity check didukung oleh hardware
Pendeteksian data overrun
Pendeteksi framing error
Pemfilteran gangguan ( noise ) meliputi pendeteksian bit false start dan pendeteksian low
pass filter digital
Tiga interrupt yaitu TX complete, TX data register empty dan RX complete.
Mode komunikasi multi-processor
Mode komunikasi double speed asynchronous
40
mengasumsikan bahwa operasi asinkron menggunakan metode poling ( tidak ada interrupt
enable ) frame format yang tetap. Boud rate diberikan sebagai fungsi parameter.
Untuk kode assembly, parameter boud rate diasumsikan untuk di simpan pada
register r16, r17. Ketika menulis fungsi pada register UCSRC, bit URSEL (MSB) harus
diset dalam kaitan dengan pembagian penempatan I/O oleh UBRRH dan UCSRC. Lebih
mengedepankan inisialisasi rutin dapat dibuat seperti itu meliputi frame format sebagai
parameter, disable interrupt dan lain-lain. Bagai manapun juga banyak aplikasi
menggunakan seting tetap boud dan register control, dan untuk aplikasi jenis ini dapat
ditempatkan secara langsung pada keseluruhan routine, atau dikombinasikan dengan
inisialisasi kode untuk modul I/O yang lain.
HEADER 3 U6
8 11
RX1 13 R2IN T1IN 12
1 7 R1IN R1OUT 10
2 TX1 14 T2OUT T2IN 9
3 T1OUT R2OUT
JSerial1 1uF 16V
1 4 1uF 16V
C+ C2+
+ C4 + C5
3 5
C1- C2-
1uF 16V 2 6 1uF 16V
V+ V- C9
+ C8 MAX232 +
41
7.4. PEMROGRAMAN PORT SERIAL MIKROKONTROLLER
Setelah membuat dan menjalankan program mengirim data serial, maka sekarang
saatnya Anda membuat program kedua yang digunakan untuk program mengirim dan
menerima data serial.
Program sebagai berikut ini
//-------------------------------------------------------
//Program Bab 5.2. MENGIRIM DAN MENERIMA DATA
//-------------------------------------------------------
//-------------------------------------------------------
//DEKLARASI HEADER
//-------------------------------------------------------
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
//-------------------------------------------------------
//DEKLARASI VARIABEL
//-------------------------------------------------------
unsigned char data_terima = 0x00;
const long int osilator = 12000000;
unsigned long int UBRR;
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiUSART (unsigned long int baud_rate);
//------------------------------------------------------
//PROGRAM UTAMA
//------------------------------------------------------
void main(void)
{
DDRC = 0xFF;
PORTC = 0x00;
InisialisasiUSART(9600);
putsf("Selamat Datang Mas Iswanto"); putchar(13);
while(1)
{
putsf("Tekan sembarang tombol"); putchar(13);
data_terima = getchar();
delay_ms(100);
putsf("Anda menekan tombol ");
putchar(data_terima);; putchar(13);
}
}
42
//------------------------------------------------------
//SUB RUTIN BAUDRATE
//------------------------------------------------------
void InisialisasiUSART (unsigned long int baud_rate)
{
UBRR = (osilator/(16*baud_rate))-1;
UBRRL = UBRR;
UBRRH = UBRR>>8;
UCSRB = 0x18;
UCSRC = 0x86;
}
43
BAB VIII PWM(OK)
8.1. PENDAHULUAN
PWM (Pulse Width Modulation) dapat digunakan untuk mengatur kecepatan motor,
yaitu dengan cara mengatur lebar pulsa (waktu ON) dari tegangan sumbernya (tegangan DC).
Perbandingan antara waktu ON dan waktu OFF disebut duty cycle (siklus kerja). Semakin
besar siklus kerjanya, akan semakin besar pula keluaran yang dihasilkan, sehingga kecepatan
motor akan semakin besar. Pembangkitan sinyal PWM dengan mikrokontroler memiliki
beberapa keuntungan, seperti teknik pemrograman yang sederhana, dan rangkaian listrik
menjadi sederhana.
Mikrokontroler AVR ATMEGA16 dapat digunakan sebagai pembangkit gelombang
PWM. Mikrokontroler AVR ATMEGA16 mempunyai PWM yang telah terintegrasi dalam
chip. Keluaran dari PWM tersebut terdapat pada pin 15 (OC1). Untuk menjalankan program
PWM, diperlukan 3 unit register timer, yaitu:
a. Timer/Counter Control Register (TCCR), untuk menentukan mode PWM.
b. Timer/Counter Register (TCNT), digunakan untuk menentukan modulasi
frekuensinya.
c. Output Compare Register (OCR), untuk menentukan nilai siklus kerjanya.
Dalam mikrokontroler ATMEGA16, terdapat beberapa mode PWM. Mode PWM yang
akan dibahas adalah mode Fast PWM, karena dalam perancangan sistem robot ini
menggunakan mode Fast PWM. Pada mode Fast PWM, semakin besar nilai OCR, maka
akan semakin besar pula siklus kerja yang dihasilkan. Keluaran PWM akan berlogika tinggi
setelah nilai TOP tercapai sampai nilai OCR tercapai dan kemudian akan berlogika rendah
sampai nilai TOP tercapai kembali. Prinsip kerja dari Fast PWM dapat dilihat pada Gambar
10.1.
nilai counter nilai OCR TOP
Keluaran
Gambar 8.1 Prinsip Kerja Mode Fast PWM
Untuk menghitung siklus kerja digunakan rumus:
44
OCR
D x100% ........................................10.1
1 TOP
Untuk menentukan frekuensi PWM dihitung dengan rumus:
f clock
f PW M ..........................................10.2
N (1 TOP )
Sedangkan untuk menentukan resolusi PWM digunakan rumus:
12 GND AVCC 29
C3 100nF1 13 XTAL2 PC7(TOSC2) 28
SW2 14 XTAL1 PC6(TOSC1) 27
X1 15 PD0(RXD) PC5 26
16 PD1(TXD) PC4 25
17 PD2(INT0) PC3 24
2
12V2 MG2
1
D2
DIODE
MOTOR DC
2
EN2 Q2
TI9013
470 TIP3055
MG2
1
12V2
D1
DIODE
MOTOR DC
2
EN2
TI9013
470 TIP3055
45
8.3. PEMROGRAMAN PWM MIKROKONTROLLER
Setelah rangkaian dibuat dan dihubungkan dengan port mikrokontroller, maka
sekarang saatnya Anda membuat program yang digunakan untuk mengatur putaran motor dc.
Program sebagai berikut ini
//-------------------------------------------------------
// Program PWM
// DEKLARASI HEADER
//-------------------------------------------------------
#include <stdio.h>
#include <mega16.h>
#include <delay.h>
//------------------------------------------------------
//DEKLARASI SUB RUTIN
//------------------------------------------------------
void InisialisasiPWM();
//------------------------------------------------------
//DEKLARASI VARIABEL
//------------------------------------------------------
int data1;
int data2;
//------------------------------------------------------
//RUTIN UTAMA
//------------------------------------------------------
void main (void)
{
InisialisasiPWM();
while(1)
{
data1 = 50;
data2 = 1024;
OCR1A=data1;
OCR1B=data2;
TIFR=0;
}
}
//------------------------------------------------------
//SUB RUTIN INISIALISASI PWM
//------------------------------------------------------
void InisialisasiPWM()
{
DDRD=0xff;
TCCR1A=0xa3;
TCCR1B=0x0b;
TCNT1=0x0000;
}
46