Selamat datang di ForSa! Forum diskusi seputar sains, teknologi dan pendidikan Indonesia.

Welcome to Forum Sains Indonesia. Please login or sign up.

Desember 06, 2024, 05:24:02 AM

Login with username, password and session length

Topik Baru

Artikel Sains

Anggota
Stats
  • Total Tulisan: 139,653
  • Total Topik: 10,405
  • Online today: 47
  • Online ever: 1,582
  • (Desember 22, 2022, 06:39:12 AM)
Pengguna Online
Users: 0
Guests: 17
Total: 17

Aku Cinta ForSa

ForSa on FB ForSa on Twitter

protokol I2C

Dimulai oleh ksatriabajuhitam, Mei 23, 2009, 09:21:09 AM

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

ksatriabajuhitam

untuk menampung pembahasan mengenai protokol I2C saja, maka topik ini dibuat

yo mulai dari perkenalan:

dimulai dari tante wiki dulu dah :)

I²C (Inter-Integrated Circuit) is a multi-master serial computer bus invented by Philips that is used to attach low-speed peripherals to a motherboard, embedded system, or cellphone. The name is pronounced eye-squared-see or eye-two-see. As of October 1, 2006, no licensing fees are required to implement the I²C protocol. However, fees are still required in order to "officially" allocate I²C slave addresses.

ini kabel (signal line) yang diperlukan oleh I2C:

SDA untuk data, SCL untuk clock, keduanya di-pull-up ke Vdd
Typical voltages used are +5 V or +3.3 V although systems with other, higher or lower, voltages are permitted.

struktur dari data I2C ialah:


master memulai komunikasi dengan mengeluarkan sinyal START (S). kemudian mengirim 7-bit alamat slave device, Most Significant Bit pertama. bit ke-8 menentukan apakah READ atau WRITE, yakni apakah slave menerima data (clear to 0) atau slave mengirim data (set to 1). kemudian diikuti dengan ACK (acknowledgement) oleh receiver. kemudian transmitter mengirim data. di akhir pengiriman data, receiver mengirim ACK baru. untuk mengakhiri komunikasi, master mengeluarkan sinyal STOP. (ref.: [pranala luar disembunyikan, sila masuk atau daftar.])

start bit:


stop bit:



itu dulu dah introduction nya, nanti dilanjut ke coding nya untuk master yang ga punya device I2C mengakses device I2C,
misalnya microcontroller mau ngakses data di serial i2c eeprom.
not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

insan sains

yaaah... ATMEGA8535 gak punya I2C euy... hiks.. hiks.. :'(
Menuju Indonesia sebagai THE COUNTRY MASTER OF TECHNOLOGY, 2030

ksatriabajuhitam

santai aja,,, karena itulah topik ini dibuat,
jadi nanti bisa diimplementasikan ke microcon yg ga punya device I2C

juga sebagai jawaban untuk http://www.forumsains.com/mikrokontroler-dan-robotika/mikrokontroler-atmega8535/msg31942/#msg31942
not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

Too Payz

wew sapa bilang ATmega8535 g punya I2C.
zzzZZzzzzz.........

ATmega8535 punya I2C liat aja librarynya di CodeVisionAVR.
udah lengkap cara makenya mudah lagi.
di Helpnya juga udah ada contohnya, baca dlu yang sabar.
Berbeda dengan SPI (Serial Programming Interface), saya belum melihat mikro lain yang mendukung SPI tapi dengan bahasa C n ATmega8535 bisa n gampang..

frans3q

nanya donk.... gw ga ngerti baca penjelasan TS. bisa d jelaskan pake bahasa orang awam???
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

tAZZZ

@Too Payz : hmmm agreee.,.....ada kok...dah pernah nyoba blum? klo udah bagi2 donks

frans3q

blom ngerti ttg I2C nih.

klo misal ny 8535, gw kasi sensor sonar (I2C), trus ada motor driver (I2C) jg. ngkoneksi in ny gmn???
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

