Laporan Vi Komunikasi i2c

39
LAPORAN PRAKTIKUM MIKROPROSESSOR LANJUT PERCOBAAN VI KOMUNIKASI I 2 C (INTER-INTEGRATED CIRCUIT) UNTUK MENGAKSES RTC DS1307 & KOMUNIKASI AVR TWI (TWO WIRE INTERFACE) UNTUK MENGAKSES EEPROM EXTERNAL KELOMPOK 8 ANGGOTA ADITYA DICKY SETIAWAN (120534431378) NUR KHOLIFAH H (120534400681) WAHYU DARMADI S (120534431437) OFFERING : D TANGGAL PRAKTIKUM : 07 &14 November 2014

description

Laporan Vi Komunikasi i2c

Transcript of Laporan Vi Komunikasi i2c

Page 1: 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

Page 2: Laporan Vi Komunikasi i2c

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,

Page 3: Laporan Vi Komunikasi i2c

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

Page 4: Laporan Vi Komunikasi i2c

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.

Page 5: Laporan Vi Komunikasi i2c

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

Page 6: Laporan Vi Komunikasi i2c

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

Page 7: Laporan Vi Komunikasi i2c

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

Page 8: Laporan Vi Komunikasi i2c

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;

Page 9: Laporan Vi Komunikasi i2c

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.

Page 10: Laporan Vi Komunikasi i2c

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.

Page 11: Laporan Vi Komunikasi i2c

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

Page 12: Laporan Vi Komunikasi i2c

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.

Page 13: Laporan Vi Komunikasi i2c

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.

Page 14: Laporan Vi Komunikasi i2c

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

Page 15: Laporan Vi Komunikasi i2c

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.

Page 16: Laporan Vi Komunikasi i2c

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.

Page 17: Laporan Vi Komunikasi i2c

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

Page 18: Laporan Vi Komunikasi i2c

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.

Page 19: Laporan Vi Komunikasi i2c

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

Page 20: Laporan Vi Komunikasi i2c

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)

}

Page 21: Laporan Vi Komunikasi i2c

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)

{

Page 22: Laporan Vi Komunikasi i2c

    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

Page 23: Laporan Vi Komunikasi i2c

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

Page 24: Laporan Vi Komunikasi i2c

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

Page 25: Laporan Vi Komunikasi i2c

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!

Page 26: Laporan Vi Komunikasi i2c

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)

Page 27: Laporan Vi Komunikasi i2c

{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

Page 28: Laporan Vi Komunikasi i2c

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.