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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-09-19T11:46:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6172&amp;mode</id>
<entry>
<author><name><![CDATA[mateusz_dan]]></name></author>
<updated>2014-09-19T11:46:19+01:00</updated>
<published>2014-09-19T11:46:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=96033#p96033</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=96033#p96033"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=96033#p96033"><![CDATA[
Witam.<br /><br />Zastanawiam się nad poprawnością kodu kolegi Marcinf8702. Próbuje właśnie zrobić swój własny termostat i jak na razie jestem na etapie tworzenia menu, aby można było na wyświetlaczu pokazywać różne temperatury poprzez wciśnięcie przycisku. Natknąłem się na ten temat i nasunęło mi się kilka pytań. Problem wygląda tak, że menu robię na podobnej zasadzie jak kolega czyli z wykorzystaniem instrukcji switch. Teraz pytanie jak kod Pana Mirka pokroić na części, aby wykorzystać instrukcję switch. Ja pokroiłem go trochę inaczej niż kolega Marcinf8702 tylko nie wiem czy poprawnie... Wrzucę fragmenty kodu związanego z czujnikiem temperatury, pomijając zbędne rzeczy.<br /><br />[syntax=c]int main(void) {<br /><br />/* ustawienie TIMER2 dla F_CPU=8Hz */<br />TCCR2 |= (1&lt;&lt;WGM21);<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);<br />OCR2 = 78;<br />TIMSK |= (1&lt;&lt;OCIE2);<br /><br />lcd_init();/* inicjalizacja LCD */<br /><br />czujniki_cnt = search_sensors();<br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury */<br />DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL );<br /><br />_delay_ms(750);<br /><br />sei();/* włączamy globalne przerwania */[/syntax]<br /><br /><br />[syntax=c]while(1) {<br />switch (a){<br />case 0;<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Pokoj 1&quot;);<br />lcd_locate(1,0);<br />lcd_str(&quot;Pokoj 2&quot;);<br /><br /><br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />if( 0 == (sekundy%3) ) czujniki_cnt = search_sensors();<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL );<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,8);<br />else {<br />lcd_locate(0,8);<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(1,8);<br />else {<br />lcd_locate(1,8);<br />lcd_str(&quot; error &quot;);<br />}<br />}<br />s1_flag=0;<br />} <br /><br />break;<br />}[/syntax]<br /><br />Tak ja &quot;pokroiłem&quot; kod Pana Mirka, lecz wygląda to trochę inaczej niż u kolegi Marcinf8702. On praktycznie wszystko wrzucił do instrukcji switch case 0. Oraz nie wykorzystał sprawdzania flagi tyknięć timera... Jak to powinno wyglądać poprawnie???<br /><br />Pojawił się własnie problem z którym nie wiem jak sobie poradzić. Gdy chodzę po menu i wejdę w podmenu z temperaturami to muszę długo czekać na odczyt temperatur, i albo wyświetli mi temperaturę albo przez chwilę wyświetla 85 stopni i po chwili dopiero temperaturę właściwą. Jak sobie z tym poradzić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3095">mateusz_dan</a> — 19 wrz 2014, o 11:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcin_G]]></name></author>
<updated>2014-02-28T16:10:46+01:00</updated>
<published>2014-02-28T16:10:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72440#p72440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72440#p72440"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72440#p72440"><![CDATA[
Wydaje mi się że spowodowane to jest tym że nie wykonuje się &quot;case 0:&quot; bo to w nim masz fragment kodu odpowiedzialny za pomiar temperatury z czujników. Przy starcie programu zmienna &quot;a&quot; używana w &quot;przełączniku&quot; jest równa 0, więc następuje pomiar temperatury. Pomiar ten powinien być dokonywany dopóty, dopóki nie użyjesz klawisza KEY1 lub KEY2 bo wtedy zmienna &quot;a&quot; zmienia swą wartość. No i teraz pytanie czy zmienna &quot;a&quot; znowu ma wartość równą 0 po zabawie z przyciskami?  Tak patrzę na ten kod i niby mieć powinna.<br />Spróbuj , o ile jeszcze tego nie zrobiłeś, cały ten kod do odczytu temperatury z timerem programowym, uruchomić w pętli głównej bez &quot;case&quot;. Będzie przynajmniej wiadomo czy jest on poprawny, chociaż ja właśnie w taki sposób korzystam z timera i to działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=758">Marcin_G</a> — 28 lut 2014, o 16:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcinf8702]]></name></author>
<updated>2014-02-28T06:52:43+01:00</updated>
<published>2014-02-28T06:52:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72376#p72376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72376#p72376"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72376#p72376"><![CDATA[
Prawie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> menu przeskakuje plynnie ale temperatura pobiera się tylko raz,, potem już sie nie zmienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1568">Marcinf8702</a> — 28 lut 2014, o 06:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcin_G]]></name></author>
<updated>2014-02-27T22:01:17+01:00</updated>
<published>2014-02-27T22:01:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72354#p72354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72354#p72354"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72354#p72354"><![CDATA[
Podstawową rzecz do odpalenia timera programowego masz już zrobioną, czyli aktywowany TIMER tykający co 10ms.<br />Najpierw zadeklaruj zmienną TIMER<br /><br />[syntax=c]volatile uint8_t TIMER;// zmienne określające Timery programowe[/syntax]<br /><br />Następnie dopisz sobie w wektorze przerwania ISR poniższy kod:<br />[syntax=c]uint8_t ms;    // zmienna określająca czas w mili sekundach, wykorzystywana w Timerach programowych, inicjalizowana wartością 10<br /><br />// Timery programowe<br />ms = TIMER;<br />if (ms)<br />   {<br />      TIMER = --ms;<br />   }[/syntax]<br /><br />Pozostaje jeszcze zmiana w  &quot;case 0&quot;. Po poleceniu &quot;czujniki_cnt = search_sensors();&quot; wpisz to:<br /><br />[syntax=c]if(!TIMER)<br />{<br />   DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); // wysłanie polecenia do rozpoczęcia odczytu z czujników<br />   TIMER1 = 100; // oczekiwanie na konwersję<br />}[/syntax]<br /><br />oczywiście delaya wywalasz a resztę zostawiasz tak jak masz.<br />Mam nadzieję że zadziała, bo piszę to z głowy czyli z niczego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  i istnieje szansa że gdzieś się walnąłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=758">Marcin_G</a> — 27 lut 2014, o 22:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcinf8702]]></name></author>
<updated>2014-02-27T20:42:20+01:00</updated>
<published>2014-02-27T20:42:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72322#p72322</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72322#p72322"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72322#p72322"><![CDATA[
Urzywam Atmegi 32 , taktowany z częstotliwością 11059200 Hz, i wklejam całem moje wypociny, wiem że program nie jest zbyt optymalny ale to mój pierwszy projekt więc proszę o wyrozumiałośc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br /><br /><br />#define KEY_PIN1 (1&lt;&lt;PD7)            // LEWO  &lt;<br />#define KEY_DOWN1 !(PIND &amp; KEY_PIN1)<br /><br />#define KEY_PIN2 (1&lt;&lt;PD6)             // PRAWO &gt;<br />#define KEY_DOWN2 !(PIND &amp; KEY_PIN2)<br /><br />#define KEY_PIN4 (1&lt;&lt;PD4)             // GÓRA ^<br />#define KEY_DOWN4 !(PIND &amp; KEY_PIN4)<br /><br />#define KEY_PIN5 (1&lt;&lt;PD3)             // DÓŁ  v<br />#define KEY_DOWN5 !(PIND &amp; KEY_PIN5)<br /><br />#define BUZZ (1&lt;&lt;PB2)<br />#define BUZZ_ON PORTB |=(1&lt;&lt;PB2)     //BUZZER ON<br />#define BUZZ_OFF PORTB &amp;= ~(1&lt;&lt;PB2)     //BUZZER OFF<br /><br />//#################FINKCJE####################################<br /><br /><br /><br />//############################################################<br /><br />uint8_t a;<br />int b;   // WARTOĆ TEMPERATURY<br />int c;   // MOC GRZAŁKI G2<br />uint8_t proc ; //procentowa wartoć PWM<br />uint8_t w;<br /><br /><br />void display_temp (uint8_t y, 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 />uint8_t x;<br />uint8_t g=29;<br />uint8_t y;<br /><br />int main(void)<br />{<br />//-------------Ustawienie pinów i inicjalizacje-------------//<br /><br />DDRC|=(1&lt;&lt;PC3);<br />PORTC|=(1&lt;&lt;PC3);<br />DDRB |=(1&lt;&lt;PB3);<br /><br />TCCR0 |= (1&lt;&lt;WGM01) | (1&lt;&lt;WGM00);       // URUCHOMIENIE PWM<br />TCCR0 |= (1&lt;&lt;COM01) | (1&lt;&lt;COM00);<br />TCCR0 |= (1&lt;&lt;CS00);<br /><br /><br />lcd_init();                             // INICJALIZACJA LCD<br />lcd_locate(0,2);<br />lcd_str(&quot;URUCHAMIANIE&quot;);                // EKRAN POWITALNY<br /><br />    for( x=0 ; x&lt;6 ; x++){<br />    _delay_ms(1000);<br />    lcd_locate(1,5+x);<br />    lcd_str(&quot;.&quot;);<br />    }<br />    lcd_cls();<br /><br />DDRD &amp;= ~KEY_PIN1;                      //INICJALIZACJA KLAWISZY<br />PORTD |=KEY_PIN1;<br />DDRD &amp;= ~KEY_PIN2;<br />PORTD |=KEY_PIN2;<br />DDRD &amp;= ~KEY_PIN4;<br />PORTD |=KEY_PIN4;<br />DDRD &amp;= ~KEY_PIN5;<br />PORTD |=KEY_PIN5;<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 />//---------------STEROWANIE MENU-----------------------------------------------------------------------------------<br />while(1){<br /><br />if(KEY_DOWN1){<br />_delay_ms(100);<br />if(KEY_DOWN1 &amp; (a&gt;0)){<br />lcd_cls();<br />a--;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN2){<br />_delay_ms(100);<br />if(KEY_DOWN2 &amp; (a&lt;2)){<br />lcd_cls();<br />a++;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br />//---------------KONIEC STEROWANIA MENU -----------------------------------------------------------------------------<br /><br /><br />switch (a){<br /><br />// -------------------------------------------------------------------------------------------------------------------<br />case 0:<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />_delay_ms(750);<br />lcd_locate(0,1);<br />lcd_str(&quot;  POMIAR T1 &gt;&gt;&quot;);<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(1,0);<br />else{<br />lcd_locate(1,0);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if(cel&lt;b){<br />//lcd_cls();<br />DDRB  |= (1&lt;&lt;PB0);<br />PORTB &amp;=~(1&lt;&lt;PB0);<br />lcd_locate(3,4);<br />lcd_str(&quot;G1:ON &quot;);// USTAIWIENIE NISKIEGO NA PB0 ( GRZAŁKA G1 WŁĄCZONA )<br />}<br /><br />else{<br />//lcd_cls();<br />PORTB |= (1&lt;&lt;PB0);       // USTAIWIENIE WYSOKIEGO NA PB0 ( GRZAŁKA G1 WŁĄCZONA )<br />lcd_locate(3,4);<br />lcd_str(&quot;G1:OFF&quot;);<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(2,0);<br />else{<br />lcd_locate(2,0);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(1,8);<br />else{<br />lcd_locate(1,8);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;3&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(2,8);<br />else{<br />lcd_locate(2,8);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />break;<br />//----------------------------------------------------------------------------------------------------------------------<br />case 1:<br />if(KEY_DOWN4){<br />_delay_ms(100);<br />if(KEY_DOWN4){<br />//lcd_cls();<br />b++;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN5){<br />_delay_ms(100);<br />if(KEY_DOWN5){<br />//lcd_cls();<br />b--;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br />lcd_locate(0,0);<br />lcd_str(&quot;&lt;&lt; USTAWIENIA &gt;&gt;&quot;);<br />lcd_locate(2,0);<br />lcd_str(&quot;TEMP.Max:&quot;);<br />lcd_locate(2,12);<br />lcd_str(&quot;&#91;*C&#93;&quot;);<br />lcd_locate(2,9);<br />lcd_int(b);<br />break;<br />//----------------------------------------------------------------------------------------------------------------------<br /><br />case 2:<br /><br />if(KEY_DOWN4 &amp; (c&lt;255)){<br />_delay_ms(40);<br />if(KEY_DOWN4){<br />//lcd_cls();<br />//b++;<br />c++;<br />OCR0=c;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(10);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN5 &amp; (c&gt;0)){<br />_delay_ms(40);<br />if(KEY_DOWN5){<br />//b--;<br />c--;<br />OCR0=c;  // REJESTR PWM ( USUNĄĆ PO ZMIANIE SYSTEMU STEROWANIA)<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(10);<br />BUZZ_OFF;<br />}<br />    }<br />lcd_locate(0,0);<br />lcd_str(&quot;&lt;&lt;MOC GRZALKI 2&quot;);<br />lcd_locate(1,2);<br />lcd_str(&quot;PWM:&quot;);<br />proc=((c*100)/255);<br />lcd_locate(1,6);<br />lcd_int(proc);<br />w=7;<br />if(proc&gt;9) w=8;<br />if(proc&gt;99) w=9;<br />lcd_locate(1,w);<br />lcd_str(&quot;&#91;%&#93;  &quot;);<br />break;<br />}<br />}<br /><br />//----------------------------------------------------------------------------------------------------------------------<br /><br /><br />}<br /><br />void display_temp(uint8_t y, uint8_t x) {<br />lcd_locate(y,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 />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 />}<br /><br /><br /><br />kod[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />Urzywam Atmegi 32 , taktowany z częstotliwością 11059200 Hz, i wklejam całem moje wypociny, wiem że program nie jest zbyt optymalny ale to mój pierwszy projekt więc proszę o wyrozumiałośc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br /><br /><br />#define KEY_PIN1 (1&lt;&lt;PD7)            // LEWO  &lt;<br />#define KEY_DOWN1 !(PIND &amp; KEY_PIN1)<br /><br />#define KEY_PIN2 (1&lt;&lt;PD6)             // PRAWO &gt;<br />#define KEY_DOWN2 !(PIND &amp; KEY_PIN2)<br /><br />#define KEY_PIN4 (1&lt;&lt;PD4)             // GÓRA ^<br />#define KEY_DOWN4 !(PIND &amp; KEY_PIN4)<br /><br />#define KEY_PIN5 (1&lt;&lt;PD3)             // DÓŁ  v<br />#define KEY_DOWN5 !(PIND &amp; KEY_PIN5)<br /><br />#define BUZZ (1&lt;&lt;PB2)<br />#define BUZZ_ON PORTB |=(1&lt;&lt;PB2)     //BUZZER ON<br />#define BUZZ_OFF PORTB &amp;= ~(1&lt;&lt;PB2)     //BUZZER OFF<br /><br />//#################FINKCJE####################################<br /><br /><br /><br />//############################################################<br /><br />uint8_t a;<br />int b;   // WARTOĆ TEMPERATURY<br />int c;   // MOC GRZAŁKI G2<br />uint8_t proc ; //procentowa wartoć PWM<br />uint8_t w;<br /><br /><br />void display_temp (uint8_t y, 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 />uint8_t x;<br />uint8_t g=29;<br />uint8_t y;<br /><br />int main(void)<br />{<br />//-------------Ustawienie pinów i inicjalizacje-------------//<br /><br />DDRC|=(1&lt;&lt;PC3);<br />PORTC|=(1&lt;&lt;PC3);<br />DDRB |=(1&lt;&lt;PB3);<br /><br />TCCR0 |= (1&lt;&lt;WGM01) | (1&lt;&lt;WGM00);       // URUCHOMIENIE PWM<br />TCCR0 |= (1&lt;&lt;COM01) | (1&lt;&lt;COM00);<br />TCCR0 |= (1&lt;&lt;CS00);<br /><br /><br />lcd_init();                             // INICJALIZACJA LCD<br />lcd_locate(0,2);<br />lcd_str(&quot;URUCHAMIANIE&quot;);                // EKRAN POWITALNY<br /><br />    for( x=0 ; x&lt;6 ; x++){<br />    _delay_ms(1000);<br />    lcd_locate(1,5+x);<br />    lcd_str(&quot;.&quot;);<br />    }<br />    lcd_cls();<br /><br />DDRD &amp;= ~KEY_PIN1;                      //INICJALIZACJA KLAWISZY<br />PORTD |=KEY_PIN1;<br />DDRD &amp;= ~KEY_PIN2;<br />PORTD |=KEY_PIN2;<br />DDRD &amp;= ~KEY_PIN4;<br />PORTD |=KEY_PIN4;<br />DDRD &amp;= ~KEY_PIN5;<br />PORTD |=KEY_PIN5;<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 />//---------------STEROWANIE MENU-----------------------------------------------------------------------------------<br />while(1){<br /><br />if(KEY_DOWN1){<br />_delay_ms(100);<br />if(KEY_DOWN1 &amp; (a&gt;0)){<br />lcd_cls();<br />a--;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN2){<br />_delay_ms(100);<br />if(KEY_DOWN2 &amp; (a&lt;2)){<br />lcd_cls();<br />a++;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br />//---------------KONIEC STEROWANIA MENU -----------------------------------------------------------------------------<br /><br /><br />switch (a){<br /><br />// -------------------------------------------------------------------------------------------------------------------<br />case 0:<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />_delay_ms(750);<br />lcd_locate(0,1);<br />lcd_str(&quot;  POMIAR T1 &gt;&gt;&quot;);<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(1,0);<br />else{<br />lcd_locate(1,0);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if(cel&lt;b){<br />//lcd_cls();<br />DDRB  |= (1&lt;&lt;PB0);<br />PORTB &amp;=~(1&lt;&lt;PB0);<br />lcd_locate(3,4);<br />lcd_str(&quot;G1:ON &quot;);// USTAIWIENIE NISKIEGO NA PB0 ( GRZAŁKA G1 WŁĄCZONA )<br />}<br /><br />else{<br />//lcd_cls();<br />PORTB |= (1&lt;&lt;PB0);       // USTAIWIENIE WYSOKIEGO NA PB0 ( GRZAŁKA G1 WŁĄCZONA )<br />lcd_locate(3,4);<br />lcd_str(&quot;G1:OFF&quot;);<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(2,0);<br />else{<br />lcd_locate(2,0);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(1,8);<br />else{<br />lcd_locate(1,8);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;3&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(2,8);<br />else{<br />lcd_locate(2,8);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />break;<br />//----------------------------------------------------------------------------------------------------------------------<br />case 1:<br />if(KEY_DOWN4){<br />_delay_ms(100);<br />if(KEY_DOWN4){<br />//lcd_cls();<br />b++;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN5){<br />_delay_ms(100);<br />if(KEY_DOWN5){<br />//lcd_cls();<br />b--;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(100);<br />BUZZ_OFF;<br />}<br />}<br />lcd_locate(0,0);<br />lcd_str(&quot;&lt;&lt; USTAWIENIA &gt;&gt;&quot;);<br />lcd_locate(2,0);<br />lcd_str(&quot;TEMP.Max:&quot;);<br />lcd_locate(2,12);<br />lcd_str(&quot;&#91;*C&#93;&quot;);<br />lcd_locate(2,9);<br />lcd_int(b);<br />break;<br />//----------------------------------------------------------------------------------------------------------------------<br /><br />case 2:<br /><br />if(KEY_DOWN4 &amp; (c&lt;255)){<br />_delay_ms(40);<br />if(KEY_DOWN4){<br />//lcd_cls();<br />//b++;<br />c++;<br />OCR0=c;<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(10);<br />BUZZ_OFF;<br />}<br />}<br /><br />if(KEY_DOWN5 &amp; (c&gt;0)){<br />_delay_ms(40);<br />if(KEY_DOWN5){<br />//b--;<br />c--;<br />OCR0=c;  // REJESTR PWM ( USUNĄĆ PO ZMIANIE SYSTEMU STEROWANIA)<br />DDRB|= BUZZ;<br />BUZZ_ON;<br />_delay_ms(10);<br />BUZZ_OFF;<br />}<br />    }<br />lcd_locate(0,0);<br />lcd_str(&quot;&lt;&lt;MOC GRZALKI 2&quot;);<br />lcd_locate(1,2);<br />lcd_str(&quot;PWM:&quot;);<br />proc=((c*100)/255);<br />lcd_locate(1,6);<br />lcd_int(proc);<br />w=7;<br />if(proc&gt;9) w=8;<br />if(proc&gt;99) w=9;<br />lcd_locate(1,w);<br />lcd_str(&quot;&#91;%&#93;  &quot;);<br />break;<br />}<br />}<br /><br />//----------------------------------------------------------------------------------------------------------------------<br /><br /><br />}<br /><br />void display_temp(uint8_t y, uint8_t x) {<br />lcd_locate(y,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 />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 />}<br /><br /><br /><br />kod[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1568">Marcinf8702</a> — 27 lut 2014, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcin_G]]></name></author>
<updated>2014-02-27T20:05:09+01:00</updated>
<published>2014-02-27T20:05:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72313#p72313</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72313#p72313"/>
<title type="html"><![CDATA[Re: Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72313#p72313"><![CDATA[
Podpowiedzieć to mogę Ci tyle że dobrze byłoby się zainteresować timerami programowymi. Nie wiem czy masz Mirka niebieską książkę, a jeśli tak to warto do nie zajrzeć, dość sporo o nich pisze i pokazuje jak ich używać. No a jeśli nie masz książki to napisz coś więcej, jakiego procka używasz, jakie taktowanie to może się coś wspólnie poradzi na te timery <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />No chyba że używasz też w projekcie jakiegoś zegarka np. PCF-a to też można go zaprząc do odliczania czasu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=758">Marcin_G</a> — 27 lut 2014, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marcinf8702]]></name></author>
<updated>2014-02-27T19:44:48+01:00</updated>
<published>2014-02-27T19:44:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72311#p72311</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72311#p72311"/>
<title type="html"><![CDATA[Pytanie o KOD - Projekt termostatu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6172&amp;p=72311#p72311"><![CDATA[
Witam mam pytanie związane z case 0: w podanym programie. Występuje tam opuźnienie _delay_ms(750) niezbędne do konwersji danych z czujnika ds18b20. Jenak jeśli przy próbie zmiany na np case 1: wystęuje opóźniennie (muszę przytrzymać klawisz aby menu się przełączyło). Jeśli usunę opuznienie to temperatura nie konwertuje się. Czy koledzy mogą mi podpwiedzieć jak rozwiązać ten problem ??<br />[syntax=c]switch (a){<br /><br />// -------------------------------------------------------------------------------------------------------------------<br />case 0:<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />_delay_ms(750);<br />lcd_locate(0,1);<br />lcd_str(&quot;  POMIAR T1 &gt;&gt;&quot;);<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(1,0);<br />else{<br />lcd_locate(1,0);<br />lcd_str(&quot; BRAK &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br />if(cel&lt;b){<br />//lcd_cls();<br />DDRB  |= (1&lt;&lt;PB0);<br />PORTB &amp;=~(1&lt;&lt;PB0);<br />lcd_locate(3,4);<br />lcd_str(&quot;G1:ON &quot;);// USTAIWIENIE NISKIEGO NA PB0 ( GRZAŁKA G1 WŁĄCZONA )<br />}<br /><br /><br />kod[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1568">Marcinf8702</a> — 27 lut 2014, o 19:44</p><hr />
]]></content>
</entry>
</feed>