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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-27T14:00:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8300&amp;mode</id>
<entry>
<author><name><![CDATA[eVol68]]></name></author>
<updated>2014-08-27T14:00:44+01:00</updated>
<published>2014-08-27T14:00:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93110#p93110</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93110#p93110"/>
<title type="html"><![CDATA[Re: L3G4200D + ATmega8 I2C - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93110#p93110"><![CDATA[
Kurczę pomyliłem się - sorki, miało być &quot;na sprzętowym TWI (I2C).&quot;<br /><br />Tak, tu (uint8_t temp;) też się pomliłem. Ogólnie w kodzie było dobrze.<br /><br />Na terminalu wyświetla się parę razy (8/10) liczba 249, a ostatnią wysłaną wartością jest, np. 22.<br /><br />Jeszcze chodzi mi o to jak dobrze podłączyć ten żyroskop do uC. Wiem, że jak korzystam z I2C to muszę podłączyć SCL i SDA (VCC i GND - oczywiście), a co z pozostałymi pinami żyroskopu? (w pierwszym poście napisałem jakie są).<br /><br /><br /><br />Edit:<br /><br />Przysiadłem trochę do Internetu, PDF'a żyroskopu, kodu i coś już działa.<br />Mianowicie, sprawdzałem wartości X, Y, Z i wyświetlałem je w terminalu. Jak sprawdzam którąkolwiek oś i jak nie ruszam żyra, to wynik skacze - nie jest to dokładnie 0, no ale są też dryfy żyroskopu. Jak przesuwam żyroskop w którąś ze stron (powiedzmy w dodatnią) i robię to powoli, to wynik idzie do góry i utrzymuje się w tych granicach jak szybko przesuwam żyroskop, jak szarpnę, to wartość skacze do wyższych wartości. Sprawdzałem to na wszystkich osiach.<br /><br />Chciałbym zrobić coś takiego, że jak obracam żyroskop (oś Z) o 90*, to taka wartość wyświetla mi się na terminalu.<br />Coś takiego, tylko że na terminalu: <br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=jwRnecjzig4" >https://www.youtube.com/watch?v=jwRnecjzig4</a><!-- m --><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=3Jml-dTWdZo" >https://www.youtube.com/watch?v=3Jml-dTWdZo</a><!-- m --><br /><br /><br />Kod:<br /><br />[syntax=c]/*<br /> *<br /> * main.c<br /> *<br /> *  Created on: 27-08-2014<br /> *      Author: eVol68<br /> *<br /> *Gyro L3G4200D<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br /><br />#include &quot;MYUART/myuart.h&quot;<br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br /><br /><br />#define LED (1&lt;&lt;PD2)<br />#define LED_ON PORTD |= LED<br />#define LED_OFF PORTD &amp;= ~LED<br />//#define LED_TOG PORTD ^= LED<br /><br />#define SCL_CLOCK  10000L<br /><br />void i2c_start();<br />void i2c_write_byte(char byte);<br />char i2c_read_byte();<br />char i2c_read_last_byte();<br />void i2c_stop();<br /><br />void init();<br />void read_data_raw();<br /><br />int temp;<br />unsigned char axh;<br />unsigned char axl;<br /><br />unsigned char ayh;<br />unsigned char ayl;<br /><br />unsigned char azh;<br />unsigned char azl;<br /><br />int ax, ay, az;<br /><br />int TWBR_1;<br /><br /><br />int main()<br />{<br />DDRD |= LED;<br />LED_ON;<br /><br />uart_init( __UBRR );<br /><br />init();<br /><br /><br />//sei();<br />while(1)<br />{<br />read_data_raw();<br /><br />uart_puts( &quot; \r\n &quot; );<br />uart_putlong( az, 10);<br />_delay_ms( 100 );<br />}<br />}<br /><br /><br />void i2c_start() {<br />TWCR = (1 &lt;&lt; TWINT) | (1 &lt;&lt; TWSTA) | (1 &lt;&lt; TWEN); // send start condition<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />}<br /><br />void i2c_write_byte(char byte) {<br />TWDR = byte;<br />TWCR = (1 &lt;&lt; TWINT) | (1 &lt;&lt; TWEN); // start address transmission<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />}<br /><br />char i2c_read_byte() {<br />TWCR = (1 &lt;&lt; TWINT) | (1 &lt;&lt; TWEA) | (1 &lt;&lt; TWEN); // start data reception, transmit ACK<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />return TWDR;<br />}<br /><br />char i2c_read_last_byte() {<br />TWCR = (1 &lt;&lt; TWINT) | (1 &lt;&lt; TWEN); // start data reception<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />return TWDR;<br />}<br /><br />void i2c_stop() {<br />  TWCR = (1 &lt;&lt; TWINT) | (1 &lt;&lt; TWSTO) | (1 &lt;&lt; TWEN); // send stop condition<br />}<br /><br />void init() {<br /><br />DDRC = 0;                              // all inputs<br />PORTC = (1 &lt;&lt; PORTC4) | (1 &lt;&lt; PORTC5); // enable pull-ups on SDA and SCL, respectively<br /><br />//TWSR = 0;  // clear bit-rate prescale bits<br />//TWBR = 12; // produces an SCL frequency of 400 kHz with a 20 MHz CPU clock speed // 17<br /><br /><br />  /* initialize TWI clock: 100 kHz clock, TWPS = 0 =&gt; prescaler = 1 */<br /><br />  TWSR = 0;                         /* no prescaler */<br />  TWBR_1 = (F_CPU/SCL_CLOCK)-16;    /* must be &gt; 10 for stable operation */<br />  TWBR = TWBR_1 / 2;<br /><br />//enable gyro<br />i2c_start();<br />i2c_write_byte(0xD2); // write gyro     0x0F<br />i2c_write_byte(0x23); // CTRL_REG4<br />i2c_write_byte(0xF0); // 2000 dps full-scale<br />i2c_stop();<br /><br />i2c_start();<br />i2c_write_byte(0xD2); // write gyro     0x0F<br />i2c_write_byte(0x21); // CTRL_REG2<br />i2c_write_byte(0x00); //<br />i2c_stop();<br /><br />i2c_start();<br />i2c_write_byte(0xD2); // write gyro     0x0F<br />i2c_write_byte(0x22); // CTRL_REG3<br />i2c_write_byte(0x08); //<br />i2c_stop();<br /><br />i2c_start();<br />i2c_write_byte(0xD2); // write gyro     0x0F<br />i2c_write_byte(0x24); // CTRL_REG5<br />i2c_write_byte(0x00); //<br />i2c_stop();<br /><br />i2c_start();<br />i2c_write_byte(0xD2); // write gyro     0x0F<br />i2c_write_byte(0x20); // CTRL_REG1_A<br />i2c_write_byte(0xFF); // normal power mode, 800 Hz data rate, all axes enabled<br />i2c_stop();<br />}<br /><br /><br />void read_data_raw() {<br />//  GYRO<br />unsigned char stat;<br />do{<br />i2c_start();<br />i2c_write_byte(0xD2); // write GYRO<br />i2c_write_byte(0x27);  // STAT_REG<br />i2c_start();  // repeated start<br />i2c_write_byte(0xD3); // read GYRO<br />stat = i2c_read_last_byte();<br />i2c_stop();<br />}while( (stat &amp; 0x08) == 0);<br /><br />i2c_start();<br />i2c_write_byte(0xD2); // write GYRO<br />i2c_write_byte(0xa8);  // OUT_X_L_A, MSB set to enable auto-increment  , od 0x28 w gore<br />i2c_start();  // repeated start<br />i2c_write_byte(0xD3); // read GYRO<br />axh = i2c_read_byte();<br />axl = i2c_read_byte();<br />ayh = i2c_read_byte();<br />ayl = i2c_read_byte();<br />azh = i2c_read_byte();<br />azl = i2c_read_last_byte();<br /><br />i2c_stop();<br /><br />ax = axh &lt;&lt; 8 | axl;<br />ay = ayh &lt;&lt; 8 | ayl;<br />az = azh &lt;&lt; 8 | azl;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3993">eVol68</a> — 27 sie 2014, o 14:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-27T13:39:40+01:00</updated>
<published>2014-08-27T13:39:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93106#p93106</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93106#p93106"/>
<title type="html"><![CDATA[Re: L3G4200D + ATmega8 I2C - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93106#p93106"><![CDATA[
Piszesz że chciałeś go uruchomić na SPI, a kod wskazuje na I2C (TWI).<br />W linii 35 powinno być &quot;uint8_t temp;&quot; (chyba że gdzieś został ustalony alias typu).<br /><br />Co się wyświetla w terminalu?<br /><br />Nie napisałeś w czym problem, albo jakie błędy występują. Na ślepo ciężko pomóc...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 27 sie 2014, o 13:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eVol68]]></name></author>
<updated>2014-08-27T13:55:53+01:00</updated>
<published>2014-08-27T12:32:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93103#p93103</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93103#p93103"/>
<title type="html"><![CDATA[L3G4200D + ATmega8 I2C - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8300&amp;p=93103#p93103"><![CDATA[
Witam!<br /><br />Mam od niedawna żyroskop L3G4200D i chciałem go uruchomić na ATmedze8 (8MHz) na sprzętowym TWI (I2C).<br />Ogólnie mam parę pytań dotyczących podłączenia tegoż układu, bo to jest jakby nie patrzeć pierwsze moje spotkanie z żyroskopem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wracając do rzeczy, mój żyroskop jest na płytce PCB i ma wyprowadzenia VCC, SCL, SDA, GNG, SDO, CS, DR (DRDY), INT.<br />ATmege zasilam z 3,3V, a na żyroskop daję 5V, bo ma stabilizator 3,3V.<br /><br />Napisałem nawet wstępny kod w C (AVR), no ale coś jakby się wyświetlało na PC przez UART, ale to chyba nie to :/ ( dane wysyłam na PC, aby zobaczyć czy coś w ogóle działa ) + dioda LED do debugowania.<br />Najpierw chciałem odczytać temperaturę, a później osie X, Y, Z. <br /><br />Tutaj daje ten mój program:<br />[syntax=c]/*<br /> *<br /> * main.c<br /> *<br /> *  Created on: 26-08-2014<br /> *      Author: eVol68<br /> *<br /> *<br /> *Gyro L3G4200D<br /> *VCC = 3,3V<br /> *Odczyt temp<br /> */<br /><br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br />#include &quot;MYUART/myuart.h&quot;<br /><br /><br />#define LED (1&lt;&lt;PD2)<br />#define LED_ON PORTD |= LED<br />#define LED_OFF PORTD &amp;= ~LED<br />#define LED_TOG PORTD ^= LED<br /><br />#define ACK 1<br />#define NACK 0<br /><br />uint8_t temp;<br /><br />void i2cSetBitrate(uint16_t bitrate_kHz);<br />void TWI_start(void);<br />void TWI_stop(void);<br />void TWI_write( uint8_t bajt );<br />uint8_t TWI_read( uint8_t ack );<br /><br /><br />// Główna funkcja programu<br />int main()<br />{<br />DDRD |= LED;<br />LED_ON;// Włączenie diody LED<br /><br />uart_init( __UBRR );// Inicjalizacja UART'u<br /><br />DDRC = 0;<br />PORTC |= (1&lt;&lt;PC4) | (1&lt;&lt;PC5);// I2CPC5 - SCL, PC4 - SDA<br /><br />i2cSetBitrate( 100 );// Prędkość I2C = 100kHz<br /><br />// CTRL_REG1 (20h)<br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x20);// CTRL_REG1 (20h)<br />TWI_write(0b00001111);// Włączenie żyroskopu<br />TWI_stop();// Stop<br /><br />// CTRL_REG2 (21h)<br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x21);// CTRL_REG2 (21h)<br />TWI_write(0b00100000);// Normal mode<br />TWI_stop();// Stop<br /><br />// CTRL_REG3 (22h)<br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x22);// CTRL_REG3 (22h)<br />TWI_write(0x00);// 2000 dps<br />TWI_stop();// Stop<br /><br />// CTRL_REG4 (23h)<br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x23);// CTRL_REG4 (23h)<br />TWI_write(0b00000000);//<br />TWI_stop();// Stop<br /><br />// CTRL_REG5 (24h)<br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x24);// CTRL_REG5 (24h)<br />TWI_write(0x00);//<br />TWI_stop();// Stop<br /><br /><br /><br />while(1)<br />{<br /><br />TWI_start();// Start<br />TWI_write(0b11010010);// SDO = VCC<br />TWI_write(0x26);// OUT_TEMP (26h)<br />TWI_start();// Start<br />TWI_write(0b11010011);//<br />temp = TWI_read(ACK);// Odczyt temperatury<br />TWI_stop();// Stop<br /><br />            uart_puts( &quot; \r\n &quot; );<br />uart_putlong( temp, 10 );<br />_delay_ms(100);<br /><br />}<br />}<br /><br /><br /><br /><br />void i2cSetBitrate(uint16_t bitrate_kHz) {<br />    uint8_t bitrate_div;<br /><br />    bitrate_div = ((F_CPU/1000l)/bitrate_kHz);<br />    if(bitrate_div &gt;= 16)<br />        bitrate_div = (bitrate_div-16)/2;<br /><br />    TWBR = bitrate_div;<br />}<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 /><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 /><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 /><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 />}[/syntax]<br /><br />Z góry dzięki za wszelką pomoc i zainteresowanie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3993">eVol68</a> — 27 sie 2014, o 12:32</p><hr />
]]></content>
</entry>
</feed>