judul
Breaking News
Loading...
Kamis, 05 Maret 2015

Dasar I2C AVR dengan C codevisionAVR

Kamis, Maret 05, 2015
I2C singkatan dari Inter Integrated Circuit, adalah sebuah protokol untuk komunikasi serial antar IC, dan sering disebut juga Two Wire Interface (TWI). Bus yang digunakan untuk komunikasi antara mikrokontroler dan divais periferal seperti memori, sensor temperatur dan I/O expander.
Komunikasi dilakukan melalui dua jalur: SDA (serial data) dan SCL (serial clock). Setiap divais I2C memiliki 7-bit alamat yang unik. MSB adalah fix dan ditujukan untuk kategori divais. Sebagai contoh, 1010 biner ditujukan untuk serial EEPROM. Tiga bit berikutnya memungkinkan 8 kombinasi alamat I2C, yang berarti, dimungkinkan 8 divais dengan tipe yang sama, beroperasi pada bus I2C yang sama. Pengalamatan 7-bit memungkinkan 128 divasi pada bus yang sama. Alamat I2C dikirim dalam byte pertama. LSB dari byte ini digunakan untuk menunjukkan bila master akan melakukan penulisan (0) atau pembacaan (0) .

Agar data dapat didistribusikan oleh master dengan tepat ke beberapa slave, menurut konsep I2C, semua jenis IC I2C diproduksi dengan nomor group tersendiri yang diatur oleh philips, sehingga produsen IC lain yang memproduksi IC I2C harus mendaftarkan produknya ke Philips untuk mendapatkan nomor group.

contoh,
  • IC serial EEPROM  memiliki no group = 1010 biner,
  • IC Remote 8 bit I/O Expander  memiliki no group =  0111 biner.dll

No group dimasukan ke 4 bit msb untuk  mensetting device adress  dan  3 bit berikutnya  A0, A1 ,A2  kaki ic yg bersangkutan.  Dengan demikian pada I2C Bus total bisa dipasang paling banyak 8 IC sejenis.

contoh : IC EEPROM 24C02 kaki  A2,A1 dan A0 kita groundkan

maka device address Ic 24C02 tsb adalah 1010 000x  , x = 1 jika operasi baca , x=0 jika operasi tulis.

Berikut ini device address untuk IC EEPROM serial lainya.
Konfigurasi fisik Bus I2C
Konfigurasi fisik Bus I2C

Sinyal Dasar I2C

Sinyal dasar I2C meliputi sinyal START, STOP dan ACK sebagai berikut:

SCK merupakan sinyal clock untuk ‘mendorong’ data di SDA, dalam keadaan tidak ada transfer data SDA dan SCK harus dalam keadaan ‘1’. Data di SDA boleh berubah hanya pada saat SCK =’0’ seperti digambarkan dalam diagram waktu Gambar 2, isi SDA diambil peralatan I2C pada saat SCL berubah dari ‘1’ menjadi ‘0’. Jika terjadi perubahan SDA pada saat SCL = ‘1’, perubahan itu diartikan sebagai sinyal START atau 
Diagram waktu sinyal sda dan scl

  • Sinyal START menandakan master akan mulai mengirim data,  sinyal ini terlihat di bagian kiri Gambar 3 berupa perubahan tegangan SDA dari ‘1’ menjadi ‘0’ pada saat SCK=’1’.
  • Sinyal STOP menandakan master akan mengakhiri komunikasi data, sinyal ini terlihat di bagian kanan Gambar 3 berupa perubahan tegangan SDA dari ‘0’ menjadi ‘1’ pada saat SCK=’1’.



  •  Sinyal ACK, merupakan sinyal balasan dari slave setelah menerima data 1 byte. Pada kondisi ini, slave “menarik” sda menjadi low selama satu sinyal clock. Sinyal ACK ini dapat dilihat pada Gambar 4, dimana pengiriman sinyal ini menandakan bahwa slave telah menerima 1 byte data.

Cara Kerja I2C Bus

cara kerja I2C Bus dapat dibedakan menjadi format pengalamatan  7 bit dan format pengalamatan 10 bit. Inisiatif komunikasi transfer data pada I2C Bus selalu dimulai dari pengiriman sinyal START oleh master yang kemudian diikuti oleh address byte ( 7 bit address + 1 bit pengarah data ), dan dilanjutkan dengan pengiriman data untuk mode pengalamatan 7 bit, seperti diilustrasikan pada Gambar :
mode pengalamatan 7 bit

Seperti terlihat pada Gambar 5, pengalamatan dilakukan dengan mengirimkan 7 bit data, dengan 4 bit pertama (MSB) merupakan kode dari I2C Philips untuk mangalamati IC EEPROM jenis ATMEL. 3 bit berikutnya merupakan alamat untuk eksternal pin dengan jumlah kemungkinan alamat sebanyak 8 alamat (2³).

Mode pengalamatan 7 bit ini hanya dapat digunakan untuk EEPROM dengan kapasitas maksimal 8 byte. Sehingga untuk EEPROM dengan kapasitas diatas 8 byte menggunakan mode pengalamatan 10 bit.



Contoh menulis 1 byte ke EEPROM 24C02 
Pemrograman  I2C dengan bahasa C  codevision
atur PIN PORT yang akan digunakan - pada Form configure Project




Program membaca dan menulis  serial EEPROM  24c02
// Alphanumeric LCD functions
#include "mega32"
#include "alcd.h"
#include "i2c.h"
/* function declaration for delay_ms */
#include  "stdio.h"


#define EEPROM_BUS_ADDRESS 0xA0


#define EEPROM_BUS_ADDRESS 0xA0


/* read a byte from the 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;
}


/* write a byte to the 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);
}


// Declare your global variables here

char buff[16];
void main(void)
{

char i;

PORTB= 0x00;
DDRB= 0b10000001;
lcd_init(16);     

/* initialize the I2C bus */
i2c_init();

/* write the byte 55h at address AAh */
eeprom_write(0x21,'A');

/* read the byte from address AAh */
i=eeprom_read(0x21);
sprintf(buff,"%c",i);

lcd_gotoxy(0,0);lcd_puts(buff);


while (1); /* loop forever */

}

kami informasikan sebagian isi artikel dicopy dari https://pccontrol.wordpress.com  dan http://christianto.tjahyadi.com/, tapi dengan penambahan redaksi dari Az Robot Indonesia


Well down, Tidak sulitkan kawan... Anda akan dengan mudah mengembangkan source code diatas. Make simply for easy understanding.

Jika ada pertanyaan silahkan tinggalkan dikolom komentar. semoga bermanfaat.


2 komentar:

  1. /* write the byte 55h at address AAh */
    eeprom_write(0x21,'A');

    /* read the byte from address AAh */
    i=eeprom_read(0x21);
    sprintf(buff,"%c",i);

    mas mau tanya, inti program diatas apakah menampilkan string 'A' ke LCD?
    apa fungsi dari %c ?

    saya udah coba, tp malah gak tampil apa-apa di lcd. mohon pencerahannya. terima kasih

    BalasHapus
  2. '%c' - the function argument is a single character

    coba diganti sprintf(buff,"%s",i);
    atau tambahkan karakter / string penanda, misalnya: sprintf(buff,"EEPROM:%s",i);

    BalasHapus

 
Toggle Footer