LAPORAN PRAKTIKUM MIKROPROSESSOR LANJUT PERCOBAAN VI 2 KOMUNIKASI I C (INTER-INTEGRATED CIRCUIT) UNTUK MENGAKSES RTC DS1307 & KOMUNIKASI AVR TWI (TWO WIRE INTERFACE) UNTUK MENGAKSES EEPROM EXTERNAL
KELOMPOK 8 ANGGOTA ADITYA DICKY SETIAWAN NUR KHOLIFAH H WAHYU DARMADI S
(120534431378) (120534400681) (120534431437)
OFFERING :D TANGGAL PRAKTIKUM : 07 &14 November 2014 UNIVERSITAS NEGERI MALANG FAKULTAS TEKNIK PRODI S1 PENDIDIKAN TEKNIK ELEKTRO 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 I2C 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 bidirectional 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).
Chip memberikan kondisi Start dengan tahap : Pertama dengan menarik jalur SDA menjadi LOW dan
Start
selanjutnya menarik jalur SCL menjadi LOW Pada kondisi stop, Master melepas SCL baru kemudian
Stop
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 /* fungsi untuk delay_ms */ #include /* 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
TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0
7 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 0 0 1 1
TWPS0 0 1 0 1
Formula untuk menentukan Frekuensi SCL Clock adalah
Prescaler value 1 4 16 64
3. TWDR (TWI Data Register) : TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0 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) : TWINT TWEA TWSTA TWSTO TWWC TWEN -TWIE 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 TWGCE 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. 2. 3. 4.
Master sebagai transmitter Master sebagai receiver Slave sebagai receiver 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<
// 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<
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<
// Clear TWI interrupt
flag,Enable TWI while (!(TWCR & (1<
Menaruh 8 bit data di TWDR Clear TWINT flag Mengaktifkan TWI dengan memberikan 1 ke bit TWEN 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<
// Clear TWI interrupt flag,Enable
TWI while (!(TWCR & (1<
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<
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<
// Clear TWI interrupt
flag,Enable TWI while (!(TWCR & (1<
// Clear TWI interrupt flag,Enable
TWI while (!(TWCR & (1<
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,
dokumentasinya (penjelasan). Jawab:
STOP,
READ,
WRITE
beserta
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.