tAZZZ

setahu saya sih
dirangkai sesuai gambar dari ksatria baju hitam, klo di atmega8535 silahkan pilih mau pin mana yang dijadikan SCA SDL, asal jangan lupa ntar di programnya diinisialisasikan,
Sensornya harus punya EEPROM untuk bisa diakses sama mikro, nah klo I2C langsung ke motor driver kayaknya ga bisa deh, soalnya dalam protokol I2C Slave harus ngasih sinyal ACK atau NACK, pokoknya si slave harus respon ga cuma nunggu data doank, klo emang maksa mau tetep pake I2C ke motor lebih baik pake mikro lagi atau ga usah deh mending langsung aja dari pin out mikro,
para sesepuh yang lain gimana?

frans3q

tapi bisa ya ada 2 alat pake koneksi I2C ke mikro yg sama?
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Jangankan 2, 10, 20, bahkan 255 I2C pun bisa tapi dengan catatan :
- Masing-masing I2C memiliki alamat unik (unique address) dan tidak boleh sama karena jika alamatnya sama nantinya akan terakses 2 I2C pada waktu yang bersamaan.
- Tegangan dan arus pada line SDA dan SCL masih dalam batas toleransi tegangan TTL agar logika 1 dan logika 0 jelas.

Beberapa I2C juga tersedia kaki CS (Chip Select) untuk mengaktifkan atau menonaktifkan I2C tersebut, nah jika tidak menggunakan metode alamat unik (unique address) manfaatkan kaki CS ini dengan cara multiplexer (multiplexer 3-8 atau 4-16 dst). Dengan metode ini berapapun I2C yang digunakan tidak masalah tetapi arus dan tegangan pada SDA dan SCL harus terpenuhi (rangkaian PCBnya jadi besar karena IC multiplexer).

frans3q

nais inpo..... ntar klo alat nya uda datang gw tanya2 lagi soal I2C ini... blom k bayang klo blom coba...
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

frans3q

#11
nah skr mo nanya I2C nih. ini dari sensor DT Sense (sensor ultrasonic). d kasi sample program buat AT90S2313 tapi krn gw pake nya 8535 gw coba rubah2 dikit jadi nya spt ini :

#include <mega8535.h>
#include <i2c.h>
#include <stdio.h>
#include <delay.h>

typedef unsigned char&  uint8_t;
typedef unsigned int uint16_t;


// I2C Bus functions
#asm
  .equ __i2c_port=0x15 ;PORTC
  .equ __sda_bit=1
  .equ __scl_bit=0
#endasm



//#define ready   PINB.3

uint16_t US,IR1,IR2;

void readReg(void)
{
   uint8_t k;
   i2c_start();
   i2c_write(0xEE);
   i2c_write(3);
   i2c_stop();

   i2c_start();
   i2c_write(0xEF);

   k=i2c_read(1);putchar(k);
   k=i2c_read(1);putchar(k);
   k=i2c_read(1);putchar(k);
   k=i2c_read(0);putchar(k);
   i2c_stop();
}

void writeReg(uint8_t cReg,uint8_t cUS,uint8_t cIR1,uint8_t cIR2)
{
   i2c_start();
   i2c_write(0xEE);
   i2c_write(2);
   i2c_write(cReg);
   i2c_write(cUS);
   i2c_write(cIR1);
   i2c_write(cIR2);
   i2c_stop();
}

void startRanging(void)
{
   i2c_start();
   i2c_write(0xEE);
   i2c_write(0);
   i2c_stop();
}

void readData(void)
{
   uint8_t k;
   i2c_start();
   i2c_write(0xEE);
   i2c_write(1);
   i2c_stop();

   i2c_start();
   i2c_write(0xEF);

   k=i2c_read(1);
   US = k * 256;
   k=i2c_read(1);
   US = US + k;

   k=i2c_read(1);
   IR1 = k * 256;
   k=i2c_read(1);
   IR1 = IR1 + k;

   k=i2c_read(1);
   IR2 = k * 256;
   k=i2c_read(0);
   IR2 = IR2 + k;

   i2c_stop();
}

