Anda di halaman 1dari 32

MODUL IV PRAKTIKUM

MIKROPROSESSOR DAN INTERFACE


(AVR MICROKONTROLLER)

DI SUSUN OLEH :
JAENAL ARIFIN, ST

LABORATORIUM ELEKTRONIKA & DIGITAL


AKADEMI TEKNIK TELEKOMUNIKASI SANDHY PUTRA
PURWOKERTO
MODUL AVR MICROKONTROLLER
(Alfand Vegard's Risc processor)

A. PENDAHULUAN
Perkembangan teknologi elektronika digital telah berkembang dengan pesatnya, diberbagai
bidang. Pengunaan mikrokontroller sangat luas, mulai dari mainan elektronika sampai dengan
modul-modul rangkaian digital lainnya. Teknologi ini dirasakan masih cukup ampuh dalam
menyelesaikan permasalahan elektronika digital, dikarenakan memiliki kemudahan dalam hal
pemrograman untuk mengendalikan input-output dan biaya murah. Lahirnya mikrokontroler
telah menimbulkan suatu revolusi dalam membuat system berbasis digital yang kompleks.
Sebuah chip mikrokontroler yang relatif `murah' dapat bekerja sesuai dengan keinginan
programmer. Sebagai contoh seperti pada sistem pengontrolan maupun sistem otomasi
maupun pada sistem robot. Mikrokontroller type CISC clan RISC saat ini berkembang pesat. Hal
ini didasarkan pada arsitektur processor dan set instruksinya. Tipe AVR (Alfand Vegard's Risc
processor) merupakan jenis RISC, yang hamper semua instruksi dikerjakan 1 siklus, sehingga
lebih cepat waktu eksekusinya. AVR keluaran ATMEL saat ini dikelompokan menjadi 4 group :
keluarga AT90Sxx, keluarga ATMega, keluarga ATtiny dan keluarga AT89RFxx. Tidak ada
perbedaan mendasar pada keempatnya, baik arsitektur maupun instruksinya. Kapasitas
memori, peripheral dan fungsi adalah yang menjadikan masing – masing keluarga AVR memiliki
keunikan tersendiri.

B. MODUL PRAKTIKUM AVR INI TERDIRI DARI :


a. Arsitektur Mikrokontroller ATMEGA16
b. Dasar pemrograman C
c. Menggunakan software avr studio untuk mikrokontroler AVR.
d. Input output (8 X LED)
e. Timer
f. Display LCD Character 2x16
g. ADC
h. USART AVR
i. Interupsi
j. EEPROM INTERNAL
k. Watchdog
l. Brown Out Detector
m. RTC DS 1307
n. EEPROM EXTERNAL
I. ARSITEKTUR AVR ATMEGA16
Fitur Dasar ATmega16
AVR Atmega16 merupakan salah satu produk dari ATMEL. Mikrokontroler ini memiliki fitur-fitur
sebagai berikut:
1. Port I/O 32 jalur (Port A, Port B, Port C, Port D masing - masing 8 bit)
2. ADC 8 channel dengan resolusi 10 bit
3. 3 buah timer / counter
4. Osilator internal
5. Flash PEROM 16 Kb
6. EEPROM 512 byte
7. SRAM 512 byte
8. Interupsi Eksternal dan Internal
9. Port USART untuk komunikasi serial

Konfigurasi Hardware
Mikrokontroler ATmega16 memiliki konfigurasi pin 40 kaki yang terdiri dari masing-masing pin
I/O (32 pin) serta mempunyai fungsi khusus tergantung penggunaannya.

Tabel 1. Konfigurasi Pin ATmega16


NO. NAMA FUNGSI
1 PBO XCK/TO Port BO/Counter 0 /clock eksternal untuk USART (XCK)
2 PB1 (T1) Port B1/Counter 1
PB2
3 (INT2/AIN0) Port B2/Input (+) Analog Komparator (AINO) dan interupsi eksternal 2 INT2
PB3
4 (OC0/AIN1) Port B3 / Input (-) Analog Komparator (AIN1) dan output PWM0
5 PB4 (SS) Port B4 / SPI Slave Select Input (SS)
6 PB5 (MOSl) Port BS / SPI bus Master Out Slave In
7 PB6 (MISO) Port B6 / SPI bus Master In Slave Out
8 PB7 (SCK) Port B7 / sinyal clock serial SPI
9 RESET Reset mikrokontroler
10 VCC Catu daya (+)
11 GND Sinyal ground terhadap catu daya
12 s/d 13 XTAL2-XTAL1 Sinyal input clock eksternal (kristal)
14 PD0 (RXD) Port D0 / Penerima data serial
15 PD1 (TXD) Port D1 / Pengirim data serial
16 PD2 (INT0) Port D2 / Interupsi eksternal 0
17 PD3 (INT1) Port D3 / Interupsi eksternal 1
18 PD4 (OC1B) Port D4 / Pembanding Timer-Counter 1 (Output PWM 1B)
19 PD5 (OC1A) Port D5 / Output PWM 1A
20 PD6 (ICP1) Port D6 / Timer-Counter 1 input
21 PD7 (OC2) Port D7 / Output PWM 2
22 PC0 (SCL) Port C0 / Serial bus clock line
23 PC1 (SDA) Port C1 / Serial bus data input-output
24 s/d 27 PC2 – PC5 PC2 – PC5
28 PC6 (TOSC1) Port C6 / Timer osilator 1
29 PC7 (TOSC2) Port C7 / Timer osilator 2
30 AVCC Tegangan ADC
31 GND Sinyal ground ADC
32 AREFF Tegangan referensi ADC
33 s/d 40 PA0 – PA7 Port A0-PortA7 input untuk ADC (8 channel : ADCO-ADC7)

STRUKTUR MEMORI
Secara khusus Mikrokontroller AVR ATmega16 mempunyai ruang memori data dan memori
program
yang terpisah. Memori data terdiri 3 bagian :
- 32 buah General Purspose Register (GPR) / register umum
- 64 buah register I/O
- 512 byte SRAM Internal
Memori program sebesar 8 Kbyte dalam Flash PEROM dengan alamat 000H - FFFH.

II. DASAR PEMROGRAMAN C

Bahasa C luas digunakan untuk pemrograman berbagai jenis perangkat, termasuk


mikrokontroler. Bahasa ini sudah merupakan high level language, dimana memudahkan
programmer menuangkan algoritmanya. Untuk mengetahui dasar bahasa C dapat dipelajari
sebagai berikut.
1. Struktur penulisan program
#include < [library1.h] > // Opsional
#include < [library2.h] > // Opsional
#define [nama1] [nilai] ; // Opsional
#define [nama2] [nilai] ; // Opsional
[global variables] // Opsional
[functions] // Opsional
int main(void) // Program Utama
{
[Deklarasi local variable/constant]
[Isi Program Utama]
}
2. Tipe data
* char : 1 byte ( -128 s/d 127 )
* unsigned char : 1 byte ( 0 s/d 255 )
* int : 2 byte ( -32768 s/d 32767 )
* unsigned int : 2 byte ( 0 s/d 65535 )
* long : 4 byte ( -2147483648 s/d 2147483647 )
* unsigned long : 4 byte ( 0 s/d 4294967295 )
* float : bilangan desimal
* array : kumpulan data-data yang sama tipenya.
3. Deklarasi variabel & konstanta
* Variabel adalah memori penyimpanan data yang nilainya dapat diubah-ubah.
Penulisan :
[tipe data] [nama] = [nilai] ;
* Konstanta adalah memori penyimpanan data yang nilainya tidak dapat diubah.
Penulisan :
const [nama] = [nilai] ;
* Tambahan:
Global variabel/konstanta yang dapat diakses di seluruh bagian program.
Local variabel/konstanta yang hanya dapat diakses oleh fungsi tempat
dideklarasikannya.
4. Statement
Statement adalah setiap operasi dalam pemrograman, harus diakhiri dengan [ ; ] atau [ }
]. Statement tidak akan dieksekusi bila diawali dengan tanda [ // ] untuk satu baris. Lebih
dari 1 baris gunakan pasangan [ /* ] dan [ */ ].
Statement yang tidak dieksekusi disebut juga comments / komentar.
Contoh:
suhu=adc/255*100; //contoh rumus perhitungan suhu
5. Function
Function adalah bagian program yang dapat dipanggil oleh program utama.
Penulisan :
[tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2])
{
[statement] ;
}
6. Conditional statement dan looping
if else : digunakan untuk penyeleksian kondisi
if ( [persyaratan] ) {
[statement1];
[statement2];
}
else {
[statement3];
[statement4];
}
for : digunakan untuk looping dengan jumlah yang sudah diketahui
for ( [nilai awal] ; [persyaratan] ; [operasi nilai] ) {
[statement1];
[statement2];
}
while : digunakan untuk looping jika dan salama memenuhi syarat tertentu
while ( [persyaratan] ) {
[statement1];
[statement2];
}
do while : digunakan untuk looping jika dan salama memenuhi syarat tertentu, namun
min 1 kali
do {
[statement1];
[statement2];
}
while ( [persyaratan] )
switch case : digunakan untuk seleksi dengan banyak kondisi
switch ( [nama variabel] ) {
case [nilai1]: [statement];
break;
case [nilai2]: [statement];
break;
}
7. Operasi logika dan biner
* Logika
AND :&&
NOT : !
OR : ||
* Biner
AND : &
OR : |
XOR : ^
Shift right: >>
Shift left : <<>
* Lebih besar sama dengan : >=
* Lebih kecil : < * Lebih kecil sama dengan : <=
9. Operasi aritmatika * + , - , * , / : tambah,kurang,kali,bagi * += , -= , *= , /= : nilai di
sebelah kiri operator di tambah/kurang/kali/bagi dengan nilai di sebelah kanan operator
* % : sisa bagi * ++ , -- : tambah satu (increment), kurang satu (decrement) * Contoh : a =
5 * 6 + 2 / 2 -1 ; maka nilai a adalah 30 a *= 5 ; jika nilai awal a adalah 30, maka nilai a =
30x5 = 150. a += 3 ; jika nilai awal a adalah 30, maka nilai a = 30+5 = 33. a++ ; jika nilai
awal a adalah 5 maka nilai a = a+1 = 6. a-- ; jika nilai awal a adalah 5 maka nilai a = a-1 =
4

III. BASIC INPUT OUTPUT AVR


AVR dengan package 40-pin PDIP, contoh ATmega 16 memiliki 32 I/O lines. Masing-
masing lines dapat diatur fungsinya. Sebagian dari lines-lines I/O tersebut ada yang
memilki fungsi-fungsi khusus, seperti ADC, Analog Comparator, PWM, USART dan
External Interrupt. Kali ini kita akan membahas basicnya dulu. Fungsi dasar dari setiap
pin microcontroller adalah: “membaca perubahan level tegangan apakah 0 atau 5 volt
(jika digunakan sebagai input)” ”mengeluarkan tegangan sebesar 0 atau 5 volt (jika
digunakan sebagai output)” Microcontroller AVR memiliki 2 register yang berhubungan
dengan fungsi dasar ini, yaitu:
1. Register DDRx
DDRx ( x adalah port micro yang digunakan ).
Misal: menggunakan Port A berarti registernya DDRA.
Register ini berfungsi untuk mengatur arah Pin/Port micro. Apakah dipakai sebagai
input atau output. Nilai register ini sebesar 8 bit. Setiap bit mewakili masing-masing
pin kaki micro. Jika pin kaki micro digunakan sebagai input maka register DDRx
nya harus bernilai 0(nol). Jika pin kaki micro digunakan sebagai output maka
register DDRx nya harus bernilai 1.
Misal Port A akan digunakan sebagai input maka untuk mensetnya kita gunakan
perintah: DDRA= 0x00; //ini berarti seluruh pin-pin pada Port A digunakan sebagai
input
Contoh: Port A.0 dijadikan input sedangkan Port A.2 ..sampai.. Port A.7 digunakan
sebagai output maka perintahnya: DDRA= 0xFE; 0xFE (heksa) == 0b 1111 1110
(biner) Perhatikan baik-baik konversi biner diatas!! Setiap bit nilai biner mewakili
Pin-Pin pada PortA.
2. Register PORTx
PORTx ( x adalah port micro yang digunakan ). Misal: menggunakan Port A berarti
registernya PORTA. Jika Port digunakan sebagai input register ini berfungsi
sebagai penentu apakah kondisi Port di Pull Up atau Floating. Jika Port
digunakan sebagai output register ini menentukan kondisi Port High atau Low.
Untuk memahami apa arti Pull Up perhatikan gambar berikut :

Pin 1. dihubungkan ke VCC(tegangan 5 Volt) melalui resistor (R), inilah yang di


maksud dengan Pull Up. Saat tidak ada tegangan dari luar Pin 1 akan cenderung
berkondisi High (1) Pin 2. dibiarkan begitu saja sehingga kondisi logic Pin2 rentan
terhadap pengaruh sekitarnya. Pin 2. bisa berlogika high bisa juga berlogika low ini
artinya logika Pin2 ngambang (Floating). Kondisi floating biasanya diperlukan saat
Pin sebuah IC atau micro dihubungkan ke sensor. Karena jika di Pull Up
dikhawatirkan kondisi logic Pin IC mengganggu kondisi logic pin-pin sensor.
Perhatikan code program berikut:
DDRA=0x00;
PORTA = 0xFF;
ini berarti seluruh pin-pin pada Port A sebagai Input dan di Pull Up.
Perhatikan code program berikut:
DDRB= 0x00;
PORTB=0x0F;
0x0F == 0b 0000 1111
berarti :
Seluruh pin-pin PortB dijadikan Input
PortB.0 ..sampai.. PortB.3 di Pull Up
PortB.4 ..sampai.. PortB.7 dalam keadaan Floating
Apa itu Infinite Looping??
Infinite : tak terbatas, tak terhingga
Looping : perulangan, pengulangan, perputaran
Infinite Looping adalah perulangan(looping) yang dijalankan terus menerus.
INGAT!!! code program yang
dijalankan AVR adalah code program yang berada dalam fungsi utama:
void main()
{
..............................//code program
.............................//code program
}
Program dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan
dijalankan sekali. Dengan memakai infinite looping Code Program yang berada di
dalam infinite looping akan dijalankan terus menerus.
void main()
{
...................//code program di luar infinite looping. Hanya dijalankan sekali
...................//code program di luar infinite looping. Hanya dijalankan sekali
while(1) //infinite looping
{
..................................// code program dalam infinite looping
.................................//code program dalam infinite looping
}
}
Untuk keluar dari infinite looping gunakan perintah
break;
Mengapa terjadi Infinite Looping ??
Perhatikan code program berikut:
while(1)
{
............................ //code program
........................... //code program
}
Arti dari code program di atas adalah:
while(1) //selama 1 maka kerjakan program di dalam kurung kurawal
{
.................... //code program
.................... //code program
}
Statement diatas akan selalu benar (selalu bernilai satu) karena angka 1merupakan
konstanta. Konstanta nilainya tidak akan berubah, sehingga terjadilah Looping terus
menerus .
Coba bedakan dengan code program berikut:
while(index<4)
{
....................................... //code program
....................................... //code program
index=index+1;
}
Program di dalam kurung kurawal akan dijalankan selama index kurang dari 4. index
merupakan variabel sehingga nilainya bisa berubah. Nah.. jika index lebih dari atau
sama dengan 4, looping tidak dijalankan lagi.

PERCOBAAN PROGRAM DENGAN BAHASA C

A. Gambar rangkaian

B. Alat dan Bahan

1. Satu set modul AVR trainer versi 1.0 atau versi 2.0

2. PC dekstop

3. Power supply (5 Volt)

4. Usb asp downloader


PERCOBAAN I.
Mengeluarkan Output ke PORTB (8xled merah)
- Led terhubung dengan PORTB
#define F_CPU 11059200 //xtal yang dipakai
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
//===========================================subrutin init devices
void init_devices()
{
DDRB=255; //PORTB sebagai output
}
//==========================================program utama
int main()
{
init_devices(); //panggil sub rutin init devices
for(;;) //pengulangan
{
led=255; //aktifkan semua led
_delay_ms(1000); //tunda 1 detik
led=0; //matikan semua led
_delay_ms(1000); //tunda 1 detiku
}
}
//===========================================

PERCOBAAN II.
Mengeluarkan Output ke PORTB (8xled merah) dan buzzer
- Led terhubung dengan PORTB
- Buzzer terhubung dengan PORTA.7
//===========================================
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
#define buzzer_hi PORTA|=(1<<7)
#define buzzer_lo PORTA&=~(1<<7)
//===========================================
void init_devices()
{
DDRB=255;
DDRA|=(1<<7);
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
buzzer_hi;
_delay_ms(1000);
buzzer_lo;
led=0;
_delay_ms(1000);
}
}
//===========================================

PERCOBAAN III.
Membaca input push button untuk mengontrol 8 x led
- Led terhubung dengan PORTB
- push button terhubung dengan pind.2 dan pind.3
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
#define tombol PIND
#define satu 2
#define dua 3
//===========================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRD&=~(1<<2); //INPUT
DDRD&=~(1<<3); //INPUT
PORTD|=(1<<2); //PULL UP INTERNAL AKTIF
PORTD|=(1<<3);
}
//==========================================program utama
int main()
{
init_devices();
led=0;
for(;;)
{
if(bit_is_clear(tombol,satu)) led=255;
if(bit_is_clear(tombol,dua)) led=0;
}
}
//===========================================
TIMER COUNTER
Timer/counter dalam mikrokontroler merupakan fasilitas yang salah satu fungsinya sebagai
pewaktu atau hitungan. Sumber clock atau trigger dapat dibangkitkan dari sinyal eksternal atau
internal. Jika sumber sinyal berasal dari internal maka di sebut sebagai TIMER dan jika sumber
sinyal berasal dari luar maka disebut sebagai COUNTER. Mikrokontroler ATMega16 memiliki 3
buah timer yaitu Timer0, Timer1, dan Timer2. Timer0 dan Timer2 memiliki kapasitas 8-bit
sedangkan Timer1 memiliki kapasitas 16-bit. Apa yang dimaksud timer 8 bit dan 16 bit?
timer 8 bit adalah timer yg bisa mencacah/menghitung sampai maksimal nilai 0xFF heksa
(dalam biner = 11111111). Klo yg 16 bit nilai maksimalnya 0xFFFF. Untuk dapat menjalankan
timer/counter1 harus dipelajari dulu mengenai register timer/counter1 karena di register itulah
tempat setting Timer/Counter1 agar bisa bekerja. Register tersebut terdiri dari :
-TCCR1B
-TCNT1
-TIMSK
-TIFR
Register TCCR1B merupakan tempat setting clock yang intinya agar timer/counter1 bisa bekerja
maka register ini jangan sampai diisi dengan 0×00 (dikosongkan). Sumber clock bisa berasal dari
internal mulai dari no prescaler sampai 1024 prescaler dan bisa juga dari sumber external.
Register TCNT1 merupakan register pencacah setiap ada trigger bisa tepi naik atau tepi turun,
tapi kalo sumbernya dari dalam (internal) pencacahan dilakukan pada saat tepi naik. Register ini
akan mencacah naik dari 0×00 sampai nilai max 0xFFFF kemudian di reset kembali lagi ke 0×00.
Pada saat overflow yaitu kondisi dari 0xFFFF ke 0×00 maka bit TOV1 dari register TIFR akan di
set 1. Keadaan overflow juga bisa digunakan untuk menjalankan interrupt. Register TIMSK
merupakan register tempat setting interrupt timer/counter1 overflow diaktifkan atau tidak.
Dengan memberikan logika satu pada bit TOIE1 maka interrupt timer/counter1 aktif dengan
catatan global interrupt diaktifkan (terdapat di Status register). Sedangkan register TIFR
(Timer/Counter Interrupt Flag Register) digunakan sebagai penanda apakah sudah terjadi
overflow. Pada timer/counter1 overflow ditandai dengan logika 1 pada bit TOV1 pada register
ini.
rumus yang digunakan adalah :
TCNT = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
waktu --> waktu yg kita inginkan
XTAL --> frekuensi xtal yg dipakai
prescaler --> nilai prescaler

Apa nilai prescaler itu?


Timer membutuhkan clock source. Biasanya clock source yg saya pakai adalah clock sistem (XTAL). Dan
kita bisa menset
besarnya nilai ini. Maximum sama dengan XTAL, minimum XTAL/1024. Nah nilai pembagi (1024) ini yg
disebur nilai
prescaler.
Macam2 nilai prescaler yg diijinkan: 1, 8 , 64 , 256 , 1024
Untuk mengubah nilai prescaler timer 1, kita harus merubah nilai register TCCR1B bit 0...2
Tabel 2 Clock Select bit Description

PERCOBAAN IV
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 1
Nah sebelumnya kita cari nilai TCNT1?
- XTAL 11.0592
- PRESCALER 1024
- WAKTU YANG DIINGINKAN 1 DETIK
inget rumus: TCNT1 = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
Jadi,...............
TCNT1= (1+65535)-(1detik * (11059200/1024))
=65536 - (1detik*10800)
=65536-10800
=54736 (desimal)
= D5D0 (heksadesimal)

#define F_CPU 11059200


#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
//===========================================
void init_devices()
{
DDRB=255;
}
void delay1detik()
{
TCCR1B=0B00000101;
TCNT1=0xd5d0;
while(!(TIFR&(1<<TOV1)));
TIFR=4;
TCCR1B=0B00000000;
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
//_delay_ms(1000);
delay1detik();
led=0;
//_delay_ms(1000);
delay1detik();
}
}
//===========================================

PERCOBAAN V
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 2
#define F_CPU 11059200
#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
//===========================================
void init_devices()
{
DDRB=255;
}
void delay10ms()
{
TCCR2=0B00000111;
TCNT2=0x94;
while(!(TIFR&(1<<TOV2)));
TIFR=64;
TCCR2=0B00000000;
}
void delay1detik()
{
unsigned char ulang;
for(ulang=0;ulang<100;ulang++)
{
delay10ms();
}
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
//_delay_ms(1000);
delay1detik();
led=0;
//_delay_ms(1000);
delay1detik();
}
}
//===========================================

PERCOBAAN VI
Mengeluarkan Output ke PORTB (8xled merah) dengan interval waktu on
dan off led 1 detik menggunakan timer 0

#define F_CPU 11059200


#include "avr/io.h"
#include "util/delay.h"
#define led PORTB
//===========================================
void init_devices()
{
DDRB=255;
}
void delay10ms()
{
TCCR0=0B00000101;
TCNT0=0x94;
while(!(TIFR&(1<<TOV0)));
TIFR=1;
TCCR0=0B00000000;
}
void delay1detik()
{
unsigned char ulang;
for(ulang=0;ulang<100;ulang++)
{
delay10ms();
}
}
//==========================================program utama
int main()
{
init_devices();
for(;;)
{
led=255;
//_delay_ms(1000);
delay1detik();
led=0;
//_delay_ms(1000);
delay1detik();
}
}
//===========================================

LCD 2x16 KARAKTER


Modul LCD Character dapat dengan mudah dihubungkan dengan mikrokontroller. LCD yang
akan kita pelajari bersama ini mempunyai lebar display 2 baris 16 kolom atau biasa disebut
sebagai LCD Character 16x2, dengan 16 pin konektor, yang didefinisikan sebagai berikut :

Tabel 3 Pin dan Fungsi

Display karakter pada LCD diatur oleh pin EN, RS dan RW: Jalur EN dinamakan Enable. Jalur ini
digunakan untuk memberitahu LCD bahwa anda sedang mengirimkan sebuah data. Untuk
mengirimkan data ke LCD, maka melalui program EN harus dibuat logika low “0” dan set pada
dua jalur kontrol yang lain RS dan RW. Ketika dua jalur yang lain telah siap, set EN dengan logika
“1” dan tunggu untuk sejumlah waktu tertentu (sesuai dengan datasheet dari LCD tersebut) dan
berikutnya set EN ke logika low “0” lagi. Jalur RS adalah jalur Register Select. Ketika RS berlogika
low “0”, data akan dianggap sebagi sebua perintah atau instruksi khusus (seperti clear screen,
posisi kursor dll). Ketika RS berlogika high “1”, data yang dikirim adalah data text yang akan
ditampilkan pada display LCD. Sebagai contoh, untuk menampilkan huruf “T”
pada layar LCD maka RS harus diset logika high “1”. Jalur RW adalah jalur kontrol Read/ Write.
Ketika RW berlogika low (0), maka informasi pada bus data akan dituliskan pada layar LCD.
Ketika RW berlogika high ”1”, maka program akan melakukan pembacaan memori dari LCD.
Sedangkan pada aplikasi umum pin RW selalu diberi logika low ”0”. Pada akhirnya, bus data
terdiri dari 4 atau 8 jalur (bergantung pada mode operasi yang dipilih oleh user). Pada kasus bus
data 8 bit, jalur diacukan sebagai DB0 s/d DB7.

Pada aplikasi ini, pin RW selalu diberi logika low ”0” (GND) karena kita hanya melakukan operasi
write saja, data bus yang digunakan cukup 4 saja yakni D4-D7,selain itu pin control juga
dihubungkan ke μC (pin RS dan E).

PERCOBAAN VII
Menulis karakter ke LCD

#define F_CPU 11059200UL


#include "util/delay.h"
#include "stdlib.h"
#include "avr/io.h"
#include "avr/pgmspace.h"
#define led PORTB
#define tombol PIND
#define satu 2
#define dua 3
#define LCD_RS_HI PORTC|=(1<<7) //LCD
#define LCD_RS_LO PORTC&=~(1<<7)
#define LCD_EN_HI PORTC|=(1<<6)
#define LCD_EN_LO PORTC&=~(1<<6)
#define LCD_D4_HI PORTC|=(1<<5)
#define LCD_D4_LO PORTC&=~(1<<5)
#define LCD_D5_HI PORTC|=(1<<4)
#define LCD_D5_LO PORTC&=~(1<<4)
#define LCD_D6_HI PORTC|=(1<<3)
#define LCD_D6_LO PORTC&=~(1<<3)
#define LCD_D7_HI PORTC|=(1<<2)
#define LCD_D7_LO PORTC&=~(1<<2)
//==============================================
#define line1 0x00
#define line2 0x40
//===========================================
void LCD_STROBE()
{
LCD_EN_HI;
LCD_EN_LO;
}
void lcd_write(unsigned char datalcd)
{
if(datalcd & 0x80) {LCD_D7_HI;} else {LCD_D7_LO;}
if(datalcd & 0x40) {LCD_D6_HI;} else {LCD_D6_LO;}
if(datalcd & 0x20) {LCD_D5_HI;} else {LCD_D5_LO;}
if(datalcd & 0x10) {LCD_D4_HI;} else {LCD_D4_LO;}
LCD_STROBE();
if(datalcd & 0x08) {LCD_D7_HI;} else {LCD_D7_LO;}
if(datalcd & 0x04) {LCD_D6_HI;} else {LCD_D6_LO;}
if(datalcd & 0x02) {LCD_D5_HI;} else {LCD_D5_LO;}
if(datalcd & 0x01) {LCD_D4_HI;} else {LCD_D4_LO;}
LCD_STROBE();
_delay_ms(5);
}

void lcd_clrscr()
{
LCD_RS_LO;
lcd_write(0x1);
_delay_ms(2);
}

void lcd_putc(unsigned char c)


{
LCD_RS_HI;
lcd_write(c);
}
void lcd_puts(const char *s)
{
register char c;

while ( (c = *s++) ) {
lcd_putc(c);
}
}
void lcd_puts_pp(const char *progmem_s)
{
register char c;
for(;;)
{
c = pgm_read_byte(progmem_s++);
if(c==0) break;
lcd_putc(c);
}
}
void lcd_goto(unsigned char poslcd)
{
LCD_RS_LO;
lcd_write(0x80 + poslcd);
}
void init_lcd()
{
LCD_RS_LO;
_delay_ms(15);
LCD_D4_HI;
LCD_D5_HI;
LCD_STROBE();
_delay_ms(5);

LCD_STROBE();
_delay_us(100);
LCD_STROBE();
_delay_ms(5);
LCD_D4_LO;
LCD_STROBE();
_delay_us(40);
lcd_write(0x28);
lcd_write(0x0C);
lcd_write(0x06);
lcd_write(0x01);
_delay_ms(10);
}
//==================================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRD&=~(1<<2); //INPUT
DDRD&=~(1<<3); //INPUT
PORTD|=(1<<2); //PULL UP INTERNAL AKTIF
PORTD|=(1<<3);
DDRC=255;
}
//==========================================program utama
int main()
{
_delay_ms(100);
init_devices();
init_lcd();
led=0;
for(;;)
{
lcd_goto(line1);
lcd_puts("hallo lcd");

lcd_goto(line2);
lcd_puts("lcd lcd ");

for(;;)
{
}
}
}
//=========================================================

ADC (ANALOG DIGITAL CONVERTER)


ADC (Analog to Digital Converter) adalah fitur paling populer dari ATmega 16. Dengan adanya fitur ini
kita tidak perlu menggunakan ADC0804 untuk membaca sinyal analog. ATmega16 memiliki 8 channel
input ADC. Hasil pembacaan ADC beresolusi maksimum 10 bit.
ADC (Analog to Digital Converter) adalah fitur paling populer dari ATmega 16. Dengan adanya fitur ini
kita tidak perlu menggunakan ADC0804 untuk membaca sinyal analog. ATmega16 memiliki 8 channel
input ADC. Hasil pembacaan ADC beresolusi maksimum 10 bit.
Register-Register yang mempengaruhi ADC:
Berikut adalah daftar register untuk menentukan setting ADC
Register ADMUX
Register ADMUX digunakan untuk menentukan tegangan referensi dari ADC menentukan format data
hasil konversi ADC menentukan channel ADC yg akan digunakan
Berikut isi dari register ADMUX
Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ADMUX
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial
Value 0 0 0 0 0 0 0 0

Bit 7 (REFS1) dan bit 6(REFS0) digunakan untuk menentukan tegangan referensi ADC.

Bit 5 (ADLAR) digunakan untuk menentukan format data hasil konversi.


Bit 3..0 (MUX3..0) digunakan untuk menentukan channel ADC
Register ADCSRA

Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial
Value 0 0 0 0 0 0 0 0

Bit 7 (ADEN) untuk mengaktifkan ADC. ADEN=0 disable / ADEN=1 enable


Bit 6 (ADSC) untuk memulai (start) pembacaan ADC.
Bit 5 (ADFR) jika ADFR=1 free running mode , ADFR=0 single conversion
Bit 4 (ADIF) bit penanda interupsi. Bernilai 1 saat konversi ADC selesai.
Bit 3 (ADIE) berfungsi untuk mengaktifkan interupsi ADC. ADIE=1 enable / ADIE=0 disable
Bit 2..0(ADPS2..0) menentukan clock ADC

Tabel 4 Prescaler Selection


Register ADCL dan ADCH
merupakan 2 register tempat menampung hasil pembacaan ADC
untuk mengambil nilai nya gunakan ADCW(mode 10 bit) dan ADCH (mode 8 bit)

Berikut listing fungsi baca adc


unsigned int getadc(unsigned char channeladc)
{
unsigned int adcVal;
ADMUX=channeladc|0x40; //avcc
ADCSRA|=(1<<ADEN);
ADCSRA|=(1<<ADSC);
loop_until_bit_is_clear(ADCSRA,ADSC);
adcVal = ADCW;
ADCSRA&=~(1<<ADEN);
return adcVal;
}

USART AVR
USART atau yang lebih dikenal dengan Universal Syncronous and Asyncronous Receiver Transmitter
sangat handal dan berguna dalam berbagai project yang berhubungan dengan interface PC, misalnya
program monitoring suhu ruangan menggunakan delphi, dan lain-lain.
USART dipisahkan menjadi 3 bagian yaitu clock generator, Transmit, dan Receive. Mari kita
bahas satu persatu:
1. Clock Generator Clock generator tergantung pada mode data transfer, terdapat empat mode
clock generator yang berbeda,yaitu:
 Normal asynchronous;
 Double speed asynchronous;
 Master synchronous;
 Slave synchronous.
Kebanyakan yang digunakan adalah asynchronous internal clock generator. Register Baud Rate
(UBBR) digunakan dimana nilai yang diberikan untuk down counter. Setiap kali nilai down-
counter mendekati nol, maka sebuah clock dibangkitkan. Kamu dapat menghitung berapa nilai
UBRR yang akan kamu tulis tergantung dari baudrate yang kamu inginkan dan kecepatan dari
MCU clock. Nilai UBBR dapat dihitung menggunakan formula:
BAUD = fck/(16(UBBR+1)). Formula ini digunakan untuk Asynchronous normal mode jika
menggunakan mode double speed maka formula yang digunakan adalah BAUD =
fck/(8(UBBR+1)). Untuk lebih jelasnya mengenai double speed bias dilihat sendiridi datasheet
AVRMisalkan digunakan kecepatan MCU = 8 MHz dan baudrate yang diinginkan 9600, setelah
dihitung menggunakan rumus diatas diperoleh nilai UBBR = 51.083333333, kita bulatkan
UBBR = 51. Dengan nilai UBBR =51, maka nilai aktual boudrate adalah 9615, jika dibagi
dengan 9600 diperoleh 1.0016 dan karena itu errornya adalah 0.16 %. Dengan error tersebut
USART masih dapat bekerja tetapi tidak sempurna. Oleh karena itu biasanya digunakan kristal
7.3728 MHz sehingga akan memberikan nilai UBBR = 47 dan no error. Table yang
menunnukkan variasi clock/baud dapat kamu temukan di datasheet AVR. Untuk mode
Synchronous dan clock external melalui pin XCK dapat dilihat di datasheet
2. USART Transmission
USART dapat melakukan transmit data dengan memberikan logika satu di bit TXEN ayng
terdapat dalam register UCSRB. Operasi normal port akan diabaikan oleh USART. Ketika
transmit sudah diaktifkan maka pin yang bersangkutan yaitu pinD1 tidak bisa digunakan dalam
mode normal. Adapun program pada WinAVR yang menangani USART transmit sebagai
berikut:
void USART_SendByte(uint8_t Data)
{
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
UDR = Data;
}
3. USART Reception
USART Receiver dapat diaktifkan dengan memberikan logika satu pada bit RXEN yang terdapat
dalam register UCSRB. Ketika USART receiver diaktifkan maka pin yang bersangkutan tidak
bisa dioperasikan sebagai normal mode, pin yang dimaksud adalah pinD0. Berikut ini program
WinAVR yang menangani USART Receive:
uint8_t USART_vReceiveByte()
{
// Wait until a byte has been received
while((UCSRA&(1<<RXC)) == 0) ;
// Return received data
return UDR;
}

Sebelum melakukan transfer data, maka ada beberapa hal yang perlu dipersiapkan yaitu baud
rate, mode operasi dan format frame data yang akan dikirim. Antara receiver dan transmitter
harus mempunyai setting yang sama. Data frame dari USART biasnya dimulai dengan bit
START lalu di ikuti dengan data mulai dari 5 data sampai 9 data dan diakhiri dengan bit STOP
bisa 1 atau 2 bit. Diantara data dan bit STOP biasanya ditambahkan parity sebanyak 1 bit. Parity
berfungsi sebagai error cek dengan pilihan no parity, even, or odd parity. Berikut ini diberikan
contoh program init USART, dan subrutin kirim serial:
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
//==============================================
void initserial( unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

void uart_putc(unsigned char c)


{
while(!(UCSRA & (1 << UDRE)));
UDR = c;
}

void uart_puts(const char *s)


{
register char c;

while ( (c = *s++) ) {
uart_putc(c);
}
}

void enter()
{
uart_putc(13);
uart_putc(10);
}

INTERRUPT

Sebuah Mikrokontroller tanpa dilengkapi dengan fasilitas interrupt dapat dikatakan


mikrokontroller tersebut kurang berharga. Interrupt akan menghentikan sementara eksekusi dari
jalannya program yang normal. Apabila terjadi interrupt, maka eksekusi program akan menuju
ke program interrupt, setelah selesai maka eksekusi program akan kembali ke program semula.
Interupt sangat dibutuhkan dalam permrograman karena dengan interrupt kita dapat mengontrol
suatu kejadian di luar system. Tanpa interrupt kita dapat mengecek suatu kondisi menggunakan
looping, teknik ini dinamakan polling. Tapi polling memiliki beberapa kekurangan diantaranya
kita tidak bisa melakukan pekerjaan lain selama kita melakukan pengecekan ataupun jika
dimungkinkan pgrogram akan sangat panjang.
Jika terjadi suatu interrupt, maka eksekusi program akan menuju ke program interrupt yang
ditunjukkan dengan vector interrupt. Setiap mikrokontroller meiliki beberapa fasilitas interrupt
sehingga tiap-tiap interrupt memiliki vector interrupt yang berbeda-beda. Vector interrupt
merupakan alamat dimana program interrupt harus ditempatkan agar dapat dieksekusi dengan
benar. Umumnya alamat antar vector interuput hanya berjarak 1 byte sehingga apabila program
interrupt yang dibuat sangat panjang akan mengganggu vector intruupt yang lain. Untuk
mengatasi hal tersebut dalam pembuatan program akan dilompatkan ke label dimana program
interrupt tersebut disediakan. Pada mikrokontroller ATMega16 jenis-jenis interrupt beserta
alamat vector interrupt dapat dilihat di datasheet ATMega16.
Alamat vector reset dan vector interrupt dapat dirubah-rubah sesuai dengan keinginan kita
dengan cara mengubah BOOTRTS dan IVSEL. BOOTRST dapat dirubah melalui program
downloader yang digunakan. Kalau menggunakan PonyProg2000 dapat melalui sekuriti
konfigurasi.Sedangkan untuk mengkonfigurasi IVSEL dapat dilakukan pada regiser GICR.
Adapun keterangan dari dua bit GICR adalah sebagai berikut:

BIT 1 – IVSEL (Interrupt Vector Select)


Ketika di set nol, interrupt vector akan ditempatkan di awal Flash memory. Jika di set satu,
interrupt vector akan dipindahkan di awal Boot Loader dari flash. Alamat dari Boot Flash dapat
ditentukan dari BOOTSZ Fuses. Konfigurasi dari BOOTSZ dapat dilihat dalam tabel dibawah ini

BIT 0 – IVCE ( Interrupt Vector Enable)


Bit ini harus di set satu agar perubahan pada IVSEL dapat diaktivkan. IVCE akan di nolkan oleh
hardware untuk 4 cycle setelah IVSEL di tulis. Setting IVCE akan menonaktifkan interrupt.

Ketika power off atau reset maka program akan menuju ke alamat $000 untuk menjalankan
program reset.
Pada bahasa C program akan menuju ke fungsi main(). Pada C untuk dapat mengakses interrupt
diperlukan sebuah library interrupt.h adapun penuisannya sebagai berikut :
#include <avr/interrupt.h>
Semua program interrupt dapat dideskripsikan menggunakan macro command ISR(), seperti
ISR(INT0_vect)
{
//program yang akan ditulis
}

EEPROM INTERNAL
Mikrokontroller jenis AVR mempunyai fitur EEPROM (Electronically Erasable Read Only
Memory) dengan kapasitas yang berbeda-beda tergantung dari jenis mikrokontrollernya.
ATMega16 memiliki EEPROM internal dengan kapasitas 512 Byte. Memory jenis ini
mengijinkan para pengguna untuk menyimpan parameter program, konstanta, data string dan
lain-lain. EEPROM merupakan memori dari jenis ROM yang mempunyai kemampuan baca-tuis
dan apabila catu daya tidak ada, data mesih tersimpan di dalam memori, data tidak akan hilang.
Hal ini akan berbeda dengan memori dari jenis RAM.

Untuk mengakses EEPROM terlebih dahulu harus mengetahui register-register EEPROM, yakni:
EEAR – EEPROM Address Register, EEDR – EEPROM Data Register, dan EECR – EEPROM
Control Register.
- EEAR adalah register yang berfungsi menyimpan alamat EEPROM yang akan diakses.
- EEDR adalah register yang berfungsi menyimpan data yang akan ditulis ke EEPROM dan data
yang dibaca dari EEPROM.
- EECR adalah register yang berfungsi untuk mengontrol sinyal-sinyal kontrol untuk proses
akses EEPROM.

Proses menulis data ke EEPROM memerlukan langkah-langkah berikut ini:


1. tunggu bit EEWE=0
2. Letakkan alamat EEPROM yang dituju dalam register EEAR
3. Letakkan data dalam register EEDR
4. Set bit EEMWE
5. Set bit EEWE

Demikian juga halnya dengan proses membaca data dari EEPROM, berikut langkah-langkahnya:
1. tunggu bit EEWE=0
2. Letakkan alamat EEPROM yang akan diakses dalam register EEAR
3. Set bit EERE
4. Baca data dari EEDR dan simpan di register
Berikut subrutin tulis ke eeprom internal, dan fungsi baca dari eeprom internal
//==================================================
//baca tulis eeprom internal
//==================================================
//=========================================================
void writeeeprom(unsigned int alamat, unsigned char datana)
{
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EEDR = datana;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
unsigned char readeeprom(unsigned int alamat)
{
unsigned char dataeeprom;
loop_until_bit_is_clear(EECR,EEWE);
EEAR = alamat;
EECR |= (1<<EERE);
dataeeprom=EEDR;
return dataeeprom;
}

WATCHDOG
Pewaktu watchdog merupakan piranti pewaktuan perangkat keras yang bisa memicu reset
sistem pada saat program utama, karena ada beberapa keasalahan, seperti hang, mengabaikan
layanan rutin ke watchdog (biasanya seperti pemberian pulsa secara rutin), atau gampangannya
kalo Anda punya anjing atau kucing kemudian lupa memberikan makan, apa yang terjadi? Ya
jegog atau ngeong khan?? Dalam hal ini, saat jegog atau ngeong, pewaktu watchdog akan
mereset sistem. Intinya, mengembalikan sistem ke awal mula (kondisi normal) karena telah
terjadi kesalahan atau hang tadi…,Pada C untuk dapat mengakses WATCHDOG diperlukan
sebuah library #include "avr/wdt.h"
Untuk mengaktifkan WDT, pengguna harus menuliskan lama waktu watchdog ke subrutin missal
kita mau memilih watchdog dengan waktu 2.1 detik maka. Niilai yang harus di isikan adalah 7,
bisa dilihat di table dibawah ini :
#define WDTO_2S 7
wdt_enable(WDTO_2S);

Saat Watchdog diaktifkan, nilainya akan selalu dinaikkan setiap siklus mesin selama osliator
juga bekerja. Timeout pada Watchdog bergantung pada frekuensi kristal atau detak yang
digunakan. Tidak ada jalan lain untuk menonaktifkan Watchdog kecuali melalui RESET (baik
reset secara perangkat keras atau reset karena WDT melimpah atau overflow). Pada saat WDT
melimpah, maka akan menghasilkan luaran pulsa RESET HIGH pada pin RST.
Berikut perintah untuk mereset watchdog
wdt_reset();

RTC DS 1307
RTC yang kita bahas kali ini adalah RTC dengan antarmuka I2C, yaitu DS1307. fitur dari
DS1307:
 Real-time clock (RTC) meyimpan data-data detik, menit, jam, tanggal, bulan, hari dalam
seminggu, dan tahun valid hingga 2100;
 56-byte, battery-backed, RAM nonvolatile (NV) RAM untuk penyimpanan;
 Antarmuka serial Two-wire (I2C)
 Sinyal luaran gelombang-kotak terprogram (Programmable squarewave);
 Deteksi otomatis kegagalan-daya (power-fail) dan rangkaian switch;
 Konsumsi daya kurang dari 500nA menggunakn mode baterei cadangan dengan
operasional osilator;
 Tersedia fitur industri dengan ketahana suhu: -40°C hingga +85°C
 Tersedia dalam kemasa 8-pin DIP atau SOIC
Sedangkan daftar pin DS1307:
 VCC - Primary Power Supply
 X1, X2 - 32.768kHz Crystal Connection
 VBAT - +3V Battery Input
 GND - Ground
 SDA - Serial Data
 SCL - Serial Clock
 SQW/OUT - Square Wave/Output Driver
Gambar diagram PIN:

SUBRUTIN UNTUK MEMBACA RTC


void gettimertc()
{
i2c_start();
i2c_transmit_byte(0xd0);
i2c_transmit_byte(0);
i2c_start();
i2c_transmit_byte(0xd1);
second=i2c_receive_byte(ACK);
minute=i2c_receive_byte(ACK);
hour=i2c_receive_byte(ACK);
day=i2c_receive_byte(ACK);
date=i2c_receive_byte(ACK);
month=i2c_receive_byte(ACK);
year=i2c_receive_byte(NO_ACK);
i2c_stop();
_delay_ms(10);
bcdtodecrtc();
}

EEPROM EXTERNAL I2C 24C64


EEPROM at24c64 merupakan eeprom dengan antarmuka i2c yang mempunyai kapasitas 8
kbyte. Eeprom ini cukup banyak dipasaran.
Berikut subrutin tulis dan fungsi baca eeprom at24c64.
//===================================================================
//akses eeprom
//===================================================================
void i2c_eeprom_write(unsigned int alamat, unsigned char dataeeprom)
{
i2c_start();
i2c_transmit_byte(0xa0);
i2c_transmit_byte(alamat>>8);
i2c_transmit_byte(alamat);
i2c_transmit_byte(dataeeprom);
i2c_stop();
_delay_ms(10);
}
unsigned char i2c_eeprom_read(unsigned int alamat)
{
unsigned char dataeeprom;
i2c_start();
i2c_transmit_byte(0xa0);
i2c_transmit_byte(alamat>>8);
i2c_transmit_byte(alamat);
i2c_start();
i2c_transmit_byte(0xa1);
dataeeprom=i2c_receive_byte(NO_ACK);
i2c_stop();
return dataeeprom;
_delay_ms(10);
}
BROWN OUT DETECTOR
Jika tegangan kurang dari yg diperlukan mikro, memang mikro akan salah menjalankan program.
Salah ini bisa berupa mengendalikan port2 yg salah, salah data komunikasi dan juga dapat
mengganti data pada EEPROM. Parahnya lagi kesalahan itu random!!! tdk bisa ditanggulangi
dgn program. HAL INI SANGAT BERBAHAYA JIKA MENYANGKUT SISTEM YG
SENSITIF. Solusinya adalah dengan menggunakan Brown-out Detection(BOD). Kalau pada
mikro klan MCS51sepertinya kita harus membuat rangkaian BOD sendiri di luar mikro, kalo
mikro klan AVR sudah menyediakan BOD on-chip. Cara kerja BOD adalah; mikro akan berhenti
bekerja jika tegangan sumber melewati batas bawah tegangan BOD (VBOD-) dan akan bekerja
lagi(dianggap reset) jika tegangan telah melebihi batas atas tegangan BOD (VBOD+). selisih
VBOD- dan VBOD+ disebut tegangan histerisis (VHYST). Dengan adanya fasilitas BOD ngak
ada lagi mikro yg ngawur…..
Lalu bagaimana menggunakannya?
Contoh: ATmega16
Kita tinggal mengaktifkan fuse BODEN, maka BOD akan bekerja dengan VBOD- = 3.7V dan
VBOD+ = 4.5V. Artinya jika VCC kurang dari 4.5V, mikro tdk bekerja. Jika di atas 4.5V, mikro
akan mulai bekerja. Setelah bekerja jika VCC turun di bawah 3.7V, mikro akan berhenti bekerja.
Untuk dapat bekerja kembali tegangan VCC harus di atas 4.5V. Jika terpenuhi maka mikro akan
bekerja kembali dari awal program, bukan melanjutkan program sebelumnya pada waktu
tegangan turun. Satu lagi fuse yg berhubungan dengan BOD yaitu BODLEVEL.

Referensi yang berhubungan dengan mikroprosessor & Interface :


1. http://www.hobbyprojects.com/
2. http://rosesana.indonetwork.co.id/500356/robotics-sg5-ut-robotic-arm-full-kit.htm
3. http://www.discovercircuits.com/
4. http://www.pjrc.com/tech/8051/
5. http://www.ziddu.com/download/8464711/BTCRC2Audio_C51.zip.html
6. http://www.ikalogic.com/
7. http://www.toko-elektronika.com/
8. http://www.cytron.com.my/
9. http://www.atmel.com/
10. http://www.avrprojects.net
11. http://www.ziddu.com/download/8068263/IklanSpecialReportPengeringTangan.pdf.html
12. http://www.kaskus.us/showthread.php?t=2522198
13. http://yusisukmalia.wordpress.com/2009/12/05/belajar-bareng-mikrokontroler-avr-sama-
akang-dhani/
14. www.mechatron80.blogspot.com
15. www.belajarmikro.com
16. indorobotika.wordpress.com
17. www.active-robots.com
18. www.mikron123.com
19. www.digi-ware.com
20. mikrokontroler.sekoteng.com
21. www.electronicsteacher.com
22. www.national.com
23. www.hobbyengineering.com
24. http://www.forumsains.com
25. www.freebookspot.in
26. www.electroniclab.com
27. www.microcontroller.com
28. www.mytutorialcafe.com
29. agfi.staff.ugm.ac.id
30. www.Atmel.Com
31. www.ee.surrey.ac.uk
32. www.epanorama.net
33. www.Robotstore.Com
34. www.STTS.Com
35. www.atmel
36. www.cognotics.com
37. www.wavecom.com
38. www.parallax.com
39. www.mcselec.com
40. www.ti.com
41. www.national.com
42. www.maxim-ic.com
43. www.beyondlogic.com
44. www.hpinfotech.ro
45. delta-electronic.com
46. http://bittronix.blogspot.com/2010/02/circuit-cellar-februari-2010.html
47. visualbasic.about.com
48. http://www.gardnerswebsite.com/internetclock/index.htm
49. www.circuitcellar.com
50. www.digi-ware.com
51. oporek.com
52. archive.computerhistory.org
53. http://yusisukmalia.wordpress.com/2010/01/07/pentingnya-bodbrown-out-detection/
54. www.mitov.com
55. openavr.org
56. www.tanu-sha.narod.ru
57. obdev.at
58. mirley.firlej.org
59. sdcc.sourceforge.net
60. www.keil.com
61. www.8052.com
62. http://hanundany.wordpress.com
63. http://www.avrku.com/
64. http://www.facebook.com/?tid=10150103545641835&sk=messages#!/group.php?gid=90
699213608
65. http://www.facebook.com/?tid=10150103545641835&sk=messages#!/group.php?gid=52
798984019
66. www.robot-elektronics.co.uk
67. Arianto Widyatmo, Haryono Eduard & Fendy, Belajar Mikroprosesor – Mikrokontroller
Melalui Komputer PC, PT Elexmedia Komputindo, Jakarta.
68. Atmel, AT89C51 Refference manual
69. D. sharon, J. harstein dan G. Yantian, Robot Dan otomasi Industri, PT Elexmedia
Komputindo, Jakarta, Indonesia.
70. Moh. Ibnu Malik & Anistardi, Berexperimen Dengan Mikrokontroller 8031, PT
Elexmedia Komputindo, Jakarta.
71. Peter Abel , IBM PC Assembly Language And Programming, Prentice Hall International,
USA.
72. Rizal Rizkiawan, Tutorial Perancangan Harware Jilid 1, PT Elexmedia Komputindo,
Jakarta.
73. Rizal Rizkiawan, Tutorial Perancangan Harware Jilid 2, PT Elexmedia Komputindo,
Jakarta.
74. Rizal Rizkiawan, Tutorial Perancangan Harware Jilid 3, PT Elexmedia Komputindo,
Jakarta.
75. Budiharto, 10 Projeck Robot Spektakuler, Elex Media Komputiondo, 208
76. Budiharto,Widodo, Robotika, Teori dan Implementasi, Andi Offset, Yogyakarta, 2009.
77. Budiharto, Widodo, 12 Proyek Sistem akusisi Data, Elex Media Komputindo, 2007.
78. Budiharto, Widodo, 12 Proyek Mikrokontroler untuk pemula, Elex Media Komputindo,
2007.
79. Budiharto, Widodo, Panduan Praktikum Mikrokontroler AVR ATmega -16, Elex Media
Komputindo, 2006.
80. Achmad, Balza. "Diktat Penerapan Mikroposesor". Yogyakarta: Jurusan Teknik Fisika,
Universitas Gadjah Mada. 2004
81. Sudjadi, "Teori dan Aplikasi Mikrokontroler",Graha Ilmu Jogyakarta.
82. Ruwano, Nino Guevara. "Berkarya Dengan Mikrokontroler AT89C2051". Jakarta: PT.
Elex Media Komputindo. 2006
83. Handbook of Mikrokontroller 8 bit & 6 bit,intel Corporation.