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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-01-10T12:35:14+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5483&amp;mode</id>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-01-10T12:35:14+01:00</updated>
<published>2014-01-10T12:35:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64495#p64495</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64495#p64495"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64495#p64495"><![CDATA[
No sam sobie nie mogę <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez Gość — 10 sty 2014, o 12:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-10T12:10:39+01:00</updated>
<published>2014-01-10T12:10:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64489#p64489</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64489#p64489"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64489#p64489"><![CDATA[
rezasurmar a sobie też możesz kliknąć ? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> DZIĘKUJĘ<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 10 sty 2014, o 12:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-01-10T09:39:42+01:00</updated>
<published>2014-01-10T09:39:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64472#p64472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64472#p64472"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64472#p64472"><![CDATA[
<div class="quotetitle">kurnachatka napisał(a):</div><div class="quotecontent"><br />llemar napisał(a):<br />Dziękuję Ci kurnachatka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> program działa (gdzie się klika pomógł?)<br /><br />Prawdopodobnie nie masz takiej możliwości bo temat założył kolega rezasurmar i tylko on może kliknąć pomógł.<br /></div><br /><br />kliknąłem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez Gość — 10 sty 2014, o 09:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kurnachatka]]></name></author>
<updated>2014-01-10T09:26:09+01:00</updated>
<published>2014-01-10T09:26:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64471#p64471</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64471#p64471"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64471#p64471"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />Dziękuję Ci kurnachatka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> program działa (gdzie się klika pomógł?)<br /></div><br />Prawdopodobnie nie masz takiej możliwości bo temat założył kolega rezasurmar i tylko on może kliknąć pomógł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=930">kurnachatka</a> — 10 sty 2014, o 09:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-01-09T13:33:21+01:00</updated>
<published>2014-01-09T13:33:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64389#p64389</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64389#p64389"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64389#p64389"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />A niecierpliwość jest ogromna i chciałoby się wszystko robić od razu <br />No nic, trzeba wziąć jeszcze na wstrzymanie i czytać<br /></div><br /><br />Mam tak samo jak ty <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> że tak przytoczę słowa piosenki.<br /><br />Ogólnie wiedza moja na temat programowania w C jest mizerna, ale staram się zawsze uruchamiać po kolei poszczególne &quot;klocki&quot; programu<br />Dlatego idealnie jest podzielić sobie to na funkcje. Nauczyć się przekazywać parametry przez funkcje i przyjmować parametry do funkcji. Wtedy troszkę łatwiej zapanować nad kodem. Nawet jak ma być jeden if w funkcji to na początku dobrze to rozjaśnia kod.<br /><br />Po za tym jak już koledzy wspominali, przyjmij jeden &quot;model&quot; czy &quot;styl&quot; klamrowania, tabulatorów. Masz kreatory od tego w eclipsie. Np. po enterze automatycznie wrzuca ci tabulacje. Sam staram się stosować styl Mirkowy, bo łatwiej wtedy o pomoc, a przejrzystość kodu na tym bardzo mocno zyskuje.<br /><br />Np. robisz sobie szablon z ifów, elsów i od razu walisz za nimi klamry, nawet jak będzie tam jeden rozkaz na początku. Dzięki temu nie zgubisz żadnej klamerki po drodze.<p>Statystyki: Napisane przez Gość — 9 sty 2014, o 13:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T12:12:17+01:00</updated>
<published>2014-01-09T12:12:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64387#p64387</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64387#p64387"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64387#p64387"><![CDATA[
Dziękuję Ci kurnachatka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> program działa (gdzie się klika pomógł?)<br />Jednakże przed kolejnymi pytaniami poczytam jeszcze BlueBooka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Dzięki wam zrobiłem kroczek do przodu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 12:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kurnachatka]]></name></author>
<updated>2014-01-09T11:59:14+01:00</updated>
<published>2014-01-09T11:59:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64386#p64386</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64386#p64386"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64386#p64386"><![CDATA[
Masz tu przerobiony swój kod znajdź różnice.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &lt;avr/pgmspace.h&gt;<br />    #include &lt;util/delay.h&gt;<br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />    #define KEY1_PIN (1&lt;&lt;PD0)<br />    #define KEY1_DOWN !(PIND &amp; KEY1_PIN)<br />    #define KEY2_PIN (1&lt;&lt;PD1)<br />    #define KEY2_DOWN !(PIND &amp; KEY2_PIN)<br />    #define KEY3_PIN (1&lt;&lt;PD2)<br />    #define KEY3_DOWN !(PIND &amp; KEY3_PIN)<br /><br />    uint16_t temp1;<br />    uint16_t temp2;<br />    uint16_t temp3;<br /><br />    int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits);<br />    uint8_t czujniki_cnt;           /* ilość czujników na magistrali */<br />    volatile uint8_t s1_flag;       /* flaga tyknięcia timera co 1 sekundę */<br />    volatile uint8_t sekundy;       /* licznik sekund 0-59 */<br />    uint8_t stopien&#91;&#93; = {12,18,18,12,32,32,32,32};<br />    uint8_t subzero, cel, cel_fract_bits;<br /><br />    int main(void) {<br /><br />            DDRA |= (1&lt;&lt;PA7);       // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />            PORTA |= (1&lt;&lt;PA7);      // załączamy podświetlenie LCD - stan wysoki<br /><br />            DDRC |= (1&lt;&lt;PC3);   //Diody (przekaźniki przepustnic)<br />            PORTC |= (1&lt;&lt;PC3);<br />            DDRC |= (1&lt;&lt;PC4);<br />            PORTC |= (1&lt;&lt;PC4);<br />            DDRC |= (1&lt;&lt;PC5);<br />            PORTC |= (1&lt;&lt;PC5);<br /><br />            DDRD &amp;= ~KEY1_PIN;  //KLAWISZE<br />            PORTD |= KEY1_PIN;<br />            DDRD &amp;= ~KEY2_PIN;<br />            PORTD |= KEY2_PIN;<br />            DDRD &amp;= ~KEY3_PIN;<br />            PORTD |= KEY3_PIN;<br /><br />            /* ustawienie TIMER0 dla F_CPU=11,0592MHz */<br />            TCCR0 |= (1&lt;&lt;WGM01);                            /* tryb CTC */<br />            TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);           /* preskaler = 1024 */<br />            OCR0 = 107;                                                     /* dodatkowy podział przez 108 (rej. przepełnienia) */<br />            TIMSK |= (1&lt;&lt;OCIE0);                            /* zezwolenie na przerwanie CompareMatch */<br />            /* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />            /* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br />            lcd_init();     /* inicjalizacja LCD */<br />            lcd_defchar(0x80,stopien);<br /><br />            /* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />            czujniki_cnt = search_sensors();<br />            DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />            /* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />            _delay_ms(750);<br /><br />            sei();  /* włączamy globalne przerwania */<br /><br />            /* pętla nieskończona */<br />            while(1) {<br />    //===============================================================================================================<br />    //Porównania temperatur, otwieranie przepustnic<br /><br />                if((temp1 &gt; temp2) &amp;&amp; (temp1 &gt; temp3)) //jeżeli temperatura z DSnr1 &gt; od temp. DSnr2 i temperatura z DSnr1 &gt; od temp. DSnr3<br />                {<br />                        PORTC &amp;= ~(1&lt;&lt;PC3); //ustaw stan niski na porcie C3<br />                }else<br />                {<br />                        PORTC |= (1&lt;&lt;PC3); //ustaw stan wysoki na porcie C3<br />                }<br /><br />                if((temp2 &gt; temp1) &amp;&amp; (temp2 &gt; temp3)) //jeżeli temperatura z DSnr1 &gt; od temp. DSnr2 i temperatura z DSnr1 &gt; od temp. DSnr3<br />                {<br />                        PORTC &amp;= ~(1&lt;&lt;PC4); //ustaw stan niski na porcie C3<br />                }else<br />                {<br />                        PORTC |= (1&lt;&lt;PC4); //ustaw stan wysoki na porcie C3<br />                }<br /><br />                if((temp3 &gt; temp2) &amp;&amp; (temp3 &gt; temp1)) //jeżeli temperatura z DSnr1 &gt; od temp. DSnr2 i temperatura z DSnr1 &gt; od temp. DSnr3<br />                {<br />                        PORTC &amp;= ~(1&lt;&lt;PC5); //ustaw stan niski na porcie C3<br />                }else<br />                {<br />                        PORTC |= (1&lt;&lt;PC5); //ustaw stan wysoki na porcie C3<br />                }<br /><br /><br />    //=========================================================================================================================<br />    //Odczytywanie temperatur<br />                    if(s1_flag) {   /* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />                            /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />                            if( 0 == (sekundy%3) ) {<br /><br />                                    uint8_t *cl=(uint8_t*)gSensorIDs;       // pobieramy wskaźnik do tablicy adresów czujników<br />                                    for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />                                    czujniki_cnt = search_sensors();        // ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />                                    lcd_locate(0,15);<br />                                    lcd_int( czujniki_cnt );        // wyświetlamy ilość czujników na magistrali<br />                            }<br /><br />                            /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />                            if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />                            /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br />                             *  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br />                             *  to pokaż komunikat o błędzie<br />                             */<br />                            if( 2 == (sekundy%3) ) {<br />                                    if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) )<br />                                    {<br />                                    temp1= Convert_Temperature( subzero,  cel,  cel_fract_bits);<br /><br /><br />                                    }<br /><br />                                    if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) )<br />                                    {<br />                                    temp2= Convert_Temperature( subzero,  cel,  cel_fract_bits);<br /><br />                                    }<br /><br />                                    if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) )<br />                                    {<br />                                    temp3= Convert_Temperature( subzero,  cel,  cel_fract_bits);<br /><br />                                    }<br /><br />                            }<br /><br />                            /* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />                            s1_flag=0;<br />                    } /* koniec sprawdzania flagi */<br />            } /* koniec pętli nieskończonej */<br />    }<br /><br /><br /><br />    int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits){<br /><br />            int16_t result;<br /><br />            if(subzero) result = (cel*-10)-cel_fract_bits;<br />            else result = (cel*10)+cel_fract_bits;<br /><br />            return result;<br />    }<br />    /* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />    /* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />    ISR(TIMER0_COMP_vect)  //przerwania timer<br />    {<br />            static uint8_t cnt=0;   /* statyczna zmienna cnt do odliczania setnych ms */<br /><br />            if(++cnt&gt;99) {  /* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />                    s1_flag=1;      /* ustaw flagę tyknięcia sekundy */<br />                    sekundy++;      /* zwiększ licznik sekund */<br />                    if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />                    cnt=0;  /* wyzeru licznik setnych ms */<br />            }<br />    }[/syntax]<br /><br />Jak go wkleisz powinno działać, munie kompiluje się bez błędów.<br />Podpowiem tylko że w kilku miejscach miałeś za if-ami niepotrzebne średniki i jeszcze tam kilka przeróbek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=930">kurnachatka</a> — 9 sty 2014, o 11:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T11:52:37+01:00</updated>
<published>2014-01-09T11:52:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64385#p64385</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64385#p64385"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64385#p64385"><![CDATA[
A niecierpliwość jest ogromna i chciałoby się wszystko robić od razu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />No nic, trzeba wziąć jeszcze na wstrzymanie i czytać<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 11:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-01-09T11:45:32+01:00</updated>
<published>2014-01-09T11:45:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64384#p64384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64384#p64384"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64384#p64384"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />Warto przeczytać i wiedzieć wszystko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Być może za wcześnie zabieram się za ćwiczenia...<br /></div><br /><br />Tzn ja powtarzam zawsze jak mantrę ....<br /><br />Bluebooka trzeba przeczytać RAZ przynajmniej JEDEN RAZ tak w całości od deski do deski a dopiero potem można czytać na wyrywki<br /><br />dlaczego ?<br /><br />ano dlatego że wtedy zanim sam sobie zadasz pytanie jak przekazać do zmiennych wartości z funkcji to w głowie odezwie ci się mała kotwiczka, którą zapuściłem wcześniej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> gdy czytałeś RAZ całość i będziesz wiedział że trzeba zajrzeć gdzieś tam do środka bo ... ooo tym właśnie było tam napisane<br /><br />tak działa przekaz podprogowy w Bluebooku <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">acid3 napisał(a):</div><div class="quotecontent"><br />Najpierw teoretyczna część ksiązki, potem miganie, a potem LCD z multitouchem<br /></div><br /><br />Tzn tak jak pisałem wyżej - najpierw RAZ cała książka - bo w Bluebooku teoria miesza się w przykładach w drugiej jej części warsztatowej .... to nie jest typowo napisana książka że najpierw jakaś teoria a potem wybrane ćwiczenia ... to wszystko jest zmiksowane w odpowiedni sposób <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=54">mirekk36</a> — 9 sty 2014, o 11:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2014-01-09T11:44:15+01:00</updated>
<published>2014-01-09T11:44:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64383#p64383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64383#p64383"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64383#p64383"><![CDATA[
llemar, jeśli mnie wzrok nie zawodzi to teraz warunki się wykonują po kolei bez względu na wynik i na końcu dostajesz warninga za else które tam &quot;nie pasuje&quot;.<br /><br />Najpierw teoretyczna część ksiązki, potem miganie, a potem LCD z multitouchem  <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=944">acid3</a> — 9 sty 2014, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T11:39:40+01:00</updated>
<published>2014-01-09T11:39:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64382#p64382</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64382#p64382"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64382#p64382"><![CDATA[
Warto przeczytać i wiedzieć wszystko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Być może za wcześnie zabieram się za ćwiczenia...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 11:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-01-09T11:25:29+01:00</updated>
<published>2014-01-09T11:25:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64380#p64380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64380#p64380"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64380#p64380"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />Jeszcze jedno pytanko - jak zwrócić wynik funkcji do zmiennych (temp1, temp2, temp3)??<br /></div><br /><br />a czytałeś już o funkcjach w Bluebooku ? czy jeszcze nie ? ... bo jeśli nie - to warto<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 sty 2014, o 11:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T11:15:15+01:00</updated>
<published>2014-01-09T11:15:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64377#p64377</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64377#p64377"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64377#p64377"><![CDATA[
acid3- zrobiłem tak jak jest na stronie 62 w niebieskiej książce. Czytam ją na bieżąco (nie zawsze ze zrozumieniem ale staram się to pojąć) Sugerujesz, żeby warunki były zagnieżdżone ?<br />Jeszcze jedno pytanko - jak zwrócić wynik funkcji do zmiennych (temp1, temp2, temp3)??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 11:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2014-01-09T11:02:39+01:00</updated>
<published>2014-01-09T11:02:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64375#p64375</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64375#p64375"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64375#p64375"><![CDATA[
llemar, nie masz klamerek po if'ach i masz else po wykonaniu PORTC &amp;=...... czyli else nie wiadomo czego się dotyczy.<br /><br />Przeczytaj podstawy C z książki zwłaszcza rozdział o IF i jej składni. Bez takich podstaw ani rusz dalej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 9 sty 2014, o 11:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T10:52:40+01:00</updated>
<published>2014-01-09T10:52:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64374#p64374</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64374#p64374"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64374#p64374"><![CDATA[
Zrobiłem tak jak podpowiedział kolega kurnachatka, lecz kompilator dalej krzyczy &quot;suggest explicit braces to avoid ambiguous 'else'&quot;<br />w miejscu<br />[syntax=c]if(temp1 &gt; temp2)                //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr2<br />if(temp1 &gt; temp3)             //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr3<br /><br />PORTC &amp;= ~(1&lt;&lt;PC3); //ustaw stan niski na porcie C3<br /><br />else<br />{<br />PORTC |= (1&lt;&lt;PC3); //ustaw stan wysoki na porcie C3<br />}[/syntax]<br /><br /><br />cały kod wygląda tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />#define KEY1_PIN (1&lt;&lt;PD0)<br />#define KEY1_DOWN !(PIND &amp; KEY1_PIN)<br />#define KEY2_PIN (1&lt;&lt;PD1)<br />#define KEY2_DOWN !(PIND &amp; KEY2_PIN)<br />#define KEY3_PIN (1&lt;&lt;PD2)<br />#define KEY3_DOWN !(PIND &amp; KEY3_PIN)<br /><br />uint16_t temp1;<br />uint16_t temp2;<br />uint16_t temp3;<br /><br />int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits);<br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br />uint8_t stopien&#91;&#93; = {12,18,18,12,32,32,32,32};<br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />DDRA |= (1&lt;&lt;PA7);// ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />PORTA |= (1&lt;&lt;PA7);// załączamy podświetlenie LCD - stan wysoki<br /><br />DDRC |= (1&lt;&lt;PC3);   //Diody (przekaźniki przepustnic)<br />PORTC |= (1&lt;&lt;PC3);<br />DDRC |= (1&lt;&lt;PC4);<br />PORTC |= (1&lt;&lt;PC4);<br />DDRC |= (1&lt;&lt;PC5);<br />PORTC |= (1&lt;&lt;PC5);<br /><br />DDRD &amp;= ~KEY1_PIN;  //KLAWISZE<br />PORTD |= KEY1_PIN;<br />DDRD &amp;= ~KEY2_PIN;<br />PORTD |= KEY2_PIN;<br />DDRD &amp;= ~KEY3_PIN;<br />PORTD |= KEY3_PIN;<br /><br />/* ustawienie TIMER0 dla F_CPU=11,0592MHz */<br />TCCR0 |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0 = 107;/* dodatkowy podział przez 108 (rej. przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE0);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br />lcd_init();/* inicjalizacja LCD */<br />lcd_defchar(0x80,stopien);<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);<br /><br />sei();/* włączamy globalne przerwania */<br /><br />/* pętla nieskończona */<br />while(1) {<br />//===============================================================================================================<br />//Porównania temperatur, otwieranie przepustnic<br /><br />if(temp1 &gt; temp2)                //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr2<br />if(temp1 &gt; temp3)             //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr3<br /><br />PORTC &amp;= ~(1&lt;&lt;PC3); //ustaw stan niski na porcie C3<br /><br />else<br />{<br />PORTC |= (1&lt;&lt;PC3); //ustaw stan wysoki na porcie C3<br />}<br /><br />if(temp2 &gt; temp1)                //jeżeli temperatura dziesiętne z DSnr2 &gt; od temp. dziesiętnej DSnr1<br />if(temp2 &gt; temp3)            //jeżeli temperatura dziesiętne z DSnr2 &gt; od temp. dziesiętnej DSnr3<br /><br />PORTC &amp;= ~(1&lt;&lt;PC4); //ustaw stan niski na porcie C4<br /><br />else<br />{<br />PORTC |= (1&lt;&lt;PC4); //ustaw stan wysoki na porcie C4<br />}<br /><br />if(temp3 &gt; temp2)                //jeżeli temperatura dziesiętne z DSnr3 &gt; od temp. dziesiętnej DSnr2<br />if(temp3 &gt; temp1)            //jeżeli temperatura dziesiętne z DSnr3 &gt; od temp. dziesiętnej DSnr1<br /><br />PORTC &amp;= ~(1&lt;&lt;PC5); //ustaw stan niski na porcie C5<br /><br />else<br />{<br />PORTC |= (1&lt;&lt;PC5); //ustaw stan wysoki na porcie C5<br />}<br /><br /><br /><br />//=========================================================================================================================<br />//Odczytywanie temperatur<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) {<br /><br />uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />czujniki_cnt = search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />lcd_locate(0,15);<br />lcd_int( czujniki_cnt );// wyświetlamy ilość czujników na magistrali<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br /> *  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br /> *  to pokaż komunikat o błędzie<br /> */<br />if( 2 == (sekundy%3) ) {<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );<br />{<br />int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits);<br />temp1=cel;<br /><br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );<br />{<br />int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits);<br />temp2=cel;<br /><br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );<br />{<br />int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits);<br />temp3=cel;<br /><br />}<br /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}<br /><br /><br /><br />int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits){<br /><br />        int16_t result;<br /><br />        if(subzero) result = (cel*-10)-cel_fract_bits;<br />        else result = (cel*10)+cel_fract_bits;<br /><br />        return result;<br />}<br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMP_vect)  //przerwania timer<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 10:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kurnachatka]]></name></author>
<updated>2014-01-09T08:25:36+01:00</updated>
<published>2014-01-09T08:25:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64359#p64359</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64359#p64359"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64359#p64359"><![CDATA[
Ja bym się nie bawił z tym porównywaniem wartości zmiennych w if-ach przed przecinkiem, po przecinku.<br />Nie żeby się nie dało wykonać ale strasznie zagmatwane.<br /><br />Ja to realizuje tak że jeżeli chcę mieć dokładność do jednego miejsca po przecinku to przemnażam wartości przez 10 i na nich wykonuje wszystkich operacji.<br />Tutaj masz gotową funkcje której ja używam.<br />[syntax=c]int16_t Convert_Temperature(uint8_t subzero, uint8_t cel, uint8_t cel_fract_bits){<br /><br />int16_t result;<br /><br />if(subzero) result = (cel*-10)-cel_fract_bits;<br />else result = (cel*10)+cel_fract_bits;<br /><br />return result;<br />}[/syntax] <br /><br />w miejscu gdzie przypisujesz wartości temperatur do kolejnych temp... zastosuj tą funkcje i przypisz wynik do zmiennej int16_t.<br />I wtedy porównujesz zmienne np temperatura 10.5C to wartość 105, -5,3C to wartość -53 itp...<br /><br />[syntax=c]temp2=Convert_Temperature(subzero, cel, cel_fract_bits);[/syntax]<br /><br />Tylko zadeklaruj wartość temp2 jako int16_t a wartość temp21 usuń i tak analogicznie dla wszystkich czujników.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />A tak sprawdzasz swoje temperatury<br /><br />[syntax=c]if((temp1 &gt; temp2) &amp;&amp; (temp1 &gt; temp3)) //jeżeli temperatura z DSnr1 &gt; od temp. DSnr2 i temperatura z DSnr1 &gt; od temp. DSnr3<br />{<br />PORTC &amp;= ~(1&lt;&lt;PC3); //ustaw stan niski na porcie C3<br />}else<br />{<br />PORTC |= (1&lt;&lt;PC3); //ustaw stan wysoki na porcie C3<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=930">kurnachatka</a> — 9 sty 2014, o 08:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2014-01-09T07:29:22+01:00</updated>
<published>2014-01-09T07:29:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64357#p64357</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64357#p64357"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64357#p64357"><![CDATA[
Witam<br /><div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />kilka warunków if pod sobą i już problem.  Proszę o pomoc<br /></div><br />...to znaczy: nie działa, źle działa czy brzydko wygląda.<br />Sory, ale  ( chyba ) nie  piszesz.<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 9 sty 2014, o 07:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Villentre]]></name></author>
<updated>2014-01-09T01:58:53+01:00</updated>
<published>2014-01-09T01:58:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64353#p64353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64353#p64353"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64353#p64353"><![CDATA[
<strong>Marcin_G</strong>, w obu przypadkach kompilator u mnie zwrócił ten sam wynik, więc ze względów optymalizacyjnych różnicy brak.<br /><br />Co innego wygląd (ja wolę formę podaną przez Ciebie, zwięzłą) i możliwości znalezienia jakiś błędów/debagowania (tu zdecydowanie łatwiej dopisać jakieś else w formie rozpisanej). Niemniej - kwestia gustu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=517">Villentre</a> — 9 sty 2014, o 01:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcin_G]]></name></author>
<updated>2014-01-09T01:14:58+01:00</updated>
<published>2014-01-09T01:14:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64350#p64350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64350#p64350"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64350#p64350"><![CDATA[
Skorzystam z okazji i zapytam, czy w sytuacji gdy jest tyle warunków które muszą się spełnić, zapisanie tego w formie jaką prezentuję poniżej jest lepszym czy może gorszym rozwiązaniem od zapisania tego w sposób jaki podał kolega, oczywiście po poprawieniu błędów w składni.<br />[syntax=c]if (temp1 &gt; temp2 &amp;&amp; temp1 &gt; temp3 &amp;&amp; temp11 &gt; temp21 &amp;&amp; temp11 &gt; temp31)<br />{<br />PORTC &amp;= ~(1&lt;&lt;PC3);<br />}<br />else<br />{<br /> PORTC |= (1&lt;&lt;PC3);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=758">Marcin_G</a> — 9 sty 2014, o 01:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2014-01-09T00:12:29+01:00</updated>
<published>2014-01-09T00:12:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64349#p64349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64349#p64349"/>
<title type="html"><![CDATA[Re: Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64349#p64349"><![CDATA[
Jak na mój gust to przy tych wszystkich if'ach brakuje klamerek {} potem nagle jest średnik nie wiadomo po co a potem klamerka, która dla kompilatora jest już bardzo nie ważna. <br /><br />Proponuję koledze aby przeczytał on pierwszą część BB i ogólnie &quot;zaprzyjaźnił&quot; się z samą składnią C.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 9 sty 2014, o 00:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-01-09T00:03:24+01:00</updated>
<published>2014-01-09T00:03:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64347#p64347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64347#p64347"/>
<title type="html"><![CDATA[Porównanie temperatur]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64347#p64347"><![CDATA[
Witam wszystkich serdecznie i dziękuję koledze rezasurmar za założenie tematu. Od niedawna zacząłem się uczyć programowania w C. Jako na dobry początek wymyśliłem sobie sterowniczek do centrali wentylacyjnej który miałby za zadanie odnaleźć najcieplejszy kanał powietrza i przełączyć się na niego (kominek, wymiennik gruntowy i czerpnia na ścianie budynku). W związku z tym, iż zdecydowanie za mało wiem postanowiłem, że posklejam kod z tego co znajdę i co już mam wraz  z niebieską księgą. Aż doszedłem do momentu kiedy musiałem sam napisać kawałek kodu, no i tu pojawiły się schody. Na początku porównywałem ze sobą całkowite części temperatury i tu nie było problemu, ale chciałbym, żeby urządzenie działało jeszcze dokładniej więc dodałem do porównania części po przecinku, kilka warunków if pod sobą i już problem.  Proszę o pomoc.<br />Dziękuję i pozdrawiam,<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 9 sty 2014, o 00:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-01-08T23:39:07+01:00</updated>
<published>2014-01-08T23:39:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64344#p64344</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64344#p64344"/>
<title type="html"><![CDATA[Problem z programem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5483&amp;p=64344#p64344"><![CDATA[
Z racji że kolega nie może jeszcze wrzucać na forum nowych tematów zakładam za niego temat<br /><br /><div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2014-01-07<br /> *       Autor: xxx<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />#define KEY1_PIN (1&lt;&lt;PD0)<br />#define KEY1_DOWN !(PIND &amp; KEY1_PIN)<br />#define KEY2_PIN (1&lt;&lt;PD1)<br />#define KEY2_DOWN !(PIND &amp; KEY2_PIN)<br />#define KEY3_PIN (1&lt;&lt;PD2)<br />#define KEY3_DOWN !(PIND &amp; KEY3_PIN)<br /><br />uint8_t temp1;<br />uint8_t temp11;<br />uint8_t temp2;<br />uint8_t temp21;<br />uint8_t temp3;<br />uint8_t temp31;<br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br />uint8_t stopien&#91;&#93; = {12,18,18,12,32,32,32,32};<br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />DDRA |= (1&lt;&lt;PA7);// ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />PORTA |= (1&lt;&lt;PA7);// załączamy podświetlenie LCD - stan wysoki<br /><br />DDRC |= (1&lt;&lt;PC3);   //Diody (przekaźniki przepustnic)<br />PORTC |= (1&lt;&lt;PC3);<br />DDRC |= (1&lt;&lt;PC4);<br />PORTC |= (1&lt;&lt;PC4);<br />DDRC |= (1&lt;&lt;PC5);<br />PORTC |= (1&lt;&lt;PC5);<br /><br />DDRD &amp;= ~KEY1_PIN;  //KLAWISZE<br />PORTD |= KEY1_PIN;<br />DDRD &amp;= ~KEY2_PIN;<br />PORTD |= KEY2_PIN;<br />DDRD &amp;= ~KEY3_PIN;<br />PORTD |= KEY3_PIN;<br /><br />/* ustawienie TIMER0 dla F_CPU=11,0592MHz */<br />TCCR0 |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0 = 107;/* dodatkowy podział przez 108 (rej. przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE0);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br />lcd_init();/* inicjalizacja LCD */<br />lcd_defchar(0x80,stopien);<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);<br /><br />sei();/* włączamy globalne przerwania */<br /><br />/* pętla nieskończona */<br />while(1) {<br />//===============================================================================================================<br />//Porównania temperatur, otwieranie przepustnic<br /><br />if(temp1 &gt; temp2 )                //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr2<br />if(temp1 &gt; temp3)             //jeżeli temperatura dziesiętne z DSnr1 &gt; od temp. dziesiętnej DSnr3<br />if(temp11 &gt; temp21)       //jeżeli temperatura po przecinku z DSnr1 &gt; od temp. po przecinku DSnr2<br />if(temp11 &gt; temp31);   //jeżeli temperatura po przecinku z DSnr1 &gt; od temp. po przecinku DSnr3<br />{<br />PORTC &amp;= ~(1&lt;&lt;PC3); //ustaw stan niski na porcie C3<br />}<br />else<br />{<br />PORTC |= (1&lt;&lt;PC3); //ustaw stan wysoki na porcie C3<br />}<br /><br />if(temp2 &gt; temp1)                //jeżeli temperatura dziesiętne z DSnr2 &gt; od temp. dziesiętnej DSnr1<br />if(temp2 &gt; temp3)            //jeżeli temperatura dziesiętne z DSnr2 &gt; od temp. dziesiętnej DSnr3<br />if(temp21 &gt; temp11)      //jeżeli temperatura po przecinku z DSnr2 &gt; od temp. po przecinku DSnr1<br />if(temp21 &gt; temp31);  //jeżeli temperatura po przecinku z DSnr2 &gt; od temp. po przecinku DSnr3<br />{<br />PORTC &amp;= ~(1&lt;&lt;PC4); //ustaw stan niski na porcie C4<br />}<br />else<br />{<br />PORTC |= (1&lt;&lt;PC4); //ustaw stan wysoki na porcie C4<br />}<br /><br />if(temp3 &gt; temp2)                //jeżeli temperatura dziesiętne z DSnr3 &gt; od temp. dziesiętnej DSnr2<br />if(temp3 &gt; temp1)            //jeżeli temperatura dziesiętne z DSnr3 &gt; od temp. dziesiętnej DSnr1<br />if(temp31 &gt; temp21)      //jeżeli temperatura po przecinku z DSnr3 &gt; od temp. po przecinku DSnr2<br />if(temp31 &gt; temp11);  //jeżeli temperatura po przecinku z DSnr3 &gt; od temp. po przecinku DSnr1<br />{<br />PORTC &amp;= ~(1&lt;&lt;PC5); //ustaw stan niski na porcie C5<br />}<br />else<br />{<br />PORTC |= (1&lt;&lt;PC5); //ustaw stan wysoki na porcie C5<br />}<br /><br /><br /><br />//=========================================================================================================================<br />//Odczytywanie temperatur<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) {<br /><br />uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />czujniki_cnt = search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />lcd_locate(0,15);<br />lcd_int( czujniki_cnt );// wyświetlamy ilość czujników na magistrali<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br /> *  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br /> *  to pokaż komunikat o błędzie<br /> */<br />if( 2 == (sekundy%3) ) {<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );// display_temp(16);<br />{<br />temp1=cel;<br />temp11=cel_fract_bits; //wczytanie temperatury do zmiennej<br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );// display_temp(24);<br />{<br />temp2=cel;<br />temp21=cel_fract_bits;<br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) );// display_temp(32);<br />{<br />temp3=cel;<br />temp31=cel_fract_bits;<br />}<br /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}<br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMP_vect)  //przerwania timer<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /></div><p>Statystyki: Napisane przez Gość — 8 sty 2014, o 23:39</p><hr />
]]></content>
</entry>
</feed>