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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-04T18:35:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12184&amp;mode</id>
<entry>
<author><name><![CDATA[sq5rix]]></name></author>
<updated>2015-07-04T18:35:37+01:00</updated>
<published>2015-07-04T18:35:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133620#p133620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133620#p133620"/>
<title type="html"><![CDATA[Re: MMA8452 Obsługa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133620#p133620"><![CDATA[
Zobacz w nocie jak przebiega komunikacja. Najczęściej trzeba trochę przerobić funcję read i write buf.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5966">sq5rix</a> — 4 lip 2015, o 18:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomTea]]></name></author>
<updated>2015-07-03T16:43:26+01:00</updated>
<published>2015-07-03T16:43:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133547#p133547</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133547#p133547"/>
<title type="html"><![CDATA[Re: MMA8452 Obsługa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133547#p133547"><![CDATA[
Dzięki ! <br />Ruszyła komunikacja. Przyszedł czas na sprawdzenia czy potrafię uruchomić samego scalaka żeby zaczął mierzyć.<br />W celu sprawdzenia dopisałem taką funkcję:<br />[syntax=c]uint8_t MMA8452Q_readPL(void){<br /><br />uint8_t temp;<br />TWI_read_buf(MMA8452Q_addr,PL_STATUS,1,&amp;temp);<br />if(temp &amp; 0x40)<br />return LOCKOUT;<br />else<br />return ((temp &amp; 0x6) &gt;&gt; 1);<br /><br />}[/syntax]<br />Ma ona za zdanie odczytać położenie i zwrócić odpowiadającą mu wartość. <br /><br />W pliku main.c wygląda to tak :<br />[syntax=c]while(1){<br /><br />if(MMA8452Q_avalible()){<br />ssd1306_CLR();<br /><br />GFX_PutInt(0,page1*8,MMA8452Q_readPL(),1,1,0);<br />ssd1306_display();<br /><br />_delay_ms(500);<br />}<br />}[/syntax]<br />Niestety mimo wielu prób ciągle zwraca mi jedna i te samą wartość. <br />Mam pytanie czy dobrze używam funkcji TWI_read_buf() (To jest ta z BB) ?<br />Wygląda to tak jak by się zacinał na ustawieniach początkowych i nic dalej nie robił.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1309">TomTea</a> — 3 lip 2015, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-07-02T16:27:55+01:00</updated>
<published>2015-07-02T16:27:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133472#p133472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133472#p133472"/>
<title type="html"><![CDATA[Re: MMA8452 Obsługa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133472#p133472"><![CDATA[
Może się mylę, ale wygląda mi na to, że nie masz rezystorów podciągających do Vcc na liniach SDA i SCL. Zobacz na schemacie zestawu ATB <a href="http://atnel.pl/instrukcja-atb-rev-1-04.html"  class="postlink">http://atnel.pl/instrukcja-atb-rev-1-04.html</a>, że gdy rozłączasz zworki J8 i J9 to równocześnie &quot;odłączasz&quot; też te rezystory R29 i R31.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 2 lip 2015, o 16:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomTea]]></name></author>
<updated>2015-07-02T14:41:10+01:00</updated>
<published>2015-07-02T14:41:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133470#p133470</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133470#p133470"/>
<title type="html"><![CDATA[MMA8452 Obsługa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12184&amp;p=133470#p133470"><![CDATA[
Witam ! <br />Chciałem napisać bibliotekę do akcelerometru MMA8452, coś w stylu Mirka o OLED. Chciałem przeszczepić kod z Arduino na AVR. <br />Robiłem to na podstawie tego kodu: (umieszczę link bo dużo do wyklejania by było)<br />GitHub:<br /><a href="https://github.com/sparkfun/MMA8452_Accelerometer/blob/master/Libraries/Arduino/src/SparkFun_MMA8452Q.cpp"  class="postlink">mma8452.c</a><br /><a href="https://github.com/sparkfun/MMA8452_Accelerometer/blob/master/Libraries/Arduino/src/SparkFun_MMA8452Q.h"  class="postlink">mma8452.h</a><br /><br />Stworzyłem na tej podstawie własną bibliotekę oraz napisałem prosty program do wyświetlania jednej wartości (tak żeby zobaczyć czy w ogóle coś działa):<br /><br />mma8452q.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br />#include &quot;../I2C_TWI/i2c_twi.h&quot;<br />#include &quot;mma8452q.h&quot;<br /><br />void MMA8452Q_init(TMMA8452Q_Scale fsr, TMMA8452Q_ODR odr){<br /><br />MMA8452Q_standby();<br />MMA8452Q_setScale(fsr);<br />MMA8452Q_setODR(odr);<br />MMA8452Q_setupPL();<br />MMA8452Q_setupTap(0x80, 0x80, 0x80);<br />MMA8452Q_active();<br />}<br /><br />void MMA8452Q_read(TMMA8452Q *ac){<br />uint8_t buf&#91;6&#93;;<br /><br />TWI_read_buf(MMA8452Q_addr,OUT_X_MSB,6,buf);<br />ac-&gt;x = ((short)(buf&#91;0&#93; &lt;&lt; 8 | buf&#91;1&#93;)) &gt;&gt; 4;<br />ac-&gt;y = ((short)(buf&#91;2&#93; &lt;&lt; 8 | buf&#91;3&#93;)) &gt;&gt; 4;<br />ac-&gt;z = ((short)(buf&#91;4&#93; &lt;&lt; 8 | buf&#91;5&#93;)) &gt;&gt; 4;<br /><br /><br />}<br /><br />uint8_t MMA8452Q_avalible(void){<br />uint8_t temp;<br />TWI_read_buf(MMA8452Q_addr,STATUS,1,temp);<br /><br />return(temp &gt;&gt; 3);<br />}<br /><br />/*<br /> * byte MMA8452Q::available()<br />{<br />return (readRegister(STATUS) &amp; 0x08) &gt;&gt; 3;<br />}<br /> */<br /><br />void MMA8452Q_active (void){<br />uint8_t c;<br />TWI_read_buf(MMA8452Q_addr,CTRL_REG1, 1, c);<br />c = c | 0x01;<br />TWI_write_buf(MMA8452Q_addr,CTRL_REG1, 1, c);<br />}<br /><br />/*<br /> * void MMA8452Q::active()<br />{<br />byte c = readRegister(CTRL_REG1);<br />writeRegister(CTRL_REG1, c | 0x01); //Set the active bit to begin detection<br />}<br /> */<br /><br />void MMA8452Q_setupPL(void){<br />uint8_t temp;<br />// 1. Enable P/L<br />TWI_read_buf(MMA8452Q_addr,PL_CFG,1,temp);<br />temp = temp | 0x40;<br />TWI_write_buf(MMA8452Q_addr,PL_CFG,1,temp);// Set PL_EN (enable)<br />// 2. Set the debounce rate<br />temp = 0x50;<br />TWI_write_buf(MMA8452Q_addr,PL_COUNT,1,temp);// Debounce counter at 100ms (at 800 hz)<br />}<br /><br />void MMA8452Q_setupTap (uint8_t xThs, uint8_t yThs, uint8_t zThs){<br />// Set up single and double tap - 5 steps:<br />// for more info check out this app note:<br />// http://cache.freescale.com/files/sensors/doc/app_note/AN4072.pdf<br />// Set the threshold - minimum required acceleration to cause a tap.<br />uint8_t temp = 0;<br />if (!(xThs &amp; 0x80)) // If top bit ISN'T set<br />{<br />temp |= 0x3; // Enable taps on x<br />TWI_write_buf(MMA8452Q_addr,PULSE_THSX,1,xThs);<br />}<br />if (!(yThs &amp; 0x80))<br />{<br />temp |= 0xC; // Enable taps on y<br />TWI_write_buf(MMA8452Q_addr,PULSE_THSY,1,yThs);<br />}<br />if (!(zThs &amp; 0x80))<br />{<br />temp |= 0x30; // Enable taps on z<br />TWI_write_buf(MMA8452Q_addr,PULSE_THSZ,1,zThs);<br />}<br />// Set up single and/or double tap detection on each axis individually.<br />temp = temp | 0x40;<br />TWI_write_buf(MMA8452Q_addr,PULSE_CFG,1,temp);<br />// Set the time limit - the maximum time that a tap can be above the thresh<br />temp = 0x30;<br />TWI_write_buf(MMA8452Q_addr,PULSE_TMLT,1,temp);<br />// Set the pulse latency - the minimum required time between pulses<br />temp = 0xA0;<br />TWI_write_buf(MMA8452Q_addr,PULSE_LTCY,1,temp);<br />// Set the second pulse window - maximum allowed time between end of<br />//latency and start of second pulse<br />temp = 0xFF;<br />TWI_write_buf(MMA8452Q_addr,PULSE_WIND,1,temp);<br />}<br /><br />void MMA8452Q_setODR (TMMA8452Q_ODR odr){<br />uint8_t ctrl;<br />TWI_read_buf(MMA8452Q_addr,CTRL_REG1,1,ctrl);<br />ctrl &amp;= 0xCF; // Mask out data rate bits<br />ctrl |= (odr &lt;&lt; 3);<br />TWI_write_buf(MMA8452Q_addr,CTRL_REG1,1,ctrl);<br />}<br /><br /><br />void MMA8452Q_setScale (TMMA8452Q_Scale fsr){<br />uint8_t cfg;<br />TWI_read_buf(MMA8452Q_addr,XYZ_DATA_CFG,1,cfg);<br />cfg &amp;= 0xFC; // Mask out scale bits<br />cfg |= (fsr &gt;&gt; 2);  // Neat trick, see page 22. 00 = 2G, 01 = 4A, 10 = 8G<br />TWI_write_buf(MMA8452Q_addr,XYZ_DATA_CFG,1,cfg);<br />}<br /><br />void MMA8452Q_standby(void){<br />uint8_t c;<br />TWI_read_buf(MMA8452Q_addr,CTRL_REG1,1,c);<br />c = c &amp; ~(0x01);<br />TWI_write_buf(MMA8452Q_addr,CTRL_REG1,1,c);<br /><br />}<br /><br />//uint8_t MMA8452_readRegister(TMMA8452Q_Register reg){<br /><br />//}[/syntax]<br /><br />mma8452q.h<br />[syntax=c]#ifndef MMA8452Q_MMA8452Q_H_<br />#define MMA8452Q_MMA8452Q_H_<br /><br />#define MMA8452Q_addr 0x1D // 0x01C lub 0x1D<br /><br />///////////////////////////////////<br />// MMA8452Q Register Definitions //<br />///////////////////////////////////<br />typedef enum  {<br />STATUS = 0x00,<br />OUT_X_MSB = 0x01,<br />OUT_X_LSB = 0x02,<br />OUT_Y_MSB = 0x03,<br />OUT_Y_LSB = 0x04,<br />OUT_Z_MSB = 0x05,<br />OUT_Z_LSB = 0x06,<br />SYSMOD = 0x0B,<br />INT_SOURCE = 0x0C,<br />WHO_AM_I = 0x0D,<br />XYZ_DATA_CFG = 0x0E,<br />HP_FILTER_CUTOFF = 0x0F,<br />PL_STATUS = 0x10,<br />PL_CFG = 0x11,<br />PL_COUNT = 0x12,<br />PL_BF_ZCOMP = 0x13,<br />P_L_THS_REG = 0x14,<br />FF_MT_CFG = 0x15,<br />FF_MT_SRC = 0x16,<br />FF_MT_THS = 0x17,<br />FF_MT_COUNT = 0x18,<br />TRANSIENT_CFG = 0x1D,<br />TRANSIENT_SRC = 0x1E,<br />TRANSIENT_THS = 0x1F,<br />TRANSIENT_COUNT = 0x20,<br />PULSE_CFG = 0x21,<br />PULSE_SRC = 0x22,<br />PULSE_THSX = 0x23,<br />PULSE_THSY = 0x24,<br />PULSE_THSZ = 0x25,<br />PULSE_TMLT = 0x26,<br />PULSE_LTCY = 0x27,<br />PULSE_WIND = 0x28,<br />ASLP_COUNT = 0x29,<br />CTRL_REG1 = 0x2A,<br />CTRL_REG2 = 0x2B,<br />CTRL_REG3 = 0x2C,<br />CTRL_REG4 = 0x2D,<br />CTRL_REG5 = 0x2E,<br />OFF_X = 0x2F,<br />OFF_Y = 0x30,<br />OFF_Z = 0x31<br />} TMMA8452Q_Register ;<br /><br />////////////////////////////////<br />// MMA8452Q Misc Declarations //<br />////////////////////////////////<br />typedef enum  {SCALE_2G = 2, SCALE_4G = 4, SCALE_8G = 8} TMMA8452Q_Scale ; // Possible full-scale settings<br />typedef enum  {ODR_800, ODR_400, ODR_200, ODR_100, ODR_50, ODR_12, ODR_6, ODR_1} TMMA8452Q_ODR ; // possible data rates<br />// Possible portrait/landscape settings<br />#define PORTRAIT_U 0<br />#define PORTRAIT_D 1<br />#define LANDSCAPE_R 2<br />#define LANDSCAPE_L 3<br />#define LOCKOUT 0x40<br /><br /><br />typedef struct {<br /><br />uint16_t x;<br />uint16_t y;<br />uint16_t z;<br />uint8_t buf&#91;5&#93;; //bufor<br /><br />}TMMA8452Q;<br /><br />//Funkcje<br />void MMA8452Q_standby(void);//Tryb wstrzymania, konieczne przy konfiguracji rejestrów<br />void MMA8452Q_setScale (TMMA8452Q_Scale fsr);//Ustawianie skali<br />void MMA8452Q_setODR (TMMA8452Q_ODR odr);<br />void MMA8452Q_setupPL(void);<br />void MMA8452Q_setupTap (uint8_t xThs, uint8_t yThs, uint8_t zThs);<br />void MMA8452Q_active (void);<br />uint8_t MMA8452Q_avalible(void);<br />void MMA8452Q_init(TMMA8452Q_Scale fsr, TMMA8452Q_ODR odr);<br />void MMA8452Q_read(TMMA8452Q *ac);<br /><br /><br />#endif /* MMA8452Q_MMA8452Q_H_ */[/syntax]<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br />#include &quot;OLED/ssd1306.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MMA8452Q/mma8452q.h&quot;<br /><br />TMMA8452Q akc;<br /><br />int main (void){<br /><br /><br />ssd1306_Init(SSD1306_SWITCHCAPVCC, REFRESH_MAX);<br /><br />MMA8452Q_init(SCALE_8G, ODR_6);<br /><br />//TU PRZESTAJE DZIAŁAĆ<br /><br />GFX_PutString(0,0,&quot;Test MMA8452&quot;,1,1,0);<br />ssd1306_display();<br /><br /><br /><br /><br />while(1){<br /><br />if(MMA8452Q_avalible()){<br />MMA8452Q_read(&amp;akc);<br /><br />ssd1306_CLR();<br />GFX_PutInt(0,page1*8,akc.x,1,1,0);<br />ssd1306_display();<br /><br />_delay_ms(500);<br />}<br />}<br />}[/syntax]<br /><br />Niestety program przestaje działać zaraz po wykonaniu MMA8452Q_init() :/<br /><br />A teraz pytanie gdzie mogę popełniać błąd ? Może gdzieś w komunikacji robię ? <br /><br />p.s. Dorzucam zdjęcie jak jest podłączone wszystko.<br />PC1 -&gt; SDA<br />PC0 -&gt; SCL<br /><a href="http://forum.atnel.pl/_obrazki/o/1309/3abea8111797752ff9927032232c703e.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1309/3abea8111797752ff9927032232c703e.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1309">TomTea</a> — 2 lip 2015, o 14:41</p><hr />
]]></content>
</entry>
</feed>