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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-11T22:18:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20069&amp;mode</id>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-01-25T20:55:39+01:00</updated>
<published>2018-01-25T20:55:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202684#p202684</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202684#p202684"/>
<title type="html"><![CDATA[Re: MPU6050 - (gy-521)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202684#p202684"><![CDATA[
A \0?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 25 sty 2018, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maly]]></name></author>
<updated>2018-02-11T22:18:17+01:00</updated>
<published>2018-01-25T19:39:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202678#p202678</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202678#p202678"/>
<title type="html"><![CDATA[Re: MPU6050 - (gy-521)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202678#p202678"><![CDATA[
Jest tak jak piszesz. Bufor w tym wypadku przechowuje po prostu znaki (każdy znak podanej liczby). Więc jeśli liczba odczytywana z żyroskopu (i wysyłana przez uart) jest np. z zakresu od -32768 do 32767 to w najgorszym wypadku rozmiar bufora powinien wynosić 6 bo -32768 ma 6 znaków.<br /><br /><br />@down<br />Oczywiście zapomniałem o \0 <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4814">Maly</a> — 25 sty 2018, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[baryla92]]></name></author>
<updated>2018-01-25T18:45:34+01:00</updated>
<published>2018-01-25T18:45:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202675#p202675</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202675#p202675"/>
<title type="html"><![CDATA[Re: MPU6050 - (gy-521)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202675#p202675"><![CDATA[
Hej, dzięki za nakierowanie na problem. Udało się go rozwiązać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Linijka po linijce jak sugerowałeś.<br />Nie był to problem z funkcją TWI_read_buf, tylko z funkcją USART_Transmit_int.<br /><br />Funkcja itoa była problem, a raczej rozmiar bufora (buf[2]) w funkcji itoa. Miał za mały rozmiar i widocznie przy konwersji nie mieścił wystarczającej ilości znaków. Po zwiększeniu jego wielkości do 10 działa bez problemu jak na razie bez problemu.<br /><br />A tak nawiasem mówiąc jaki powinien być optymalny rozmiar bufora dla tego zastosowania? Można założyć że dla 1 cyfry otrzymywanej będzie to 1 bajt bufora ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3155">baryla92</a> — 25 sty 2018, o 18:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maly]]></name></author>
<updated>2018-01-25T02:10:57+01:00</updated>
<published>2018-01-25T02:10:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202644#p202644</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202644#p202644"/>
<title type="html"><![CDATA[Re: MPU6050 - (gy-521)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202644#p202644"><![CDATA[
Jeśli Ci się zawiesza, może być to dlatego że funkcja TWI_read_buf oczekuje w pętli while na dane a ich nie dostaje. Z tego co pamiętam ja przy takiej konfiguracji (co prawda na ARM) odczytywałem po 2 bajty z układu. Spróbuj więc odczytać na razie zamiast 14 tylko 2 bajty. <br />Jeśli to się uda to wtedy odczytuj po 2:<br />[syntax=c]TWI_read_buf(MPU_addr,0x3B,2,gyro_buf);<br />AcX = (gyro_buf&#91;0&#93;&lt;&lt;8) | (gyro_buf&#91;1&#93;);<br />TWI_read_buf(MPU_addr,0x3D,2,gyro_buf);<br />AcY = (gyro_buf&#91;0&#93;&lt;&lt;8) | (gyro_buf&#91;1&#93;);<br />TWI_read_buf(MPU_addr,0x3F,2,gyro_buf);<br />AcZ = (gyro_buf&#91;0&#93;&lt;&lt;8) | (gyro_buf&#91;1&#93;);<br />...[/syntax]<br />i tak dalej. <br />Jeśli to nie będzie przyczyną problemu poszukamy dalej. <br /><br />A i jeśli to nie będzie to, w funkcji np. TWI_read_buf wstaw gdzieś do testów zapalanie diody. Jeśli się zapali wstaw zapalanie linijkę niżej itd. do momentu aż się nie zapali. Takie pseudo debugowanie <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4814">Maly</a> — 25 sty 2018, o 02:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[baryla92]]></name></author>
<updated>2018-01-24T20:57:02+01:00</updated>
<published>2018-01-24T20:57:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202630#p202630</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202630#p202630"/>
<title type="html"><![CDATA[MPU6050 - (gy-521)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20069&amp;p=202630#p202630"><![CDATA[
Cześć, pisze gdyż mam problem z moim MPU6050. Używam Atmegi16 taktowanie 8MHz.<br />Udało mi się nawiązać komunikację z układem jednak mam problem z odczytem danych.<br />Testowałem na początku tylko wysyłanie wartości AcX do terminala, gdy wartości na terminalu były ujemne (czujnik pochylony do dołu) odczyt był prawidłowy gdy natomiast ustawiłem go poziomo odczyt się zawieszał. Tak samo dla innych wartości, gdy próbuje odczytać teraz np. 3 wartości AcX, Acy oraz AcZ, 1 raz uda mi się je odczytać i potem zawieszenie.<br />W pętli while mam podpiętą migającą diodę i gdy zwiesza się &quot;komunikacja&quot; ona przestaje migać tak jakby program wysypywał się z pętli while.<br />Być może coś źle ustawiłem w konfiguracji lub jakiś błąd w kodzie typowo czy mógłby ktoś zerknąć i nakierować mnie na rozwiązanie ?<br />main.c<br />[syntax=c]/*<br /> * GccApplication1.c<br /> *<br /> * Created: 2018-01-15 21:08:10<br /> * Author : Marcin<br /> */ <br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;i2c_twi.h&quot;<br /><br />#define LED1 PA1<br /><br />const int MPU_addr=0xD0;  // I2C address of the MPU-6050 0x68<br />const int MPU_reg=0x3B;  // I2C start register of the MPU-6050<br /><br />int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;<br />uint8_t gyro_buf&#91;14&#93;;<br />char znak&#91;10&#93;=&quot;\n znak&quot;;<br /><br />// USART<br />#define FOSC 8000000// Clock Speed<br />#define BAUD 9600<br />#define MYUBRR FOSC/16/BAUD-1<br />void USART_Init( unsigned int ubrr);<br />void USART_Transmit( unsigned char data );<br />void USART_Transmit_str(char *data);<br />void USART_Transmit_int(int16_t data);<br />void MPU6050_Init(void);<br /><br />int main(void)<br />{<br />DDRA |= (1&lt;&lt;LED1);<br />PORTA |= (1&lt;&lt;LED1);<br /><br />i2cSetBitrate(100);<br /><br />MPU6050_Init();<br />USART_Init(MYUBRR);<br /><br />    while (1) <br />    {<br />_delay_ms(500);<br />PORTA ^= (1&lt;&lt;LED1);<br /><br />TWI_read_buf(MPU_addr,MPU_reg,14,gyro_buf);<br />AcX=0;<br />AcX |= (gyro_buf&#91;0&#93;&lt;&lt;8) | (gyro_buf&#91;1&#93;);<br />AcY=0;<br />AcY |= (gyro_buf&#91;2&#93;&lt;&lt;8) | (gyro_buf&#91;3&#93;);<br />AcZ=0;//akcelelometr<br />AcZ |= (gyro_buf&#91;4&#93;&lt;&lt;8) | (gyro_buf&#91;5&#93;);<br /><br />GyX |= (gyro_buf&#91;8&#93;&lt;&lt;8) | (gyro_buf&#91;9&#93;);<br />GyY |= (gyro_buf&#91;10&#93;&lt;&lt;8) | (gyro_buf&#91;11&#93;);     //żyroskop<br />GyZ |= (gyro_buf&#91;12&#93;&lt;&lt;8) | (gyro_buf&#91;13&#93;);<br /><br />USART_Transmit_str(&quot;\n AcX: &quot;);<br />USART_Transmit_int(AcX);<br /><br />USART_Transmit_str(&quot;  AcY: &quot;);<br />USART_Transmit_int(AcY);<br /><br />USART_Transmit_str(&quot;  AcZ: &quot;);<br />USART_Transmit_int(AcZ);<br />    }<br />}<br /><br />void USART_Init( unsigned int ubrr)<br /> {<br /> /* Set baud rate */<br /> UBRRH = (unsigned char)(ubrr&gt;&gt;8);<br /> UBRRL = (unsigned char)ubrr;<br /> /* Enable receiver and transmitter */<br /> UCSRB = (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN);<br /> /* Set frame format: 8data, 2stop bit */<br /> UCSRC = (1&lt;&lt;URSEL)|(1&lt;&lt;USBS)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void USART_Transmit( unsigned char data )<br />{<br />/* Wait for empty transmit buffer */<br />while ( !( UCSRA &amp; (1&lt;&lt;UDRE)) )<br />;<br />/* Put data into buffer, sends the data */<br />UDR = data;<br />}<br /><br />void USART_Transmit_str(char *data)<br />{<br />uint8_t len;<br />uint8_t i=0;<br /><br />len=strlen(data);<br />for(i=0;i&lt;len;i++) {<br />USART_Transmit(data&#91;i&#93;);<br />}<br />}<br /><br />void USART_Transmit_int(int16_t data)<br />{<br />char buf&#91;2&#93;;<br />itoa(data,buf,10);<br />USART_Transmit_str(buf);<br />}<br /><br />void MPU6050_Init(void) <br />{<br />TWI_write_byte(MPU_addr,0x6B,0); //Internal 8MHz oscillator<br />TWI_write_byte(MPU_addr,0x1B,0x10); //±1000°/s gyroscope range <br />TWI_write_byte(MPU_addr,0x1C,0x10); //±8g accelerometer range <br />}[/syntax]<br /><br />i2c.c<br />[syntax=c]/*<br /> * i2c_twi.c<br /> *<br /> *  Created on: 2010-09-07<br /> *       Autor: Mirosław Kardaś<br /> */<br />#include &lt;avr/io.h&gt;<br /><br />#include &quot;i2c_twi.h&quot;<br /><br />void i2cSetBitrate(uint16_t bitrateKHz) {<br />uint8_t bitrate_div;<br /><br />bitrate_div = ((F_CPU/1000l)/bitrateKHz);<br />if(bitrate_div &gt;= 16)<br />bitrate_div = (bitrate_div-16)/2;<br /><br />TWBR = bitrate_div;<br />}<br /><br />void TWI_start(void) {<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTA);<br />while (!(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />void TWI_stop(void) {<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO);<br />while ( !(TWCR&amp;(1&lt;&lt;TWSTO)));<br />}<br /><br />void TWI_write(uint8_t bajt) {<br />TWDR = bajt;<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while ( !(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />uint8_t TWI_read(uint8_t ack) {<br />TWCR = (1&lt;&lt;TWINT)|(ack&lt;&lt;TWEA)|(1&lt;&lt;TWEN);<br />while ( !(TWCR &amp; (1&lt;&lt;TWINT)));<br />return TWDR;<br />}<br /><br /><br />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf ) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />while (len--) TWI_write(*buf++);<br />TWI_stop();<br />}<br /><br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />TWI_start();<br />TWI_write(SLA + 1);<br />while (len--) *buf++ = TWI_read( len ? ACK : NACK );<br />TWI_stop();<br />}<br /><br />void TWI_write_byte(uint8_t SLA, uint8_t adr, uint8_t value) {<br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />TWI_write(value);<br />TWI_stop();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3155">baryla92</a> — 24 sty 2018, o 20:57</p><hr />
]]></content>
</entry>
</feed>