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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-21T21:38:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=19820&amp;mode</id>
<entry>
<author><name><![CDATA[mateur]]></name></author>
<updated>2017-12-21T21:38:05+01:00</updated>
<published>2017-12-21T21:38:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200925#p200925</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200925#p200925"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200925#p200925"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />No więc chyba warto zaglądać na stronę wydawnictwa? tak czy nie ?<br /></div><br />Tak.<br /><br />Wracając do tematu..<br />Komunikacja działa - odczytuję bajty z czujnika. Na początek wziąłem się za temperaturę. 20-bitowa wartość odczytanej temperatury, którą poskładałem z bajtów MSB, LSB i XLSB przybiera spodziewane wartości i zmienia się w prawidłowy sposób (płynnie rośnie po ogrzaniu i płynnie spada przy ochłodzeniu czujnika). Pozostaje jedynie tą zmienną przekonwertować wg. formuły z noty jednak natrafiam na pewne trudności.<br /><br />[syntax=c]int32_t bmp280_comp_T(int32_t adc_T)<br />{<br />int32_t var1, var2, T;<br />var1 = (temp &gt;&gt; 14) - ((dig_T1 &gt;&gt; 10) * dig_T2);<br />var2 = (temp &gt;&gt; 17) - ((dig_T1 &gt;&gt; 13) * ((temp &gt;&gt; 17) - ((dig_T1 &gt;&gt; 13) * dig_T3)));<br />t_fine = var1 + var2;<br />T = (var1 + var2) &gt;&gt; 10;<br />return T;<br />}[/syntax]<br /><br />Czy któryś z szanownych kolegów ma napisaną, działającą formułę dla konwersji temperatury (a przy okazji i dla ciśnienia)? Ewentualnie widzi problem w tej dołączonej?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11512">mateur</a> — 21 gru 2017, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-12-19T18:43:33+01:00</updated>
<published>2017-12-19T18:43:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200806#p200806</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200806#p200806"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200806#p200806"><![CDATA[
<div class="quotetitle">mateur napisał(a):</div><div class="quotecontent"><br />Wykrzyknik jednak nie potrzebny? Mam wydanie 1<br /></div><br /><br />No więc chyba warto zaglądać na stronę wydawnictwa? tak czy nie ?<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/uaktualnienia-programow-do-dvd.html" >http://atnel.pl/uaktualnienia-programow-do-dvd.html</a><!-- m --><br /><br />zajrzyj<br /><br />tak samo tutaj:<br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/errata.html" >http://atnel.pl/errata.html</a><!-- m --><br /><br />gdzie masz PDF z erratą i jest to jak pokazane wyraźnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 19 gru 2017, o 18:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateur]]></name></author>
<updated>2017-12-19T18:11:10+01:00</updated>
<published>2017-12-19T18:11:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200805#p200805</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200805#p200805"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200805#p200805"><![CDATA[
Korzystając z BB poszedłem za radą aby gdy coś nie działa stworzyć sobie coś ultra prostego co działać musi - stąd też ten nieładny kod &quot;na piechotę i do kupy&quot;. Pomyślałem sobie, że jeśli ktoś zechce przejrzeć co tam naskrobałem przeleci sobie od góry do dołu i np stwierdzi: TWI jest, adresy się zgadzają, funkcje ok, ale chwila chwila tu jest babol... i mnie o tym życzliwie poinformuje.<br />A jeśli chodzi o funkcję TWI_stop to:<br /><br /><a href="https://obrazkiforum.atnel.pl/11512/6c19a941695342ebf481e99089141a12.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/11512/6c19a941695342ebf481e99089141a12.jpg" alt="Obrazek" /></a><br /><br />Wykrzyknik jednak nie potrzebny? Mam wydanie 1 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11512">mateur</a> — 19 gru 2017, o 18:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-12-18T23:39:31+01:00</updated>
<published>2017-12-18T23:39:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200784#p200784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200784#p200784"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200784#p200784"><![CDATA[
Masz Bluebooka - czemu nie stosujesz funkcji TWI_write_buf() i TWI_read_buf() ??? ... tylko piszesz program liniowo tworząc sobie hektolitry problemów. Zamiast korzystać z bibliotek jak się należy to ty peklujesz WSZYSTKO w jeden plik jak w Bascomie ... toż to masakrung wychodzi a później sam nie możesz znaleźć błędów - warto jednak korzystać z Bluebooka mówię ci, tym bardziej, że go masz pod ręką<br /><br />Poza tym masz babola w twi_stop - wywal wykrzyknik<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 gru 2017, o 23:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateur]]></name></author>
<updated>2017-12-18T22:17:47+01:00</updated>
<published>2017-12-18T22:17:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200783#p200783</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200783#p200783"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200783#p200783"><![CDATA[
Dziękuję za odpowiedzi. Po zmianie adresu na 0xEC program nie &quot;utyka&quot; w jednym miejscu. Mam jednak problemy z odczytaniem wartości zmierzonych przez czujnik. Wynik wyświetlam  na jednej cyfrze wyświetlacza 7-seg (wymagania projektowe) i jedyne co udaje mi się uzyskać to kolejne wyświetlanie 0, 0, 8 - co miało by odpowiadać 00,8*C.  Poniżej znowu odchudzony kod tym razem jednak z funkcjami do odczytu danych z czujnika:<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br /><br />volatile uint8_t cyfry&#91;10&#93; = {40,63,140,13,27,73,72,47,8,9};//0,1,2,3...<br /><br />volatile uint8_t td = 2;<br />volatile uint8_t tj = 3;<br />volatile uint8_t tpp = 9;<br /><br />//parametry kompensacyjne BMP280<br /><br />uint16_t dig_T1, dig_P1;<br />int16_t dig_T2, dig_T3, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9;<br /><br />uint8_t bufor_danych_komp&#91;24&#93;;<br />int8_t bufor_t&#91;3&#93;;<br />uint8_t bufor_p&#91;3&#93;;<br /><br />uint32_t odczytane_p;//odczytane aktualne ciśnienie<br />int32_t odczytana_t;//odczytana aktualna temperatura<br /><br />uint32_t wlasciwe_p;//ciśnienie po kompensacji<br />int32_t wlasciwa_t;//temperatura po kompensacji<br /><br />int32_t wysokosc;<br /><br />void TWI_init()<br />{<br />TWBR = 32;<br />}<br /><br />void TWI_start(void)<br />{<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 />{<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 />{<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 />{<br />if(ack)TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEA)|(1&lt;&lt;TWEN);<br />else TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />return TWDR;<br />}<br /><br />void BMP280_pomiar()<br />{<br />TWI_start();<br />TWI_write(0xEC);//Adres BMP280<br />TWI_write(0xF4);//komórka ctrl_meas (oversampling cisnienia, oversampling temperatury, tryb pomiaru)<br />TWI_write(0x6F);//bity dla ctrl_meas (8; 8; normal)<br />TWI_write(0xF5);//komórka config (czas stand_by dla normal, poziom filtrowania, spi enable)<br />TWI_write(0x0C);//bity dla config (0,5ms; 3; 0)<br />TWI_stop();<br />}<br /><br /><br />void BMP280_inicjuj()<br />{<br />TWI_start();//start transmisji<br />TWI_write(0xEC);//wyślij adres układu<br />TWI_write(0xA1);//wyślij początkowy adres pamięci wybranego układu<br />TWI_start();//ponowny start magistrali<br />TWI_write(0xEC + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />bufor_danych_komp&#91;0&#93; = TWI_read(1);<br />bufor_danych_komp&#91;1&#93; = TWI_read(1);<br />bufor_danych_komp&#91;2&#93; = TWI_read(1);<br />bufor_danych_komp&#91;3&#93; = TWI_read(1);<br />bufor_danych_komp&#91;4&#93; = TWI_read(1);<br />bufor_danych_komp&#91;5&#93; = TWI_read(1);<br />bufor_danych_komp&#91;6&#93; = TWI_read(1);<br />bufor_danych_komp&#91;7&#93; = TWI_read(1);<br />bufor_danych_komp&#91;8&#93; = TWI_read(1);<br />bufor_danych_komp&#91;9&#93; = TWI_read(1);<br />bufor_danych_komp&#91;10&#93; = TWI_read(1);<br />bufor_danych_komp&#91;11&#93; = TWI_read(1);<br />bufor_danych_komp&#91;12&#93; = TWI_read(1);<br />bufor_danych_komp&#91;13&#93; = TWI_read(1);<br />bufor_danych_komp&#91;14&#93; = TWI_read(1);<br />bufor_danych_komp&#91;15&#93; = TWI_read(1);<br />bufor_danych_komp&#91;16&#93; = TWI_read(1);<br />bufor_danych_komp&#91;17&#93; = TWI_read(1);<br />bufor_danych_komp&#91;18&#93; = TWI_read(1);<br />bufor_danych_komp&#91;19&#93; = TWI_read(1);<br />bufor_danych_komp&#91;20&#93; = TWI_read(1);<br />bufor_danych_komp&#91;21&#93; = TWI_read(1);<br />bufor_danych_komp&#91;22&#93; = TWI_read(1);<br />bufor_danych_komp&#91;23&#93; = TWI_read(0);<br />TWI_stop();//koniec transmisji<br /><br />dig_T1 = bufor_danych_komp&#91;1&#93;;<br />dig_T1 = (dig_T1 &lt;&lt; 8) | bufor_danych_komp&#91;0&#93;;<br />dig_T2 = bufor_danych_komp&#91;3&#93;;<br />dig_T2 = (dig_T2 &lt;&lt; 8) | bufor_danych_komp&#91;2&#93;;<br />dig_T3 = bufor_danych_komp&#91;5&#93;;<br />dig_T3 = (dig_T3 &lt;&lt; 8) | bufor_danych_komp&#91;4&#93;;<br />dig_P1 = bufor_danych_komp&#91;7&#93;;<br />dig_P1 = (dig_P1 &lt;&lt; 8) | bufor_danych_komp&#91;6&#93;;<br />dig_P2 = bufor_danych_komp&#91;9&#93;;<br />dig_P2 = (dig_P2 &lt;&lt; 8) | bufor_danych_komp&#91;8&#93;;<br />dig_P3 = bufor_danych_komp&#91;11&#93;;<br />dig_P3 = (dig_P3 &lt;&lt; 8) | bufor_danych_komp&#91;10&#93;;<br />dig_P4 = bufor_danych_komp&#91;13&#93;;<br />dig_P4 = (dig_P4 &lt;&lt; 8) | bufor_danych_komp&#91;12&#93;;<br />dig_P5 = bufor_danych_komp&#91;15&#93;;<br />dig_P5 = (dig_P5 &lt;&lt; 8) | bufor_danych_komp&#91;14&#93;;<br />dig_P6 = bufor_danych_komp&#91;17&#93;;<br />dig_P6 = (dig_P6 &lt;&lt; 8) | bufor_danych_komp&#91;16&#93;;<br />dig_P7 = bufor_danych_komp&#91;19&#93;;<br />dig_P7 = (dig_P7 &lt;&lt; 8) | bufor_danych_komp&#91;18&#93;;<br />dig_P8 = bufor_danych_komp&#91;21&#93;;<br />dig_P8 = (dig_P8 &lt;&lt; 8) | bufor_danych_komp&#91;20&#93;;<br />dig_P9 = bufor_danych_komp&#91;23&#93;;<br />dig_P9 = (dig_P9 &lt;&lt; 8) | bufor_danych_komp&#91;22&#93;;<br /><br />}<br /><br />void BMP280_odczytaj_t()<br />{<br />TWI_start();//start transmisji<br />TWI_write(0xEC);//wyślij adres BMP280<br />TWI_write(0xFA);//wyślij początkowy adres pamięci wybranego układu - bajt MSB dla odczytu temperatury<br />TWI_start();//ponowny start magistrali<br />TWI_write(0xEC + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />bufor_t&#91;0&#93; = TWI_read(1);//odczyt MSB temperatury<br />bufor_t&#91;1&#93; = TWI_read(1);//odczyt LSB temperatury<br />bufor_t&#91;2&#93; = TWI_read(0);// odczyt XLSB temperatury<br />TWI_stop();//koniec transmisji<br /><br />//składanie bajtów w zmienną 32bit<br />odczytana_t = bufor_t&#91;0&#93;;//przepisuję zmienną int8_t do zmiennaj int32_t aby ta przejęła znak<br />odczytana_t = odczytana_t &lt;&lt; 8 | bufor_t&#91;1&#93;;//przesuwam w lewo najbardziej znaczący bajt o 8 pozycji i w powstałe puste miejsce wstawiam mniej znaczący bajt<br />odczytana_t = odczytana_t &lt;&lt; 8 | bufor_t&#91;2&#93;;//przesuwam całośc o kolejne 8 bajtow i dodaje najmniej znaczący bajt<br />odczytana_t = odczytana_t &gt;&gt; 4;//całosc przesuwam w prawo bo najmniej znaczacy bajt ma uzyte jedynie 4 bity<br />}<br /><br />void BMP280_odczytaj_p()<br />{<br />TWI_start();//start transmisji<br />TWI_write(0xEC);//wyślij adres BMP280<br />TWI_write(0xF7);//wyślij początkowy adres pamięci wybranego układu - bajt MSB dla cisnienia<br />TWI_start();//ponowny start magistrali<br />TWI_write(0xEC + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />bufor_p&#91;0&#93; = TWI_read(1);//odczyt MSB aktualnego cisnienia<br />bufor_p&#91;1&#93; = TWI_read(1);//odczyt LSB aktualnego cisnienia<br />bufor_p&#91;2&#93; = TWI_read(0);//odczyt XLSB aktualnego cisnienia<br />TWI_stop();//koniec transmisji<br /><br />odczytane_p = bufor_p&#91;0&#93;;//składanie bajtów w zmienną 32bit<br />odczytane_p = odczytane_p &lt;&lt; 8 | bufor_p&#91;1&#93;;//mechanizm jak przy T<br />odczytane_p = odczytane_p &lt;&lt; 8 | bufor_p&#91;2&#93;;<br />odczytane_p = odczytane_p &gt;&gt; 4;<br />}<br /><br />void BMP280_konwertuj()<br />{<br />int32_t adc_T;//wg noty... w sumie to nie wiem co tu się dzieje.<br />int32_t adc_P;<br /><br />adc_T = odczytana_t;<br />adc_P = odczytane_p;<br /><br />double var1, var2, p, t_fine;<br />var1 = (((double)adc_T)/16384.0 - ((double)dig_T1)/1024.0) * ((double)dig_T2);<br />var2 = ((((double)adc_T)/131072.0 - ((double)dig_T1)/8192.0) * (((double)adc_T)/131072.0 - ((double) dig_T1)/8192.0)) * ((double)dig_T3);<br />t_fine = (var1 + var2);<br /><br />wlasciwa_t = (int32_t) (t_fine*10 / 5120.0); // temperatura ma miec format 2187 co odpowiada 21,87 *C - stąd później dzielenie przez 1000<br /><br />var1 = ((double)t_fine/2.0) - 64000.0;<br />var2 = var1 * var1 * ((double)dig_P6) / 32768.0;<br />var2 = var2 + var1 * ((double)dig_P5) * 2.0;<br />var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);<br />var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;<br />var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);<br />if (var1 == 0.0)<br />{<br />return;<br />}<br />p = 1048576.0 - (double)adc_P;<br />p = (p - (var2 / 4096.0)) * 6250.0 / var1;<br />var1 = ((double)dig_P9) * p * p / 2147483648.0;<br />var2 = p * ((double)dig_P8) / 32768.0;<br />p = (p + (var1 + var2 + ((double)dig_P7)) / 16.0);<br /><br />wlasciwe_p = p;<br />}<br /><br />void BMP280_oblicz_wysokosc()<br />{<br />float temp;<br />temp = (float) wlasciwe_p / 101325;<br />temp = 1 - pow(temp, 0.19029);<br />wysokosc = 44330 * temp * 100;<br />}<br /><br /><br />int main (void)<br />{<br />DDRC &amp;= ~(1&lt;&lt;PC4);//I2C<br />DDRC &amp;= ~(1&lt;&lt;PC5);//I2C<br /><br />DDRB |= (1&lt;&lt;PB0);//lampa, segment e//dane wyświetlane są na jednym wyświetlaczu 7-seg<br />DDRB |= (1&lt;&lt;PB1);//lampa, segment d<br />DDRB |= (1&lt;&lt;PB2);//lampa, segment f<br />DDRB |= (1&lt;&lt;PB3);//lampa, segment h (kropka)<br />DDRB |= (1&lt;&lt;PB4);//lampa, segment a<br />DDRB |= (1&lt;&lt;PB5);//lampa, segment g<br />DDRB |= (1&lt;&lt;PB6);//lampa, segment b<br />DDRB |= (1&lt;&lt;PB7);//lampa, segment c<br /><br />PORTB = 255;<br /><br />TWI_init();<br /><br />while(1)<br />{<br />BMP280_inicjuj();<br />BMP280_pomiar();<br />_delay_ms(500);<br />BMP280_odczytaj_p();<br />BMP280_odczytaj_t();<br />BMP280_konwertuj();<br /><br />td = wlasciwa_t / 1000;//temperatura dziesiątki<br />tj = (wlasciwa_t - (td * 1000)) / 100;//temperatura jedności<br />tpp = (wlasciwa_t - (td * 1000) - (tj * 100)) / 10;//temperatura po przecinku<br /><br />PORTB = cyfry&#91;td&#93;;//wyswietlanie...<br />_delay_ms(300);<br />PORTB = 255;<br />_delay_ms(100);<br />PORTB = cyfry&#91;tj&#93;;<br />_delay_ms(300);<br /><br />PORTB = 255;<br />_delay_ms(400);<br /><br />PORTB = cyfry&#91;tpp + 8&#93;;<br />_delay_ms(300);<br /><br />    PORTB = 255;<br /><br />        _delay_ms(2000);<br /><br />}<br />}[/syntax]<br /><br />Sam czujnik z pewnością jest w porządku - sprawdzone na ESP8266, który leży obok i odczytuje temperaturę i ciśnienie gdy podłączę do niego czujnik. Magistrala I2C również funkcjonuje bo we właściwym kodzie używam jeszcze RTC na PCF8583 z którym atmega komunikuje się bez przeszkód.<br /><br />Może któryś z szanownych kolegów bawił się już BMP280 w podobny sposób? Będę wdzięczny za wszelkie wskazówki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11512">mateur</a> — 18 gru 2017, o 22:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-17T15:23:44+01:00</updated>
<published>2017-12-17T15:23:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200705#p200705</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200705#p200705"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200705#p200705"><![CDATA[
<div class="quotetitle">mateur napisał(a):</div><div class="quotecontent"><br />[syntax=c]        TWI_write(0x76);//adres bmp[/syntax]<br /></div><br /><br />Zacząłbym od zmiany adresu. Adres BMP280 powinien wynosić 0xEC dla zapisu i 0xED dla odczytu lub 0xEE dla zapisu i 0xEF dla odczytu, w zależności od podłączenia pinu SDO.<br /><br />Zwykle, kiedy w dokumentacji podawany jest 7-bitowy adres układu I2C, należy przesunąć go o jeden bit w lewo i później najmniej znaczący bit ustawić zgodnie z kierunkiem transmisji R=1/W=0. Czasami podawany jest adres ośmiobitowy z bitem R/W równym zero (zapis), a czasami podawane są dwa odrębne adresy ośmiobitowe osobno dla zapisu i odczytu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 17 gru 2017, o 15:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-12-17T15:03:18+01:00</updated>
<published>2017-12-17T15:03:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200700#p200700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200700#p200700"/>
<title type="html"><![CDATA[Re: BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200700#p200700"><![CDATA[
A próbowałeś odpalić Mirkowy I2C skaner, żeby zobaczyć czy w ogóle scalak jest widoczny na magistrali? Masz BB?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 17 gru 2017, o 15:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateur]]></name></author>
<updated>2017-12-17T14:27:29+01:00</updated>
<published>2017-12-17T14:27:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200698#p200698</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200698#p200698"/>
<title type="html"><![CDATA[BMP280 Atmega8A I2C komunikacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19820&amp;p=200698#p200698"><![CDATA[
Witam!<br />Zwracam się z prośbą o pomoc w temacie komunikacji procesora Atmega8A poprzez sprzętowy interfejs I2C z czujnikiem temperatury i ciśnienia BMP280. Przy próbie jego inicjalizacji program &quot;utyka&quot; gdzieś po drodze. Dodam, że do magistrali I2C podłączony jest również zegar czasu rzeczywistego PCF8583, który korzystając z tych samych funkcji komunikacyjnych działa wyśmienicie. Poniżej odchudzony do minimum kod programu, którym próbuję testować wspomniany czujnik - niestety bez rezultatów.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br /><br />#define LED1 (1&lt;&lt;PD1)<br />#define LED0 (1&lt;&lt;PD4)<br />#define LED2 (1&lt;&lt;PD5)<br />#define LED3 (1&lt;&lt;PD6)<br />#define LED4 (1&lt;&lt;PD7)<br /><br />#define LED0_on PORTD |= LED0<br />#define LED0_off PORTD &amp;= ~LED0<br />#define LED1_on PORTD |= LED1<br />#define LED1_off PORTD &amp;= ~LED1<br />#define LED2_on PORTD |= LED2<br />#define LED2_off PORTD &amp;= ~LED2<br />#define LED3_on PORTD |= LED3<br />#define LED3_off PORTD &amp;= ~LED3<br />#define LED4_on PORTD |= LED4<br />#define LED4_off PORTD &amp;= ~LED4<br /><br />//parametry kompensacyjne BMP280<br /><br />uint16_t dig_T1, dig_P1;<br />int16_t dig_T2, dig_T3, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9;<br /><br />uint8_t bufor_danych_komp&#91;24&#93;;<br />int8_t t_msb;<br />uint8_t t_lsb;<br />uint8_t t_xlsb;<br />uint8_t bufor_p&#91;3&#93;;<br /><br />uint32_t odczytane_p;<br />int32_t odczytana_t;<br /><br />uint32_t wlasciwe_p;<br />int32_t wlasciwa_t;<br /><br />int32_t wysokosc;<br /><br />uint8_t ack = 0;<br /><br />void TWI_init()<br />{<br />TWBR = 32;<br />}<br /><br />void TWI_start(void)<br />{<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 />{<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 />{<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 />{<br />if(ack)TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEA)|(1&lt;&lt;TWEN);<br />else TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while (!(TWCR &amp; (1 &lt;&lt; TWINT)));<br />return TWDR;<br />}<br /><br />void BMP280_inicjuj()<br />{<br />TWCR &amp;= ~((1&lt;&lt;TWSTO)|(1&lt;&lt;TWEN));//reset układu TWI<br /><br />TWI_start();<br />TWI_write(0x76);//adres bmp<br />TWI_write(0xF4);//adres komórki pamięci, wtym przypadku ctrl_meas<br />TWI_write(0x0C);//bajt do zapisania w ctrl_meas<br />TWI_write(0xF5);//adres komórki pamięci, tym razem config<br />TWI_write(0x6F);//bajt do zapisania w config<br />TWI_stop();<br /><br />_delay_ms(300);<br /><br />TWI_start();//start transmisji<br />TWI_write(0x76);//wyślij adres układu<br />TWI_write(0xA1);//wyślij początkowy adres pamięci wybranego układu<br />TWI_start();<br />TWI_write(0x76 + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />bufor_danych_komp&#91;0&#93; = TWI_read(1);<br />bufor_danych_komp&#91;1&#93; = TWI_read(1);<br />bufor_danych_komp&#91;2&#93; = TWI_read(1);<br />bufor_danych_komp&#91;3&#93; = TWI_read(1);<br />bufor_danych_komp&#91;4&#93; = TWI_read(1);<br />bufor_danych_komp&#91;5&#93; = TWI_read(1);<br />bufor_danych_komp&#91;6&#93; = TWI_read(1);<br />bufor_danych_komp&#91;7&#93; = TWI_read(1);<br />bufor_danych_komp&#91;8&#93; = TWI_read(1);<br />bufor_danych_komp&#91;9&#93; = TWI_read(1);<br />bufor_danych_komp&#91;10&#93; = TWI_read(1);<br />bufor_danych_komp&#91;11&#93; = TWI_read(1);<br />bufor_danych_komp&#91;12&#93; = TWI_read(1);<br />bufor_danych_komp&#91;13&#93; = TWI_read(1);<br />bufor_danych_komp&#91;14&#93; = TWI_read(1);<br />bufor_danych_komp&#91;15&#93; = TWI_read(1);<br />bufor_danych_komp&#91;16&#93; = TWI_read(1);<br />bufor_danych_komp&#91;17&#93; = TWI_read(1);<br />bufor_danych_komp&#91;18&#93; = TWI_read(1);<br />bufor_danych_komp&#91;19&#93; = TWI_read(1);<br />bufor_danych_komp&#91;20&#93; = TWI_read(1);<br />bufor_danych_komp&#91;21&#93; = TWI_read(1);<br />bufor_danych_komp&#91;22&#93; = TWI_read(1);<br />bufor_danych_komp&#91;23&#93; = TWI_read(0);<br />TWI_stop();//koniec transmisji<br /><br />LED1_on;<br />_delay_ms(2000);<br />LED1_off;<br />}<br /><br />void BMP280_odczytaj_t()<br />{<br />TWI_start();//start transmisji<br />TWI_write(0x76);//wyślij adres układu<br />TWI_write(0xFA);//wyślij początkowy adres pamięci wybranego układu<br />TWI_start();//ponowny start magistrali<br />TWI_write(0x76 + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />t_msb = TWI_read(1);<br />t_lsb = TWI_read(1);<br />t_xlsb = TWI_read(0);<br />TWI_stop();//koniec transmisji<br /><br />odczytana_t = t_msb;<br />odczytana_t = odczytana_t &lt;&lt; 8 | t_lsb;<br />odczytana_t = odczytana_t &lt;&lt; 8 | t_xlsb;<br />odczytana_t = odczytana_t &gt;&gt; 4;<br />}<br /><br />void BMP280_odczytaj_p()<br />{<br />TWI_start();//start transmisji<br />TWI_write(0x76);//wyślij adres układu<br />TWI_write(0xF7);//wyślij początkowy adres pamięci wybranego układu<br />TWI_start();//ponowny start magistrali<br />TWI_write(0x76 + 1);//ponownie adres wraz z ustawioną flagą odczytu danych<br />bufor_p&#91;0&#93; = TWI_read(1);<br />bufor_p&#91;1&#93; = TWI_read(1);<br />bufor_p&#91;2&#93; = TWI_read(0);<br />TWI_stop();//koniec transmisji<br /><br />odczytane_p = bufor_p&#91;0&#93;;<br />odczytane_p = odczytane_p &lt;&lt; 8 | bufor_p&#91;1&#93;;<br />odczytane_p = odczytane_p &lt;&lt; 8 | bufor_p&#91;2&#93;;<br />odczytane_p = odczytane_p &gt;&gt; 4;<br />}<br /><br />void BMP280_konwertuj()<br />{<br />int32_t adc_T;<br />int32_t adc_P;<br /><br />adc_T = odczytana_t;<br />adc_P = odczytane_p;<br /><br />double var1, var2, p, t_fine;<br />var1 = (((double)adc_T)/16384.0 - ((double)dig_T1)/1024.0) * ((double)dig_T2);<br />var2 = ((((double)adc_T)/131072.0 - ((double)dig_T1)/8192.0) * (((double)adc_T)/131072.0 - ((double)  dig_T1)/8192.0)) * ((double)dig_T3);<br />t_fine = (var1 + var2);<br /><br />wlasciwa_t = (int32_t) (t_fine*10 / 5120.0);<br /><br />var1 = ((double)t_fine/2.0) - 64000.0;<br />var2 = var1 * var1 * ((double)dig_P6) / 32768.0;<br />var2 = var2 + var1 * ((double)dig_P5) * 2.0;<br />var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);<br />var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;<br />var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);<br />if (var1 == 0.0)<br />{<br />return; // avoid exception caused by division by zero<br />}<br />p = 1048576.0 - (double)adc_P;<br />p = (p - (var2 / 4096.0)) * 6250.0 / var1;<br />var1 = ((double)dig_P9) * p * p / 2147483648.0;<br />var2 = p * ((double)dig_P8) / 32768.0;<br />p = (p + (var1 + var2 + ((double)dig_P7)) / 16.0);<br /><br />wlasciwe_p = p;<br />}<br /><br />void BMP280_oblicz_wysokosc()<br />{<br />float temp;<br />temp = (float) wlasciwe_p / 101325;<br />temp = 1 - pow(temp, 0.19029);<br />wysokosc = 44330 * temp * 100;<br />}<br /><br />int main (void)<br />{<br />DDRC &amp;= ~(1&lt;&lt;PC4);//I2C<br />DDRC &amp;= ~(1&lt;&lt;PC5);//I2C<br /><br />DDRD |= LED1;<br />DDRD |= LED2;<br />DDRD |= LED3;<br />DDRD |= LED4;<br />DDRD |= LED0;<br /><br />PORTB = 255;<br /><br />TWI_init();<br /><br />while(1)<br />{<br /><br /><br />LED0_on;<br />_delay_ms(2000);<br />LED0_off;<br /><br />BMP280_inicjuj();<br />_delay_ms(1000);<br /><br />}<br /><br />}[/syntax]<br /><br />Czy, któryś z szanownych kolegów miał już do czynienia ze wspomnianym czujnikiem, w podobnej konfiguracji i zechce się pochylić nad moim problemem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11512">mateur</a> — 17 gru 2017, o 14:27</p><hr />
]]></content>
</entry>
</feed>