title: Accessing RTC(DS1307) through I2C in ATmega16
body: <p>I have written a code to access RTC(DS1307) through I2C using ATmega16 and I am using compiler AVR Studio 4.</p>
  
  <p>Code is given below:-</p>
  
  <pre><code>#include&lt;avr/io.h&gt;
  #include&lt;util/delay.h&gt;
  #define F_CPU 1000000UL
  
  void rtc_init(void)
  {
  TWSR=0x00;
  TWBR=0x47;
  TWCR=0x04;
  
  }
  
  void rtc_start(void)
  {
  TWCR=(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWINT);
  
  while(TWCR &amp; (1&lt;&lt;TWINT)==0);
  
  }
  
  
  unsigned char rtc_read(void)
  {
  TWCR=(1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);
  while(!(TWCR &amp; (1&lt;&lt;TWINT)));
  return(TWDR);
  }
  
  void rtc_write(unsigned char data)
  {
  TWDR=data;// sending address
  TWCR=(1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);
  while(TWCR &amp; (1&lt;&lt;TWINT)==0);
  }
  
  void rtc_stop()
  {
  TWCR=(1&lt;&lt;TWINT)|(TWSTO)|(1&lt;&lt;TWEN);
  while(TWCR &amp; (1&lt;&lt;TWINT)==0);
  
  }
  
  main()
  {
  unsigned char sec,min,hr;
  DDRA=0xFF;
  DDRB=0xFF;
  
  
  rtc_init();
  _delay_ms(1000);
  
  rtc_start();
  
  rtc_write(0b11010000);   // 1101000=adress of ds1307 and bit 0= write   
  rtc_write(0x00);  // pointing address location 00 i.e seconds
  rtc_write(0x00);// set sec=0
  rtc_write(0x00);// set min=0
  rtc_write(0x00);// set hr=0
  
  rtc_stop();
  
  
  while(1)
  {
  
  rtc_start();
  rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
  rtc_write(0x00);  // pointing address location 00 i.e seconds
  sec=rtc_read();
  rtc_stop();
  PORTA=sec;
  PORTB=0x01;
  _delay_ms(5000);
  rtc_start();
  rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
  rtc_write(0x01);  // pointing address location 00 i.e seconds
  min=rtc_read();
  rtc_stop();
  PORTA=min;
  PORTB=0x02;
  _delay_ms(5000);
  rtc_start();
  rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
  
  hr=rtc_read();
  rtc_stop();
  PORTA=hr;
  PORTB=0b00000100;
  _delay_ms(5000);
  }
  }
  </code></pre>
  
  <p>I have successfully build the above code. When I am running this code on PROTEUS simulator I am not getting any output, but polling in the code working properly for applying delay.</p>
  
  <p>I want to know where I have done wrong and how to resolve it.   </p>