«

»

Jul 31

NS.One dan Wire Library

Wire library yang disertakan dalam software NS.One dan Arduino, memungkinkan kita untuk berkomunikasi dengan divais I2C / TWI. Bus I2C mendukung hingga 119 divais. Walaupun memiliki alamat 7-bit (128 nilai), alamat 0 digunakan untuk broadcast ke seluruh divais dan alamat 120-127 untuk kebutuhan ke depan.

Pada board NS.One, SDA (jalur data) dan SCL (jalur clock) terletak pada pin 17 (PC1) dan 16 (PC0).

Terdapat dua versi pengalamatan I2C, 7-bit dan 8-bit. 7 bit pertama meng-identifikasi divais, dan bit ke delapan menentukan proses tulis atau baca.

Jadi, pengalamatan 8-bit memiliki dua alamat, satu alamat untuk menulis dan satu alamat untuk membaca.

Pustaka Wire menggunakan pengalamatan 7-bit. Bila pada datasheet atau contoh, menggunakan alamat 8-bit, alamat terakhir dibuang dgn menggeser satu bit ke kanan, menyisakan sebuah alamat antara 0 dan 127.

Sebagai contoh, chip DS1307 memiliki alamat 8-bit 0xD0. Setelah digeser satu bit ke kanan, alamat menjadi 0x68, dan alamat ini yang digunakan dalam program berbasis pustaka Wire.

Perlu diketahui, pustaka Wire menggunakan frekuensi SCL 100 kHz, sehingga bila dihubungkan denga divais yang lebih lambat, akan menimbulkan masalah (tidak terjadi komunikasi).

#include <Wire.h>
#define rtc 0x68 // The pre-defined address for DS1307

int ss,mm,hh,dd,DD,MM,YY;
int prev;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  static char buff[20];
  get_time();
  if(ss!=prev)                // lcd Print when the seconds change
  {
    sprintf(buff,"%02d-%02d-%02d",DD,MM,2000+YY);
    Serial.println(buff);
    sprintf(buff,"%02d:%02d:%02d",hh,mm,ss);
    Serial.println(buff);
    prev=ss;
  }
}

void get_time()
{
  Wire.beginTransmission(rtc); // start communication over i2c with DS1307
  Wire.write((byte)0); // Write the value of the register to point to
  Wire.endTransmission(); // End communication over i2c with DS1307

  Wire.requestFrom(rtc,7); // This will request 7 bytes of data                           
  ss = bcdToDec(Wire.read()); //starting from the '0' the register
  mm = bcdToDec(Wire.read());
  hh = bcdToDec(Wire.read());
  dd = bcdToDec(Wire.read());
  DD = bcdToDec(Wire.read());
  MM = bcdToDec(Wire.read());
  YY = bcdToDec(Wire.read());
  Wire.endTransmission();
}

void set_time()
{
  Wire.beginTransmission(rtc);
  Wire.write((byte)0);
  Wire.write(decToBCD(50));    // seconds
  Wire.write(decToBCD(59));    // minutes
  Wire.write(decToBCD(11));    // hours
  Wire.write(decToBCD(3));     // day of the week, startin monday
  Wire.write(decToBCD(21));    // date
  Wire.write(decToBCD(12));    // month
  Wire.write(decToBCD(11));    // year
  Wire.endTransmission();
}

int decToBCD(int dec)
{
  return dec/10*16 + (dec%10);
}

int bcdToDec(int bcd)
{
  return bcd/16*10 + (bcd%16);
}