http://klikdisini.com/embedded
oleh
Agfianto Eko Putra (agfi68@gmail.com) dan Dhani Nugraha (dhan_t46@yahoo.com)
2011
Daftar Isi
1. Apakah Mikrokontroler itu? ...................................................................................................... 4
2. Pengetahuan Dasar Mikrokontroler AVR .................................................................................. 7
2.1. Pendahuluan ....................................................................................................................... 7
2.2. Memilih AVR “yang benar” ............................................................................................... 8
2.3. Ada apa dengan Mikrokontroler AVR ATMega16? ............................................................ 9
2.3.1. Ringkasan Fitur-fitur Mikrokontroler AVR ATMega16 ............................................... 9
2.3.2. Diagram Pin dan Diagram Blok Mikrokontroler AVR ATMega16 ............................. 10
2.3.3. Penjelasan Singkat Pin-pin pada Mikrokontroler AVR ATMega16 ............................ 11
3. Pengenalan Bahasa C untuk Mikrokontroler AVR ................................................................... 15
3.1. Struktur Penulisan Bahasa C ............................................................................................. 15
3.2. Tipe-tipe data dalam Bahasa C .......................................................................................... 15
3.3. Deklarasi Variabel dan Konstanta ..................................................................................... 15
3.4. Pernyataan ........................................................................................................................ 16
3.5. Fungsi ............................................................................................................................... 16
3.6. Pernyataan berkondisi dan Pengulangan............................................................................ 16
3.7. Operasi Logika dan Bilangan Biner .................................................................................. 17
3.8. Operasi Aritmetika............................................................................................................ 17
3.9. Pengulangan Terus-menerus atau Infinite Looping ............................................................ 18
4. Menggunakan AVR Studio 4 dengan WinAVR GCC .............................................................. 20
5. Masukan/Luaran (I/O) pada Mikrokontroler AVR ................................................................... 25
5.1. Register DDRx ................................................................................................................. 25
5.2. Register PORTx................................................................................................................ 25
5.3. Register PINx ................................................................................................................... 26
5.4. Percobaan-1: LED berkedip-kedip .................................................................................... 27
5.5. Percobaan-2: Membunyikan buzzer! ................................................................................. 29
5.6. Percobaan-3: Aplikasi Pushbutton untuk ON/OFF LED.................................................... 30
6. Timer/Counter dan Watchdog pada Mikrokontroler AVR ....................................................... 32
6.1. Percobaan-4: Menggunakan Timer1 .................................................................................. 35
6.2. Percobaan-5: Menggunakan Timer2 .................................................................................. 37
6.3. Percobaan-6: Menggunakan Timer0 .................................................................................. 39
6.4. Percobaan-7: Lima Kali pencacahan – aplikasi Counter .................................................... 41
6.5. Tentang Watchdog ............................................................................................................ 42
6.6. Percobaan-8: Aplikasi Watchdog (Bagian-1) .................................................................... 43
6.7. Percobaan-9: Aplikasi Watchdog (Bagian-2) .................................................................... 44
7. Interupsi dan Aplikasinya ........................................................................................................ 46
7.1. Pendahuluan Interupsi Mikrokontroler AVR ..................................................................... 46
7.2. Percobaan-10: ON/OFF LED menggunakan Interupsi Timer0 .......................................... 47
7.3. Percobaan-11: ON/OFF LED melalui Interupsi Eksternal ................................................. 48
8. Komunikasi Serial ................................................................................................................... 49
Sama-sama memiliki unit pengolah pusat atau yang lebih dikenal dengan CPU (Central
Processing Unit);
CPU tersebut sama-sama menjalankan program dari suatu lokasi atau tempat, biasanya dari
ROM (Read Only Memory)1 atau RAM (Random Access Memory)2;
Sama-sama memiliki RAM yang digunakan untuk menyimpan data-data sementara atau yang
lebih dikenal dengan variabel-variabel;
Sama-sama memiliki beberapa luaran dan masukan (I/O) yang digunakan untuk melakukan
komunikasi timbal-balik dengan dunia luar, melalui sensor (masukan) dan aktuator (luaran),
perhatikan bagan yang ditunjukkan pada Gambar 1.
Lantas apa yang membedakan antara Mikrokontroler dengan Komputer atau Mikrokomputer? Begitu
mungkin pertanyaan yang ada di benak kita, saat kita membaca beberapa daftar kesamaan yang
sudah saya tuliskan tersebut. Sama sekali berbeda, itu jawaban yang saya berikan kepada Anda:
Mikrokontroler adalah versi mini dan untuk aplikasi khusus dari Mikrokomputer atau Komputer!
Berikut saya berikan kembali daftar kesamaan yang pernah kemukakan sebelumnya dengan
menekankan pada perbedaan antara Mikrokontroler dan Mikrokomputer:
CPU pada sebuah Komputer berada eksternal dalam suatu sistem, sampai saat ini kecepatan
operasionalnya sudah mencapai lebih dari 2,5 GHz, sedangkan CPU pada Mikrokontroler
berada didalam (internal) sebuah chip, kecepatan kerja atau operasionalnya masih cukup
rendah, dalam orde MHz (misalnya, 24 MHz, 40 MHz dan lain sebagainya). Kecepatan yang
relatif rendah ini sudah mencukupi untuk aplikasi-aplikasi berbasis mikrokontroler.
Jika CPU pada mikrokomputer menjalankan program dalam ROM atau yang lebih dikenal
dengan BIOS (Basic I/O System) pada saat awal dihidupkan, kemudian mengambil atau
menjalankan program yang tersimpan dalam hard disk. Sedangkan mikrokontroler sejak awal
menjalankan program yang tersimpan dalam ROM internal-nya (bisa berupa Mask ROM
atau Flash PEROM atau Flash ROM). Sifat memori program dalam mikrokontroler ini non-
volatile, artinya tetap akan tersimpan walaupun tidak diberi catu daya.
1
Memori yang hanya bisa dibaca saja.
2
Memori yang bisa dibaca juga bisa ditulisi.
Perhatikan Gambar 2, agar Anda mendapatkan gambaran tentang mikrokontroler lebih jelas.
ALU, Instruction Decoder, Accumulator dan Control Logic, sebagaimana ditunjukkan pada
Gambar 2, merupakan Otak-nya mikrokontroler yang bersangkutan. Jantungnya berasal dari detak
OSC (lihat pada Gambar 2 sebelah kiri atas). Sedangkan di sekeliling „Otak‟ terdapat berbagai
macam periferal seperti SFR (Special Function Register) yang bertugas menyimpan data-data
sementara selama proses berlangsung). Instruction Decoder bertugas menerjemahkan setiap
instruksi yang ada di dalam Program Memory (hasil dari pemrograman yang kita buat sebelumnya).
Hasil penerjemahan tersebut merupakan suatu operasi yang harus dikerjakan oleh ALU (Arithmetic
Logic Unit), mungkin dengan bantuan memori sementara Accumulator yang kemudian
menghasilkan sinyal-sinyal kontrol ke seluruh periferal yang terkait melalui Control Logic.
Memori RAM atau RAM Memory bisa digunakan sebagai tempat penyimpan sementara, sedangkan
SFR (Special Function Register) sebagian ada yang langsung berhubungan dengan I/O dari
mikrokontroler yang bersangkutan dan sebagian lain berhubungan dengan berbagai macam
operasional mikrokontroler.
Timer atau Counter digunakan sebagai pewaktu atau pencacah, sebagai pewaktu fungsinya seperti
sebuah jam digital dan bisa diatur cara kerjanya. Sedangkan pencacah lebih digunakan sebagai
penghitung atau pencacah event atau bisa juga digunakan untuk menghitung berapa jumlah pulsa
dalam satu detik dan lain sebagainya. Biasanya sebuah mikrokontroler bisa memiliki lebihd dari 1
timer.
EEPROM (sama seperti RAM hanya saja tetap akan menyimpan data walaupun tidak mendapatkan
sumber listrik/daya) dan port-port I/O untuk masukan/luaran, untuk melakukan komunikasi dengan
periferal eksternal mikrokontroler seperti sensor dan aktuator.
TinyAVR (tidak ada kaitannya ama mbak Tini yang jualan gudeg…)
Mikrokontroler (mungil, hanya 8 sampai 32 pin) serbaguna dengan Memori Flash untuk
menyimpan program hingga 16K Bytes, dilengkapi SRAM dan EEPROM 512 Bytes.
MegaAVR (nah yang ini sudah mulai banyak yang nulis bukunya…)
Mikrokontroler dengan unjuk-kerja tinggi, dilengkapi Pengali Perangkat keras (Hardware
Multiplier), mampu menyimpan program hingga 256 KBytes, dilengkapi EEPROM 4K Bytes
dan SRAM 8K Bytes.
AVR XMEGA
Mikrokontroler AVR 8/16-bit XMEGA memiliki periferal baru dan canggih dengan unjuk-
kerja, sistem Event dan DMA yang ditingkatkan, serta merupakan pengembangan keluarga
AVR untuk pasar low power dan high performance (daya rendah dan unjuk-kerja tinggi).
AVR32 UC3
Unjuk-kerja tinggi, mikrokontroler flash AVR32 32-bit daya rendah. Memiliki flash hingga
512 KByte dan SRAM 128 KByte.
AVR32 AP7
Unjuk-kerja tinggi, prosesor aplikasi AVR32 32-bit daya rendah, memiliki SRAM hingga 32
KByte.
Cuman yang populer di Indonesia adalah tinyAVR dan megaAVR, itupun masih kalah populer
dengan keluarga AT89 yang belakangan juga sudah mulai banyak yang beralih ke AVR.
Perbedaan jenis-jenis tersebut terletak dari fasilitas, atau lebih dikenal dengan fitur-fiturnya. Jenis
TinyAVR merupakan mikrokontroler dengan jumlah pin yang terbatas (sedikit maksudnya) dan
sekaligus fitur-fiturnya juga terbatas dibandingkan yang megaAVR. Semua mikrokontroler AVR
Beberapa mikrokontroler AVR memiliki SRAM, EEPROM, antarmuka SRAM eksternal, ADC,
pengali perangkat keras, UART, USART dan lain sebagainya. Bayangkan saja Anda punya
TinyAVR dan MegaAVR, kemudian telanjangi (maksudnya copotin) semua periferal-nya, nah Anda
akan memiliki AVR Core yang sama! Kayak membuang semua isi hamburger, maka Anda akan
mendapatkan rotinya doang yang sama…
Untuk lebih jelasnya perhatikan keterangan singkat yang saya berikan berikut ini, berdasar informasi
resmi dari Atmel (http://www.atmel.com) dan maaf masih dalam bahasa Inggris (supaya
kelihatannya aura kecanggihannya, he he he...).
tinyAVR
o Optimized for simple applications requiring a small microcontroller.
o Great performance for cost effective devices.
o Fully featured with 10-bit ADCs and high speed PWMs onboard.
o Self-Programming Flash memory for maximum flexibility.
o debugWIRE On-Chip Debug and In-System Programming.
megaAVR
o Self-Programming Flash memory with boot block.
o High accuracy 10-bit A/D converters with up to x200 analog gain stage.
o USART, SPI and TWI(1) compliant serial interfaces.
o IEEE 1149.1 compliant JTAG interface on megaAVRs with 44 pins or more.
o On-Chip Debug through JTAG or debugWIRE interface.
AVR XMEGA
o picoPower technology for ultra low power consumption
o True 1.6 volt operation and CPU speed up to 32 MHz.
o Event System and DMA Controller.
o High speed, high resolution 12-bit ADC and DAC.
o Crypto engine, Timers/Counters and fast communication interfaces.
o Accurate and flexible Clock System with dynamic clock switching.
AVR32 UC3
o High CPU performance.
o Low power consumption.
o High data throughput.
o Low system cost.
o High reliability.
o Easy to use.
AVR32 AP7
o High CPU perfromance.
o Low power consumption.
o SIMD / DSP instructions.
o Instruction & data caches.
o Memory management unit.
o Built for embedded Linux
Berikut ini saya ringkaskan berbagai macam fitur-fitur untuk Mikrokontroler AVR ATMega16 atau
Atmega16L (Mikrokontroler AVR 8-bit dengan Flash ISP 16kByte) langsung dari datasheet-nya,
maaf juga masih sebagian besar dalam Bahasa Inggris 3...
3
Jika Anda bingung dengan istilah-istilah pada fitur-fitur ini silahkan merujuk ke datasheet aslinya, sehingga fokus
pada buku ini tidak melulu pada datasheet...
Pada Gambar 4 dan 5 ditunjukkan diagram pin, masing-masing, untuk Mikrokontroler AVR
ATMega16 tipe PDIP dan TQFP/MLF atau dikenal sebagai SMD.
Pada Gambar 6 dan 7 ditunjukkan diagram blok untuk Mikrokontroler AVR ATMega16, perhatikan
begitu banyaknya fitur-fitur dalam diagram blok tersebut, sebagaimana juga sudah saya kutipkan
pada bagian sebelumnya.
Berikut kita jelaskan secara singkat fungsi dari masing-masing PIN pada Mikrokontroler AVR
ATMega16.
4
Resistor pull up internal berkaitan dengan rangkaian internal pada mikrokontroler AVR yang bersangkutan.
Pada Tabel 1, 2 dan 3 ditunjukkan masing-masing alternatif fungsi dari Port B, Port C dan Port D.
Dalam buku saya ini sengaja penjelasan dari masing-masing fungsi tersebut (kecuali antarmuka
JTAG) akan dibahas pada saat digunakan, sehingga Anda bisa memahami langsung dengan
mencoba, istilah kerennya “Learning by Doing”...
Keterangan:
Opsional artinya boleh ditulis boleh tidak, menyesuaikan kebutuhan – tuliskan pustaka apa
saja yang digunakan dan lain sebagainya
Penulisan variabel dilakukan di awal agar aman bisa digunakan sepanjang program, demikian
juga dengan deklarasi fungsi-fungsi yang terlibat
Silahkan ikuti (baca) terus tutorial ini untuk melihat contoh-contoh program di bagian lain
tutorial ini.
Contoh:
suhu=adc/255*100; //contoh rumus perhitungan suhu
3.5. Fungsi
Function atau fungsi adalah bagian program yang dapat dipanggil oleh program utama.
Penulisan :
[tipe data hasil] [nama function]([tipe data input 1],[tipe data input 2])
{
[pernyataan_1];
[pernyataan_2];
...
}
for : digunakan untuk pengulangan dengan jumlah yang sudah diketahui – berapa kali diulang.
for ( [nilai awal] ; [syarat] ; [operasi nilai] )
{
[statement1];
[statement2];
...
}
while: digunakan untuk pengulangan (looping) jika dan sealama memenuhi suatu kondisi masih
dipenuhi (pengulangan selama benar
while ( [persyaratan] )
{
[statement1];
[statement2];
...
}
do while: digunakan untuk pengulangan jika dan selama memenuhi syarat tertentu, namun min 1 kali
AND: &&
NOT: !
OR : ||
Biner
AND: &
OR : |
XOR : ^
Shift right: >>
Shift left : <<
a = 5 * 6 + 2 / 2 – 1 hasilnya 30
a *= 5 jika nilai awal a=30, maka hasilnya 150
a += 3 jika nilai awal a=30, maka hasilnya 33
a++ jika nilai awal a=5, maka hasilnya 6
a-- jika nilai awal a=5, maka hasilnya 4, dst
Yang perlu Anda ingat, bahwa kode-kode program yang dijalankan, dalam kaidah Bahasa C, adalah
yang ada di fungsi utama atau main, seperti contoh berikut...
void main()
{
// pernyataan-pernyataan program
}
Program akan dijalankan berurutan dari atas ke bawah dan program tersebut hanya akan dijalankan
sekali saja. Jika menggunakan infinite loop (ada yang mengatakan sebagai pengulangan tak-hingga
atau kalang tak-hingga, gak masalah, artinya sama saja kok), maka program yang ada di dalam
pengulangan tersebut akan dijalankan berulang-ulang terus-menerus, contoh...
void main()
{
// pernyataan-pernyataan program
while (1); // infinite loop
{
// pernyataan2
}
}
Mengapa terjadi Infinite Looping ?? Perhatikan pada contoh tersebut, pernyataan atau instruksi
while (1) menyatakan bahwa kondisi SELALU BENAR, sehingga selalu dilakukan pengulangan
terus-menerus! Coba bedakan dengan contoh berikut...
void main()
{
// pernyataan-pernyataan program
while (index<5); // infinite loop
{
// pernyataan2
Index += 1;
}
}
Untuk pertama kali, Anda harus melakukan instalasi AVR Studio 4 ini ke komputer anda, jika ingin
diintegrasikan dengan WinAVR GCC, lakukan instalasi WinAVR GCC terlebih dahulu sebelum
AVR Stdui 4.0. Cara menginstalnya pun mudah layaknya anda menginstal perangkat lunak komputer
yang lain. Gambar 8 adalah contoh tampilan utama dari AVR Studio 4.0 saat pertama kali Anda
jalankan.
Tampilan yang ditunjukkan pada Gambar 8 bukan merupakan tampilan utama dari AVR Studio 4,
melainkan kotak dialog wizard yang akan menuntun kita, khususnya, membuat program baru (lihat
pada tanda panah, bahwa dialog ini diaktifkan setiap kali AVR Studio 4 dijalankan, hilangkan tanda
centang jika Anda tidak ingin mengaktifkan kotak dialog ini di awal program).
Okey, sekarang kita klik New Project, sehingga akan ditampilkan pilihan dan isian-isian yang
ditunjukkan pada Gambar 9.
Perhatikan tanda panah di Gambar 9, lakukan pilihan bahasa apa yang akan Anda gunakan, apakah
Atmel AVR Assembler atau AVR GCC? Karena kita akan belajar pemrograman mikrokontroler
AVR menggunakan Bahasa C, maka dipilih AVR GCC.
5
http://www.atmel.com
6
Unduh WinAVR GCC di
7
Pengertian simulasi disini adalah simulasi dalam tingkat register bukan simulasi dengan piranti (device). Jika Anda
menginginkan simulasi dengan rangkain dan piranti, gunakan free software lainnya yaitu VMLAB yang bisa diunduh
di http://amctools.com/download.htm (versi terbaru saat ebook ini ditulis adalah v3.15)
Gambar 10. Halaman 2 kotak dialog wizard saat dipilih AVR GCC
Langkah selanjutnya adalah memilih mikrokontroler AVR yang digunakan, perhatikan tanda panah
pada Gambar 11, dan akhiri dengan klik Finish. Sehingga ditampilkan jendela utama dari AVR
Studio 4, sebagaimana ditunjukkan pada Gambar 12, dengan editor (perhatikan tanda panah pada
Gambar 12) siap digunakan untuk mengetikkan program Anda.
Okey, misalnya sekarang kita ketikkan program berikut, ketik saja dulu, ntar kita terangkan atau
berikan penjelasan tentang program ini di halaman-halaman berikutnya...
// program LED01.C
// menghidupkan lampu LED pada PORTB
//===========================================
void init_devices()
{
DDRB=255;
}
//==========================================program utama
int main()
{
init_devices();
led=255;
}
//===========================================
Simpan berkas (program) Anda dengan Ctrl+S atau pilih menu File Save. Kemudian lakukan
kompilasi (tekan F7), jika tidak ada kesalahan akan ditampilkan laporan seperti contoh berikut...
Wow! Anda sudah berhasil membuat program mikrokontroler AVR Anda yang pertama, selamat ya!
Luar biasa!
Okey, sampai disini pendahuluan AVR Studio 4-nya, sekarang kita mulai bahas konsep
pemrogramannya, antara lain:
8
Untuk urusan mendownload program (HEX) ke mikrokontroler silahkan merujuk ke artikel saya yang terkait di ??, dan
ikuti diskusi-nya.
Kali ini kita akan membahas tentang hal dasar berkaitan dengan konsep I/O atau masukan/luaran
pada mikrokontroler AVR:
Membaca tingkat tegangan masukan, apakah berlogika 0 (tegangan disekitar 0 volt) atau 1 (tegangan
sekitar 5 volt maksimal);
Mengeluarkan tingkat tegangan 0 (sekitar 0 volt) atau 1 (sekitar 5 volt);
Untuk keperlua tersebut, AVR memiliki beberapa register yang terkait, yaitu DDRx, PORTx dan
PINx9, berikut penjelasan masing-masing...
Berikan logika 1 (satu) pada bit yang terkait agar dijadikan sebagai luaran atau output.
Berikan logika 0 (nol) pada bit yang terkait agar dijadikan sebagai masukan atau input.
Misal PORTA semua bit akan digunakan sebagai masukan, maka untuk mengaturnya kita gunakan
perintah...
Misalnya lagi, PORTA.0 akan dijadikan masukan sedangkan PORTA.2 sampai PORTA.7 akan
digunakan sebagai luaran, maka perintahnya...
DDRA= 0xFE;
Perhatikan 0xFE (heksa) = 0b11111110 (biner), perhatikan baik-baik konversi biner ini, setiap bit
nilai biner mewakili Pin-Pin pada PortA.
9
Tanda „x‟ diganti dengan A, B, C atau D menyesuaikan dengan pin masukan/luaran yang digunakan.
Penjelasan: Jika PIN.1 dihubungkan ke VCC (tegangan 5 Volt) melalui resistor (R), maka inilah
yang di maksud dengan pullup. Saat tidak ada tegangan dari luar, PIN.1 akan cenderung
berkondisi HIGH (logika 1). Sedangkan PIN.2 dibiarkan begitu saja sehingga kondisi logik dari
PIN.2 begitu rentan terhadap pengaruh disekitarnya. PIN.2 bisa berlogika HIGH, bisa juga
berlogika LOW, ini artinya logika PIN.2 mengambang (floating).
Kondisi floating biasanya diperlukan saat PIN sebuah mikrokontroler dihubungkan ke suatu sensor.
Karena jika di pullup, dikhawatirkan kondisi logik PIN tersebut mengganggu kondisi logik pin-pin
sensor yang bersangkutan.
DDRA=0x00;
PORTA = 0xFF;
Ini berarti seluruh pin-pin pada PORTA dijadikan sebagai masukan dan di-pullup, artinya pada
rangkaian yang terkait, jika menggunakan tombol atau pushbutton, jika tidak ditekan akan terbaca
HIGH dan jika ditekan akan terbaca LOW. Gunakan contoh rangkaian pada Gambar 15 dan
perhatikan tanda panah, pushbutton satu ujung dihubungkan ke pin yang terkait sedangkan ujung
lainnya di-GND-kan. INGAT! Ini bukan satu-satu-nya cara membuat rangkaian masukan dengan
pushbutton, tetapi ini cara yang mudah dan murah meriah... he he he...
Contoh lainnya...
DDRB= 0x00;
PORTB=0x0F;
Ini artinya seluruh pin-pin PORTB dijadikan masukan, dengan konfigurasi 0x0F (0b00001111) atau
PORTB.0 sampai PORTB.3 di-pullup, sedangkan PORTB.4 sampai PORTB.7 dikonfigurasi
floating.
10
Gambar AVR Trainer v2.0 selengkapnya ada di cover dari ebook ini!
Penjelasan:
Penjelasan:
11
Silahkan membaca artikel saya yang menjelaskan tentang masalah sistem clock pada mikrokontroler AVR di
http://agfi.staff.ugm.ac.id/blog/index.php/2009/12/mengenal-system-clock-pada-mikrokontroler-avr/
Penjelasan:
Baris 1 - 4 sudah jelas khan? Belum? Ya monggo, silahkan lihat dulu atau baca lagi penjelasan dari
percobaan-percobaan sebelumnya, jika sudah paham silahkan kembali lagi kesini...
Baris 6 – 8 digunakan untuk mendeklarasikan 3 macam alias, yaitu „tombol‟, „satu‟ dan „dua‟. Jika
Anda perhatikan, khusus tombol didefinisikan sebagai register PIND, sebagaimana janji saya
sebelumnya register PINx saya jelaskan disini, yaitu digunakan untuk membaca masukan. Artinya
untuk memberikan luaran melalui register PORTx sedangkan untuk membaca masukan gunakan
register PINx;
Perhatikan sekarang pada rutin init_devices() yang berbeda dengan sebelumnya (baris 11 – 18):
o DDRB=255 sama seperti sebelumnya, PORTB semuanya dijadikan sebaga saluran luaran;
Mudah bukan?
12
Jika ditekan bernilai logika „0‟.
Jika sumber sinyal pemicu atau clock berasal dari internal maka Timer/Counter berfungsi sebagai
pewaktu atau timer dan jika sumber sinyal berasal dari luar maka disebut sebagai pencacah atau
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 pewaktu yang bisa mencacah atau menghitung hingga maksimal nilai
0xFF heksa (dalam biner = 11111111).
Timer 16-bit sama seperti timer 8-bit, hanya saja nilai maksimalnya mencapai 0xFFFF.
Pada ebook ini akan dibahas mengenai Timer1, 16-bit, dan untuk dapat menjalankan atau
menggunakan Timer1 ini, maka kita harus mempelajari terlebih dulu register-register yang berkaitan
dengan Timer1 karena di register itulah tempat pengaturan Timer/Counter1 agar bisa bekerja.
Pada Gambar 19 ditunjukkan diagram blok dari Timer1 16-bit, terlihat adanya beberapa register yang
terkait, antara lain (dari atas): TCNT1, OCR1A, OCR1B, ICR1, TCCR1A, TCCR1B dan juga
beberapa bit-bit terkait seperti: TOV1, OC1A, OC1B dan ICF1.
TCCR1B
TCNT1
TIMSK
TIFR
Register TCCR1B, ditunjukkan pada Gambar 20, merupakan tempat pengaturan clock yang intinya
agar Timer/Counter1 bisa bekerja, maka register TCCR1B ini jangan sampai diisi dengan 0x00
(dikosongkan).
Kok tidak boleh berisi 0x00 atau semua bit pada TCCR1B nol semua? Coba perhatikan Tabel 4.
Sumber clock bisa berasal dari internal mulai dari prescaler 1 hingga 1024 atau bisa juga dari sumber
eksternal, semua bisa diatur sesuai atau mengikuti aturan pada Tabel 4.
Apa nilai praskalar itu? Timer1 (juga timer/counter lainnya) membutuhkan sumber detak atau
clock source. Biasanya sumber detak yang biasa kita pakai berasal dari XTAL. Besarnya maksimum
sama dengan XTAL yang digunakan dan minimum XTAL/1024. Nah nilai pembagi atau 1024 ini-
lah yang disebur nilai praskalar atau prescaler.
Apa yang terjadi jika semua bit di TCCR1B nol semua? Artinya bit 0, 1 dan 2 juga nol semua,
perhatikan Gambar 19, itu artinya CS12=0, CS11=0 dan CS10=0 dan itu menurut Tabel 4 “No clock
source (Timer/Counter stopped)” Timer berhenti bekerja! Atau tidak bekerja!!
Tiga bit (CS12, CS11 dan CS10) ini dulu yang kita perhatikan...
Overflow (melimpah) terjadi saat kondisi dari 0xFFFF ke 0x0000, sehingga mengakibatkan bit
TOV1 pada register TIFR akan di-set (diberi logika 1). Kondisi overflow juga bisa digunakan untuk
menjalankan interrupsi.
Register TIMSK, yang ditunjukkan pada Gambar 21, merupakan register tempat pengaturan
interupsi overflow dari Timer/Counter1 yang ingin diaktifkan atau tidak. Dengan memberikan logika
1 pada bit TOIE1 (bit-2 pada TIMSK), maka interupsi Timer/Counter1 aktif dengan catatan bit
interupsi global diaktifkan (bit-7 di register Status SREG, perhatikan Gambar 22).
13
Hanya saya tuliskan yang terkait saja, selengkapnya silahkan merujuk datasheet ATMega16.
Persamaan untuk mencari waktu jeda yang ingin digunakan adalah berdasarkan nilai awal yang harus
dimasukkan ke dalam TCNT1, gunakan persamaan berikut:
Alternatif lain, Anda bisa menggunakan programnya AVR Timer yang bisa diunduh melalui website
http://www.techideas.co.nz. Langkah-langkah penggunakan program ini kita jelaskan berikut:
1. Setelah mengunduh program AVR Timer dari http://www.techideas.co.nz, langkah selanjutnya adalah
menjalankan AVRTimer1Clac.exe untuk perhitungan atau kalkulasi Timer1;
2. Lakukan pengisian beberapa nilai sebagaimana ditunjukkan pada Gambar 23, menyesuaikan dengan
kebutuhan yang telah kita tetapkan tadi:
a. Frekuensi kristal: 11,0592MHz atau ditulis 11.059.200 Hz;
b. Pilih nilai prescale sebesar 1024;
Listing programnya...
Program ini pada dasarnya sama seperti percobaan-1, hanya saja sekarang tundaan atau jeda
menggunakan fasiltas Timer1 yang ada di ATMega16;
Cukup saya jelaskan saja subrutin delay1detik(), yang lainnya sama seperti penjelasan percobaan-
percobaan sebelumnya:
o Baris-15 merupakan pengisian register TCCR1B agar digunakan nilai prescale sebesar 1024,
artinya nilai kristal 11,0592MHz dibagi dengan 1024, sekaligus mengaktifkan Timer1;
o Baris-16 memberikan nilai awal pada TCNT1 sesuai dengan perhitungan atau kalkulasi yang
telah dilakukan sebelumnya, yaitu mengisi dengan nilai awal 54.736 (desimal) atau 0xD5D0
(heksadesimal);
o Baris-17 menunggu hingga terjadi overflow – ini merupakan proses pooling bukan interupsi;
o Jika sudah terjadi overflow atau melimpah, maka flag TOV1 di-reset (baris 18) dan Timer1
dimatikan (baris 19).
Gampang tho!?
// program TIMER02.C
// ON dan OFF LED pada PORTB menggunakan Timer2
// By Agfianto Eko Putra, 2010
void delay1detik()
{
unsigned char ulang;
for(ulang=0; ulang<100; ulang++)
{
delay10ms();
}
}
int main()
{
init_devices();
for(;;)
{
led=255;
delay1detik();
led=0;
delay1detik();
}
}
Percobaan-5 ini sebenarnya juga mirip/sama dengan percobaan-4 (sebelumnya), hanya saja digunakan
fasilitas Timer2 untuk melakukan penundaan 1 detik;
Anda perhatikan pada 12 hingga 28:
o Terdapat ....14 subrutin yaitu delay10ms() dan ........................15;
o Mengapa kok tidak langsung dilakukan tundaan 1 detik? Mengapa harus melakukan
pengulangan ....16 kali subrutin delay10ms()? Perhatikan baris 24 – 27;
o Ingat, Timer2 merupakan timer ....17 bit, artinya dengan kemampuan seperti itu tidak bisa
dilakukan langsung tundaan 1 detik, cara paling gampang untuk mendapatkan tundaan 1 detik
atau 1.000 milidetik adalah mengulang 100 kali tundaan 10 milidetik;
o Perhatikan register TCCR2 bit 0, 1 dan 2 pada Gambar 23. Kemudian perhatikan juga Tabel
5 untuk semua kemungkinan nilai CS22, CS21 dan CS20.
o Nilai prescale yang digunakan, mengikuti Tabel 5, perhatikan pada baris 14, adalah sebesar
....18 atau nilai clock dibagi dengan nilai prescale tersebut;
14
Jawaban: 2 (dua)
15
Jawaban: delay1detik()
16
Jawaban: 100 (seratus)
17
Jawaban: 8 (delapan)
o Baris 16 digunakan untuk menunggu terjadinya ......................21 pada Timer2, kemudian bit
overflow tersebut direset (baris-17).
o Timer2 kemudian dihentikan dengan memberi nilai .........22 pada register TCCR2.
18
Jawaban: 1024
19
Jawaban = 94
20
Jawaban = 148 (seratus empat puluh delapan)
21
Jawaban: overflow
22
Jawaban: 0 (nol) atau 0x00
// program TIMER03.C
// ON dan OFF LED pada PORTB menggunakan Timer0
// By Agfianto Eko Putra, 2010
void init_devices()
{
DDRB=255;
}
void delay1detik()
{
unsigned char ulang;
for(ulang=0; ulang<100; ulang++)
{
int main()
{
init_devices();
for(;;)
{
led=255;
delay1detik();
led=0;
delay1detik();
}
}
#include "avr/io.h"
#include "avr/interrupt.h" // saatnya menggunakan interupsi
ISR(TIMER0_OVF_vect)
{
TCNT0=0xFB; // isi ulang 0xFB agar 5 kali saja
++cacah; // setara dengan -5 (negatif 5)
}
void init_devices()
{
DDRC=255;
DDRD=255;
}
int main()
{
init_devices();
enable_timer0();
sei();
cacah=1;
while(1)
{
led = cacah;
pencacah = TCNT0;
}
}
Pewaktu Watchdog pada mikrokontroler AVR mendapatkan clock dari osilator internal 1 MHz yang
tersendiri (khusus). Dengan melakukan pengontrolan Watchdog Prescaler, interval reset yang
dilakukan Watchdog dapat diatur dan mengikuti Tabel 6. Gambar 28 menunjukkan diagram blok
pewaktu watchdog pada mikrokontroler AVR sedangkan Gambar 29 menunjukkan register yang
terlibat.
Kesimpulan:
// program WD01.C
// tampilan di LCD16x2 dan watchdog
//#define WDTO_2S 7
//==================================================
void init_devices()
{
DDRB=255; //PORTB sebagai luaran
DDRD&=~(1<<2); //PORTD.2 sebagai masukan
DDRD&=~(1<<3); //PORTD.3 sebagai masukan
PORTD|=(1<<2); //PULL UP internal pada
PORTD|=(1<<3); //PORTD.2 dan PORTD.3 aktif
DDRC=255;
wdt_enable(WDTO_2S); // timeout WDT-nya 2 detik
// tersedia 15MS, 30MS, 60MS, dst
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
led=0;
lcd_goto(line1);
lcd_puts("mulai awal...");
_delay_ms(100);
lcd_clrscr();
while(1)
{
_delay_ms(1000);
wdt_reset(); //harus direset WDT-nya
lcd_goto(line1);
lcd_puts("watchdog mega16");
lcd_goto(line2);
lcd_puts("telah direset..");
_delay_ms(1000);
_delay_ms(1000);
}
}
//===========================================
//#define WDTO_2S 7
#define led PORTB
#define tombol PIND
#define satu 2
#define dua 3
//==================================================
void init_devices()
{
DDRB=255; //PORTB sebagai luaran
DDRD&=~(1<<2); //PORTD.2 sebagai masukan
DDRD&=~(1<<3); //PORTD.3 sebagai masukan
PORTD|=(1<<2); //PULL UP internal pada
PORTD|=(1<<3); //PORTD.2 dan PORTD.3 aktif
DDRC=255;
wdt_enable(WDTO_2S); //timeout WDT-nya 2 detik
//tersedia 15MS, 30MS, 60MS, dst
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
led=0;
lcd_goto(line1);
lcd_puts("mulai awal...");
_delay_ms(100);
lcd_clrscr();
while(1)
{
_delay_ms(1000);
wdt_reset(); //harus direset WDT-nya
lcd_goto(line1);
lcd_puts("watchdog mega16");
lcd_goto(line2);
lcd_puts("telah direset..");
while (!bit_is_clear(tombol,satu));
//menunggu tombol ditekan
//jika tidak ditekan
//WDT akan mereset uC
}
}
//===========================================
Skenario tersebut membutuhkan mekanisme interupsi. Saat proses dilakukan secara normal,
kemudian terjadi interupsi, program normal ditinggalkan terlebih dulu, mengerjakan rutin interupsi,
kemudian kembali lagi mengerjakan program secara normal. Inilah konsep interupsi...!
Mikrokontroler AVR memiliki 21 macam sumber interupsi yang terdiri dari 3 interupsi eksternal dan
18 interupsi internal, sebagaimana ditunjukkan pada Tabel 7.
// program INTERUPSI_TIMER01.C
// ON dan OFF LED pada PORTB
// selama 1 detik menggunakan interupsi TIMER0
ISR(TIMER1_OVF_vect)
{
led=!led; // toggle penyalaan LED (ON/OFF)
TCNT1=0xd5d0; //isi ulang 0xD5D0 agar 1 detik
TIFR=4;
}
void init_devices()
{
DDRB=255; //LED OUTPUT
}
//==============================================
void enable_timer1()
{TIMSK|=(1<<TOIE1);}
void disable_timer1()
{TIMSK&=~(1<<TOIE1);}
void start_timer1()
{TCCR1B=0B00000101;}
void stop_timer1()
{TCCR1B=0B00000000;}
//===============================================
int main()
{
init_devices();
led=1;
while(1);
}
ISR(INT1_vect)
{
led=255;
}
//=================================================================
void enableint0()
{GICR|=(1<<INT0);}
void disableint0()
{GICR&=~(1<<INT0);}
void enableint1()
{GICR|=(1<<INT1);}
void disableint1()
{GICR&=~(1<<INT1);}
void init_devices()
{
DDRB=255; //PORTB sebagai luaran
DDRD&=~(1<<2); //PORTD.2 sebagai masukan INT0
DDRD&=~(1<<3); //PORTD.3 sebagai masukann INT1
PORTD|=(1<<2); //PULL UP internal
PORTD|=(1<<3); //semuanya diaktifkan
int main()
{
init_devices();
enableint0();
enableint1();
while(1);
}
Jalur komunikasi serial pada mikrokontroler AVR ATMega16/32/8515 terdapat pada pin PORTD.0
(RXD) dan PORTD.1 (TXD), perhatikan pin-pin yang terkait pada Gambar 4 dan 5. Diagram
bloknya ditunjukkan pada Gambar 30.
Pembahasan komunikasi serial USART dipisahkan menjadi 3 bagian yaitu Penghasil detak (clock
generator), Mengirim data (Data Transmit) dan Menerima data (Data Receive).
• Normal asynchronous;
• Double Speed asynchronous;
• Master synchronous, dan
• Slave synchronous.
Pada Gambar 31 ditunjukkan diagram blok logik penghasil detak yang terkait dengan beberapa
register seperti UBRR (16-bit: UBRRL dan UBRRH) dan lain-lain.
Gambar 31. Diagram blok logik penghasil detak untuk komunikasi serial
Anda bisa menghitung berapa nilai UBRR yang sesuai dengan baudrate yang diinginkan mengacu
pada osilator atau kristal yang digunakan oleh mikrokontroler menggunakan persamaan
BAUD = fclk/(16(UBRR+1))
Persamaan ini digunakan untuk Asynchronous Normal Mode, jika menggunakan mode Double
Speed Asynchronous, maka persamaan yang digunakan adalah
BAUD = fclk/(8(UBRR+1))
Informasi detil tentang clock generator ini bisa dilihat di datasheet AVR ATMega16. Anda bisa juga
memanfaatkan website http://www.wormfood.net/avrbaudcalc.php untuk menghitung secara online.
Misalkan digunakan frekuensi osilator untuk mikrokontroler sebesar 8 MHz (atau 8.000.000 Hz) dan
baudrate yang diinginkan adalah 9600, setelah dihitung menggunakan persamaan diatas diperoleh
nilai UBRR sebesar 51,083333333, kita bulatkan menjadi 51. Dengan nilai UBRR =51, maka nilai
seseungguhnya dari baudrate adalah 9615 (bukan 9600), jika dibagi dengan 9600 diperoleh 1.0016
dan karena itu error-nya adalah 0.16%. Dengan error tersebut USART masih dapat bekerja tetapi
tidak sempurna.
Anda bisa menggunakan AVR Assistant yang dibuat oleh Mike Henning (bisa Anda unduh program
tersebut di http://www.esnips.com/web/AtmelAVR), program ini juga bisa digunakan sebagai
alternatif dari AVR Timer Calculator yang telah dijelaskan sebelumnya. Tampilan awal ditunjukkan
pada Gambar 32.
• Bagian kiri digunakan untuk mengatur baudrate, sedangkan bagian kanan digunakan untuk
mengatur Timer0, 1 dan 2 (jadi satu antarmukanya);
• Contoh untuk baudrate 9600, dengan kristal 8MHz, hasil perhitungannya ditunjukkan pada
Gambar 33 kiri, sedangkan untuk kristal 7,372MHz ditunjukkan pada Gambar 33 kanan.
Perhatikan perbedaan error %-nya.
Gambar 33. Contoh penggunaan AVR Assistant v1.3 untuk dua frekuensi MPU berbeda
• Untuk contoh pengaturan Timer1 agar menunda interupsi terjadi 100 kali per detik (seperti
kasus timer yang dijelaskan sebelumnya), dengan frekuensi kristal 11,059MHz, ditunjukkan
pada Gambar 34.
Berikut adalah subrutin yang digunakan untuk menghitung nilai UBRR pada winAVR GCC
Variabel MYUBRR digunakan untuk menyimpan nilai UBRR setelah dilakukan perhitungan
sebagaimana ditunjukkan pada listing tersebut. Pemanggilannya menggunakan instruksi
initserial(MYUBRR);
23
Hasil perhitungan dari http://www.wormfood.net/avrbaudcalc.php
Saat bit TXEN diberi logika 1, artinya USART Transmitter diaktifkan, dengan demikian pin TxD
pada PORTD.1 hanya bisa digunakan untuk pengiriman data pada komunikasi serial. Lakukan
terlebih dahulu inisialisasi baudrate, mode kerja dan format data sebelum mengirimkan data-data
melalui port serial. Untuk mengatur berapa stop bit, digunakan USBS pada register UCSRC,
Gambar 36, sedangkan mengatur lebar bit data digunakan UCSZ2 (di register UCSRB), UCSZ1 dan
UCSZ0 (di register UCSRC) mengikuti Tabel 9.
Jika Anda menggunakna mode sinkron, maka pin XCK (PORTB.0) hanya boleh digunakan untuk
mengirimkan detak atau clock transmisi.
Berikut adalah subrutin yang digunakan untuk mengaktifkan UASRT Transmitter pada winAVR
GCC.
Berikut adalah subrutin (b dan uart_putc()) yang digunakan untuk mengirimkan sebuah data
(karakter)
Penjelasan:
Pada subrutin pertama, uart_putc(), data dikirimkan dengan cara menuliskan sebuah kode
karakter ke register UDR, perhatikan Gambar 37, perhatikan baris 19;
Namun sebelum menuliskan atau mengisi register UDR, ditunggu dulu nilai bit UDRE (bit-
5) pada register UCSRA (Gambar 38) agar bernilai 1 (satu), maksudnya jika UDRE=1
berarti UDR-nya kosong dan siap mengirim data berikutnya, perhatikan baris 18;
Subrutin kedua, yaitu uart_puts() digunakan untuk mengirimkan serangkaian data (tidak
hanya satu karakter saja), perhatikan terjadinya pengulangan subtrutin uart_putc() pada baris
27 dan 28.
Berikut adalah cara yang digunakan untuk menerima data (karakter), ada di dalam program utama
(main()):
Untuk menerima data caranya mudah, yaitu dengan memeriksa apakah bit RXC (bit ke 7) pada
register UCSRA bernilai 1? Perhatikan Gambar 36 dan baris 50. Jika RXC bernilai 1 artinya UDR
Konektor komunikasi serial pada AVR Trainer Board v2.0 ditunjukkan pada Gambar 40.
Pada Gambar 41 ditunjukkan rangkaian baku antarmuka LCD, yang contohnya ditunjukkan pada
Gambar 42, merupakan tipe 2x16 karakter dan tentunya masih ada tipe-tipe lainnya.
Gambar 44. Penampil LCD dan Masukan ADC pada AVR Basic Trainer v2.0
Pada Gambar 43 ditunjukkan contoh rangkaian antarmuka LCD dan ADC dengan ATMega16 yang
bisa digunakan untuk latihan-latihan antarmuka LCD dan ADC. Sedangkan pada Gambar 44
ditunjukkan komponen-komponen LCD dan masukan ADC yang terkait pada papan AVR Basic
Trainer v2.0.
// program LCD_01.C
// tampilan di LCD16x2
// By Agfianto Eko Putra, 2010
//==================================================
void init_devices()
{
DDRC=255; // PORTC sebagai luaran ke LCD
}
//===============program utama======================
int main()
{
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts(" saya manusia");
lcd_goto(line2);
lcd_puts(" keren");
while(1);
}
// program LCD_02.C
// tampilan di LCD16x2
// By Agfianto Eko Putra, 2010
//==================================================
void init_devices()
{
DDRC=255;
}
//================program utama=====================
int main()
{
init_devices();
while(1) {
lcd_goto(line1);
lcd_puts(" saya manusia");
lcd_goto(line2);
lcd_puts(" keren");
_delay_ms(250);
lcd_clrscr();
_delay_ms(250);
}
#include "util/delay.h"
#include "avr/io.h"
#include "avr/pgmspace.h"
#include "lcd_pc.c"
//==================================================
void init_devices()
{
DDRC=255;
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts("0123456789ABCDEF");
lcd_goto(line2);
lcd_puts("FEDCBA9876543210");
_delay_ms(250);
LCD_RS_LO;
while(1) {
for (int i=1; i<=16; i++) {
lcd_write(0x1C); // tampilan geser kanan, ke kiri
_delay_ms(200);
}
for (int i=1; i<=16; i++) {
lcd_write(0x18); // tampilan geser kanan, ke kanan
_delay_ms(200);
}
_delay_ms(250);
}
}
//===========================================
//==================================================
void init_devices()
{
DDRD&=~(1<<2); //PORTD.2 sebagai masukan
DDRD&=~(1<<3); //PORTD.3 sebagai masukan
PORTD|=(1<<2); //PULL UP internal pada
PORTD|=(1<<3); //PORTD.2 dan PORTD.3 aktif
DDRC=255;
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts("Belum ada tombol");
lcd_goto(line2);
lcd_puts("yang ditekan...!");
while(1)
{
if(bit_is_clear(tombol,satu))
{
lcd_clrscr();
lcd_goto(line1);
lcd_puts("Anda menekan");
lcd_goto(line2);
lcd_puts("Tombol PD2/INT0");
}
if(bit_is_clear(tombol,dua))
{
lcd_clrscr();
lcd_goto(line1);
lcd_puts("Anda menekan");
lcd_goto(line2);
lcd_puts("Tombol PD3/INT1");
}
}
}
//===========================================
// program ADC01.C
// pembacaan ADC internal M16
//=========================================================
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()
{
unsigned int tempadc1,tempadc2;
init_devices();
init_lcd();
led=0;
lcd_goto(line1);
lcd_puts("Demo ADC-0 dan 1");
lcd_goto(line2);
lcd_puts(" AT Mega16!");
_delay_ms(1000);
lcd_clrscr();
for(;;)
lcd_goto(line1);
lcd_puts("POT: ");
lcdword(tempadc1);
lcd_goto(line2);
lcd_puts("LDR: ");
lcdword(tempadc2);
_delay_ms(500);
}
}
//===========================================
//=========================================================
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()
{
unsigned int tempadc1,tempadc2;
pot=(tempadc1/1024)*5;
ldr=(tempadc2/1024)*5;
lcd_goto(line1);
lcd_puts("POT: ");
lcdword(pot);
lcd_goto(line2);
lcd_puts("LDR: ");
lcdword(ldr);
_delay_ms(500);
}
}
//===========================================
Catatan Anda:
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
..................................................................................................................................................................
Emping (chip/IC) RTC (Real Time Clock) DS1307 bekerja dengan daya rendah (low power),
memiliki kalender/jam BCD dan SRAM yang nonvolatile dengan kapasitas 56 bytes. Alamat dan
data dikirim melalui 2 kabel dwi- arah. Jam dan kalender pada DS1307 menyediakan informasi
detik, menit, jam, hari, tanggal, bulan dan tahun. Banyak hari dalam satu bulan diatur secara otomatis
oleh IC ini baik untuk 31 hari maupun kurang. Jam bekerja dalam format 24 jam atau 12 jam dengan
indikator AM/PM. DS1307 dapat mendeteksi secara otomatis catu dayanya, jika catu daya ke sistem
mati, maka secara otomatis DS1307 akan mengambil catu daya dari baterai (jika dipasang).
DS 1307 memiliki 8 buah pin dan tersedia dalam bentuk 8-pin DIP serta 8- pin SOIC. Konfigurasi
ditunjukkan pada Gambar 45.
Untuk format pengiriman data tanggal ditunjukkan pada Gambar 47. Data tanggal ditulis mulai alamat
04H. Untuk pengaturan hari tidak dilakukan, karena DS1307 otomatis akan menyesuaikan hari
berdasarkan tanggal yang telah diatur.
Gambar 48 menunjukkan format pembacaan data dari DS1307. Di awal komunikasi, mikrokontroler akan
membangkitkan sinyal start I2C. Kemudian mikrokontroler akan mengirimkan alamat grup dari DS1307
yaitu 1101 dan kode untuk menulis ke DS1307 yaitu 0 pada LSB-nya. Kode tulis ini diberikan ke
DS1307 karena mikrokontroler akan menuliskan terlebih dahulu alamat awal pembacaan register DS1307
yaitu 00H.
Setelah itu, proses pembacaan I2C dimulai. Mikrokontroler mengirimkan alamat DS1307 beserta kode
instruksi baca. Proses pembacaan dilakukan per-byte dimulai dari register detik sampai register tahun,
alamat masing-masing register tersebut ditunjukkan pada Gambar 49. Setelah menerima data 1-byte utuh
mikrokontroler akan mengirimkan sinyal acknowledge ke DS1307. Pada akhir pembacaan register tahun,
akan dikirim sinyal notacknowledge dan diakhiri dengan sinyal stop.
void dectobcdrtc()
{
hour=dec2bcd(hour);
minute=dec2bcd(minute);
second=dec2bcd(second);
date=dec2bcd(date);
month=dec2bcd(month);
year=dec2bcd(year);
}
void bcdtodecrtc()
{
hour=bcd2dec(hour);
minute=bcd2dec(minute);
second=bcd2dec(second);
date=bcd2dec(date);
month=bcd2dec(month);
year=bcd2dec(year);
}
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();
void rtc_lcd()
{
lcd_goto(line1);
lcd_putc((hour / 10) + 48);
lcd_putc((hour % 10) + 48);
lcd_putc(58); //karakter ":"
lcd_putc((minute / 10) + 48);
//=========================================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRC=255;
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts(" Demo RTC ");
lcd_goto(line2);
lcd_puts(" DS1307");
_delay_ms(1000);
lcd_clrscr();
while(1)
{
gettimertc();
rtc_lcd();
led=second;
_delay_ms(1000);
}
}
//===========================================
void dectobcdrtc()
{
hour=dec2bcd(hour);
minute=dec2bcd(minute);
second=dec2bcd(second);
date=dec2bcd(date);
month=dec2bcd(month);
year=dec2bcd(year);
}
void bcdtodecrtc()
{
hour=bcd2dec(hour);
minute=bcd2dec(minute);
second=bcd2dec(second);
date=bcd2dec(date);
month=bcd2dec(month);
year=bcd2dec(year);
}
void beep()
{
PORTA |= (1<<7);
_delay_ms(10);
PORTA &= ~(1<<7);
//_delay_ms(100);
}
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();
//=========================================================
void init_devices()
{
DDRB=255; //LED OUTPUT
DDRA |= (1<<7);
DDRC=255;
}
//==========================================program utama
int main()
{
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts(" Demo RTC ");
lcd_goto(line2);
lcd_puts(" DS1307");
_delay_ms(1000);
lcd_clrscr();
while(1)
{
gettimertc();
rtc_lcd();
led=second;
if ((second==0)||(second==30)) beep();
_delay_ms(1000);
}
}
//===========================================
Fitur dari 2-wire (komunikasi TWI atau I2C) Serial EEPROM AT24C32/64 sebagai berikut...
Low-Voltage and Standard-Voltage Operation
o 2.7 (VCC = 2.7V to 5.5V)
Diagram pin beserta keterangan pin-nya ditunjukkan pada Gambar 51. Sedangkan diagram blok-nya
ditunjukkan pada Gambar 52. Pin A0 – A2 digunakan untuk menentukan alamat dari divais
AT24C32/64 yang bersangkutan, bisa 8 macam alamat, dari 0 hingga 7. Untuk rangkaian, kaki atau
pin SDA dan SCL dihubungkan ke 2 pin berbeda dari mikrokontroler yang bersangkutan,
komunikasi-nya sama seperti DS1307, yaitu menggunakan TWI atau I2C.
Jika pin atau kaki write protect dihubungkan ke GND, maka bekerja secara normal, bisa baca dan
tulis. Sedangkan jika dihubungkan ke Vcc, maka penulisan ke kuadran teratas (8/16K bit) dilarang
atau tidak bisa.
Untuk pengalamat divais ini melalui program, gunakan rujukan yang ditunjukkan pada Gambar 53.
dengan format 4 bit awal selalu „1010‟ kemudian diikuti dengan 3 bit alamat divais dan 1 bit untuk
operasi pembacaan (R) atau penulisan (W). Jika pin R/W = 0, maka terjadi penulisan data.
Berikut ini diberikan dua contoh program mengakses EEPROM. Percobaan pertama mengakses
EEPROM internal, dalam hal ini tidak diperlukan akses I2C, dan yang kedua mengakses EEPROM
eksternal yang membutuhkan protokol I2C.
//==========================================program utama
int main()
{
unsigned char tempeeprom;
init_devices();
init_lcd();
led=0;
lcd_goto(line1); //introduksi melalui LCD
lcd_puts("Demo EEPROM");
lcd_goto(line2);
lcd_puts("Internal Mega16");
_delay_ms(1000);
lcd_clrscr();
lcd_goto(line1);
lcd_puts("tulis EEPROM");
writeeeprom(0,101); //tulis ke alamat 0x00
_delay_ms(1000);
lcd_goto(line1);
lcd_puts("baca EEPROM...");
tempeeprom=readeeprom(0); //baca dari alamat 0x00
_delay_ms(1000);
lcd_clrscr();
lcd_goto(line1);
lcd_puts("hasilnya...");
lcd_goto(line2);
lcdbyte(tempeeprom); //tampilkan hasil baca ke LCD
led=tempeeprom;
while(1);
}
//===========================================
//==========================================program utama
int main()
{
unsigned char tempeeprom;
init_devices();
init_lcd();
lcd_goto(line1);
lcd_puts(" Demo EEPROM ");
lcd_goto(line2);
lcd_puts(" AT24C2");
_delay_ms(1000);
lcd_clrscr();
lcd_goto(line1);
lcd_puts("tulis EEPROM");
i2c_eeprom_write(0,202); //tulis ke alamat 0x00
_delay_ms(1000);
lcd_goto(line1);
lcd_puts("baca EEPROM...");
tempeeprom=i2c_eeprom_read(0); //baca dari alamat 0x00
_delay_ms(1000);
lcd_clrscr();
lcd_goto(line1);
lcd_puts("hasilnya...");
lcd_goto(line2);
lcdbyte(tempeeprom); //tampilkan hasil baca ke LCD
led=tempeeprom;
while(1);
}
//===========================================
Catatan:
Saran dan masukan untuk buku ini silahkan kirim email ke agfi68@ugm.ac.id, terima kasih!