Laporan Vi Komunikasi i2c
-
Upload
nur-kholifah-hidayah -
Category
Documents
-
view
106 -
download
4
description
Transcript of Laporan Vi Komunikasi i2c
LAPORAN PRAKTIKUM
MIKROPROSESSOR LANJUT
PERCOBAAN VI
KOMUNIKASI I2C (INTER-INTEGRATED CIRCUIT) UNTUK
MENGAKSES RTC DS1307
&
KOMUNIKASI AVR TWI (TWO WIRE INTERFACE) UNTUK
MENGAKSES EEPROM EXTERNAL
KELOMPOK 8
UNIVERSITAS NEGERI MALANG
FAKULTAS TEKNIK
PRODI S1 PENDIDIKAN TEKNIK ELEKTRO
November 2014
ANGGOTA
ADITYA DICKY SETIAWAN (120534431378)NUR KHOLIFAH H (120534400681)WAHYU DARMADI S (120534431437)
OFFERING : DTANGGAL PRAKTIKUM : 07 &14 November 2014
MODUL XX
KOMUNIKASI I2C (INTER-INTEGRATED CIRCUIT) UNTUK
MENGAKSES RTC DS1307
TUJUAN
Mengetahui dan memahami bagaimana proses komunikasi I2C.
Mengetahui, memahami dan mempraktekkan pemrograman
mikrokontroler untuk komunikasi I2C RTC DS1307
I2C (Inter-Integrated Circuit)
Bus I2C dikembangkan pada awal 1980-an oleh Philips Semikonduktor.
Tujuan aslinya adalah untuk mempermudah koneksi CPU dengan chip periferal di
TV-set. Penelitian yang dilakukan oleh Philips Labs di Eindhoven (Belanda)
menghasilkan bus komunikasi 2 kabel yang disebut bus I2C. I2C merupakan
singkatan dari Inter-IC bus. Namanya secara harfiah menjelaskan tujuannya:
untuk menyediakan hubungan komunikasi antar IC.
Bus I2C digunakan di berbagai bidang aplikasi bukan hanya peralatan
audio dan video. Bus ini diterima di industri sebagai standar de-facto. Bus I2C
telah diadopsi oleh beberapa produsen chip terkemuka seperti Xicor, ST
Microelectronics, Infineon Technologies, Intel, Texas Instruments, Maxim,
Atmel, Analog Devices dan lain-lain dengan nama TWI (Two Wire Inteface).
Protocol I 2 C Bus
I2C adalah komunikasi serial half duplex dan karenanya aliran data hanya
dapat berlangsung satu arah pada satu waktu. Di I2C, transmisi data serial
dilakukan dalam mode asynchronous. Protokol ini hanya menggunakan dua kabel
untuk berkomunikasi antara dua atau lebih IC. I2C adalah protokol multi-point di
mana maksimum 128 perangkat periferal dapat dihubungkan untuk berkomunikasi
sepanjang antarmuka serial yang terdiri dari jalur bi-directional (SDA) dan bi-
directional serial clock (SCL). Dua baris saluran terbuka dua arah bernama SDA
(Serial Data) dan SCL (Serial Clock) dengan pull up resistor. Bus terdiri dari
hanya dua kabel atau sirkuit, satu untuk clock dan yang lainnya untuk data,
dengan resistor pull-up pada setiap kawat bus. Salah satu dari dua perangkat, yang
mengendalikan seluruh proses, dikenal sebagai Master dan yang lain yang
merespon permintaan dari master dikenal sebagai perangkat Slave. ACK sinyal
(pengakuan) dikirim / diterima dari kedua belah pihak setelah setiap transfer untuk
mengurangi kesalahan. SCL adalah jalur bus clock yang digunakan untuk
sinkronisasi dan dikendalikan oleh master. SDA dikenal sebagai bus transfer data
Mikrokontroler umumnya bertindak sebagai master, mari kita lihat contoh
umum komunikasi I2C. Konfigurasi seperti gambar di bawah dan anggap MCU
ingin mengirimkan data ke salah satu slave yang ada.
Pertama, MCU akan memberikan kondisi START. Kondisi ini bertindak
sebagai sinyal “Attention” kepada semua alat yang terhubung. Semua IC yang
ada di bus akan mendengarkan bus untuk data yang akan masuk.
Selanjutnya MCU mengirim ADDRESS alat yang ingin diakses bersama
dengan indikasi apakah akses ini adalah operasi Read atau Write (disini
dicontohkan operasi write). Setelah menerima ADDRESS, semua IC akan
membandingkan dengan alamatnya. Jika alamatnya tidak cocok, alat-alat
menunggu sampai bus dilepaskan dengan kondisi STOP. Jika alamatnya cocok,
IC Slave akan memberikan respon yang dinamakan sinyal ACKNOWLEDGE.
Setelah MCU menerima sinyal ACK, MCU dapat memulai mengirim atau
menerima DATA. Pada contoh ini, MCU akan mengirimkan data. Saat semua
selesai, MCU memberikan kondisi STOP. Ini adalah sebuah sinyal yang
menunjukkan bahwa bus telah dilepaskan dan bahwa IC yang terhubung bisa
menunggu transmisi lain dimulai kapanpun. Proses diatas dapat diilustrasikan
dengan gambar dibawah
I2C Bus Event
Kondisi Start dan Stop
Sebelum terjadi transaksi di bus, kondisi START harus diberikan pada
bus. Kondisi start bertindak sebagai sinyal untuk semua IC yang terhubung yang
menunjukkan bahwa akan ada data yang ditransmisikan ke bus. Sebagai hasilnya,
semua IC yang terhubung akan mendengarkan bus. Setelah sebuah pesan selesai,
kondisi STOP dikirim. Ini adalah sinyal untuk semua alat yang ada di bus yang
menunjukkan bahwa bus tersedia kembali (idle).
Start
Chip memberikan kondisi Start dengan tahap :
Pertama dengan menarik jalur SDA menjadi LOW dan
selanjutnya menarik jalur SCL menjadi LOW
StopPada kondisi stop, Master melepas SCL baru kemudian
melepas jalur SDA
Catatan :
Sebuah pesan dapat mengandung beberapa kondisi Start. Hal ini umumnya
disebut kondisi “repeated start”
Kondisi Stop selalu menandakan berakhirnya komunikasi, meskipun
kondisi ini diberikan ditengah transaksi atau ditengah sebuah byte.
Mengirimkan Satu Byte Ke Slave
Setelah kondisi start dikirim, satu byte dapat ditransmisikan oleh Master ke Slave.
Byte pertama setelah kondisi start akan mengidentifikasi slave yang ada di bus
dan memilih mode operasi (read atau write). Arti dari byte selanjutnya bergantung
pada slave.
Meminta Acknowledge dari Slave
Setelah alamat atau data ditransmisikan ke bus, data atau alamat ini harus di
ACKNOWLEDGE oleh slave. Jika yang dikirim adalah alamat: jika alamat cocok
dengan alamat slave, maka slave dan hanya slave yang alamatnya cocok akan
memberikan respons dengan ACK. Jika yang dikirim adalah data byte ke slave
yang sudah cocok alamatnya, slave itu juga akan memberikan respons ACK.
Slave yang akan memberikan ACK menarik jalur SDA menjadi LOW
segera setelah menerima transmisi bit ke delapan. Pada prakteknya, proses ini
tidak akan kelihatan.
Maksudnya segera setelah master menarik SCL menjadi LOW untuk
menuntaskan transmisi bit (1), SDA akan ditarik menjadi LOW oleh slave (2).
Master kemudian memberikan pulsa clock ke jalur SCL (3). Slave akan
melepaskan jalur SDA setelah selesainya pulsa clock ini (4). Bus kembali tersedia
bagi master untuk melanjutkan pengiriman data atau memberikan kondisi stop.
Pada proses pengiriman data ke slave, proses permintaan ACK ini harus
dituntaskan sebelum kondisi stop dapat diberikan. Slave akan menahan bus (SDA
ditahan LOW oleh slave) sampai master meberikan pulsa clock ke jalur SCL.
Menerima Satu Byte dari Slave
Setelah slave alamatnya cocok dan slave telah memberikan ACK, satu byte dapat
diterima dari slave jika R/W bit pada address di set ke READ (set ke 1). Sintax
protokolnya sama dengan mengirimkan satu byte ke slave, kecuali sekarang
master tidak diperbolehkan menyentuh jalur SDA. Master mengirimkan 8 pulsa
clock di jalur SCL. Slave sekarang mengontrol jalur SDA, jalur ini akan menjadi
HIGH jika slave ingin mengirimkan 1 atau tetap LOW jika ingin mengirimkan 0.
Untuk membaca data ini, yang harus dilakukan master adalah
mengeluarkan rising edge di jalur SCL (2), membaca level di SDA (3) dan
mengeluarkan falling edge di jalur SCL (4). Slave tidak akan merubah data saat
SCL dalam kondisi HIGH. Saat kondisi (1) dan (5), slave boleh merubah kondisi
jalur SDA. Proses ini harus dilakukan 8 kali secara berurutan untuk menuntaskan
byte data. Bytes selalu ditransmisikan MSB terlebih dahulu.
Memberikan Acknowledge ke Slave
Setelah menerima satu byte dari slave, master harus memberikan
acknowledge ke slave. Master dalam kondisi kontrol penuh jalur SDA dan SCL.
Setelah transmisi bit terakhir ke master (1), slave akan melepaskan jalur SDA.
Jalur SDA akan menjadi HIGH (2). Master kemudian menarik jalur
SDA menjadi LOW (3). Selanjutnya master akan memberikan
pulsa clock pada jalur SCL (4). Setelah selesainya pulsa clock ini,
master akan melepaskan jalur SDA (5). Slave sekarang
mendapatkan kembali kontrol jalur SDA (6).
Pemberian acknowledge ini dilakukan jika ingin membaca
data lebih dari satu byte dari slave. Jika ingin membaca hanya satu byte atau pada
saat menerima byte terakhir pada pembacaan data lebih dari satu byte maka pada
tahap (3) SDA di set menjadi HIGH dalam hal ini kondisinya dinamakan NOT
ACKNOWLEDGE (NACK).
Kondisi No Acknowledge
Kondisi ini berbeda dengan NACK, No Acknowledge adalah kondisi saat
master mengirimkan data ke slave sementara NACK adalah kondisi saat master
membaca data dari slave. Jika saat pengiriman data bit ke delapan dari master ke
slave, slave tidak menarik SDA menjadi LOW maka kondisi ini dinamakan No
ACK. Kondisi ini dapat diartikan :
Slave tidak ada di bus (jika data yang dikirim adalah alamat)
Slave kehilangan pulsa dan tidak sinkron dengan jalur SCL master
Bus dalam kondisi stuck. Salah satu jalur mungkin tertahan LOW secara
permanent.
Pada kondisi ini master harus membatalkan transmisi dengan mengirimkan
kondisi stop ke BUS.
I2C Software Menggunakan CodeVision AVR (Bit Banging)
I2C Software membuat event I2C dengan memanipulasi kondisi logika pin yang
akan digunakan sebagai pin SDA dan SCL menggunakan sintaks input output
sehingga semua pin I/O pada AVR dapat dipakai untuk komunikasi I2C. Pada
CodeVision AVR sudah disediakan library I2C untuk memudahkan pengguna.
Konfigurasi I2C juga dipermudah dengan adanya CodeWizard. Untuk kelancaran
operasi, fungsi-fungsi I2C membutuhkan adanya 3,3 – 4,7k pull-up resistor ke
+5V di sinyal SDA dan SCL
Pada CodeWizard setting I2C terdapat pada menu Bit-Banged I2C Bus Interface
untuk versi 3.04 atau I2C pada versi 2
I2C Port konfigurasi port yang akan digunakan sebagai SDA dan SCL
SDA Bit nomor pin pada I2C Port yang akan dipakai sebagai jalur SDA
SCL Bit nomor pin pada I2C Port yang akan dipakai sebagai jalur SCL
Bit Rate Konfigurasi Frekuensi clock SCL
Library Bit-Banged I2C ini juga menyediakan konfigurasi untuk device-device
tertentu untuk mempermudah pengaksesan slave, misalnya IC LM75, DS1621,
PCF8563 dan lain-lain.
Fungsi fungsi yang ada pada library I2C adalah sebagai berikut :
void i2c_init(void)
Fungsi untuk inisialisasi bus I2C. Fungsi ini adalah fungsi pertama yang harus
dipanggil sebelum menggunakan fungsi-fungsi lain.
unsigned char i2c_start(void)
Memberikan Kondisi Start. Mengembalikan nilai 1 jika bus bebas atau 0 jika bus
I2C sedang sibuk
void i2c_stop(void)
Memberikan kondisi stop
unsigned char i2c_read(unsigned char ack)
Membaca satu byte data dari bus. Parameter ACK menunjukkan apakah ACK
diberikan setelah membaca satu byte.
unsigned char i2c_write(unsigned char data)
Menulis satu byte data ke bus. Mengembalikan nilai 1 jika slave memberikan
ACK atau 0 jika tidak.
Berikut ini contoh program untuk mengakses Atmel 24C02 256 byte I2C
EEPROM
/* Include Header I2C
Koneksi I2C Bus dan bit rate harus disetting terlebih dahulu di : Project|
Configure|C Compiler|Libraries|Bit-Banged I2C Bus Interface menu */
#include <i2c.h>
/* fungsi untuk delay_ms */
#include <delay.h>
/* define alamat slave (EEPROM) */
#define EEPROM_BUS_ADDRESS 0xa0
/* fungsi untuk membaca satu byte data dari EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();i2c_write(EEPROM_BUS_ADDRESS);i2c_write(address);i2c_start();i2c_write(EEPROM_BUS_ADDRESS | 1);data=i2c_read(0);i2c_stop();return data;
}
/* fungsi untuk menulis satu byte data ke EEPROM */void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();i2c_write(EEPROM_BUS_ADDRESS);i2c_write(address);i2c_write(data);i2c_stop();/* 10ms delay to complete the write operation */delay_ms(10);
}
void main(void) {
unsigned char i;/* Inisialisasi I2C */i2c_init();/* menulis byte 55h pada alamat AAh */eeprom_write(0xaa,0x55);/* membaca satu byte dari alamat AAh */i=eeprom_read(0xaa);while (1); /* loop forever */
}
RTC DS1307
Sebuah Real Time Clock dasarnya seperti sebuah jam, RTC bekerja menggunakan
sumber daya dari baterai dan menyimpan waktu meskipun saat listrik padam.
Dengan menggunakan RTC, kita dapat mencatat waktu meskipun kita
memprogram ulang mikrokontroler atau mencabutnya dari USB atau sumber
daya.
Dibawah ini adalah contoh IC RTC DS1307. IC ini harganya murah, mudah di
solder dan dapat bekerja selama bertahun-tahun hanya dengan satu baterai koin.
RTC DS1307 ini menggunakan sistem full binary-coded decimal (BCD) untuk
jam dan kalendernya seta mempunyai 56 bytes Non-Volatile SRAM untuk
penyimpanan data. Alamat dan data ditransmisikan secara serial menggunakan
I2C. Jam dan kalender dapat memberikan informasi detik, menit, jam, hari,
tanggal, bulan, dan tahun. Jam pada IC ini dapat beroperasi dalam 24 jam atau 12
jam dengan format AM/PM. DS1307 ini mempunyai power-sense circuit yang
mendeteksi kegagalan sumber daya dan otomatis berpindah ke daya baterai.
Tabel diatas menunjukkan address map RTC DS1307 dan register RAM. Register
RTC terletak di alamat 0x00 – 0x07. Register RAM terletak pada alamat 0x08 –
0x3F. Alamat ini dapat diakses secara berurutan, jika sudah mencapai alamat
0x3F atau akhir alamat RAM maka lokasi register akan berpindah ke alamat 0x00.
Gambar diatas menunjukkan proses transfer data pada bus Serial I2C DS1307.
Bergantung pada kondisi R/W bit, dua model transfer data yang mungkin
dilakukan adalah :
1. Transfer data dari master transmitter ke slave receiver. Byte pertama
ditransmisikan oleh master adalah alamat slave. Selanjutnya diikuti satu
atau beberapa data byte. Slave merespons dengan memberikan
acknowledge bit setelah setiap byte diterima. Data ditransmisikan MSB
terlebih dahulu.
2. Transfer data dari slave transmitter ke master receiver. Byte pertama yang
merupakan alamat slave ditransmisikan oleh master. Slave kemudian
merespons dengan acknowledge bit. Lalu diikuti dengan slave
mengirimkan satu atau beberapa data byte ke master. Master memberikan
acknowledge bit setelah semua byte diterima. Di akhir byte terakhir yang
diterima, NACK diberikan oleh master ke slave.
DS1307 dapat bekerja dalam dua mode operasi :
1. Slave receiver mode (mode tulis)
Serial data dan clock diterima melalui SDA dan SLC. Setelah setiap byte
diterima, ACK bit di kirimkan. Kondisi START dan STOP dikenali
sebagai awal dan akhir transfer serial. Hardware melakukan pengenalan
alamat setelah penerimaan alamat slave dan direction bit. Alamat slave
adalah byte pertama yang diterima setelah maser memberikan kondisi
START. Alamat slave berisi 7-bit alamat DS1307 yaitu 1101000 diikuti
dengan direction bit (R/W), yang pada mode write bernilai 0. Setelah
menerima alamat slave, DS1307 mengirimkan ACK pada SDA. Setelah
DS1307 mengenali alamat slave dan write bit, master mengirimkan data
ke DS1307. Proses ini mengeset register pointer pada DS1307. Master
dapat mengirimkan 0 atau data byte lagi. Pointer register otomatis
bertambah satu alamat setelah setiap byte diterima. Master kemudian
memberikan kondisi STOP untuk menghentikan penulisan data.
2. Slave transmitter mode (mode baca)
Byte pertama yang ditransmisikan adalah 7-bit alamat slave diikuti dengan
RW bit yang bernilai 1. Setelah menerima dan mendecode alamat slave,
DS1307 memberikan ACK. DS1307 mulai mengirimkan data dimulai
dengan alamat register yang dintuntuk oleh pointer register. Jika pointer
register tidak ditulis sebelum inisialisasi mode baca, byte pertama yang
dibaca adalah yang terakhir disimpan di pointer register. Pointer register
otomatis bertambah satu setelah setiap byte dibaca. DS1307 harus
menerima Not Acknowledge (NACK) untuk menghentikan pembacaan.
Untuk penjelasan lebih lanjut silakan baca datasheet.
ALAT DAN BAHAN YANG DIGUNAKAN
1 unit PC/Notebook
Minimum System ATmega8535
Modul RTC DS1307
1 kabel USB Type B
1 kabel RJ11 to RS232
1 konverter USB to Serial
1 buah modul LCD
1 kabel 10 pin
PROSEDUR
1. Hubungkan pin SDA dan SCL modul RTC DS1307 pada pin yang akan
anda gunakan sebagai pin SDA dan SCL pada minimum system!
2. Hubungkan kabel RJ11 pada minimum system dan RS232 pada konverter
USB to Serial!
3. Hubungkan kabel USB type B ke downloader dan ke PC/Notebook serta
USB to Serial ke USB Notebook!
4. Buatlah fungsi START, STOP, READ, WRITE komunikasi I2C
menggunakan CodeVision dengan memanipulasi logika pin yang
digunakan sebagai SDA dan SCL sesuai dengan karakteristik komunikasi
I2C RTC DS1307! (tidak boleh menggunakan fungsi I2C yang sudah ada
pada CodeVision).
5. Buatlah fungsi untuk mengonfigurasi detik, menit, jam, hari, tanggal,
bulan, dan tahun menggunakan fungsi I2C yang sudah dibuat!
6. Buatlah fungsi untuk membaca detik, menit, jam, hari, tanggal, bulan, dan
tahun menggunakan fungsi I2C yang sudah dibuat!
7. Buatlah program yang menampilkan detik, menit, jam, hari, tanggal,
bulan, dan tahun pada serial (terminal) atau LCD!
8.
DATA HASIL PERCOBAAN
1. Source code fungsi START, STOP, READ, WRITE beserta
dokumentasinya (penjelasan).
Jawab:
unsigned char i2c_start(void) berfungsi untuk memberikan
Kondisi Start dan mengembalikan nilai 1 jika bus bebas atau 0
jika bus I2C sedang sibuk.
void i2c_stop(void) berfungsi untuk memberikan kondisi stop.
unsigned char i2c_read(unsigned char ack) berfungsi utuk
membaca satu byte data dari bus. Parameter ACK menunjukkan
apakah ACK diberikan setelah membaca satu byte.
unsigned char i2c_write(unsigned char data) berfungsi untuk
menulis satu byte data ke bus. Mengembalikan nilai 1 jika slave
memberikan ACK atau 0 jika tidak.
2. Source code fungsi untuk mengonfigurasi detik, menit, jam, hari, tanggal,
bulan, dan tahun beserta dokumentasinya (penjelasan).
Jawab:void main(void)
{unsigned char second,minute,hours,day,date,month,year;
3. Source code fungsi untuk membaca detik, menit, jam, hari, tanggal, bulan,
dan tahun beserta dokumentasinya (penjelasan).
Jawab:while (1) { second=rtc_read(0); minute=rtc_read(1); hours=rtc_read(2); day=rtc_read(3); date=rtc_read(4); month=rtc_read(5); year=rtc_read(6);
4. Sorce code program untuk menampilkan detik, menit, jam, hari, tanggal,
bulan, dan tahun pada serial (terminal) atau LCD beserta dokumentasinya
(penjelasan).
Jawab:lcd_clear();
lcd_gotoxy(0,0); sprintf(buff,"%d:",hours); lcd_puts(buff); lcd_gotoxy(3,0); sprintf(buff,"%d:",minute); lcd_puts(buff); lcd_gotoxy(6,0); sprintf(buff,"%d",second); lcd_puts(buff); lcd_gotoxy(0,1); sprintf(buff,"date:%d",date); lcd_puts(buff);
lcd_clear berfungsi untuk menghapus layar LCD.
lcd_gotoxy berfungsi untuk menempatkan kursor pada baris dan
kolom tertentu.
lcd_puts(buff) berfungsi untuk memanggil variabel dalam
format yang telah ditentukan.
5. Screenshot/foto tampilan pada terminal atau LCD
Jawab:
x
ANALISA DATA
Pada pengujian kali ini yaitu pengujian pewaktuan dengan menggunakan
RTC DS1307. Pengujian ini bertujuan untuk mengetahui apakah pewaktuan pada
RTC dapat tetap berjalan dan bersifat berkesinambungan sekalipun system dalam
keadaan mati atau tidak aktif. Waktu tidak tereset melainkan tetap berjalan
sekalipun system dalam keadaan mati atau tidak sedang bekerja. Dalam pengujian
ini RTC berfungsi dengan baik dan dapat memberikan pewaktuan yang tepat
kepada system khususnya saat melakukan pengambilan data.
KESIMPULAN
1. I2C adalah satu jenis bus serial yang memiliki dua jalur yang dgunakan
untuk melakukan komunikasi antara perangkat elektronik yaitu jalur SDA
(Serial Data) dan SCL (Serial Clock).
2. System I2C terbagi atas dua bagian, yaitu suatu device yang bertindak
sebagai pengontrol atau master dan suatu device yang dikontrol atau slave.
Master dan slave saling berkomunikasi melalui jalur data bus I2C. alat
yang mengendalikan komunikasi disebut master dan alat yang
dikendalikan oleh master disebut slave.
3. Pada satu jalur data I2C yang sama, dapat terdapat slave lebih dari satu.
Oleh karena itu, I2CBus harus dikendalikan master yang dapat
membangkitkan serial clock (SCL), mengontrol system komunikasi data
(SDA), dan dapat menghasilkan kondisi-kondisi “START” dan “STOP”.
4. I2C Bus berorientasi pada 8 bit data (byte), dengan most significant bit /
MSB ditransfer terlebih dulu, serta 2 macam data byte yaitu Address Byte
dan Data Byte.
5. Dalam bus I2C, transmisi data serial dilakukan dalam mode asynchronous.
Protokol ini hanya menggunakan dua kabel untuk berkomunikasi antara
dua atau lebih IC.
6. Apabila pada SDA terjadi transisi dari kondisi high ke kondisi low pada
saat SCL berkondisi high, maka terjadilah kondisi START.
7. Apabila pada SDA terjadi transisi dari kondisi low ke kondisi high pada
saat SCL berkondisi high, maka terjadilah kondisi STOP.
8. Kondisi START dan STOP selalu dibangkitkan oleh Master, dan bus
dikatakan sibuk setelah START dan dikatakan bebas setelah STOP.
MODUL XX
KOMUNIKASI AVR TWI (TWO WIRE INTERFACE) UNTUK
MENGAKSES EEPROM EXTERNAL
AVR TWI (Two Wire Interface)
Protocol I2C merupakan trademark dari Phillips, oleh karena itu
dikembangkan TWI yang mirip dengan Protocol I2C untuk mengatasi problem
trademark ini. Two Wire Interface atau TWI pada memanfaatkan register TWI
pada AVR. Hal ini sering disebut sebagai I2C Hardware atau TWI Hardware.
Penggunaan register TWI ini memudahkan komunikasi karena semua di atur
langsung oleh hardware AVR. Pin yang digunakan tidak bisa memakai sembarang
pin, harus pin SDA dan SCL pada AVR. Berikut ini register-register yang dipakai
pada komunikasi TWI :
1. TWBR (TWI Bit Rate Register) :
TWBR
7
TWBR
6
TWBR
5
TWBR
4
TWBR
3
TWBR
2
TWBR
1
TWBR
0
Register ini digunakan pada mode master untuk mengeset faktor pembagi
untuk bit rate genarator (Frekuensi SCL CLock). Bit rate generator unit
mengontrol periode waktu SCL. Frekuensi clock SCL ditentukan oleh Bit Rate
Register (TWBR) dan bit prescaler dari register TWSR.
2. TWSR (TWI Status Register) :
TWS7 TWS7 TWS7 TWS7 TWS7 -- TWPS1 TWPS0
Bit 7-3 TWS : TWI Status
Bit ini menunjukkan status bus TWI. Status lengkapnya dapat dilihat di datasheet.
Bit 2 Reserved bit
Bit 1-0 TWPS : TWI Prescaler Bits
Bit ini digunakan untuk menentukan prescaler dari Bit rate generator unit sesuai
dengan tabel dibawah ini
TWPS1 TWPS0 Prescaler value
0 0 1
0 1 4
1 0 16
1 1 64
Formula untuk menentukan Frekuensi SCL Clock adalah
3. TWDR (TWI Data Register) :
TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD
0
TWDR selalu mengandung data terakhir yang ada di bus SDA. Pada mode
transmitter TWDR berisi byte berikutnya yang akan ditransmisikan. Saat mode
receiver, TWDR berisi byte terakhir yang diterima. Data di TWDR tetap stabul
selama TWINT flag dalam kondisi HIGH
4. TWCR (TWI Control Register) :
TWIN
T
TWEA TWST
A
TWST
O
TWWC TWEN -- TWI
E
Bit 7 TWINT : TWI Interrupt Flag
Bit ini digunakan untuk memonitor status TWI. TWINT di set oleh hardware saat
TWI telah menyelesaikan pekerjaannya. SCL akan menjadi LOW sampai saat
TWINT bit di set. TWINT flag harus di clear dengan software sebelum memulai
operasi apapun pada TWI. TWINT flag di clear dengan memberikan logika 1
padanya
Bit 6 TWEA : TWI Enable Acknowledge Bit
Bit TWEA digunakan untuk menghasilkan pulsa ACK. Pulsa ACK dihasilkan
Jika bit TWEA ditulis menjadi 1. Dilain pihak jika bit TWEA adalah 0 maka
perangkat dapat diputus secara virtual dari bus TWI untuk sementara waktu.
Bit 5 TWSTA : TWI START Condition Bit
Dengan memberikan logika 1 ke bit ini, perangkat menjadi kontroler master lalu
mengecek apakah bus tersedia (bus tidak sibuk dalam transmisi dengan master
lain). Setelah itu menghasilkan kondisi start di bus. Jika bus tidak bebas maka
TWI menunggu sampai kondisi stop terdeteksi kemudian menghasilkan kondisi
start baru untuk mengklaim sebagai master dari bus.
Bit 4 TWSTO : TWI STOP Condition Bit
Dengan memberikan logika 1 ke TWSTO bit, master mengirimkan kondisi stop
ke bus TWI. Ketika kondisi stop dijalankan di bus, bit TWSTO menjadi logika 0
secara otomatis.
Bit 3 TWWC : TWI Write Collision Flag
Bit ini digunakan untuk menghindari bentrokan saat penulisan ke TWDR. Bit
TWWC akan berlogika 1 saat TWDR berusaha menulis (TWINT berlogika 0).
TWWC berlogika 0 dengan menulis TWDR saat TWINT high.
Bit 2 TWEN : TWI Enable Bit
Bit TWEN digunakan untuk mengaktifkan/menonaktifkan interface TWI. Saat bit
ini diberi logika 1, operasi TWI diaktifkan. Jika bit ini berlogika 0, TWI
dimatikan dan transmisi TWI dihentikan
Bit 1 Reserved bit dan selalu ditulis 0
Bit 0 TWIE : TWI Interrupt Enable
Bit TWIE digunakan untuk mengaktifkan atau mematikan interrupt request TWI.
interrupt request aktif dengan memberi logika 1 ke TWIE dan nonaktif dengan
memberikan logika 0
5. TWAR (TWI (slave) Address Register) :
TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGC
E
Bit 7-1 TWA : TWI (Slave) Address Bit
Bit ini digunakan untuk menyimpan 7 bit alamat slave saat diprogram sebagai
slave transmitter atau receiver
Bit 0 TWCGA : TWI General Call Recognition Enable Bit
Bit ini digunakan untuk mengaktifkan slave untuk meng-acknowledge alamat
general call (0x00).
Menggunakan AVR TWI (Two Wire Interface)
Pin SDA dan SCL dari Slave harus dihubungkan ke pin SDA dan SCL
mikrokontroler.
AVR TWI dapat bekerja dalam 4 mode :
1. Master sebagai transmitter
2. Master sebagai receiver
3. Slave sebagai receiver
4. Slave sebagai transmitter
Master Sebagai Transmitter
1. Inisialisasi master
Inisialisasi sebagai master berarti mengeset frekuensi clock TWI (SCL).
Hal ini dilakukan dengan mengeset bit rate di TWBR dan bit prescaler di
TWSR
void TWI_init_master(void) // Function to initialize master
{
TWBR=0x01; // Bit rate
TWSR=(0<<TWPS1)|(0<<TWPS0); // Setting prescalar bits
// SCL freq= F_CPU/(16+2(TWBR).4^TWPS)
}
2. Mengirim kondisi start
Mikrokontroler AVR mempunyai built in register yang memudahkan
proses kondisi start lebih mudah :
a. Clear TWINT dengan memberikan logika 1
b. Set TWSTA bit untuk mengirimkan kondisi start
c. Set TWEN bit untuk inisialisasi TWI
d. Memonitor status TWINT flag
e. Mengecek byte ACK (menggunakan pengkondisian while karena
frekuensi SCL sangat kecil dibandingkan dengan frekuensi clock
mikrokontroler. Byte ACK dapat dibandingkan dengan memonitor
status TWSR
void TWI_start(void)
{
// Clear TWI interrupt flag, Put start condition on SDA, Enable TWI
TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))); // Wait till start condition is
transmitted
while((TWSR & 0xF8)!= 0x08); // Check for the acknowledgement
}
3. Mengirim alamat slave, data direction bit (write) dan menunggu sinyal
ACK
Proses ini dikontrol sepenuhnya oleh register TWI AVR
a. Menaruh 7 bit alamat slave dan direction control bit di TWDR
b. Clear TWINT flag
c. Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
d. Memonitor status TWINT, TWINT flag akan berlogika 0 ketika
data di TWDR telah ditransmisikan
e. Cek kebenaran ACK
void TWI_write_address(unsigned char data)
{
TWDR=data; // Address and write instruction
TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt
flag,Enable TWI
while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte
received
while((TWSR & 0xF8)!= 0x40); // Check for the acknoledgement
}
4. Mengirim 8bit data dan menunggu ACK
a. Menaruh 8 bit data di TWDR
b. Clear TWINT flag
c. Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
d. Memonitor status TWINT, TWINT flag akan berlogika 0 ketika
data di TWDR telah ditransmisikan
e. Cek kebenaran ACK
void TWI_write_data(unsigned char data)
{
TWDR=data; // put data in TWDR
TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable
TWI
while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte
transmitted
while((TWSR & 0xF8) != 0x28); // Check for the acknoledgement
}
5. Mengirim kondisi Stop
a. Clear TWINT flag
b. Set bit TWEN
c. Memberikan logika 1 ke bit TWSTO
d. Memonitor status TWSTO bit, bit TWSTO akan clear setelah
kondisi stop terkirim
void TWI_stop(void)
{
// Clear TWI interrupt flag, Put stop condition on SDA, Enable TWI
TWCR= (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while(!(TWCR & (1<<TWSTO))); // Wait till stop condition is
transmitted
}
Master Sebagai Receiver
6. Mengirim kondisi start
Sama dengan langkah 2
Pada langkah ke 6 ini kondisi start dikirim setelah kondisi stop. Jika satu
atau lebih kondisi start dikirim sebelum kondisi stop maka ini disebut
kondisi repetitive start. Kondisi ini sama dengan kondisi start
perbedaannya hanya di ACK. Jika data dikirim terus menerus dengan arah
yang sama maka tidak perlu kondisi start, repetitive start atau stop di
antaranya. Data kedua dapat ditransmisikan setelah menerima ACK dari
byte data pertama
7. Mengirim alamat slave, data direction bit (read) dan menunggu sinyal
ACK
a. Menaruh 8 bit data di TWDR (7bit alamat slave + data direction bit
(read = 1)
b. Clear TWINT flag
c. Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
d. Memonitor status TWINT, TWINT flag akan berlogika 0 ketika
data di TWDR telah ditransmisikan
e. Cek kebenaran ACK
void TWI_read_address(unsigned char data)
{
TWDR=data; // Address and read instruction
TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt
flag,Enable TWI
while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte
received
while((TWSR & 0xF8)!= 0x40); // Check for the acknoledgement
}
8. Membaca data dari bus SDA
a. Clear TWINT flag
b. Set TWEN bit
c. Memonitor status TWINT
d. Cek ACK. Jika master ingin menerima byte terakhir dari slave,
status TWSR akan menjadi 0x58. Setelah menerima byte terakhir,
repetitive start dikirimkan oleh master untuk melanjutkan
komunikasi atau memberikan kondisi stop untuk menghentikan
proses. Jika 2 kondisi itu tidak diberikan maka master ingin terus
menerima byte dari slave sehingga status TWSR menjadi 0x50
Untuk memberikan ACK ke slave tentang byte terakhir, bit TWEA
digunakan saat pengiriman data. Jika bit TWEA di set, penerimaan
berlanjut. Jika bit TWEA low, master memerintahkan slave untuk
mengirimkan byte terakhir
e. Mengambil data yang diterima
unsigned char TWI_read_data(void)
{
unsigned char recv_data;
TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable
TWI
while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte
transmitted
while((TWSR & 0xF8) != 0x58); // Check for the acknoledgement
recv_data=TWDR;
return recv_data;
}
9. Mengirim kondisi Stop
ALAT DAN BAHAN YANG DIGUNAKAN
1 unit PC/Notebook
Minimum System ATmega8535
Modul EEPROM External
1 kabel USB Type B
1 kabel RJ11 to RS232
1 konverter USB to Serial
1 buah modul LCD
1 kabel 10 pin
PROSEDUR
1. Hubungkan pin SDA dan SCL modul EEPROM pada pin yang akan anda
gunakan sebagai pin SDA dan SCL pada minimum system!
2. Hubungkan kabel RJ11 pada minimum system dan RS232 pada konverter
USB to Serial!
3. Hubungkan kabel USB type B ke downloader dan ke PC/Notebook serta
USB to Serial ke USB Notebook!
4. Buatlah fungsi START, STOP, READ, WRITE komunikasi I2C
menggunakan CodeVision dengan memanipulasi logika pin yang
digunakan sebagai SDA dan SCL sesuai dengan karakteristik komunikasi
TWI EEPROM! (tidak boleh menggunakan fungsi TWI yang sudah ada
pada CodeVision).
5. Buatlah fungsi untuk menulis data pada EEPROM!
6. Buatlah fungsi untuk membaca data pada EEPROM!
7. Buatlah fungsi untuk menampilkan data yang dibaca dari EEPROM ke
serial atau LCD!
DATA HASIL PERCOBAAN
1. Source code fungsi START, STOP, READ, WRITE beserta
dokumentasinya (penjelasan).
Jawab:
void TWI_start(void) berfungsi untuk memberikan kondisi start.
void TWI_stop(void) berfungsi untuk memberikan kondisi stop.
void TWI_read_address(unsigned char data) berfungsi untuk
mengirim alamat slave, data direction bit (read) dan menunggu
sinyal ACK.
unsigned char TWI_read_data(void) berfungsi untuk membaca
data dari bus SDA.
void TWI_write_address(unsigned char data) berfungsi untuk
mengirim alamat slave, data direction bit (read) dan menunggu
sinyal ACK.
void TWI_write_data(unsigned char data) berfungsi untuk
mengirim 8 bit data dan menunggu ACK.
2. Source code fungsi untuk menulis data pada EEPROM
Jawab:
void eeprom_write(unsigned char address, unsigned char data)
{i2c_start();i2c_write(EEPROM_BUS_ADDRESS);i2c_write(address);i2c_write(data);i2c_stop();
3. Source code fungsi untuk membaca data dari EEPROM
Jawab:
unsigned char eeprom_read(unsigned char address)
{unsigned char data;i2c_start();i2c_write(0xa0);i2c_write(address);i2c_start();i2c_write(0xa0| 1);data=i2c_read(0);i2c_stop();return data;}
4. Sorce code program untuk menampilkan data pada serial (terminal) atau
LCD beserta dokumentasinya (penjelasan).
Jawab:
lcd_clear(); lcd_gotoxy (0,0); sprintf(buff,"data AA=%x",i); lcd_puts(buff);
5. Screenshot/foto tampilan pada terminal atau LCD
Jawab:
ANALISA DATA
Pada pengujian kali ini yaitu pengujian penyimpanan dengan
menggunakan EEPROM. Pengujian ini bertujuan untuk mengetahui apakah
EEPROM dapat tetap berjalan dan bersifat menyimpan sekalipun system dalam
keadaan mati atau tidak aktif. Data tidak hilang melainkan tetap berjalan
sekalipun system dalam keadaan mati atau tidak sedang bekerja. Dalam pengujian
ini EEPROM berfungsi dengan baik dan dapat menyimpan data dengan baik
kepada system khususnya saat melakukan pengambilan data dan pengeluaran data
saat diupload oleh PC.
KESIMPULAN
Bahwa pengaksesan data EEPROM eksternal mempunyai perbedaan
dengan pengaksesan EEPROM internal. Pada pengaksesan EEPROM
internal penulisan dan pembacaan data langsung pada alamat yang terdapat
pada mikrokontroler. Sedangkan pada pengaksesan EEPROM eksternal
dibutuhkan fungsi untuk penulisan dan pembacaan data pada EEPROM.
Two Wire Interface atau TWI merupakan jenis bus yang dikembangkan
oleh perusahaan Atmel yang diadopsi dari teknologi I2C milik Philips yang
mana semua pengaturan untuk komunikasi data sudah diatur oleh
hardware baik itu pebangkitan sinyal pada jalur SCL hingga pengiriman
frame data.
Two Wire Interface atau TWI pada memanfaatkan register TWI pada
AVR. Hal ini sering disebut sebagai I2C Hardware atau TWI Hardware.
Penggunaan register TWI ini memudahkan komunikasi karena semua di
atur langsung oleh hardware AVR. Pin yang digunakan tidak bisa
memakai sembarang pin, harus pin SDA dan SCL pada AVR.