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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-01-07T16:31:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21840&amp;mode</id>
<entry>
<author><name><![CDATA[Mario17]]></name></author>
<updated>2019-01-07T16:31:03+01:00</updated>
<published>2019-01-07T16:31:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215552#p215552</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215552#p215552"/>
<title type="html"><![CDATA[Re: Przeliczanie wartości z ADC nieliniowo.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215552#p215552"><![CDATA[
A jeżeli zależy Ci na pamięci możesz też zrobić tak:<br /><br />[syntax=c]#define N 5<br /><br />const uint8_t delta&#91;N&#93; PROGMEM = { 28,14,23,20,20 };<br /><br />void level_measurement( void ){<br /><br />uint16_t lvlMax = 1023, lvlMin = lvlMax - pgm_read_word( &amp;delta&#91;0&#93; );<br />uint8_t i;<br /><br />level = pomiar( 1 );<br /><br />for( i=0; i&lt;N-1; i++ ){<br /><br />if( level &gt; lvlMin &amp;&amp; level &lt; lvlMax ) break;<br /><br />lvlMax -= pgm_read_word( &amp;delta&#91;i&#93; );<br />lvlMin = lvlMax - pgm_read_word( &amp;delta&#91;i+1&#93; );<br /><br />}<br />if( i ) level = i + 10; else level = i;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3695">Mario17</a> — 7 sty 2019, o 16:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2019-01-07T14:12:37+01:00</updated>
<published>2019-01-07T14:12:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215539#p215539</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215539#p215539"/>
<title type="html"><![CDATA[Przeliczanie wartości z ADC nieliniowo.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21840&amp;p=215539#p215539"><![CDATA[
Witam<br />Napisałem takiego potwora, zastanawiam się jak można to zrobić inaczej bardziej fachowo bo patrząc na taki „kod” mnie samego odrzuca i mam świadomość, że jest to mało eleganckie, tyle if-ów. Podkreślam, że mimo paskudnego wyglądu działa tak jak powinno.<br />[syntax=c]void level_measurement(void)<br />{<br />level = pomiar(1);<br /><br /><br />if(level &lt; 139) level = 46;<br />if(level &gt;= 995)level = 0;<br />if((level &lt; 995) &amp;&amp; (level &gt;= 981)) level = 10;<br />if((level &lt; 981) &amp;&amp; (level &gt;= 958)) level = 11;<br />if((level &lt; 958) &amp;&amp; (level &gt;= 938)) level = 12;<br />if((level &lt; 938) &amp;&amp; (level &gt;= 918)) level = 13;<br />if((level &lt; 918) &amp;&amp; (level &gt;= 887)) level = 14;<br />if((level &lt; 887) &amp;&amp; (level &gt;= 862)) level = 15;<br />if((level &lt; 862) &amp;&amp; (level &gt;= 836)) level = 16;<br />if((level &lt; 836) &amp;&amp; (level &gt;= 815)) level = 17;<br />if((level &lt; 815) &amp;&amp; (level &gt;= 795)) level = 18;<br />if((level &lt; 795) &amp;&amp; (level &gt;= 774)) level = 19;<br />if((level &lt; 774) &amp;&amp; (level &gt;= 750)) level = 20;<br />if((level &lt; 750) &amp;&amp; (level &gt;= 725)) level = 21;<br />if((level &lt; 725) &amp;&amp; (level &gt;= 698)) level = 22;<br />if((level &lt; 698) &amp;&amp; (level &gt;= 672)) level = 23;<br />if((level &lt; 672) &amp;&amp; (level &gt;= 653)) level = 24;<br />if((level &lt; 653) &amp;&amp; (level &gt;= 623)) level = 25;<br />if((level &lt; 623) &amp;&amp; (level &gt;= 598)) level = 26;<br />if((level &lt; 598) &amp;&amp; (level &gt;= 575)) level = 27;<br />if((level &lt; 575) &amp;&amp; (level &gt;= 549)) level = 28;<br />if((level &lt; 549) &amp;&amp; (level &gt;= 528)) level = 29;<br />if((level &lt; 528) &amp;&amp; (level &gt;= 498)) level = 30;<br />if((level &lt; 498) &amp;&amp; (level &gt;= 477)) level = 31;<br />if((level &lt; 477) &amp;&amp; (level &gt;= 453)) level = 32;<br />if((level &lt; 453) &amp;&amp; (level &gt;= 432)) level = 33;<br />if((level &lt; 432) &amp;&amp; (level &gt;= 414)) level = 34;<br />if((level &lt; 414) &amp;&amp; (level &gt;= 383)) level = 35;<br />if((level &lt; 383) &amp;&amp; (level &gt;= 362)) level = 36;<br />if((level &lt; 362) &amp;&amp; (level &gt;= 336)) level = 37;<br />if((level &lt; 336) &amp;&amp; (level &gt;= 311)) level = 38;<br />if((level &lt; 311) &amp;&amp; (level &gt;= 289)) level = 39;<br />if((level &lt; 289) &amp;&amp; (level &gt;= 260)) level = 40;<br />if((level &lt; 260) &amp;&amp; (level &gt;= 242)) level = 41;<br />if((level &lt; 242) &amp;&amp; (level &gt;= 219)) level = 42;<br />if((level &lt; 219) &amp;&amp; (level &gt;= 193)) level = 43;<br />if((level &lt; 193) &amp;&amp; (level &gt;= 162)) level = 44;<br />if((level &lt; 162) &amp;&amp; (level &gt;= 139)) level = 45;<br />}[/syntax]<br /><br />Poniższa funkcja mam za zadanie przypisać wynikowi (zakresowi) z ADC konkretną liczbę. Na przykład wartość powyżej 995 powinna dawać wynik 0, wartość od 981 do 995 wskazuje na 10, od 958 do 981 to 11, od 938 do 958 to już 12 itd.<br />Nie mogłem tego zrobić stosując jakiś stały przelicznik, ponieważ wartości z ADC nie przyrastają liniowo.<br />Czy macie pomysł jak to napisać profesjonalnie?<br />Pytam z ciekawości bo jak napisałem powyżej, działa prawidłowo, tylko wygląda dziwnie a gdybym potrzebował poszerzyć zakres od 0 do 50 to już w ogóle będzie śmiesznie.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 7 sty 2019, o 14:12</p><hr />
]]></content>
</entry>
</feed>