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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-10-29T21:50:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19485&amp;mode</id>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-10-29T21:50:48+01:00</updated>
<published>2017-10-29T21:50:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198016#p198016</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198016#p198016"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198016#p198016"><![CDATA[
Czy ustawiłeś PB0 jako wyjście? <br />Mam tutaj na myśli: [syntax=c]DDRB |= (1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB0);[/syntax]<br />W którym miejscu w kodzie wstawiłeś tą linijkę:<br />[syntax=c]if(cel &gt; 50) PORTB |= (1&lt;&lt;PB0);[/syntax]<br />Ja dałbym ją:<br />[syntax=c]s1_flag = 0;<br />                } // koniec sprawdzania flagi s1_flag<br /> <br />                if(cel &gt; 50) PORTB |= (1&lt;&lt;PB0); //tutaj!!! załączenie wentylatora<br />                else PORTB &amp;= ~(1&lt;&lt;PB0); // wyłączenie wyntylatora<br /> <br />        } // koniec while<br />} // koniec inta[/syntax]<br />Warto pomyśleć nad zastosowaniem histerezy. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Na przykład:<br /><a href="http://forum.atnel.pl/post195278.html?hilit=histereza#p195278"  class="postlink">http://forum.atnel.pl/post195278.html?hilit=histereza#p195278</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 29 paź 2017, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrLearner]]></name></author>
<updated>2017-10-29T19:49:24+01:00</updated>
<published>2017-10-29T19:49:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198000#p198000</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198000#p198000"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=198000#p198000"><![CDATA[
To akurat pisałem z palca na szybko. Bardziej mi chodzi o wytłumaczenie, jak zrobić warunek z tą temperaturą <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=18017">avrLearner</a> — 29 paź 2017, o 19:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jaca_76]]></name></author>
<updated>2017-10-29T19:03:49+01:00</updated>
<published>2017-10-29T19:03:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197994#p197994</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197994#p197994"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197994#p197994"><![CDATA[
PB1 |= (1&lt;&lt;PB0);<br />Powinno być PORTB |= (1&lt;&lt;PB0);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2479">jaca_76</a> — 29 paź 2017, o 19:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrLearner]]></name></author>
<updated>2017-10-29T20:06:44+01:00</updated>
<published>2017-10-29T17:07:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197985#p197985</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197985#p197985"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197985#p197985"><![CDATA[
Mam kolejne pytanie. Chciałbym zrobić tak, że gdy temperatura wzrośnie powyżej jakiejś wartości - np. 50 st. C, to załącza się wiatrak. W tym celu podaję stan wysoki na PB0. I tu mam pytanie. Jak sprawdzić czy temperatura jest większa od 50 st. C?<br /><br />[syntax=c]if(cel &gt; 50) PORTB |= (1&lt;&lt;PB0);[/syntax]<br /><br />Coś takiego nie działa. W przypadku pomiaru napięcia, wartość zmierzona jest zapisywana w rejestrze ADCW, a jak jest tutaj? Nie rozumiem tego zbytnio<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18017">avrLearner</a> — 29 paź 2017, o 17:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrLearner]]></name></author>
<updated>2017-10-29T12:50:26+01:00</updated>
<published>2017-10-29T12:50:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197975#p197975</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197975#p197975"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197975#p197975"><![CDATA[
Dzięki za radę, tak właśnie zrobiłem i działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18017">avrLearner</a> — 29 paź 2017, o 12:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-10-29T12:34:54+01:00</updated>
<published>2017-10-29T12:34:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197971#p197971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197971#p197971"/>
<title type="html"><![CDATA[Re: Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197971#p197971"><![CDATA[
<div class="quotetitle">avrLearner napisał(a):</div><div class="quotecontent"><br />w moim programie z tym pomiarem temperatury coś jest nie tak.<br /></div><br /><br />Nie napisałeś niestety co dokładnie jest nie tak. <br />Wygląda na to, że co 100ms kasujesz ekran i wyświetlasz napięcie i prąd.<br />Temperaturę wyświetlasz co 3 sekundy, więc nie zdążysz jej zobaczyć. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Wywal po prostu tą linijkę: lcd_cls();, a kasowanie zrób już w konkretnych funkcjach do wyświetlania napięcia i prądu, na przykład tak: lcd_str(&quot;                 &quot;);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 29 paź 2017, o 12:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrLearner]]></name></author>
<updated>2017-10-29T11:15:40+01:00</updated>
<published>2017-10-29T11:15:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197966#p197966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197966#p197966"/>
<title type="html"><![CDATA[Problem z pomiarem temperatury DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19485&amp;p=197966#p197966"><![CDATA[
Witam, piszę pewien program, który będzie miał za zadanie dokonywać pomiaru prądu, napięcia i temperatury w zasilaczu. Na podstawie temperatury będzie zrobione sterowanie wiatrakiem. Jak na razie udało mi się zrobić pomiar napięcia i prądu, ale mam pewien problem z pomiarem temperatury. Jeśli chodzi o sposób połączenia DS18B20 do mikroprocesora to jest dobrze podłączone, bo wgrywałem na Atmegę8 program z BB i działa dobrze, ale w moim programie z tym pomiarem temperatury coś jest nie tak.<br /><br />Wstawiam kod:<br />[syntax=c]#include&lt;avr/io.h&gt;<br />#include&lt;avr/delay.h&gt;<br />#include&lt;avr/interrupt.h&gt;<br />#include&lt;avr/pgmspace.h&gt;<br />#include&lt;avr/eeprom.h&gt;<br />#include&lt;string.h&gt;<br /><br />#include &quot;lcd44780.h&quot;<br />#include &quot;1wire/ds18x20.h&quot;<br /><br /><br />// Deklaracje funkcji:<br />uint16_t pomiar_napiecia(uint8_t kanal);<br />void wysw_nap(void);<br />void wysw_prad(void);<br />void wysw_temp(void);<br /><br />// Definicje zmiennych:<br />uint32_t wynik_nap, wynik_i;<br />uint32_t pmu, pmi;<br />uint8_t cz_du, cz_uu, cz_di, cz_ui;// cz_du - częśc dziesiętna napięcia, itd.<br />volatile uint8_t Timer1; // timery programowe<br /><br /><br />// *** Pomiar temp.: ***<br />uint8_t czujniki_cnt; // liczba czujników na magistrali<br />volatile uint8_t s1_flag, sekundy; // flaga tykcięcia co 1s i licznik sekund<br />uint8_t subzero, cel, cel_fract_bits; // znak(+ lub -), częśc dziesiętna, częśc ułamkowa<br /><br /><br /><br /><br />int main (void)<br />{<br />// Inicjalizacja LCD i ekran powitalny:<br />lcd_init();<br />lcd_locate(0, 0);<br />lcd_str_P(PSTR(&quot;Zasilacz stabil.&quot;));<br />lcd_locate(1, 4);<br />lcd_str_P(PSTR(&quot;30V / 5A&quot;));<br />_delay_ms(1500);<br /><br />// ADC:<br />ADCSRA |= (1&lt;&lt;ADEN);  // włączenie ADC<br />ADCSRA |= (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2); // preskaler = 64<br />ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;REFS1); // Uref = 2.56V<br /><br />// Timer2:<br />TCCR2 |= (1&lt;&lt;WGM21); // CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20); // preskaler = 1024<br />OCR2 = 107; // przerwanie co 10ms<br />TIMSK = (1&lt;&lt;OCIE2); // odblokowanie CompareMatch<br /><br />sei(); // globalna zgoda na przerwania<br /><br />// *** Pomiar temp.: ***<br />czujniki_cnt = search_sensors(); // sprawdzenie, ile czujników jest na magistrali<br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); // pomiar temperatury<br />_delay_ms (750); // oczekiwanie na dokonanie konwersji przez czujniki<br /><br />// odczyt i wyświetlenie temperatury z 1. czujnika, jeśli został wykryty<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wysw_temp();<br />else<br />{<br />lcd_locate(1, 10);<br />lcd_str(&quot;error&quot;);<br />}<br /><br /><br />while(1)<br />{<br />lcd_locate(0, 12);<br />lcd_str_P(PSTR(&quot;Temp&quot;));<br />if(!Timer1) // pomiar napięcia i prądu co 100ms:<br />{<br />lcd_cls();<br />Timer1 = 10;<br />// *** Wyświetlanie napięcia: ***<br />pmu = pomiar_napiecia(1);<br />wysw_nap();<br /><br />// *** Wyśietlanie prądu: ***<br />pmi = pomiar_napiecia(3);<br />wysw_prad();<br />} // koniec ifa<br /><br /><br />// *** Pomiar temp.: ***<br />if(s1_flag)<br />{<br />if(0 == (sekundy%3)) czujniki_cnt = search_sensors(); // sprawdzenie czujniów<br />if(1 == (sekundy%3)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); // pomiar temperatury<br />if(2 == (sekundy%3)) // wyświetlenie temperatury<br />{<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wysw_temp();<br />else<br />{<br />lcd_locate(1, 10);<br />lcd_str(&quot;error&quot;);<br />}<br />}<br />s1_flag = 0;<br />} // koniec sprawdzania flagi s1_flag<br />} // koniec while<br />} // koniec inta<br /><br /><br /><br />// Definicje funkcji:<br />uint16_t pomiar_napiecia(uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8) | kanal; //ustawienie wybranego kanału w rej. ADMUX<br />ADCSRA |= (1&lt;&lt;ADSC); // start pomiaru<br />while (ADCSRA &amp; (1&lt;&lt;ADSC)); // oczekowanie na zakończenie pomiaru<br />return ADCW; // zwrócenie 16-bitowej wartości<br />}<br /><br />void wysw_nap(void)<br />{<br />wynik_nap = pmu * 24UL * 1344UL;<br />cz_du = wynik_nap/1000000;<br />cz_uu = (wynik_nap/100) % 100;<br />lcd_locate(0, 1);<br />lcd_str_P(PSTR(&quot;U = &quot;));<br />lcd_int(cz_du);<br />lcd_str(&quot;.&quot;);<br />lcd_int(cz_uu);<br />lcd_str_P(PSTR(&quot; V&quot;));<br />}<br /><br />void wysw_prad(void)<br />{<br />wynik_i = pmi * 24UL * 2.06;<br />cz_di = wynik_i/10000;<br />cz_ui = (wynik_i/10) % 100;<br />lcd_locate (1, 1);<br />lcd_str_P(PSTR(&quot;I = &quot;));<br />lcd_int(cz_di);<br />lcd_str(&quot;.&quot;);<br />lcd_int(cz_ui);<br />lcd_str_P(PSTR(&quot; A&quot;));<br />}<br /><br />void wysw_temp(void)<br />{<br />lcd_locate(1, 12);<br />lcd_int(cel);<br />lcd_str(&quot;.&quot;);<br />lcd_int(cel_fract_bits);<br />lcd_str(&quot; C&quot;);<br />}<br /><br /><br />// Procedura obsługi przerwania:<br />ISR(TIMER2_COMP_vect)<br />{<br />uint8_t x;<br />x = Timer1;<br />if(x) Timer1 = --x;<br /><br />static uint8_t cnt=0;<br />if(++cnt &gt; 99) // gdy cnt&gt;99 minęła sekunda<br />{<br />s1_flag = 1; // ustaw flage tyknięcia sekundy<br />sekundy++;<br />if(sekundy&gt;59) sekundy = 0;<br />cnt=0;<br />}<br /><br />}[/syntax]<br /><br />A tu schemat:<br /><a href="https://obrazkiforum.atnel.pl/18017/7b765cd300c55266883ad859f4d91d86.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/18017/7b765cd300c55266883ad859f4d91d86.jpg" alt="Obrazek" /></a><br /><br />Fragment kodu programu w pętli głównej, gdzie sprawdzana jest flaga tyknięcia co 1s wydaje mi się, że też działa poprawnie. Sprawdziłem to na migającej diodzie, wpisując taki fragment kodu:<br />[syntax=c]if(s1_flag)<br />{<br />if(0 == (sekundy%2)) PORTB |= (1&lt;&lt;PB1);<br />if(1 == (sekundy%2)) PORTB &amp;= ~(1&lt;&lt;PB1);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18017">avrLearner</a> — 29 paź 2017, o 11:15</p><hr />
]]></content>
</entry>
</feed>