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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-11-14T23:56:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1803&amp;mode</id>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-11-14T23:56:11+01:00</updated>
<published>2012-11-14T23:56:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18932#p18932</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18932#p18932"/>
<title type="html"><![CDATA[Re: Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18932#p18932"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" />  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Dzięki wielkie<br />Działa pięknie<br />Może ktoś będzie chciał sprawdzić moją wersję wyświetlania temperarury:<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 &lt;stdbool.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />#define co_ile 10<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 />volatile bool s2_flag;     //flaga co (co_ile) sekund<br />uint8_t subzero, cel, cel_fract_bits, *ppwsk;<br /><br /><br />bool tab[10][12] = {<br /><br /><br />{1,1,1,1,0,1,1,0,1,1,1,1},<br />{0,1,1,0,0,1,0,0,1,0,0,1},<br />{1,1,1,0,0,1,1,0,0,1,1,1},<br />{1,1,1,0,0,1,0,1,1,1,1,1},<br />{1,0,1,1,0,1,1,1,1,0,0,1},<br />{1,1,1,1,0,0,0,0,1,1,1,1},<br />{1,1,1,1,0,0,1,0,1,1,1,1},<br />{1,1,1,0,0,1,0,0,1,0,0,1},<br />{1,1,1,1,0,1,1,1,1,1,1,1},<br />{1,1,1,1,0,1,0,0,1,1,1,1}<br /><br />};<br /><br />uint8_t stopien[6][8] = {<br /><br />{0,0,0,3,7,12,24,24},<br />{0,0,0,24,28,6,3,3},<br />{24,24,12,7,3,0,0,0},<br />{3,3,6,28,24,0,0,0},<br />{0,0,0,0,0,0,31,31},//minus<br />{0,0,0,0,0,14,14,14}        // kropka<br />};<br /><br /><br />void big_num_4x3(uint8_t cyfra , uint8_t x);<br />void big_num_4x3_str(uint16_t liczba, uint8_t xx);<br /><br /><br />int main(void) {<br /><br />//DDRA |= (1&lt;&lt;PA7);<br />//PORTA |= (1&lt;&lt;PA7); /* podświetlenie wyświetlacza LCD */<br /><br />/* ustawienie TIMER2 dla F_CPU=1,000000 MHz */<br />TCCR2 |= (1&lt;&lt;WGM21);/* tryb CTC */<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21);/* preskaler = 256 */<br />OCR2 = 39;/* dodatkowy podział przez 39 (rej. przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE2);/* 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( 0x01 , stopien[0] );<br />lcd_defchar( 0x02 , stopien[1] );<br />lcd_defchar( 0x03 , stopien[2] );<br />lcd_defchar( 0x04 , stopien[3] );<br />lcd_defchar( 0x05 , stopien[4] );    // minus<br />lcd_defchar( 0x06 , stopien[5] );    // kropka<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[0], &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[1], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<br />}<br /><br />sei();/* włączamy globalne przerwania */<br /><br />lcd_cls();<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 /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) &amp;&amp; (s2_flag==0) ){<br />lcd_cls();<br />display_temp(0);<br />}<br />//else {<br />//lcd_locate(1,0);<br />//lcd_str(&quot; error &quot;);<br />//}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[1], &amp;subzero, &amp;cel, &amp;cel_fract_bits) &amp;&amp; (s2_flag==1) ){<br />lcd_cls();<br />display_temp(0);<br />}<br /><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 xxx) {<br /><br />lcd_locate(1,( *ppwsk&gt;9) ? xxx+4 : xxx );        // jesli zmienna d[1] na którą wskazuje ppwsk jest większa od 9 czyli wywietlamy liczbę jednocyfrową to znak umieć 4 pozycje dalej niż normalnie<br />if(subzero) lcd_char(0x05);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_char(32);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />big_num_4x3_str(cel, xxx+1); /* wyświetl dziesiętne części temperatury  */<br />lcd_locate(3,(xxx+8));<br />lcd_char( 0x06 );/* wyświetl kropkę */<br />big_num_4x3(cel_fract_bits, xxx+9);<br />lcd_locate(0,(xxx+12));<br />lcd_char(0x01); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />lcd_char(0x02);<br />lcd_locate(1,xxx+12);<br />lcd_char(0x03);<br />lcd_char(0x04);<br /><br />}<br /><br /><br /><br /><br /><br /><br /><br />void big_num_4x3(uint8_t cyfra, uint8_t x)<br />{<br /><br /><br /> uint8_t i, j, k=0;<br /><br />  for(i=0;i&lt;=3;i++){<br />  lcd_locate(i,x);<br /><br />  for(j=0;j&lt;=2;j++){<br /><br />  lcd_char(  (tab[cyfra][k]) ? 255 : 32);<br />  k++;<br /><br />  }<br />  }<br /><br /><br /><br />}<br /><br /><br /><br />void big_num_4x3_str(uint16_t liczba, uint8_t xx)<br />{<br />uint8_t d[5];<br />ppwsk=&amp;d[1];<br />if(liczba/10000){<br />d[0]=liczba/10000;<br />d[1]=(liczba-(d[0]*10000))/1000;<br />d[2]=(liczba-(d[0]*10000)-(d[1]*1000))/100;<br />d[3]=(liczba-(d[0]*10000)-(d[1]*1000)-(d[2]*100))/10;<br />d[4]=(liczba-(d[0]*10000)-(d[1]*1000)-(d[2]*100))-(d[3]*10);<br />}<br /><br />else if((liczba/1000)&amp;&amp; !(liczba/10000)){<br />d[0]=liczba/1000;<br />d[1]=(liczba-(d[0]*1000))/100;<br />d[2]=(liczba-(d[0]*1000)-(d[1]*100))/10;<br />d[3]=(liczba-(d[0]*1000)-(d[1]*100)-(d[2]*10));<br />d[4]=10;<br />}<br /><br />else if((liczba/100) &amp;&amp; !(liczba/1000) &amp;&amp; !(liczba/10000)){<br />d[0]=liczba/100;<br />d[1]=(liczba-(d[0]*100))/10;<br />d[2]=(liczba-(d[0]*100)-(d[1]*10));<br />d[3]=10;<br />d[4]=10;<br />}<br /><br />else if((liczba/10) &amp;&amp; !(liczba/100) &amp;&amp; !(liczba/1000) &amp;&amp; !(liczba/10000)){<br />d[0]=liczba/10;<br />d[1]=(liczba-(d[0]*10));<br />d[2]=10;<br />d[3]=10;<br />d[4]=10;<br />}<br /><br />else{<br />d[0]=liczba;<br />d[1]=10;<br />d[2]=10;<br />d[3]=10;<br />d[4]=10;<br />}<br /><br /><br /><br /><br /><br />uint8_t ii;<br />for(ii=0;ii&lt;6;ii++)<br />{<br />if( d[1]&gt;9){                          // jesli ciąg składa się z jednej cyfry - przesuń ją o 4 miejsca w prawo<br />big_num_4x3(d[0],xx+4);<br />break;<br />}<br /><br />if ( d[ii]&lt;10 ){<br /><br />big_num_4x3(d[ii],xx);<br />xx+=4;<br />}<br /><br /><br />}<br />}<br /><br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER2_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 % co_ile) == 0)  s2_flag= !s2_flag ;                        // moja flaga do zmiany wywietlanej temperatury<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=464">1bobik1</a> — 14 lis 2012, o 23:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-11-14T23:31:50+01:00</updated>
<published>2012-11-14T23:31:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18931#p18931</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18931#p18931"/>
<title type="html"><![CDATA[Re: Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18931#p18931"><![CDATA[
No ale ci podpowiedziałem gdzie masz babola <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> — 14 lis 2012, o 23:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-11-14T22:59:16+01:00</updated>
<published>2012-11-14T22:59:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18930#p18930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18930#p18930"/>
<title type="html"><![CDATA[Re: Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18930#p18930"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Zawsze się dziwię wszystkim, którzy robią TAK GIGANTYCZNE wcięcia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo niby piszą że one są tak duże żeby lepiej widzieć zakresy IFów, pętli itp ..... a tymczasem ciekawy jestem czy jesteś w stanie się ich doliczyć ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> jakoś tak wyszło, jestem nie poprawnym (!pro)gramistą a to jest robocza wersja (wiem wiem od początku powinno być jak należy ; ) )<br /><br />typ zmiennej nic nie zmienia ( próbowałem już wcześniej )<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=464">1bobik1</a> — 14 lis 2012, o 22:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MichalXY]]></name></author>
<updated>2012-11-14T22:54:58+01:00</updated>
<published>2012-11-14T22:54:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18929#p18929</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18929#p18929"/>
<title type="html"><![CDATA[Re: Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18929#p18929"><![CDATA[
Może to że zmienna s2_flag jest typu bool jest powodem błędu. Ja na twoim miejscu zmienił ją uint8_t tak jak zmienna s1_flag.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=226">MichalXY</a> — 14 lis 2012, o 22:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-11-14T22:47:42+01:00</updated>
<published>2012-11-14T22:47:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18927#p18927</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18927#p18927"/>
<title type="html"><![CDATA[Re: Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18927#p18927"><![CDATA[
Zawsze się dziwię wszystkim, którzy robią TAK GIGANTYCZNE wcięcia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo niby piszą że one są tak duże żeby lepiej widzieć zakresy IFów, pętli itp ..... a tymczasem ciekawy jestem czy jesteś w stanie się ich doliczyć ? <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> — 14 lis 2012, o 22:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[1bobik1]]></name></author>
<updated>2012-11-14T22:38:03+01:00</updated>
<published>2012-11-14T22:38:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18926#p18926</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18926#p18926"/>
<title type="html"><![CDATA[Mała zmiana w obsłudze przerwania i error]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1803&amp;p=18926#p18926"><![CDATA[
Witam<br /><br />Mam problem z obsługą przerwania, mianowicie dodałem jedną linijkę:<br />[syntax=c]if( (sekundy % co_ile) == 0)  s2_flag= !s2_flag ;  [/syntax]<br />i wywala error<br /><br />Tu cały kod:<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 &lt;stdbool.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />#define co_ile 10<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 />volatile bool s2_flag;     //flaga co (co_ile) sekund<br />uint8_t subzero, cel, cel_fract_bits, *ppwsk;<br /><br /><br />bool tab[10][12] = {<br /><br /><br />{1,1,1,1,0,1,1,0,1,1,1,1},<br />{0,1,1,0,0,1,0,0,1,0,0,1},<br />{1,1,1,0,0,1,1,0,0,1,1,1},<br />{1,1,1,0,0,1,0,1,1,1,1,1},<br />{1,0,1,1,0,1,1,1,1,0,0,1},<br />{1,1,1,1,0,0,0,0,1,1,1,1},<br />{1,1,1,1,0,0,1,0,1,1,1,1},<br />{1,1,1,0,0,1,0,0,1,0,0,1},<br />{1,1,1,1,0,1,1,1,1,1,1,1},<br />{1,1,1,1,0,1,0,0,1,1,1,1}<br /><br />};<br /><br />uint8_t stopien[6][8] = {<br /><br />{0,0,0,3,7,12,24,24},<br />{0,0,0,24,28,6,3,3},<br />{24,24,12,7,3,0,0,0},<br />{3,3,6,28,24,0,0,0},<br />{0,0,0,0,0,0,31,31},//minus<br />{0,0,0,0,0,14,14,14}        // kropka<br />};<br /><br /><br />void big_num_4x3(uint8_t cyfra , uint8_t x);<br />void big_num_4x3_str(uint16_t liczba, uint8_t xx);<br /><br /><br />int main(void) {<br /><br />//DDRA |= (1&lt;&lt;PA7);<br />//PORTA |= (1&lt;&lt;PA7); /* podświetlenie wyświetlacza LCD */<br /><br />/* ustawienie TIMER2 dla F_CPU=1,000000 MHz */<br />TCCR2 |= (1&lt;&lt;WGM21);/* tryb CTC */<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21);/* preskaler = 256 */<br />OCR2 = 39;/* dodatkowy podział przez 39 (rej. przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE2);/* 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( 0x01 , stopien[0] );<br />lcd_defchar( 0x02 , stopien[1] );<br />lcd_defchar( 0x03 , stopien[2] );<br />lcd_defchar( 0x04 , stopien[3] );<br />lcd_defchar( 0x05 , stopien[4] );    // minus<br />lcd_defchar( 0x06 , stopien[5] );    // kropka<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[0], &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[1], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<br />}<br /><br />sei();/* włączamy globalne przerwania */<br /><br />lcd_cls();<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[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) &amp;&amp; (s2_flag==0) ) 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[1], &amp;subzero, &amp;cel, &amp;cel_fract_bits) &amp;&amp; (s2_flag==1) ) display_temp(0);<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 xxx) {<br /><br />lcd_locate(1,( *ppwsk&gt;9) ? xxx+4 : xxx );        // jesli zmienna d[1] na którą wskazuje ppwsk jest większa od 9 czyli wywietlamy liczbę jednocyfrową to znak umieć 4 pozycje dalej niż normalnie<br />if(subzero) lcd_char(0x05);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_char(32);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />big_num_4x3_str(cel, xxx+1); /* wyświetl dziesiętne części temperatury  */<br />lcd_locate(3,(xxx+8));<br />lcd_char( 0x06 );/* wyświetl kropkę */<br />big_num_4x3(cel_fract_bits, xxx+9);<br />lcd_locate(0,(xxx+12));<br />lcd_char(0x01); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />lcd_char(0x02);<br />lcd_locate(1,xxx+12);<br />lcd_char(0x03);<br />lcd_char(0x04);<br /><br />}<br /><br /><br /><br /><br /><br /><br /><br />void big_num_4x3(uint8_t cyfra, uint8_t x)<br />{<br /><br /><br /> uint8_t i, j, k=0;<br /><br />  for(i=0;i&lt;=3;i++){<br />  lcd_locate(i,x);<br /><br />  for(j=0;j&lt;=2;j++){<br /><br />  lcd_char(  (tab[cyfra][k]) ? 255 : 32);<br />  k++;<br /><br />  }<br />  }<br /><br /><br /><br />}<br /><br /><br /><br />void big_num_4x3_str(uint16_t liczba, uint8_t xx)<br />{<br />uint8_t d[5];<br />ppwsk=&amp;d[1];<br />if(liczba/10000){<br />d[0]=liczba/10000;<br />d[1]=(liczba-(d[0]*10000))/1000;<br />d[2]=(liczba-(d[0]*10000)-(d[1]*1000))/100;<br />d[3]=(liczba-(d[0]*10000)-(d[1]*1000)-(d[2]*100))/10;<br />d[4]=(liczba-(d[0]*10000)-(d[1]*1000)-(d[2]*100))-(d[3]*10);<br />}<br /><br />else if((liczba/1000)&amp;&amp; !(liczba/10000)){<br />d[0]=liczba/1000;<br />d[1]=(liczba-(d[0]*1000))/100;<br />d[2]=(liczba-(d[0]*1000)-(d[1]*100))/10;<br />d[3]=(liczba-(d[0]*1000)-(d[1]*100)-(d[2]*10));<br />d[4]=10;<br />}<br /><br />else if((liczba/100) &amp;&amp; !(liczba/1000) &amp;&amp; !(liczba/10000)){<br />d[0]=liczba/100;<br />d[1]=(liczba-(d[0]*100))/10;<br />d[2]=(liczba-(d[0]*100)-(d[1]*10));<br />d[3]=10;<br />d[4]=10;<br />}<br /><br />else if((liczba/10) &amp;&amp; !(liczba/100) &amp;&amp; !(liczba/1000) &amp;&amp; !(liczba/10000)){<br />d[0]=liczba/10;<br />d[1]=(liczba-(d[0]*10));<br />d[2]=10;<br />d[3]=10;<br />d[4]=10;<br />}<br /><br />else{<br />d[0]=liczba;<br />d[1]=10;<br />d[2]=10;<br />d[3]=10;<br />d[4]=10;<br />}<br /><br /><br /><br /><br /><br />uint8_t ii;<br />for(ii=0;ii&lt;6;ii++)<br />{<br />if( d[1]&gt;9){                          // jesli ciąg składa się z jednej cyfry - przesuń ją o 4 miejsca w prawo<br />big_num_4x3(d[0],xx+4);<br />break;<br />}<br /><br />if ( d[ii]&lt;10 ){<br /><br />big_num_4x3(d[ii],xx);<br />xx+=4;<br />}<br /><br /><br />}<br />}<br /><br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER2_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 % co_ile) == 0)  s2_flag= !s2_flag ;                        // moja flaga do zmiany wywietlanej temperatury<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}<br />[/syntax]<br /><br />i info z konsoli:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">**** Budowanie of configuration Release for project Termometr_4x3 ****<br /><br />make all <br />Building file: ../main.c<br />Invoking: AVR Compiler<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=1000000UL -MMD -MP -MF&quot;main.d&quot; -MT&quot;main.d&quot; -c -o &quot;main.o&quot; &quot;../main.c&quot;<br />../main.c: In function 'main':<br />../main.c:265: error: static declaration of '__vector_3' follows non-static declaration<br />../main.c:265: error: previous declaration of '__vector_3' was here<br />../main.c:276: error: expected declaration or statement at end of input<br />make: *** &#91;main.o&#93; Error 1<br /><br />**** Build Finished ****</div><br /><br />Flagi s2_flag chcę używać do przełączania wyświetlanej temperatury w odstępie 10 sekund (mam 2 czujniki ), ponieważ 2 wskazania nie mieszczą się na wyświetlaczu<br />o co chodzi w tym błędzie ?<br /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=464">1bobik1</a> — 14 lis 2012, o 22:38</p><hr />
]]></content>
</entry>
</feed>