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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-31T12:27:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3712&amp;mode</id>
<entry>
<author><name><![CDATA[tomwisnia]]></name></author>
<updated>2013-07-31T12:27:30+01:00</updated>
<published>2013-07-31T12:27:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43954#p43954</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43954#p43954"/>
<title type="html"><![CDATA[Re: Termometr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43954#p43954"><![CDATA[
dobrze ci się wydaje jeśli chodzi o ustawienie timerów,<br />w main ustawiasz timer1 a w przerwaniu uruchamiasz porównanie dla TIMER0 który nie posiada takiego trybu .<br />Przeanalizuj notę dla atmegi8<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=183">tomwisnia</a> — 31 lip 2013, o 12:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcinf8702]]></name></author>
<updated>2013-07-31T11:29:03+01:00</updated>
<published>2013-07-31T11:29:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43952#p43952</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43952#p43952"/>
<title type="html"><![CDATA[Termometr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3712&amp;p=43952#p43952"><![CDATA[
Witam <br /><br />Ostatnio staram się zrealizować Termometr na uC Atmega 8. Duało mi się go uruchomić na podstawie Książki Pana Mirka. Jednak problem polega na tym że układ dokonuje pomiaru tylko raz i temperatura nie zmienia się. kolejnego pomiaru dokonuje po zresetowanieu uC. wysyłam kod porgramu i prosze o pomoc. Wytaje mi się że źle coś poustawiałem w timerach. Z góry dziękuje za pomoc. <br /><br />PS Przeraszam za jakieś rażące błędy ale jestem początkujący. <br /><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 /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#include &quot;1Wire/ds18x20.h&quot;<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 />DDRC |= (1&lt;&lt;PC5);<br />PORTC |= (1&lt;&lt;PC5); /* podświetlenie wyświetlacza LCD */<br /><br />/* ustawienie TIMER0 dla F_CPU=8 MHz */<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;WGM13);/* tryb CTC */<br />TCCR1B |= (1&lt;&lt;CS11) | (1&lt;&lt;CS10);/* preskaler = 64*/<br />OCR1B = 1250;/* dodatkowy podział przez 108 (rej. przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE1B);/* 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(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 /><span style="color: #FF0000">A ja nie potrafię zrozumieć dlaczego niektórzy wpisują syntax z klawiatury zamiast wygodnie wygodnie wybrać z listy.<br /><br />I do wszystkich: nie usuwamy wpisów moderacyjnych.<br /><br />Zielony J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1568">Marcinf8702</a> — 31 lip 2013, o 11:29</p><hr />
]]></content>
</entry>
</feed>