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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-12-22T19:50:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=13962&amp;mode</id>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T19:50:55+01:00</updated>
<published>2015-12-22T19:50:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148723#p148723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148723#p148723"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148723#p148723"><![CDATA[
<div class="quotetitle">wchpikus napisał(a):</div><div class="quotecontent"><br />szczerze to nie sprawdzałem wysokości, nie miałem potrzeby.<br /></div><br />Chodzi mi o prawidłowe zapisanie w C wzoru na wysokość n.p.m., aby kompilator nie krzyczał.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wchpikus]]></name></author>
<updated>2015-12-22T19:44:32+01:00</updated>
<published>2015-12-22T19:44:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148722#p148722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148722#p148722"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148722#p148722"><![CDATA[
szczerze to nie sprawdzałem wysokości, nie miałem potrzeby.<br />Ciśnienie działa ok.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3859">wchpikus</a> — 22 gru 2015, o 19:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T19:27:07+01:00</updated>
<published>2015-12-22T19:27:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148720#p148720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148720#p148720"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148720#p148720"><![CDATA[
<div class="quotetitle">anonimowy napisał(a):</div><div class="quotecontent"><br />Podstawy matematyki, mnożenie to dzielenie przez odwrotność. 1/0.0000225577 = 44330.7606715, więc blisko 44330, które jest zapisane jako mnożenie. Nie wiem, czy jest to wartość dokładniejsza, czy autor biblioteki się pomylił -nie zaglądałem do dokumentacji.<br /></div><br />Dziekuję.<br />Czy mógłbyś wspomóc mnie w &quot; C prawidłowym&quot; zapisaniu wzoru do wyliczania wysokości (jak w pierwszym poście). Próbuję zapisać go na różne sposoby bez powodzenia, a problem jest najpewniej w rzutowaniu. Komunikaty kompilatora to np. invalid operands to binary / (have 'long int (*)(void)' and 'long int').<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 19:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2015-12-22T17:34:49+01:00</updated>
<published>2015-12-22T17:34:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148715#p148715</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148715#p148715"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148715#p148715"><![CDATA[
<div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Napisz proszę skąd pochodzi wartość /0.0000225577 (we wzorze jest: 44330*)<br /></div><br />Podstawy matematyki, mnożenie to dzielenie przez odwrotność. 1/0.0000225577 = 44330.7606715, więc blisko 44330, które jest zapisane jako mnożenie. Nie wiem, czy jest to wartość dokładniejsza, czy autor biblioteki się pomylił -nie zaglądałem do dokumentacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3542">anonimowy</a> — 22 gru 2015, o 17:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T16:36:59+01:00</updated>
<published>2015-12-22T16:36:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148710#p148710</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148710#p148710"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148710#p148710"><![CDATA[
<div class="quotetitle">wchpikus napisał(a):</div><div class="quotecontent"><br />Nie zapomnij o bibliotekach:<br />#include &lt;math.h&gt;<br />#include &lt;stdbool.h&gt;<br /></div><br />Ok. Dzięki.<br />Reasumując tworzę następujące pliki biblioteczne:<br />BMP085.c i BMP085.h np. w folderze BMP085 (obsługa czujnika)<br />i2cmaster.c i i2cmaster.h w foderze BMP085_I2CFLEURYPATH, który jest inkludowany w BMP085.c (obsługa I2C)<br />Czy dobrze to rozumiem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wchpikus]]></name></author>
<updated>2015-12-22T15:28:18+01:00</updated>
<published>2015-12-22T15:28:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148701#p148701</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148701#p148701"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148701#p148701"><![CDATA[
Nie zapomnij o bibliotekach:<br />#include &lt;math.h&gt;<br />#include &lt;stdbool.h&gt;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3859">wchpikus</a> — 22 gru 2015, o 15:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T13:30:56+01:00</updated>
<published>2015-12-22T13:30:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148700#p148700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148700#p148700"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148700#p148700"><![CDATA[
<div class="quotetitle">wchpikus napisał(a):</div><div class="quotecontent"><br />Podsyłam pliki, jest to od BMP085, ale powinna biblioteka pasować.<br />Może są rożne adresy, trzeba sprawdzić w specyfikacji..<br /></div><br />Wielkie dzięki!<br />Jak tylko wrócę do domu wieczorkiem to odpalę bibliotekę i dam znać.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 13:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wchpikus]]></name></author>
<updated>2015-12-22T11:54:00+01:00</updated>
<published>2015-12-22T11:54:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148697#p148697</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148697#p148697"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148697#p148697"><![CDATA[
Podsyłam pliki, jest to od BMP085, ale powinna biblioteka pasować.<br />Może są rożne adresy, trzeba sprawdzić w specyfikacji..<br /><br />BMP085.c<br /><br />[syntax=c]/*<br />bmp085 lib 0x01<br />copyright (c) Davide Gironi, 2012<br />Released under GPLv3.<br />Please refer to LICENSE file for licensing information.<br />*/<br /><br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;bmp085.h&quot;<br /><br />//variables<br />static int bmp085_regac1, bmp085_regac2, bmp085_regac3, bmp085_regb1, bmp085_regb2, bmp085_regmb, bmp085_regmc, bmp085_regmd;<br />static unsigned int bmp085_regac4, bmp085_regac5, bmp085_regac6;<br />static long bmp085_rawtemperature, bmp085_rawpressure;<br /><br />//path to i2c fleury lib<br />#include BMP085_I2CFLEURYPATH<br /><br />/*<br /> * i2c write<br /> */<br />void bmp085_writemem(uint8_t reg, uint8_t value) {<br />i2c_start_wait(BMP085_ADDR | I2C_WRITE);<br />i2c_write(reg);<br />i2c_write(value);<br />i2c_stop();<br />}<br /><br />/*<br /> * i2c read<br /> */<br />void bmp085_readmem(uint8_t reg, uint8_t buff&#91;&#93;, uint8_t bytes) {<br />uint8_t i =0;<br />i2c_start_wait(BMP085_ADDR | I2C_WRITE);<br />i2c_write(reg);<br />i2c_rep_start(BMP085_ADDR | I2C_READ);<br />for(i=0; i&lt;bytes; i++) {<br />if(i==bytes-1)<br />buff&#91;i&#93; = i2c_readNak();<br />else<br />buff&#91;i&#93; = i2c_readAck();<br />}<br />i2c_stop();<br />}<br /><br /><br />#if BMP085_FILTERPRESSURE == 1<br />#define BMP085_AVARAGECOEF 21<br />static long k&#91;BMP085_AVARAGECOEF&#93;;<br />long bmp085_avaragefilter(long input) {<br />uint8_t i=0;<br />long sum=0;<br />for (i=0; i&lt;BMP085_AVARAGECOEF; i++) {<br />k&#91;i&#93; = k&#91;i+1&#93;;<br />}<br />k&#91;BMP085_AVARAGECOEF-1&#93; = input;<br />for (i=0; i&lt;BMP085_AVARAGECOEF; i++) {<br />sum += k&#91;i&#93;;<br />}<br />return (sum /BMP085_AVARAGECOEF) ;<br />}<br />#endif<br /><br />/*<br /> * read calibration registers<br /> */<br />void bmp085_getcalibration(void) {<br />uint8_t buff&#91;2&#93;;<br />memset(buff, 0, sizeof(buff));<br /><br />bmp085_readmem(BMP085_REGAC1, buff, 2);<br />bmp085_regac1 = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGAC2, buff, 2);<br />bmp085_regac2 = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGAC3, buff, 2);<br />bmp085_regac3 = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGAC4, buff, 2);<br />bmp085_regac4 = ((unsigned int)buff&#91;0&#93; &lt;&lt;8 | ((unsigned int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGAC5, buff, 2);<br />bmp085_regac5 = ((unsigned int)buff&#91;0&#93; &lt;&lt;8 | ((unsigned int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGAC6, buff, 2);<br />bmp085_regac6 = ((unsigned int)buff&#91;0&#93; &lt;&lt;8 | ((unsigned int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGB1, buff, 2);<br />bmp085_regb1 = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGB2, buff, 2);<br />bmp085_regb2 = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGMB, buff, 2);<br />bmp085_regmb = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGMC, buff, 2);<br />bmp085_regmc = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />bmp085_readmem(BMP085_REGMD, buff, 2);<br />bmp085_regmd = ((int)buff&#91;0&#93; &lt;&lt;8 | ((int)buff&#91;1&#93;));<br />}<br /><br />/*<br /> * get raw temperature as read by registers, and do some calculation to convert it<br /> */<br />void bmp085_getrawtemperature(void) {<br />uint8_t buff&#91;2&#93;;<br />memset(buff, 0, sizeof(buff));<br />long ut,x1,x2;<br /><br />//read raw temperature<br />bmp085_writemem(BMP085_REGCONTROL, BMP085_REGREADTEMPERATURE);<br />_delay_ms(5); // min. 4.5ms read Temp delay<br />bmp085_readmem(BMP085_REGCONTROLOUTPUT, buff, 2);<br />ut = ((long)buff&#91;0&#93; &lt;&lt; 8 | ((long)buff&#91;1&#93;)); //uncompensated temperature value<br /><br />//calculate raw temperature<br />x1 = ((long)ut - bmp085_regac6) * bmp085_regac5 &gt;&gt; 15;<br />x2 = ((long)bmp085_regmc &lt;&lt; 11) / (x1 + bmp085_regmd);<br />bmp085_rawtemperature = x1 + x2;<br />}<br /><br />/*<br /> * get raw pressure as read by registers, and do some calculation to convert it<br /> */<br />void bmp085_getrawpressure(void) {<br />uint8_t buff&#91;3&#93;;<br />memset(buff, 0, sizeof(buff));<br />long up,x1,x2,x3,b3,b6,p;<br />unsigned long b4,b7;<br /><br />#if BMP085_AUTOUPDATETEMP == 1<br />bmp085_getrawtemperature();<br />#endif<br /><br />//read raw pressure<br />bmp085_writemem(BMP085_REGCONTROL, BMP085_REGREADPRESSURE+(BMP085_MODE &lt;&lt; 6));<br />_delay_ms(2 + (3&lt;&lt;BMP085_MODE));<br />bmp085_readmem(BMP085_REGCONTROLOUTPUT, buff, 3);<br />up = ((((long)buff&#91;0&#93; &lt;&lt;16) | ((long)buff&#91;1&#93; &lt;&lt;8) | ((long)buff&#91;2&#93;)) &gt;&gt; (8-BMP085_MODE)); // uncompensated pressure value<br /><br />//calculate raw pressure<br />b6 = bmp085_rawtemperature - 4000;<br />x1 = (bmp085_regb2* (b6 * b6) &gt;&gt; 12) &gt;&gt; 11;<br />x2 = (bmp085_regac2 * b6) &gt;&gt; 11;<br />x3 = x1 + x2;<br />b3 = (((((long)bmp085_regac1) * 4 + x3) &lt;&lt; BMP085_MODE) + 2) &gt;&gt; 2;<br />x1 = (bmp085_regac3 * b6) &gt;&gt; 13;<br />x2 = (bmp085_regb1 * ((b6 * b6) &gt;&gt; 12)) &gt;&gt; 16;<br />x3 = ((x1 + x2) + 2) &gt;&gt; 2;<br />b4 = (bmp085_regac4 * (uint32_t)(x3 + 32768)) &gt;&gt; 15;<br />b7 = ((uint32_t)up - b3) * (50000 &gt;&gt; BMP085_MODE);<br />p = b7 &lt; 0x80000000 ? (b7 &lt;&lt; 1) / b4 : (b7 / b4) &lt;&lt; 1;<br />x1 = (p &gt;&gt; 8) * (p &gt;&gt; 8);<br />x1 = (x1 * 3038) &gt;&gt; 16;<br />x2 = (-7357 * p) &gt;&gt; 16;<br />bmp085_rawpressure = p + ((x1 + x2 + 3791) &gt;&gt; 4);<br /><br />#if BMP085_FILTERPRESSURE == 1<br />bmp085_rawpressure = bmp085_avaragefilter(bmp085_rawpressure);<br />#endif<br />}<br /><br />/*<br /> * get celsius temperature<br /> */<br />int16_t bmp085_gettemperature(void) {<br />bmp085_getrawtemperature();<br />/*long x1, x2;<br />x1 = ((bmp085_rawtemperature - bmp085_regac6) * bmp085_regac5) &gt;&gt; 15;<br />x2 = (bmp085_regmc &lt;&lt; 11) / (x1 + bmp085_regmd);<br />return (((x1 + x2 + 8) &gt;&gt; 4) - 32.0f) / 1.8f;<br />*/<br />long temperature = ((bmp085_rawtemperature + 8)&gt;&gt;4);<br />//temperature = temperature;<br />return (temperature);<br />}<br /><br />/*<br /> * get pressure<br /> */<br />long bmp085_getpressure(void) {<br />bmp085_getrawpressure();<br />return (bmp085_rawpressure + BMP085_UNITPAOFFSET);<br />}<br /><br />/*<br /> * get altitude<br /> */<br />int16_t bmp085_getaltitude(void) {<br />bmp085_getrawpressure();<br />return (((1 - pow(bmp085_rawpressure/(double)101325, 0.1903 )) / 0.0000225577) + BMP085_UNITMOFFSET);<br />}<br /><br />/*<br /> * init bmp085<br /> */<br />void bmp085_init(void) {<br />bmp085_getcalibration(); //get calibration data<br />bmp085_getrawtemperature(); //update raw temperature, at least the first time<br /><br />#if BMP085_FILTERPRESSURE == 1<br />//initialize the avarage filter<br />uint8_t i=0;<br />for (i=0; i&lt;BMP085_AVARAGECOEF; i++) {<br />bmp085_getrawpressure();<br />}<br />#endif<br />}[/syntax]<br /><br />BMP085.h<br /><br />[syntax=c]/*<br />bmp085 lib 0x01<br />copyright (c) Davide Gironi, 2012<br />Released under GPLv3.<br />Please refer to LICENSE file for licensing information.<br />References:<br />  - this library is a porting of the bmp085driver 0.4 ardunio library<br />    http://code.google.com/p/bmp085driver/<br />Notes:<br />  - to compile with avrgcc you may define -lm flag for some math functions<br />*/<br /><br /><br />#ifndef BMP085_H_<br />#define BMP085_H_<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;avr/io.h&gt;<br /><br />#ifdef __cplusplus<br />extern &quot;C&quot; {<br />#endif<br /><br />#define BMP085_ADDR (0x77&lt;&lt;1) //0x77 default I2C address<br /><br />#define BMP085_I2CFLEURYPATH &quot;../I2C/i2cmaster.h&quot; //define the path to i2c fleury lib<br />#define BMP085_I2CINIT 0 //init i2c<br /><br />//registers<br />#define BMP085_REGAC1 0xAA<br />#define BMP085_REGAC2 0xAC<br />#define BMP085_REGAC3 0xAE<br />#define BMP085_REGAC4 0xB0<br />#define BMP085_REGAC5 0xB2<br />#define BMP085_REGAC6 0xB4<br />#define BMP085_REGB1 0xB6<br />#define BMP085_REGB2 0xB8<br />#define BMP085_REGMB 0xBA<br />#define BMP085_REGMC 0xBC<br />#define BMP085_REGMD 0xBE<br />#define BMP085_REGCONTROL 0xF4 //control<br />#define BMP085_REGCONTROLOUTPUT 0xF6 //output 0xF6=MSB, 0xF7=LSB, 0xF8=XLSB<br />#define BMP085_REGREADTEMPERATURE 0x2E //read temperature<br />#define BMP085_REGREADPRESSURE 0x34 //read pressure<br /><br />//modes<br />#define BMP085_MODEULTRALOWPOWER 0 //oversampling=0, internalsamples=1, maxconvtimepressure=4.5ms, avgcurrent=3uA, RMSnoise_hPA=0.06, RMSnoise_m=0.5<br />#define BMP085_MODESTANDARD 1 //oversampling=1, internalsamples=2, maxconvtimepressure=7.5ms, avgcurrent=5uA, RMSnoise_hPA=0.05, RMSnoise_m=0.4<br />#define BMP085_MODEHIGHRES 2 //oversampling=2, internalsamples=4, maxconvtimepressure=13.5ms, avgcurrent=7uA, RMSnoise_hPA=0.04, RMSnoise_m=0.3<br />#define BMP085_MODEULTRAHIGHRES 3 //oversampling=3, internalsamples=8, maxconvtimepressure=25.5ms, avgcurrent=12uA, RMSnoise_hPA=0.03, RMSnoise_m=0.25<br /><br />//autoupdate temperature enabled<br />#define BMP085_AUTOUPDATETEMP 1 //autoupdate temperature every read<br /><br />//setup parameters<br />#define BMP085_MODE BMP085_MODESTANDARD //define a mode<br />#define BMP085_UNITPAOFFSET 0 //define a unit offset (pa)<br />#define BMP085_UNITMOFFSET 0 //define a unit offset (m)<br /><br />//avarage filter<br />#define BMP085_FILTERPRESSURE 1 //avarage filter for pressure<br /><br /><br /><br />//functions<br />void bmp085_init(void);<br />long bmp085_getpressure(void);<br />int16_t bmp085_getaltitude(void);<br />int16_t bmp085_gettemperature(void);<br />#ifdef __cplusplus<br />}<br />#endif<br />#endif[/syntax]<br /><br /><br />Działa tylko z biblioteka I2C:<br />[syntax=c]#ifndef _I2CMASTER_H<br />#define _I2CMASTER_H   1<br />/*************************************************************************<br />* Title:    C include file for the I2C master interface<br />*           (i2cmaster.S or twimaster.c)<br />* Author:   Peter Fleury &lt;pfleury@gmx.ch&gt;  http://jump.to/fleury<br />* File:     $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $<br />* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3<br />* Target:   any AVR device<br />* Usage:    see Doxygen manual<br />**************************************************************************/<br /><br />#ifdef __cplusplus<br />extern &quot;C&quot; {<br />#endif<br /><br />#ifdef DOXYGEN<br />/**<br /> @defgroup pfleury_ic2master I2C Master library<br /> @code #include &lt;i2cmaster.h&gt; @endcode<br /><br /> @brief I2C (TWI) Master Software Library<br /> Basic routines for communicating with I2C slave devices. This single master<br /> implementation is limited to one bus master on the I2C bus.<br /> This I2c library is implemented as a compact assembler software implementation of the I2C protocol<br /> which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).<br /> Since the API for these two implementations is exactly the same, an application can be linked either against the<br /> software I2C implementation or the hardware I2C implementation.<br /> Use 4.7k pull-up resistor on the SDA and SCL pin.<br /><br /> Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module<br /> i2cmaster.S to your target when using the software I2C implementation !<br /><br /> Adjust the  CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.<br /> @note<br />    The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted<br />    to GNU assembler and AVR-GCC C call interface.<br />    Replaced the incorrect quarter period delays found in AVR300 with<br />    half period delays.<br /><br /> @author Peter Fleury pfleury@gmx.ch  http://jump.to/fleury<br /> @par API Usage Example<br />  The following code shows typical usage of this library, see example test_i2cmaster.c<br /> @code<br /> #include &lt;i2cmaster.h&gt;<br /> #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet<br /> int main(void)<br /> {<br />     unsigned char ret;<br />     i2c_init();                             // initialize I2C library<br />     // write 0x75 to EEPROM address 5 (Byte Write)<br />     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode<br />     i2c_write(0x05);                        // write address = 5<br />     i2c_write(0x75);                        // write value 0x75 to EEPROM<br />     i2c_stop();                             // set stop conditon = release bus<br />     // read previously written value back from EEPROM address 5<br />     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode<br />     i2c_write(0x05);                        // write address = 5<br />     i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode<br />     ret = i2c_readNak();                    // read one byte from EEPROM<br />     i2c_stop();<br />     for(;;);<br /> }<br /> @endcode<br />*/<br />#endif /* DOXYGEN */<br /><br />/**@{*/<br /><br />#if (__GNUC__ * 100 + __GNUC_MINOR__) &lt; 304<br />#error &quot;This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !&quot;<br />#endif<br /><br />#include &lt;avr/io.h&gt;<br /><br />/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */<br />#define I2C_READ    1<br /><br />/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */<br />#define I2C_WRITE   0<br /><br /><br />/**<br /> @brief initialize the I2C master interace. Need to be called only once<br /> @param  void<br /> @return none<br /> */<br />extern void i2c_init(void);<br /><br /><br />/**<br /> @brief Terminates the data transfer and releases the I2C bus<br /> @param void<br /> @return none<br /> */<br />extern void i2c_stop(void);<br /><br /><br />/**<br /> @brief Issues a start condition and sends address and transfer direction<br /><br /> @param    addr address and transfer direction of I2C device<br /> @retval   0   device accessible<br /> @retval   1   failed to access device<br /> */<br />extern unsigned char i2c_start(unsigned char addr);<br /><br /><br />/**<br /> @brief Issues a repeated start condition and sends address and transfer direction<br /> @param   addr address and transfer direction of I2C device<br /> @retval  0 device accessible<br /> @retval  1 failed to access device<br /> */<br />extern unsigned char i2c_rep_start(unsigned char addr);<br /><br /><br />/**<br /> @brief Issues a start condition and sends address and transfer direction<br /><br /> If device is busy, use ack polling to wait until device ready<br /> @param    addr address and transfer direction of I2C device<br /> @return   none<br /> */<br />extern uint8_t i2c_start_wait(unsigned char addr);<br /><br /><br />/**<br /> @brief Send one byte to I2C device<br /> @param    data  byte to be transfered<br /> @retval   0 write successful<br /> @retval   1 write failed<br /> */<br />extern unsigned char i2c_write(unsigned char data);<br /><br /><br />/**<br /> @brief    read one byte from the I2C device, request more data from device<br /> @return   byte read from I2C device<br /> */<br />extern unsigned char i2c_readAck(void);<br /><br />/**<br /> @brief    read one byte from the I2C device, read is followed by a stop condition<br /> @return   byte read from I2C device<br /> */<br />extern unsigned char i2c_readNak(void);<br /><br />/**<br /> @brief    read one byte from the I2C device<br /><br /> Implemented as a macro, which calls either i2c_readAck or i2c_readNak<br /><br /> @param    ack 1 send ack, request more data from device&lt;br&gt;<br />               0 send nak, read is followed by a stop condition<br /> @return   byte read from I2C device<br /> */<br />extern unsigned char i2c_read(unsigned char ack);<br />#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak();<br /><br /><br />#define TWBR_CALC(speed) ( (F_CPU / speed) - 16UL ) / 2UL<br />#define SLA_W(address)  (address &lt;&lt; 1)<br />#define SLA_R(address)  ((address &lt;&lt; 1) + 0x01)<br /><br />void twi_init(uint8_t twbr_value);<br />void twistart(void);<br />void twistop(void);<br />void twiwrite(uint8_t data);<br />uint8_t twiread(uint16_t ack);<br /><br /><br /><br /><br />#ifdef __cplusplus<br />}<br />#endif<br /><br />/**@}*/<br />#endif[/syntax]<br /><br />[syntax=c]/*************************************************************************<br />* Title:    I2C master library using hardware TWI interface<br />* Author:   Peter Fleury &lt;pfleury@gmx.ch&gt;  http://jump.to/fleury<br />* File:     $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $<br />* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3<br />* Target:   any AVR device with hardware TWI<br />* Usage:    API compatible with I2C Software Library i2cmaster.h<br />**************************************************************************/<br />#include &lt;inttypes.h&gt;<br />#include &lt;compat/twi.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;i2cmaster.h&quot;<br /><br /><br />/* I2C clock in Hz */<br />#define SCL_CLOCK  400000L<br /><br /><br />/*************************************************************************<br /> Initialization of the I2C bus interface. Need to be called only once<br />*************************************************************************/<br />void i2c_init(void)<br />{<br />  /* initialize TWI clock: 100 kHz clock, TWPS = 0 =&gt; prescaler = 1 */<br /><br /><br /><br />TWSR = 0;                         /* no prescaler */<br />TWBR = (uint8_t)(((F_CPU/SCL_CLOCK)-16)/2);  /* must be &gt; 10 for stable operation */<br /><br />}/* i2c_init */<br /><br />uint8_t i2c_sync(void){<br />uint16_t timeout = 100;<br />while(!(TWCR &amp; (1&lt;&lt;TWINT)) &amp;&amp; timeout) {<br />_delay_us(1);<br />timeout--;<br />}<br />return timeout != 0;<br />}<br /><br />uint8_t i2c_waitStop(void){<br />uint16_t timeout = 100;<br />while((TWCR &amp; (1&lt;&lt;TWSTO)) &amp;&amp; timeout) {<br />_delay_us(1);<br />timeout--;<br />}<br />return timeout != 0;<br />}<br />/*************************************************************************<br />  Issues a start condition and sends address and transfer direction.<br />  return 0 = device accessible, 1= failed to access device<br />*************************************************************************/<br />unsigned char i2c_start(unsigned char address)<br />{<br />    uint8_t   twst;<br /><br />// send START condition<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWSTA) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br /><br />// wait until transmission completed (this is stupid!!)<br />if(!i2c_sync()) return 0;<br /><br />// check value of TWI Status Register. Mask prescaler bits.<br />twst = TW_STATUS &amp; 0xF8;<br />if ( (twst != TW_START) &amp;&amp; (twst != TW_REP_START)) return 1;<br /><br />// send device address<br />TWDR = address;<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br /><br />// wail until transmission completed and ACK/NACK has been received<br />if(!i2c_sync()) return 0;<br /><br />// check value of TWI Status Register. Mask prescaler bits.<br />twst = TW_STATUS &amp; 0xF8;<br />if ( (twst != TW_MT_SLA_ACK) &amp;&amp; (twst != TW_MR_SLA_ACK) ) return 1;<br /><br />return 0;<br /><br />}/* i2c_start */<br /><br /><br />/*************************************************************************<br /> Issues a start condition and sends address and transfer direction.<br /> If device is busy, use ack polling to wait until device is ready<br /><br /> Input:   address and transfer direction of I2C device<br />*************************************************************************/<br />uint8_t i2c_start_wait(unsigned char address)<br />{<br />    uint8_t   twst;<br /><br />    int retry = 2000;<br />    while ( 1 )<br />    {<br />    // send START condition<br />    TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWSTA) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br /><br />    // wait until transmission completed<br />    if(!i2c_sync()) break;<br /><br />    // check value of TWI Status Register. Mask prescaler bits.<br />    twst = TW_STATUS &amp; 0xF8;<br />    if ( (twst != TW_START) &amp;&amp; (twst != TW_REP_START)) continue;<br /><br />    // send device address<br />    TWDR = address;<br />    TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br /><br />    // wail until transmission completed<br />    if(!i2c_sync()) break;<br /><br />    // check value of TWI Status Register. Mask prescaler bits.<br />    twst = TW_STATUS &amp; 0xF8;<br />    if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )<br />    {<br />        /* device busy, send stop condition to terminate write operation */<br />        TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWSTO);//|(0&lt;&lt;TWIE);<br /><br />        // wait until stop condition is executed and bus released<br />        if(!i2c_waitStop()) continue;<br /><br />        if(!(retry --)) break;<br />        continue;<br />    }<br />    return 1;<br />    //if( twst != TW_MT_SLA_ACK) return 1;<br />    break;<br />     }<br />return 0;<br />}/* i2c_start_wait */<br /><br /><br />/*************************************************************************<br /> Issues a repeated start condition and sends address and transfer direction<br /> Input:   address and transfer direction of I2C device<br /><br /> Return:  0 device accessible<br />          1 failed to access device<br />*************************************************************************/<br />unsigned char i2c_rep_start(unsigned char address)<br />{<br />    return i2c_start( address );<br /><br />}/* i2c_rep_start */<br /><br /><br />/*************************************************************************<br /> Terminates the data transfer and releases the I2C bus<br />*************************************************************************/<br />void i2c_stop(void)<br />{<br />    /* send stop condition */<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWSTO);//|(0&lt;&lt;TWIE);<br /><br />// wait until stop condition is executed and bus released<br />i2c_waitStop();<br /><br />}/* i2c_stop */<br /><br /><br />/*************************************************************************<br />  Send one byte to I2C device<br /><br />  Input:    byte to be transfered<br />  Return:   0 write successful<br />            1 write failed<br />*************************************************************************/<br />unsigned char i2c_write( unsigned char data )<br />{<br />    uint8_t   twst;<br /><br />// send data to the previously addressed device<br />TWDR = data;<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br /><br />// wait until transmission completed<br />i2c_sync();<br /><br />// check value of TWI Status Register. Mask prescaler bits<br />twst = TW_STATUS &amp; 0xF8;<br />if( twst != TW_MT_DATA_ACK) return 1;<br />return 0;<br /><br />}/* i2c_write */<br /><br /><br />/*************************************************************************<br /> Read one byte from the I2C device, request more data from device<br /><br /> Return:  byte read from I2C device<br />*************************************************************************/<br />unsigned char i2c_readAck(void)<br />{<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWEA);//|(0&lt;&lt;TWIE);<br />i2c_sync();<br />return TWDR;<br />}/* i2c_readAck */<br /><br /><br />/*************************************************************************<br /> Read one byte from the I2C device, read is followed by a stop condition<br /><br /> Return:  byte read from I2C device<br />*************************************************************************/<br />unsigned char i2c_readNak(void)<br />{<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);//|(0&lt;&lt;TWIE);<br />i2c_sync();<br />//uart_puts(&quot;Adana odczytana z pamieci= &quot;);uart_putnrhex(TWDR);uart_puts(&quot;\r\n&quot;);<br />return TWDR;<br />}/* i2c_readNak */<br /><br /><br /><br /><br /><br />void twi_init(uint8_t twbr_value)<br />{<br />//TWSR = 0x00;<br />TWBR = twbr_value;<br />}<br /><br />void twistart(void)<br />{<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWSTA) | (1&lt;&lt;TWEN);<br />while (!(TWCR &amp; (1&lt;&lt;TWINT)));<br />}<br /><br />void twistop(void)<br />{<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWSTO) | (1&lt;&lt;TWEN);<br />while ((TWCR &amp; (1&lt;&lt;TWSTO)));<br />}<br /><br />void twiwrite(uint8_t data)<br />{<br />TWDR = data;<br />TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN);<br />while (!(TWCR &amp; (1&lt;&lt;TWINT)));<br />}<br /><br />uint8_t twiread(uint16_t ack) // nack 0<br />{<br />TWCR = ack ?<br />  ((1 &lt;&lt; TWINT) | (1 &lt;&lt; TWEN) | (1 &lt;&lt; TWEA))<br />: ((1 &lt;&lt; TWINT) | (1 &lt;&lt; TWEN)) ;<br /><br />while (!(TWCR &amp; (1&lt;&lt;TWINT)));<br />return TWDR;<br />}<br /><br />/*<br />void scan(void)<br />{<br />uart_puts_P(&quot;Scanning for devices on i2c bus ...\r\n\n&quot;);<br /><br />for(uint8_t s = 0; s &lt;= 0x7F; s++)<br />{<br />twistart();<br />twiwrite(SLA_W(s));<br /><br />if(TW_STATUS == TW_MT_SLA_ACK )<br />{<br />uart_puts_P(&quot;Found device at address - 0x&quot;);<br />uart_put_hex(s);<br />uart_puts_P(&quot; (&lt;&lt; 1 for SLA_W) \t 0b&quot;);<br />uart_putintr(s, 2);<br />uart_puts_P(&quot; 0\r\n&quot;);<br /><br />}<br />twistop();<br />}<br />}*/[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3859">wchpikus</a> — 22 gru 2015, o 11:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T09:29:12+01:00</updated>
<published>2015-12-22T09:29:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148687#p148687</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148687#p148687"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148687#p148687"><![CDATA[
<div class="quotetitle">wchpikus napisał(a):</div><div class="quotecontent"><br />return ((1 - pow(bmp085_rawpressure/(double)101325, 0.1903 )) / 0.0000225577) + BMP085_UNITMOFFSET;<br /></div><br />Dziękuję bardzo.<br />Napisz proszę skąd pochodzi wartość /0.0000225577 (we wzorze jest: 44330*) oraz co dodajesz do wyniku (BMP085_UNITMOFFSER)?<br />Pozdrawiam<br /><br />P.S. Czy jest to biblioteka ze strony: <!-- m --><a class="postlink" href="https://github.com/mkschreder/martink/blob/master/sensors/bmp085.c" >https://github.com/mkschreder/martink/b ... s/bmp085.c</a><!-- m --> i czy działa z czujnikiem BMP180?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 09:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wchpikus]]></name></author>
<updated>2015-12-22T08:34:00+01:00</updated>
<published>2015-12-22T08:34:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148683#p148683</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148683#p148683"/>
<title type="html"><![CDATA[Re: BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148683#p148683"><![CDATA[
Ja mam w bibliotece tak:<br /><br />[syntax=c]/*<br /> * get altitude<br /> */<br />int16_t bmp085_getaltitude(void) {<br />bmp085_getrawpressure();<br />return ((1 - pow(bmp085_rawpressure/(double)101325, 0.1903 )) / 0.0000225577) + BMP085_UNITMOFFSET;<br />}[/syntax]<br /><br />[syntax=c]void bmp085_getrawpressure(void) {<br />uint8_t buff&#91;3&#93;;<br />memset(buff, 0, sizeof(buff));<br />long up,x1,x2,x3,b3,b6,p;<br />unsigned long b4,b7;<br /><br />#if BMP085_AUTOUPDATETEMP == 1<br />bmp085_getrawtemperature();<br />#endif<br /><br />//read raw pressure<br />bmp085_writemem(BMP085_REGCONTROL, BMP085_REGREADPRESSURE+(BMP085_MODE &lt;&lt; 6));<br />_delay_ms(2 + (3&lt;&lt;BMP085_MODE));<br />bmp085_readmem(BMP085_REGCONTROLOUTPUT, buff, 3);<br />up = ((((long)buff&#91;0&#93; &lt;&lt;16) | ((long)buff&#91;1&#93; &lt;&lt;8) | ((long)buff&#91;2&#93;)) &gt;&gt; (8-BMP085_MODE)); // uncompensated pressure value<br /><br />//calculate raw pressure<br />b6 = bmp085_rawtemperature - 4000;<br />x1 = (bmp085_regb2* (b6 * b6) &gt;&gt; 12) &gt;&gt; 11;<br />x2 = (bmp085_regac2 * b6) &gt;&gt; 11;<br />x3 = x1 + x2;<br />b3 = (((((long)bmp085_regac1) * 4 + x3) &lt;&lt; BMP085_MODE) + 2) &gt;&gt; 2;<br />x1 = (bmp085_regac3 * b6) &gt;&gt; 13;<br />x2 = (bmp085_regb1 * ((b6 * b6) &gt;&gt; 12)) &gt;&gt; 16;<br />x3 = ((x1 + x2) + 2) &gt;&gt; 2;<br />b4 = (bmp085_regac4 * (uint32_t)(x3 + 32768)) &gt;&gt; 15;<br />b7 = ((uint32_t)up - b3) * (50000 &gt;&gt; BMP085_MODE);<br />p = b7 &lt; 0x80000000 ? (b7 &lt;&lt; 1) / b4 : (b7 / b4) &lt;&lt; 1;<br />x1 = (p &gt;&gt; 8) * (p &gt;&gt; 8);<br />x1 = (x1 * 3038) &gt;&gt; 16;<br />x2 = (-7357 * p) &gt;&gt; 16;<br />bmp085_rawpressure = p + ((x1 + x2 + 3791) &gt;&gt; 4);<br /><br />#if BMP085_FILTERPRESSURE == 1<br />bmp085_rawpressure = bmp085_avaragefilter(bmp085_rawpressure);<br />#endif<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3859">wchpikus</a> — 22 gru 2015, o 08:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-12-22T07:18:32+01:00</updated>
<published>2015-12-22T07:18:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148680#p148680</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148680#p148680"/>
<title type="html"><![CDATA[BMP180 - wysokość n.p.m. - proszę o sprawdzenie funkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13962&amp;p=148680#p148680"><![CDATA[
Witam!<br /><br />Proszę o sprawdzenie poprawności zapisu funkcji do wyliczania wysokości n.p.m. na podstawie ciśnienia atmosferycznego. Nie działa Rzutowanie na float - błąd kompilacji. Rzutowanie na uint16_t - zwraca wynik -21206. Funkcja BMP180_getp() zwraca wartość typu long. Podstawiane wartości: Po-101325Pa (poziom morza), P-99247Pa (u mnie). Spodziewany wynik 250m n.p.m. Wzór na wysokość z noty katalogowej czujnika BMP180.<br /><a href="https://obrazkiforum.atnel.pl/9310/60685053946b44fa8a835e697d5ea4c1.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/9310/60685053946b44fa8a835e697d5ea4c1.png" alt="Obrazek" /></a><br />[syntax=c]long getAltitude(void){<br />static long SLP = 101325; // Pa<br />long altitude;<br />altitude = (float)44330 * (1-pow((float)BMP180_getp()/SLP, (1/5.255)));<br />return (long)altitude;<br />}[/syntax]<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 22 gru 2015, o 07:18</p><hr />
]]></content>
</entry>
</feed>