void sendData(void)
{
//    putchar('J');
//    putchar('a');
//    putchar('r');
//    putchar('a');
//    putchar('k');
//    putchar(0x0D);

   putchar('U');
   putchar('S');
   putchar(':');
//    putchar(' ');
   putchar((US/1000)%10 + 0x30);
   putchar((US/100)%10  + 0x30);
   putchar((US/10)%10   + 0x30);
   putchar((US%10)      + 0x30);
//    putchar(' ');
   putchar('m');
   putchar('m');

   putchar(0x0D);

//    putchar('I');
//    putchar('R');
   putchar('1');
   putchar(':');
//    putchar(' ');
   putchar((IR1/1000)%10 + 0x30);
   putchar((IR1/100)%10  + 0x30);
   putchar((IR1/10)%10   + 0x30);
   putchar((IR1%10)      + 0x30);
//    putchar(' ');
   putchar('m');
   putchar('m');

   putchar(0x0D);

//    putchar('I');
//    putchar('R');
   putchar('2');
   putchar(':');
//    putchar(' ');
   putchar((IR2/1000)%10 + 0x30);
   putchar((IR2/100)%10  + 0x30);
   putchar((IR2/10)%10   + 0x30);
   putchar((IR2%10)      + 0x30);
//    putchar(' ');
   putchar('m');
   putchar('m');

   putchar(0x0D);
   putchar(0x0D);
}

void main(void)
{
// Input/Output Ports initialization
// Port C initialization
//PORTB=0x08;
//DDRB=0x00;
PORTC =0x00;
DDRC = 0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// I2C Bus initialization
i2c_init();

delay_ms(1500);
writeReg(0x0F,128,128,128);
while (1)      
   {
         startRanging();
         delay_ms(500);
         readData();
       sendData();
       delay_ms(1000);
   };
}


scra garis besar gw ngerti prosedur buat inisiasi sensornya. gw liat dari manual ny spt nya uda bener.

masalahnya :
angkanya tumpang tindih di HyperTerminal.

harusnya contoh tampilannya :
US : 0124 mm
IR1 : 0165 mm
IR2 : 0189 mm

nah krn ada error yg gw binggung ga tau dmn error nya tampilannya jadi :


tolong donk pls.... gw uda stress seharian nyari error ny dmn ga nemu.....

btw, klo d 90S2313 kan ada Port buat Busy/Ready pakenya PortB yg buat OC1.
nah kalo d 8535 dmn ya? mksud ny buat penanda uC uda siap buat ngirim / nerima data ato belom.
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Wah banyak tulisan &nbsp jadi binun tuh....
Tulis lagi dunk... :-\

frans3q

#13
ow. gw jg ga sadar.


#include <mega8535.h>
#include <i2c.h>
#include <stdio.h>
#include <delay.h>

typedef unsigned char uint8_t;
typedef unsigned int  uint16_t;


// I2C Bus functions
#asm
 .equ __i2c_port=0x15 ;PORTC
 .equ __sda_bit=1
 .equ __scl_bit=0
#endasm



//#define ready  PINB.3

uint16_t US,IR1,IR2;

void readReg(void)
{
 uint8_t k;
 i2c_start();
 i2c_write(0xEE);
 i2c_write(3);
 i2c_stop();

 i2c_start();
 i2c_write(0xEF);

 k=i2c_read(1);putchar(k);
 k=i2c_read(1);putchar(k);
 k=i2c_read(1);putchar(k);
 k=i2c_read(0);putchar(k);
 i2c_stop();
}

void writeReg(uint8_t cReg,uint8_t cUS,uint8_t cIR1,uint8_t cIR2)
{
 i2c_start();
 i2c_write(0xEE);
 i2c_write(2);
 i2c_write(cReg);
 i2c_write(cUS);
 i2c_write(cIR1);
 i2c_write(cIR2);
 i2c_stop();
}

