<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; Аппаратный I2C]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=302</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=302&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Аппаратный I2C».]]></description>
		<lastBuildDate>Wed, 05 May 2021 03:50:32 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Аппаратный I2C]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=3450#p3450</link>
			<description><![CDATA[<p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/05/e7dcedfa28044bee2007ac6c012f574b.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/05/e7dcedfa28044bee2007ac6c012f574b.png" /></span> </p><div class="codebox"><pre><code>#define ADDR    0b1101000
#define CPU_F   16000000
#define SCL_F   100000

void setup() {
  Serial.begin(9600);
   TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
   TWSR = 0;
  set_time(21,5,4,29,9,57,0);// год 00-99, ДН 1-7 (1=ВС), месяц 1-12, дата 1-31, час 0-23, минуты 0-59, секунды 0-59
}

void loop() {
  byte sec =  (i2c_read(ADDR,0) &amp; 0x0F) + (((i2c_read(ADDR,0) &amp; 0x70) &gt;&gt; 4) * 10);
  byte min =  (i2c_read(ADDR,1) &amp; 0x0F) + (((i2c_read(ADDR,1) &amp; 0x70) &gt;&gt; 4) * 10);
  byte hour = ((i2c_read(ADDR,2) &amp; 0x0F) + ((i2c_read(ADDR,2) &amp; 0x70) &gt;&gt; 4) * 10);
  byte day =  (i2c_read(ADDR,3) &amp; 0x0F);
  byte datat = ((i2c_read(ADDR,4) &amp; 0x0F) + ((i2c_read(ADDR,4) &amp; 0x70) &gt;&gt; 4) * 10);
  byte mont = ((i2c_read(ADDR,5) &amp; 0x0F) + ((i2c_read(ADDR,5) &amp; 0x70) &gt;&gt; 4) * 10);
  byte year = ((i2c_read(ADDR,6) &amp; 0x0F) + ((i2c_read(ADDR,6) &amp; 0x70) &gt;&gt; 4) * 10);
  int temper = (i2c_read(ADDR,0x11)*100 + ((i2c_read(ADDR,0x12) &amp; 0b11000000) &gt;&gt; 6)*25) ;
Serial.print(hour);
Serial.print(&quot;:&quot;);
Serial.print(min);
Serial.print(&quot;:&quot;);
Serial.print(sec);
Serial.print(&quot; &quot;);
Serial.print(datat);
Serial.print(&quot;-&quot;);
Serial.print(mont);
Serial.print(&quot;-&quot;);
Serial.print(year);
Serial.print(&quot; &quot;);
Serial.print(day);
Serial.print(&quot; &quot;);
Serial.print(temper/100);
Serial.print(&quot;.&quot;);
Serial.print(temper%10);
Serial.println(&quot; C&quot;);

delay(100);
}

byte i2c_read(byte i2c_addr, byte i2c_reg){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT))); 
   TWDR = (i2c_addr &lt;&lt; 1) | 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   byte i2c_data = TWDR;  
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
   return i2c_data;
  }

void i2c_write(byte i2c_addr, byte i2c_reg, byte i2c_dat){
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_addr &lt;&lt; 1;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_reg;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWDR = i2c_dat;
   TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
  }  

void set_time(byte years, byte days, byte monts, byte datas, byte hours ,byte minute, byte second){
    if(second &lt; 255){i2c_write(ADDR,0x00,(second/10&lt;&lt;4)+second%10);}
    if(minute &lt; 255){i2c_write(ADDR,0x01,(minute/10&lt;&lt;4)+minute%10);} 
    if(hours &lt; 255){i2c_write(ADDR,0x02,(hours/10&lt;&lt;4)+hours%10);}
    if(days &lt; 255){i2c_write(ADDR,0x03,days);}
    if(datas &lt; 255){i2c_write(ADDR,0x04,(datas/10&lt;&lt;4)+datas%10);}
    if(monts &lt; 255){i2c_write(ADDR,0x05,(monts/10&lt;&lt;4)+monts%10);}
    if(years &lt; 255){i2c_write(ADDR,0x06,(years/10&lt;&lt;4)+years%10);}
  }  </code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 05 May 2021 03:50:32 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=3450#p3450</guid>
		</item>
		<item>
			<title><![CDATA[Аппаратный I2C]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=3447#p3447</link>
			<description><![CDATA[<p>Пример: чтение секунд в DS3231</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2021/05/8a7e35b4d5fd02d1c1676e7c89a1b3e7.png" alt="http://forum.rcl-radio.ru/uploads/images/2021/05/8a7e35b4d5fd02d1c1676e7c89a1b3e7.png" /></span> </p><div class="codebox"><pre><code>#define ADDR    0b1101000
#define CPU_F   16000000
#define SCL_F   100000

void setup() {
  Serial.begin(9600);
   TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
   TWSR = 0;

}

void loop() {
  // write
  TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));

  TWDR = ADDR &lt;&lt; 1;
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));

  TWDR = 0;
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));

  // read
  TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWSTA)|(1&lt;&lt;TWEN);  // START
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   
  TWDR = (ADDR &lt;&lt; 1) | 1;
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
   
  TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);
  while (!(TWCR &amp; (1&lt;&lt;TWINT)));
  byte data = TWDR;
   
  TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO); // СТОП
   
   byte sec =  (data &amp; 0x0F) + (((data &amp; 0x70) &gt;&gt; 4) * 10);
Serial.println(sec);

delay(100);
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Tue, 04 May 2021 17:51:56 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=3447#p3447</guid>
		</item>
	</channel>
</rss>
