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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-03-17T13:30:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=6399&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-03-17T13:30:10+01:00</updated>
<published>2014-03-17T13:30:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74697#p74697</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74697#p74697"/>
<title type="html"><![CDATA[Re: DS18B20 porównanie wartości temperatury]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74697#p74697"><![CDATA[
No to teraz ty sam zobacz ....<br /><br />wstawiłeś ten warunek ot tak sobie w pętli głównej while(1) ....<br /><br />a przecież wewnątrz tej pętli masz dwa warunki IF w których masz sprawdzaną temperaturę z każdego czujnika - co więcej sprawdzanie to następuje co ściśle określony czas za pomocą techniki timerów programowych ... dlaczego więc nie wstawisz swojego warunku w odpowiednim IF'ie dla danego czujnika ? tylko dałeś to wprost w pętli głównej i lata ci to milion razy na sekundę .... a prawdopodobnie masz tylko jeden czujnik i po drugim sprawdzeniu w cel masz jakąś dziwną wartość<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 mar 2014, o 13:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ramad]]></name></author>
<updated>2014-03-17T13:04:01+01:00</updated>
<published>2014-03-17T13:04:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74695#p74695</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74695#p74695"/>
<title type="html"><![CDATA[DS18B20 porównanie wartości temperatury]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6399&amp;p=74695#p74695"><![CDATA[
Witam, pozwolę sobie założyć tutaj temat, z racji że w ostatnim z moich postów podpiąłem się pod niewłaściwy temat i podałem zbyt małą ilość informacji.<br /><br />Podłączyłem DS18B20 do atmegi32 i wyświetliłem temperatury na wyświetlaczu. Do obsługi DSa korzystam z bibliotek Mirka, wszystko mi ładnie działa. Chce dokonywać sterowania przekaźniczkami za pomocą temperatury czytanej z dsa i tu zaczynają sie schody. Zaglądałem do bluebooka i jeżeli wszystko dobrze zrozumiałem to jedno-bajtowa zmienna cel przetrzymuje dziesiętna część temp. która jest wyświetlana na LCD po konwersji liczby całk. na string. Próbuję za pomocą prostej instrukcji warunkowej if ( cel &gt; 30) PK1_ON; ustawić stan wysoki na jednym z portów aby zadziałał przekaźnik,jednak powyżej temperatury 30c nic sie nie dzieje. Początkowo myślałem że może źle coś podpiąłem, więc żeby się upewnić pod pin PD7 podpiąłem diodę anodą z rezystorem 1k i wpiąłem katodą do masy. Jednak nadal bez rezultatu dioda się nie zapala po przekroczeniu 30c na DSie. Poniżej zamieszczam kod:<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-13<br /> *       Autor: Mirosław Kardaś<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 PK1_PIN (1&lt;&lt;PD7)<br />#define PK1_ON PORTD |= PK1_PIN<br /><br />void display_temp(uint8_t x);<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 /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />DDRD |= PK1_PIN;<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); /* podświetlenie wyświetlacza LCD */<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 = 108;/* 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 /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury<br /> * do wszystkich czujników na magistrali 1Wire<br /> * zakładając, że zasilane są w trybie NORMAL,<br /> * gdyby był to tryb Parasite, należałoby użyć<br /> * jako pierwszego prarametru DS18X20_POWER_PARASITE */<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 />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />/* wyświetlamy temperaturę gdy czujnik wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<br />}<br /><br />sei();/* włączamy globalne przerwania */<br /><br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;  T1       T2&quot;)); /* wyświetl napisy w zerowej linii LCD */<br /><br />/* pętla nieskończona */<br />while(1) {<br /><br />if (cel &gt; 30)<br />{<br />PK1_ON;<br />}<br /><br /><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) ) czujniki_cnt = search_sensors();<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(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);<br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<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 />/* wyświetlanie temperatury na pozycji X w drugiej linii LCD */<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<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)<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 widać jedyne co dodałem to :<br /><br />[syntax=c]#define PK1_PIN (1&lt;&lt;PD7)<br />#define PK1_ON PORTD |= PK1_PIN<br /><br />DDRD |= PK1_PIN;<br /><br />if (cel &gt; 30)<br />{<br />PK1_ON;<br />}[/syntax]<br /><br />ale wygląda to na zbyt proste żeby działało <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Bardzo proszę o pomoc, jak rozwiązać ten pewnie dla większości błahy problem, pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3022">ramad</a> — 17 mar 2014, o 13:04</p><hr />
]]></content>
</entry>
</feed>