void startRanging(void)
{
 i2c_start();
 i2c_write(0xEE);
 i2c_write(0);
 i2c_stop();
}

void readData(void)
{
 uint8_t k;
 i2c_start();
 i2c_write(0xEE);
 i2c_write(1);
 i2c_stop();

 i2c_start();
 i2c_write(0xEF);

 k=i2c_read(1);
 US = k * 256;
 k=i2c_read(1);
 US = US + k;

 k=i2c_read(1);
 IR1 = k * 256;
 k=i2c_read(1);
 IR1 = IR1 + k;

 k=i2c_read(1);
 IR2 = k * 256;
 k=i2c_read(0);
 IR2 = IR2 + k;

 i2c_stop();
}

void sendData(void)
{                    
//  putchar('J');
//  putchar('a');
//  putchar('r');
//  putchar('a');
//  putchar('k');
//  putchar(0x0D);

 putchar('U');
 putchar('S');
 putchar(':');
//  putchar(' ');
 putchar((US/1000)%10 + 0x30);
 putchar((US/100)%10  + 0x30);
 putchar((US/10)%10   + 0x30);
    putchar((US%10)   + 0x30);
//  putchar(' ');
 putchar('m');
 putchar('m');

 putchar(0x0D);

//    putchar('I');
//  putchar('R');
 putchar('1');
 putchar(':');
//  putchar(' ');
 putchar((IR1/1000)%10 + 0x30);
 putchar((IR1/100)%10  + 0x30);
 putchar((IR1/10)%10   + 0x30);
 putchar((IR1%10)   + 0x30);
//  putchar(' ');
 putchar('m');
 putchar('m');

 putchar(0x0D);

//  putchar('I');
//  putchar('R');
 putchar('2');
 putchar(':');
//  putchar(' ');
 putchar((IR2/1000)%10 + 0x30);
 putchar((IR2/100)%10 ; + 0x30);
 putchar((IR2/10)%10   + 0x30);
    putchar((IR2%10)      + 0x30);
//    putchar(' ');
    putchar('m');
    putchar('m');

    putchar(0x0D);
    putchar(0x0D);
}

void main(void)
{
// Input/Output Ports initialization
// Port C initialization
//PORTB=0x08;
//DDRB=0x00;
PORTC =0x00;
DDRC = 0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// I2C Bus initialization
i2c_init();

delay_ms(1500);
writeReg(0x0F,128,128,128);
while (1)    
 {
   startRanging();
   delay_ms(500);
   readData();
   sendData();
   delay_ms(1000);
 };
}
Terimakasih banyak buat tmn2 yg uda nambah IQ saya... :D

Too Payz

Kutip
void sendData(void)
{
//    putchar('J');
//    putchar('a');
//    putchar('r');
//    putchar('a');
//    putchar('k');
//    putchar(0x0D);
.....
coba ganti
putsf("Jarak");  putchar(13);   atau    putsf("Jarak\r");  atau    printf("Jarak\r");
Kutip
...............
   putchar((US/1000)%10 + 0x30);
   putchar((US/100)%10 + 0x30);
  putchar((US/10)%10 + 0x30);
   putchar((US%10) + 0x30);
..................
Pake CoViAVR kan ??
jangan seperti itu, kan ada perintah sprintf atau itoa atau ftoa coba baca help-nya..
Karena nilainya pecahan maka gunakan ftoa, cara pakenya :

unsigned char buf_UART[5];   // global variable

ftoa(US,3,buf_UART);
puts(buf_UART);
putsf(" mm\r");

ftoa(IR1,3,buf_UART);
puts(buf_UART);
putsf(" mm\r");

ftoa(IR2,3,buf_UART);
puts(buf_UART);
putsf(" mm\r");

Met mencoba......  :D   :D