<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=16674&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-31T20:33:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16674&amp;mode</id>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-10-31T20:33:19+01:00</updated>
<published>2016-10-31T20:33:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173306#p173306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173306#p173306"/>
<title type="html"><![CDATA[Re: LPS25H/Xmega128A3, obsługa po I2C.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173306#p173306"><![CDATA[
Dodam, że komunikacja z czujnikiem jest, tyle że odbieram kompletne głupoty. Wydaje mi się, że problem leży w tym fragmencie (i również w tej funkcji):<br />[syntax=c]while(I2C_ReadRegister(LPS25H,CTRL_REG2));  //wait till done[/syntax]<br />gdyż nie wiem jak to poprawnie przepisać używając atmelowskiej biblioteki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 31 paź 2016, o 20:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-10-31T17:07:20+01:00</updated>
<published>2016-10-31T17:07:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173296#p173296</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173296#p173296"/>
<title type="html"><![CDATA[Re: LPS25H/Xmega128A3, obsługa po I2C.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173296#p173296"><![CDATA[
Pierwszy listing nie jest mojego autorstwa. W swoim projekcie mam F_CPU w ustawieniach projektu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 31 paź 2016, o 17:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2016-10-31T17:03:55+01:00</updated>
<published>2016-10-31T17:03:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173295#p173295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173295#p173295"/>
<title type="html"><![CDATA[Re: LPS25H/Xmega128A3, obsługa po I2C.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173295#p173295"><![CDATA[
Widzę, że używasz F_CPU w kodzie, zamiast w ustawieniach projektu. Jest to jedno z możliwych źródeł problemów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 31 paź 2016, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-10-31T14:47:59+01:00</updated>
<published>2016-10-31T14:47:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173286#p173286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173286#p173286"/>
<title type="html"><![CDATA[LPS25H/Xmega128A3, obsługa po I2C.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16674&amp;p=173286#p173286"><![CDATA[
Szanowni Forumowicze,<br />mam problem z przeniesieniem pewnego kodu napisanego pod atmegę328 na xmegę128A3. Chodzi tutaj o obsługę czujnika LSP25H, magistrala I2C.<br />Oto kod pod atmegę328:<br />[syntax=c]#define F_CPU 16000000UL<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &quot;uart.c&quot;<br />//set up stdout and stdin<br />static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);<br />#define LED PB5<br />void delayms( uint16_t millis ) {  //approximate 1 millisecond delay<br />while ( millis ) {<br />_delay_ms( 1 );<br />millis--;<br />}<br />}<br />// ---------------------------------------------------------------------------<br />// I2C (TWI) ROUTINES<br />//<br />// The standard clock rate is 100 KHz, and set by I2C_Init<br />#define F_SCL 100000L // I2C clock speed 100 KHz<br />#define READBIT 1  //low bit of device address for read<br />#define TW_START 0xA4 // send start condition (TWINT,TWSTA,TWEN)<br />#define TW_STOP 0x94 // send stop condition (TWINT,TWSTO,TWEN)<br />#define TW_ACK 0xC4 // return ACK to slave<br />#define TW_NACK 0x84 // return NACK to slave<br />#define TW_SEND 0x84 // send data (TWINT,TWEN)<br />#define TW_READY (TWCR &amp; 0x80) // ready when TWINT returns to logic 1.<br />#define TW_STATUS (TWSR &amp; 0xF8) // returns value of status register<br />// LPS25H register definitions<br />#define LPS25H 0xBA    //8-bit device address with SA0 high as per Pololu breakout<br />#define STATUS 0x27<br />#define P_OUT_L 0x28<br />#define T_OUT_L 0x2B<br />#define CTRL_REG1 0x20<br />#define CTRL_REG2 0x21<br />#define CONFIG 0x10<br />#define ID 0x0F<br />void I2C_Init(){<br />// at 16 MHz, the SCL frequency will be 16/(16+2(TWBR)), assuming prescalar of 0.<br />// so for 100KHz SCL, TWBR = ((F_CPU/F_SCL)-16)/2 = ((16/0.1)-16)/2 = 72<br />    TWSR = 0; // prescalar to zero<br />    TWBR = ((F_CPU/F_SCL)-16)/2; // set SCL frequency in TWI bit register<br />}<br />void I2C_Stop(void) {<br />    TWCR=TW_STOP;<br /> // wait for stop condition to be executed on bus<br />   // TWINT is not set after a stop condition!<br /> while(TWCR &amp; _BV(TWSTO));<br />}<br />unsigned char I2C_Detect(unsigned char addr){<br />// look for device at specified address; return 1=found, 0=not found<br />    TWCR = TW_START; // send start condition<br />    while (!TW_READY); //wait<br />TWDR = addr; // load device's bus address<br />    TWCR = TW_SEND; // and send it<br />    while (!TW_READY);<br />    return (TW_STATUS==0x18); // return 1 if found; 0 otherwise<br />}<br />void ShowDevices(void){<br />// search all 127 addresses, report those present on the I2C bus<br />    for (unsigned char addr=1; addr&lt;128; addr++) { <br />    if (I2C_Detect(addr&lt;&lt;1)) // I2C detected?<br />       printf(&quot; .%02X&quot;,addr&lt;&lt;1);<br />I2C_Stop();<br />}<br />}<br />void I2C_Start (unsigned char slaveAddr) {<br />    I2C_Detect(slaveAddr);<br />}<br />unsigned char I2C_Write (unsigned char data) {<br />// sends a byte to slave<br />    TWDR = data; // load data to be sent<br />TWCR = TW_SEND; // and send it<br />while (!TW_READY); // wait<br />return (TW_STATUS!=0x28); //0 if successful, 1 if not<br />}<br />unsigned char I2C_ReadACK () { <br />// reads a byte from slave<br />    TWCR = TW_ACK; // ack = will read more data<br />while (!TW_READY); // wait<br />return TWDR;<br />//return (TW_STATUS!=0x28);<br />}<br />unsigned char I2C_ReadNACK () { <br />// reads a byte from slave<br />    TWCR = TW_NACK; // nack = not reading more data<br />while (!TW_READY); // wait<br />return TWDR;<br />//return (TW_STATUS!=0x28);<br />}<br />void I2C_WriteByte (unsigned char busAddr, unsigned char data) {<br />// write byte to slave<br />    I2C_Start(busAddr); // send bus address<br />I2C_Write(data); // then send the byte<br />I2C_Stop();<br />}<br />void I2C_WriteRegister(unsigned char busAddr, unsigned char deviceRegister, unsigned char data){<br />    I2C_Start(busAddr); // send bus address<br />I2C_Write(deviceRegister); // first unsigned char = device register address<br />I2C_Write(data); // second unsigned char = data for device register<br />I2C_Stop();<br />}<br />unsigned char I2C_ReadRegister(unsigned char busAddr, unsigned char deviceRegister) {<br />// read single byte of data in register<br />    unsigned char data = 0;<br />I2C_Start(busAddr); // send device address<br />I2C_Write(deviceRegister); // set register pointer<br />I2C_Start(busAddr+READBIT); // restart as a read operation<br />data = I2C_ReadNACK(); // read the register data<br />I2C_Stop(); // stop<br />return data;<br />}<br />// Read a two-byte word, low order first<br />signed int I2C_ReadTempRaw(unsigned char busAddr, unsigned char deviceRegister) {<br />    unsigned int data = 0;<br />unsigned char l;<br />I2C_Start(busAddr); // send device address<br />I2C_Write(deviceRegister | 0x80); // set register pointer, autoincrement<br />I2C_Start(busAddr+READBIT); // restart as a read operation<br />l = I2C_ReadACK(); // read the register data<br />data |= I2C_ReadNACK(); //read next unsigned char<br />I2C_Stop(); // stop<br />return (signed int) ((data&lt;&lt;8)|l);<br />}<br />// read a 3 byte value, lowest order byte first<br />signed long I2C_ReadPressureRaw(unsigned char busAddr, unsigned char deviceRegister) {<br />    unsigned char pxl,pl,ph;<br />I2C_Start(busAddr); // send device address<br />I2C_Write(deviceRegister | 0x80); // set register pointer, autoincrement<br />I2C_Start(busAddr+READBIT); // restart as a read operation<br />pxl = I2C_ReadACK(); // read ls byte<br />pl = I2C_ReadACK(); // read middle<br />ph = I2C_ReadNACK(); // read high<br />I2C_Stop(); // stop<br />return (int32_t)ph &lt;&lt; 16 | (uint16_t)pl &lt;&lt; 8 | pxl;<br />}<br />int main( void ) {<br />    unsigned char id;<br />long p;<br />int t;<br />double pp,tt;<br /><br />DDRB |= (1 &lt;&lt; LED);// set LED pin to output<br /><br />uart_init(9600);<br />stdout = &amp;mystdout; //Required for printf init<br /><br />printf(&quot;Init I2C\r\n&quot;);<br /> I2C_Init();<br />printf(&quot;Showing all I2C devices attached&quot;);<br />ShowDevices();<br />printf(&quot;\r\ndone\r\n&quot;);<br />id=I2C_ReadRegister(LPS25H,ID); //check internal device ID<br />printf(&quot;LPS25H Device Id= %02x\r\n&quot;,id);<br />// recommended one-shot operation (see AN4450 from ST)<br />    I2C_WriteRegister(LPS25H,CONFIG,0x0f); //set to maximum averaging<br /><br />id=I2C_ReadRegister(LPS25H,CONFIG); //read back configuration<br />printf(&quot;Config= %02x\r\n&quot;,id);<br /><br />while(1) {<br /><br />I2C_WriteRegister(LPS25H,CTRL_REG1,0x84); //power up, one shot mode, BDU=1<br />I2C_WriteRegister(LPS25H,CTRL_REG2,1); //initiate measurement<br /><br />while(I2C_ReadRegister(LPS25H,CTRL_REG2));  //wait till done<br /><br />p = I2C_ReadPressureRaw(LPS25H,P_OUT_L);<br />pp = p /4096.;  // sensitivity = 4096 LSB per hPa<br />t = I2C_ReadTempRaw(LPS25H,T_OUT_L);<br />tt = t/480. + 42.5;  //sensitivity = 480 LSB per degree C<br />printf(&quot;pt: %8.3f, %5.2f\r\n&quot;,pp,tt);<br />}<br /><br />I2C_WriteRegister(LPS25H,CTRL_REG1,0x00); //power down reset<br />delayms(200); //give it a rest!<br />}[/syntax]<br /><br />Chcę przeportować tylko obsługę czujnika, strumienie 'stdout' nie są mi potrzebne gdyż wynik pomiaru przesyłam sobie za pomocą nrf24l01 do centrali i potem do komputera. Oto, co napisałem i nie działa:<br />[syntax=c]// pomiar ciśnienia *****************************<br />// uint8_t sendBufferLPS&#91;&#93; = {CONFIG_LPS,0x0f,CTRL_REG1,0x84,CTRL_REG2, 0x01, P_OUT_L | 80,CTRL_REG1,0x00};<br /><br />// konfiguracja czujnika<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBufferLPS&#91;0&#93;,<br />2,<br />0);<br /><br />while ((twiMaster.status != TWIM_STATUS_READY) &amp;&amp; (spiTimeout &gt; 0)) {<br />spiTimeout--;<br />}<br /><br />if (spiTimeout == 0)<br />{<br />//MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br />TWIE_MASTER_STATUS &amp;= ~(1&lt;&lt;TWI_MASTER_BUSSTATE1_bp);<br />TWIE_MASTER_STATUS |= (1&lt;&lt;TWI_MASTER_BUSSTATE0_bp);<br />}<br /><br />spiTimeout = 1000000000000;<br /><br />// włączenie czujnika i rozpoczęcie pomiaru<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBufferLPS&#91;2&#93;,<br />4,<br />0);<br /><br />while ((twiMaster.status != TWIM_STATUS_READY) &amp;&amp; (spiTimeout &gt; 0)) {<br />spiTimeout--;<br />}<br /><br />if (spiTimeout == 0)<br />{<br />//MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br />TWIE_MASTER_STATUS &amp;= ~(1&lt;&lt;TWI_MASTER_BUSSTATE1_bp);<br />TWIE_MASTER_STATUS |= (1&lt;&lt;TWI_MASTER_BUSSTATE0_bp);<br />}<br /><br />// odczekanie na zakończenie pomiaru<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBufferLPS&#91;4&#93;,<br />1,<br />1);<br /><br />while ((twiMaster.status != TWIM_STATUS_READY) &amp;&amp; (spiTimeout &gt; 0)) {<br />spiTimeout--;<br />}<br /><br />if (spiTimeout == 0)<br />{<br />//MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br />TWIE_MASTER_STATUS &amp;= ~(1&lt;&lt;TWI_MASTER_BUSSTATE1_bp);<br />TWIE_MASTER_STATUS |= (1&lt;&lt;TWI_MASTER_BUSSTATE0_bp);<br />}<br /><br />// odczytanie pomiaru<br />TWI_MasterWriteRead(&amp;twiMaster,<br />SLAVE_ADDRESS,<br />&amp;sendBufferLPS&#91;6&#93;,<br />1,<br />3);<br /><br />while ((twiMaster.status != TWIM_STATUS_READY) &amp;&amp; (spiTimeout &gt; 0)) {<br />spiTimeout--;<br />}<br /><br />if (spiTimeout == 0)<br />{<br />//MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br />TWIE_MASTER_STATUS &amp;= ~(1&lt;&lt;TWI_MASTER_BUSSTATE1_bp);<br />TWIE_MASTER_STATUS |= (1&lt;&lt;TWI_MASTER_BUSSTATE0_bp);<br />}<br /><br />tempBuffer&#91;9&#93;  = twiMaster.readData&#91;0&#93;;<br />tempBuffer&#91;10&#93; = twiMaster.readData&#91;1&#93;;<br />tempBuffer&#91;11&#93; = twiMaster.readData&#91;2&#93;;[/syntax]<br /><br />Wydaje mi się, że źle mam przepisany fragment pt.: &quot;odczekanie na zakończenie pomiaru&quot;, ale nie mam pomysłu jak inaczej to zrobić. W załączniku przesyłam DS czujnika oraz bibliotekę do obslugi I2C (to biblioteka atmela bez żadnych zmian z mojej strony).<br />Proszę uprzejmie o wskazówki i podrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 31 paź 2016, o 14:47</p><hr />
]]></content>
</entry>
</feed>