<?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=17930&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-03-22T13:41:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17930&amp;mode</id>
<entry>
<author><name><![CDATA[robo1973]]></name></author>
<updated>2017-03-22T13:41:01+01:00</updated>
<published>2017-03-22T13:41:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185354#p185354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185354#p185354"/>
<title type="html"><![CDATA[Re: TWI Xmega 128 &gt;&gt;&gt;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185354#p185354"><![CDATA[
adres 0x10, takie jest w dokumentacji i z takim działa na atxmega128 a1 a na atxmega128a3u juz nie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6554">robo1973</a> — 22 mar 2017, o 13:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-03-21T22:22:02+01:00</updated>
<published>2017-03-21T22:22:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185312#p185312</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185312#p185312"/>
<title type="html"><![CDATA[Re: TWI Xmega 128 &gt;&gt;&gt;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185312#p185312"><![CDATA[
Jaki adres podajesz? 0x10 czy 0x20 czy wiesz czym się różni ten zapis i co biblioteka z tym robi przy odczycie i zapisie? 0x10 oznacza 0b 001 000 gdzie bit R/W dokładany jest na koniec w drugim przypadku wygląda to tak 0b0010 000x, gdzie x wynosci 0 dla zapisu i 1 dla odczytu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 21 mar 2017, o 22:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robo1973]]></name></author>
<updated>2017-03-21T21:26:24+01:00</updated>
<published>2017-03-21T21:26:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185305#p185305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185305#p185305"/>
<title type="html"><![CDATA[Re: TWI Xmega 128 &gt;&gt;&gt;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185305#p185305"><![CDATA[
tak 2 MHz Mam tak ustawione we właściwościach<br /><br />ten czujnik chcę podłączyć <!-- m --><a class="postlink" href="https://www.sparkfun.com/products/12780" >https://www.sparkfun.com/products/12780</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6554">robo1973</a> — 21 mar 2017, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2017-03-20T22:54:32+01:00</updated>
<published>2017-03-20T22:54:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185248#p185248</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185248#p185248"/>
<title type="html"><![CDATA[Re: TWI Xmega 128 &gt;&gt;&gt;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185248#p185248"><![CDATA[
A jaką częstotliwością taktujesz mikrokontroler 2 MHz?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 20 mar 2017, o 22:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robo1973]]></name></author>
<updated>2017-03-20T20:41:59+01:00</updated>
<published>2017-03-20T20:41:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185239#p185239</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185239#p185239"/>
<title type="html"><![CDATA[TWI Xmega 128 &gt;&gt;&gt;]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17930&amp;p=185239#p185239"><![CDATA[
możecie zobaczyć co jest nie tak bo nie inicjuje czujnika po TWI<br />ustawione F_CPU=2000000UL<br /><br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br /><br /><br /> #include &quot;ZX-Sensor.h&quot;<br /><br /> #define TWI_BAUD(F_SYS, F_TWI) ((F_SYS / (2 * F_TWI)) - 5)<br /> <br /><br /> namespace I2C<br /> {<br /><br /> void Init(TWI_t &amp;twi, uint8_t baud)<br /> {<br /><br />    <br /> twi.MASTER.CTRLB = TWI_MASTER_SMEN_bm;<br /> twi.MASTER.BAUD = baud;<br /> twi.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;<br /> twi.MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;<br /> }<br /> void Addr(TWI_t &amp;twi, uint8_t addr)<br /> {<br /> twi.MASTER.ADDR = addr;<br /> while(!(twi.MASTER.STATUS&amp;TWI_MASTER_WIF_bm));<br /> }<br /> void Write(TWI_t &amp;twi, uint8_t data)<br /> {<br /> twi.MASTER.DATA = data;<br /> while(!(twi.MASTER.STATUS&amp;TWI_MASTER_WIF_bm));<br /> }<br /> void Stop(TWI_t &amp;twi)<br /> {<br /> twi.MASTER.CTRLC = TWI_MASTER_CMD_gm;<br /> }<br /> void WriteBuf(TWI_t &amp;twi, uint8_t sla, uint8_t control, uint16_t len, uint8_t* buf)<br /> {<br /> Addr(twi, sla);<br /> Write(twi, control);<br /> while(len--)Write(twi, *buf++);<br /> Stop(twi);<br /> <br /> }<br /> uint8_t twi_read(TWI_t &amp;twi, uint8_t address){<br /><br /> twi.MASTER.ADDR = address;<br /> while(!(twi.MASTER.STATUS&amp;TWI_MASTER_WIF_bm));<br /><br /> twi.MASTER.DATA = 0x00;       // write word addrpointer first<br /> twi.MASTER.ADDR = address;    // send read command              // read date and time<br /> while(!(twi.MASTER.STATUS&amp;TWI_MASTER_RIF_bm));<br /> return  twi.MASTER.DATA;<br /><br /> }<br /><br /><br /> }<br /><br /><br /><br /><br />/*******************************************************************************<br /> * Initialization<br /> ******************************************************************************/<br /><br />/**<br /> * @brief Constructor - Instantiates ZX_Sensor object<br /> */<br />ZX_Sensor::ZX_Sensor(int address)<br />{<br />    addr_ = address;<br /><br />}<br /><br />/**<br /> * @brief Destructor<br /> */<br />ZX_Sensor::~ZX_Sensor()<br />{<br /><br />}<br /><br />/**<br /> * @brief Configures I2C communications and checks ZX sensor model number.<br /> *<br /> * @param enable_interrupts enables DR pin to assert on events<br /> * @return True if initialized successfully. False otherwise.<br /> */<br />bool ZX_Sensor::init(   InterruptType interrupts /* = NO_INTERRUPTS */,<br />                            bool active_high /* = true */)<br />{<br />    <br />    /* Initialize I2C */<br />    I2C::Init(ZX_I2C, TWI_BAUD(F_CPU,100000));<br />    <br />    /* Enable DR interrupts based on desired interrupts */<br />    setInterruptTrigger(interrupts);<br />    configureInterrupts(active_high, false);<br />    if ( interrupts == NO_INTERRUPTS ) {<br />        disableInterrupts();<br />    } else {<br />        enableInterrupts();<br />    }<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Reads the sensor model version<br /> *<br /> * @return sensor model version number<br /> */<br />uint8_t ZX_Sensor::getModelVersion()<br />{<br />    uint8_t ver;<br />    <br />    if ( !wireReadDataByte(ZX_MODEL, ver) ) {<br />        return ZX_ERROR;<br />    }<br /><br />    return ver;<br />}<br /><br />/**<br /> * @brief Reads the register map version<br /> *<br /> * @return register map version number<br /> */<br />uint8_t ZX_Sensor::getRegMapVersion()<br />{<br />    uint8_t ver;<br />    <br />    if ( !wireReadDataByte(ZX_REGVER, ver) ) {<br />        return ZX_ERROR;<br />    }<br />    <br />    return ver;<br />}<br /><br />/*******************************************************************************<br /> * Interrupt Configuration<br /> ******************************************************************************/<br /><br /> /**<br />  * @brief Sets the triggers that cause the DR pin to change<br />  *<br />  * @param&#91;in&#93; interrupts which types of interrupts to enable<br />  * @return True if operation successful. False otherwise.<br />  */<br />bool ZX_Sensor::setInterruptTrigger(InterruptType interrupts)<br />{<br />    <br />#if DEBUG<br /> //   Serial.print(F(&quot;Setting interrupts: &quot;));<br /> //   Serial.println(interrupts);<br />#endif<br /><br />    switch ( interrupts ) {<br />        case POSITION_INTERRUPTS:<br />            if ( !setRegisterBit(ZX_DRE, DRE_CRD) ) {<br />                return false;<br />            }<br />            break;<br />        case GESTURE_INTERRUPTS:<br />            if ( !setRegisterBit(ZX_DRE, DRE_SWP) ) {<br />                return false;<br />            }<br />            if ( !setRegisterBit(ZX_DRE, DRE_HOVER) ) {<br />                return false;<br />            }<br />            if ( !setRegisterBit(ZX_DRE, DRE_HVG) ) {<br />                return false;<br />            }<br />            break;<br />        case ALL_INTERRUPTS:<br />            if ( !wireWriteDataByte(ZX_DRE, SET_ALL_DRE) ) {<br />                return false;<br />            }<br />            break;<br />        default:<br />            if ( !wireWriteDataByte(ZX_DRE, 0x00) ) {<br />                return false;<br />            }<br />            break;<br />    }<br />    <br />#if DEBUG<br />//     uint8_t val;<br />//     wireReadDataByte(ZX_DRE, val);<br />//     Serial.print(F(&quot;ZX_DRE: b&quot;));<br />//     Serial.println(val, BIN);<br />#endif<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Configured the behavior of the DR pin on an interrupt<br /> *<br /> * @param&#91;in&#93; active_high true for DR active-high. False for active-low.<br /> * @param&#91;in&#93; pin_pulse true: DR pulse. False: DR pin asserts until STATUS read<br /> * @return True if operation successful. False otherwise.<br /> */<br />bool ZX_Sensor::configureInterrupts(    bool active_high, <br />                                            bool pin_pulse /* = false */)<br />{<br />    /* Set or clear polarity bit to make DR active-high or active-low */<br />    if ( active_high ) {<br />        if ( !setRegisterBit(ZX_DRCFG, DRCFG_POLARITY) ) {<br />            return false;<br />        }<br />    } else {<br />        if ( !clearRegisterBit(ZX_DRCFG, DRCFG_POLARITY) ) {<br />            return false;<br />        }<br />    }<br />    <br />    /* Set or clear edge bit to make DR pulse or remain set until STATUS read */<br />    if ( pin_pulse ) {<br />        if ( !setRegisterBit(ZX_DRCFG, DRCFG_EDGE) ) {<br />            return false;<br />        }<br />    } else {<br />        if ( !clearRegisterBit(ZX_DRCFG, DRCFG_EDGE) ) {<br />            return false;<br />        }<br />    }<br />    <br />#if DEBUG<br />    uint8_t val;<br />    wireReadDataByte(ZX_DRCFG, val);<br />//    Serial.print(F(&quot;ZX_DRCFG: b&quot;));<br />//    Serial.println(val, BIN);<br />#endif<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Turns on interrupts so that DR asserts on desired events.<br /> *<br /> * @return True if operation successful. False otherwise.<br /> */<br />bool ZX_Sensor::enableInterrupts()<br />{<br />    if ( !setRegisterBit(ZX_DRCFG, DRCFG_EN) ) {<br />        return false;<br />    }<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Turns off interrupts so that DR will never assert.<br /> *<br /> * @return True if operation successful. False otherwise.<br /> */<br />bool ZX_Sensor::disableInterrupts()<br />{<br />    if ( !clearRegisterBit(ZX_DRCFG, DRCFG_EN) ) {<br />        return false;<br />    }<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Reads the STATUS register to clear an interrupt (de-assert DR)<br /> *<br /> * @return True if operation successful. False otherwise.<br /> */<br />bool ZX_Sensor::clearInterrupt()<br />{<br />    uint8_t val;<br />    <br />    if ( !wireReadDataByte(ZX_STATUS, val) ) {<br />        return false;<br />    }<br />    <br />    return true;<br />}<br /><br />/*******************************************************************************<br /> * Data available<br /> ******************************************************************************/<br /><br /> /**<br />  * @brief Indicates that new position (X or Z) data is available<br />  *<br />  * @return True if data is ready to be read. False otherwise.<br />  */<br />bool ZX_Sensor::positionAvailable()<br />{<br />    uint8_t status;<br />    <br />    /* Read STATUS register and extract DAV bit */<br />    if ( !wireReadDataByte(ZX_STATUS, status) ) {<br />        return false;<br />    }<br />    status &amp;= 0b00000001;<br />    if ( status ) {<br />        return true;<br />    }<br />    <br />    return false;<br />}<br /><br />/**<br /> * @brief Indicates that a gesture is available to be read<br /> *<br /> * @return True if gesture is ready to be read. False otherwise.<br /> */<br />bool ZX_Sensor::gestureAvailable()<br />{<br />    uint8_t status;<br />    <br />    /* Read STATUS register and extract SWP bit */<br />    if ( !wireReadDataByte(ZX_STATUS, status) ) {<br />        return false;<br />    }<br />    status &amp;= 0b00011100;<br />    if ( status ) {<br />        return true;<br />    }<br />    <br />    return false;<br />}<br /><br />/*******************************************************************************<br /> * Sensor data read<br /> ******************************************************************************/<br /><br />/**<br /> * @brief Reads the X position data from the sensor<br /> *<br /> * @return 0-240 for X position. 0xFF on read error.<br /> */<br />uint8_t ZX_Sensor::readX()<br />{<br />    uint8_t x_pos;<br />    <br />    /* Read X Position register and return it */<br />    if ( !wireReadDataByte(ZX_XPOS, x_pos) ) {<br />        return ZX_ERROR;<br />    }<br />    if ( x_pos &gt; MAX_X ) {<br />        return ZX_ERROR;<br />    }<br />    return x_pos;<br />}<br /><br />/**<br /> * @brief Reads the Z position data from the sensor<br /> *<br /> * @return 0-240 for Z position. 0xFF on read error.<br /> */<br />uint8_t ZX_Sensor::readZ()<br />{<br />    uint8_t z_pos;<br />    <br />    /* Read X Position register and return it */<br />    if ( !wireReadDataByte(ZX_ZPOS, z_pos) ) {<br />        return ZX_ERROR;<br />    }<br />    if ( z_pos &gt; MAX_Z ) {<br />        return ZX_ERROR;<br />    }<br />    return z_pos;<br />}<br /><br />/**<br /> * @brief Reads the last detected gesture from the sensor<br /> *<br /> * 0x01 Right Swipe<br /> * 0x02 Left Swipe<br /> * 0x03 Up Swipe<br /> *<br /> * @return a number corresponding to  a gesture. 0xFF on error.<br /> */<br />GestureType ZX_Sensor::readGesture()<br />{<br />    uint8_t gesture;<br />    <br />    /* Read GESTURE register and return the value */<br />    if ( !wireReadDataByte(ZX_GESTURE, gesture) ) {<br />        return NO_GESTURE;<br />    }<br />#if DEBUG<br />  //  Serial.print(F(&quot;Gesture read: &quot;));<br />   // Serial.println(gesture);<br />#endif<br />    switch ( gesture ) {<br />        case RIGHT_SWIPE:<br />            return RIGHT_SWIPE;<br />        case LEFT_SWIPE:<br />            return LEFT_SWIPE;<br />        case UP_SWIPE:<br />            return UP_SWIPE;<br />        default:<br />            return NO_GESTURE;<br />    }<br />}<br /><br />/**<br /> * @brief Reads the speed of the last gesture from the sensor<br /> *<br /> * @return a number corresponding to the speed of the gesture. 0xFF on error.<br /> */<br />uint8_t ZX_Sensor::readGestureSpeed()<br />{<br />    uint8_t speed;<br />    <br />    /* Read GESTURE register and return the value */<br />    if ( !wireReadDataByte(ZX_GSPEED, speed) ) {<br />        return ZX_ERROR;<br />    }<br />    <br />    return speed;<br />}<br /><br />/*******************************************************************************<br /> * Bit Manipulation<br /> ******************************************************************************/<br /> <br />/**<br /> * @brief sets a bit in a register over I2C<br /> *<br /> * @param&#91;in&#93; bit the number of the bit (0-7) to set<br /> * @return True if successful write operation. False otherwise.<br /> */<br />bool ZX_Sensor::setRegisterBit(uint8_t reg, uint8_t bit)<br />{<br />    uint8_t val;<br />    <br />    /* Read value from register */<br />    if ( !wireReadDataByte(reg, val) ) {<br />        return false;<br />    }<br />    <br />    /* Set bits in register and write back to the register */<br />    val |= (1 &lt;&lt; bit);<br />    if ( !wireWriteDataByte(reg, val) ) {<br />        return false;<br />    }<br />    <br />    return true;    <br />}<br /><br />/**<br /> * @brief clears a bit in a register over I2C<br /> *<br /> * @param&#91;in&#93; bit the number of the bit (0-7) to clear<br /> * @return True if successful write operation. False otherwise.<br /> */<br />bool ZX_Sensor::clearRegisterBit(uint8_t reg, uint8_t bit)<br />{<br />    uint8_t val;<br />    <br />    /* Read value from register */<br />    if ( !wireReadDataByte(reg, val) ) {<br />        return false;<br />    }<br />    <br />    /* Clear bit in register and write back to the register */<br />    val &amp;= ~(1 &lt;&lt; bit);<br />    if ( !wireWriteDataByte(reg, val) ) {<br />        return false;<br />    }<br />    <br />    return true;    <br />} <br /><br />/*******************************************************************************<br /> * Raw I2C Reads and Writes<br /> ******************************************************************************/<br /><br />/**<br /> * @brief Writes a single byte to the I2C device (no register)<br /> *<br /> * @param&#91;in&#93; val the 1-byte value to write to the I2C device<br /> * @return True if successful write operation. False otherwise.<br /> */<br />bool ZX_Sensor::wireWriteByte(uint8_t val)<br />{<br /><br />I2C::Addr(ZX_I2C, addr_);<br />I2C::Write(ZX_I2C, val);<br />I2C::Stop(ZX_I2C);<br />    <br />    return true;<br />}<br /><br />/**<br /> * @brief Writes a single byte to the I2C device and specified register<br /> *<br /> * @param&#91;in&#93; reg the register in the I2C device to write to<br /> * @param&#91;in&#93; val the 1-byte value to write to the I2C device<br /> * @return True if successful write operation. False otherwise.<br /> */<br />bool ZX_Sensor::wireWriteDataByte(uint8_t reg, uint8_t val)<br />{<br />   I2C::Addr(ZX_I2C, addr_);<br />I2C::Write(ZX_I2C, reg);<br />   I2C::Write(ZX_I2C, val);<br />   I2C::Stop(ZX_I2C);<br /><br />    return true;<br />}<br /><br />/**<br /> * @brief Reads a single byte from the I2C device and specified register<br /> *<br /> * @param&#91;in&#93; reg the register to read from<br /> * @param&#91;out&#93; the value returned from the register<br /> * @return True if successful read operation. False otherwise.<br /> */<br />bool ZX_Sensor::wireReadDataByte(uint8_t reg, uint8_t &amp;val)<br />{<br />    <br /><br />I2C::Addr(ZX_I2C, addr_);<br />I2C::Write(ZX_I2C, reg);<br />val = I2C::twi_read(ZX_I2C, addr_);<br />I2C::Stop(ZX_I2C);<br />    <br />    return true;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6554">robo1973</a> — 20 mar 2017, o 20:41</p><hr />
]]></content>
</entry>
</feed>