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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-08T11:44:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7289&amp;mode</id>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2015-04-08T11:44:30+01:00</updated>
<published>2015-04-08T11:44:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125917#p125917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125917#p125917"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125917#p125917"><![CDATA[
<div class="quotetitle">africatwin napisał(a):</div><div class="quotecontent"><br />Tegorocznej zimy termostat z wątku podtrzymywał mi temperature w garazu .<br /></div><br /><br /><br /><div class="quotetitle">fajter napisał(a):</div><div class="quotecontent"><br />to było robione dla ATmega32 <br />miło słyszeć, że ktoś z tego korzysta <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />No miło słyszeć że po tak długim czasie ktoś odkopał temat i jest zadowolony z naszej forumowej pracy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong>africatwin </strong>zrób tak jak <strong>fajter </strong>pisze zmień timery z Atmega32 na Atmega8<br />nie mniej kilka złotych na 1 projekcie to nie majątek a zostawiając projekt na Atmega32 masz większe możliwości rozbudowy projektu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 8 kwi 2015, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2015-04-07T20:23:50+01:00</updated>
<published>2015-04-07T20:23:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125868#p125868</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125868#p125868"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125868#p125868"><![CDATA[
to było robione dla ATmega32 to chyba nie jest ostatnia wersja projektu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> dodałem jeszcze inne funkcje, jak zapis ostatnio używanych parametrów itp. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> miło słyszeć, że ktoś z tego korzysta <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> wystarczy zmienić licznik w trybie CTC odpowiedni dla Atmegi8. Informacje znajdziesz w nocie aplikacyjnej dla procka tego co posiadasz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> na stronie 97 w nocie dla ATmegi8 masz tryb CTC <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> TCCR1B, OCR1A, WGM12, CS12 ,CS10 itd. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> dokładnie zobacz bo to tak na szybko <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> nigdy nie robiłem nic na AT8 <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=4637">fajter</a> — 7 kwi 2015, o 20:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysssztof]]></name></author>
<updated>2015-04-06T10:16:15+01:00</updated>
<published>2015-04-06T10:16:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125726#p125726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125726#p125726"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125726#p125726"><![CDATA[
Na szybko przejrzałem temat i nie doatrzyłem się, na jakim kontrolerze był projekt wykonywany.<br /><br />W każdym razie:    każdy z mikrokontrolerów ma nieco inne możliwości, inne moduły sprzętowe (różne ilości timerów, modułów komunikacyjnych itd. itp.) a z tego wynikają różnice w rejestrach - albo jest ich inna liczba, albo są nazwane inaczej, albo spełniają nieco inne funkcje.<br /><br />Tutaj widzę masz problem z timerem.<br />Co trzeba zrobić?                                 Trzeba dokładnie rozpracować, jak dany timer działał w tym programie (co wykonywał), a następnie otworzyć kartę katalogową Atmegi8 i tak ustawić dostępne w niej timery (inne nazwy rejestrów, nieco inne bity w tych rejestrach), żeby pracowały identycznie jak w poprzednim przypadku na innym mikrokontrolerze.<br /><br /><br />Edycja - na szybko przejrzałem kartę katalogową Atmegi 8 i zauważyłem:<br />- w rejestrze TCCR0 nie istnieje bit WGM01<br />- w rejestrze TIMSK nie istnieje bit OCIE0<br />- nie istnieje rejetr OCR0<br /><br />Wygląda na to, że Timer0 w Atmedze 8 nie ma trybu ( CTC się to nazywa? ) pozwalającego na ustawienie konkretnej wartości liczbowej, przy której timer wystawi jedynkę (czyli osiągnięcie tej wartości).<br /><br />Są 2 opcje rozwiązania problemu:<br />Użycie innego timera (jeśli dobrze kojarzę,to Timer1 posiada tryb CTC)<br />Po każdym przepełnieniu inicjowanie timera0 taką wartością, aby doliczenie do 255 zajmowała mu żądany okres czasu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4274">krzysssztof</a> — 6 kwi 2015, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[africatwin]]></name></author>
<updated>2015-04-05T21:11:33+01:00</updated>
<published>2015-04-05T21:11:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125707#p125707</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125707#p125707"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=125707#p125707"><![CDATA[
Witam wszystkich. Powitalni nie znalazłem  a mój pierwszy wpis wiec krótko- Krzysiek  z  Chocianowa ,tak jak wiekszość staram się zrozumieć jezyk programowania mikrokontrolerów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br />Tegorocznej zimy termostat z wątku podtrzymywał mi temperature w garazu . <br />Teraz chciałbym wykonać go na bazie atmega8 i pojawił sie problem..<br />W  target hardware zmieniłem na atmega8 , taktowanie bez zmian , w pliku lcd44780.h pozmieniałem piny mikrokontrolera  jak i w main.c<br />Po kompilacji na czerwono ukazało sie <br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">  TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />        TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />        OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />        TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /></div><br />a w konsoli<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">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=8000000UL -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:112: error: 'WGM01' undeclared (first use in this function)<br />../main.c:112: error: (Each undeclared identifier is reported only once<br />../main.c:112: error: for each function it appears in.)<br />../main.c:114: error: 'OCR0' undeclared (first use in this function)<br />../main.c:115: error: 'OCIE0' undeclared (first use in this function)<br />../main.c: At top level:<br />../main.c:211: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler<br />../main.c: In function 'klawisz_wcisniety':<br />../main.c:245: warning: no return statement in function returning non-void<br />../main.c: In function 'klawisz_wcisniety2':<br />../main.c:275: warning: no return statement in function returning non-void<br />../main.c:287:25: warning: unknown escape sequence '\C'<br />../main.c:301:25: warning: unknown escape sequence '\C'<br />../main.c: In function 'termostat':<br />../main.c:320: warning: no return statement in function returning non-void<br />../main.c: In function 'chlodzenie':<br />../main.c:340: warning: no return statement in function returning non-void<br />make: *** &#91;main.o&#93; Error 1<br /></div><br />mogłby ktos łopatologicznie podpowiedzieć jak to ogarnąć ?<br /><br />pozdrawiam<br />Krzysiek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9357">africatwin</a> — 5 kwi 2015, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-28T13:47:54+01:00</updated>
<published>2014-06-28T13:47:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85986#p85986</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85986#p85986"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85986#p85986"><![CDATA[
<span style="color: #FF0000">POST NIEAKTUALNY WSZYSTKO JUŻ DZIAŁA POPRAWNIE!!! <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /></span><br /><br /><br />Panowie w końcu zadziałał zapis do EEPROM dzięki poradnikowi Pana Mirka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Jedynie zostaje do wyjaśnienia jeden błąd, czasami dla zapisanych ostatnio ustawionych wartości zmiennych do pamięci EEPROM, po zaniku zasilania pojawiają się po ponownym uruchomieniu urządzenia dla jednej ze zmiennych wartości liczby 255. Wygląda to tak jak by w adresie EEPROM w wyniku jakiegoś błędu jedynkami wypełniałby się cały bajt? Czy ma to związek z brakiem dołożenia czasu przerwania przed zapisem ostatnio ustawionej zmiennej? Ktoś ma jakiś pomysł jak to wyeliminować? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Poniżej zamieszczam kod.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 23-05-2014<br /> *      Author: Łukasz<br /> */<br /><br /><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 &lt;avr/eeprom.h&gt;<br /><br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisze KEY<br />    #define KEY_PIN (1&lt;&lt;PD7)                     //pin podłączenie klawisza temp_zadanej<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />    #define KEY_PIN2 (1&lt;&lt;PD6)                    //pin podłączenie klawisza histerezy<br />    #define KEY_DOWN2 !(PIND &amp; KEY_PIN2)<br /><br />    // Przekaźnik1<br />    #define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />    #define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />    #define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br />    // Przekaźnik2<br />   #define PRZEKAZNIK_PIN2 (1&lt;&lt;PC6)<br />   #define PRZEKAZNIK_ON2  PORTC |= PRZEKAZNIK_PIN2<br />   #define PRZEKAZNIK_OFF2 PORTC &amp;= ~(PRZEKAZNIK_PIN2)<br /><br />   // ustawienia fabryczne<br />//#define temp_zadana 22<br />//#define histereza 1<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    uint8_t klawisz_wcisniety2(void);<br /><br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br />    void display_histereza(uint8_t z);<br /><br />    uint8_t termostat(void);<br />    uint8_t chlodzenie(void);<br /><br />    void copy_ram_to_eem(void);           // funkcjia zapisuje dane z RAM do EEPROM<br />    void copy_eem_to_ram(void);           // funkcjia zapisuje dane z EEPROM do RAM<br />    void copy_pgm_to_ram(void);           // funkcjia zapisuje dane z FLASH do RAM<br />    void load_defaults(void);             // funkcjia ładowania danych fabrycznych<br />    void check_and_load_defaults(void);   // funkcja do sprawdzania i ładowania danych z EEPROM do RAM<br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    //uint8_t temp_zadana;<br />   // uint8_t histereza;<br /><br />    typedef struct{<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br />    uint8_t histereza;           // zmienna histereza w celu dopasowania punktu włączenia przkaźnika<br /><br />    } TTH;<br /><br />    extern TTH pgm_th PROGMEM;<br />    extern TTH eem_th EEMEM;<br />    extern TTH ram_th;<br /><br />    TTH pgm_th PROGMEM ={<br />    22,<br />    1,<br />    };<br />    TTH eem_th EEMEM;             // dane w pamięci EEPROM<br />    TTH ram_th;                   // dane w pamięci RAM<br /><br /><br />    const uint8_t znak_termo&#91;&#93; PROGMEM = {7,5,7,0,0,0,0,0};// wzór znaku termometru w pamięci FLASH<br />    const uint8_t znak_hist&#91;&#93;  PROGMEM = {4,14,4,0,31,0,14,0};// wzór znaku histerezy w pamięci FLASH<br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br />            DDRD &amp;= ~KEY_PIN2;               // kierunek pinu PD6 - wejściowy<br />            PORTD |= KEY_PIN2;<br /><br />            DDRC |= PRZEKAZNIK_PIN;<br />            DDRC |= PRZEKAZNIK_PIN2;<br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br />   <br />    check_and_load_defaults();                   // sprawdza zawartoć EEPROM i ładuje dane z EEPROM albo z FLASH<br /><br />    lcd_defchar_P(0x80, znak_termo);             // załadowanie znaku temperatury do pamięci<br />    lcd_defchar_P(0x81, znak_hist);              // załadowanie znaku histerezy do pamięci<br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br /><br /><br /><br /><br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0,2);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;Temp:&quot;));<br /><br />    lcd_locate(1,1);<br />    lcd_str_P(PSTR(&quot;TZ:&quot;));<br /><br />    lcd_locate(1,9);<br />    lcd_str_P(PSTR(&quot;H:&quot;));<br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        klawisz_wcisniety2();<br />        display_temp_zadana(4);<br />        termostat();<br />        chlodzenie();<br />        display_histereza(11);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<br />            lcd_int(cel);<br />            lcd_str(&quot;.&quot;);<br />            lcd_int(cel_fract_bits);<br />            lcd_str(&quot;\x80&quot;);<br />            lcd_str(&quot;C&quot;);<br />    }<br /><br /><br />    /* Procedura obsługi przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                        ram_th.temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                        if(ram_th.temp_zadana&gt;=38){<br />                                ram_th.temp_zadana = 0;<br />                        }<br />                    }<br /><br />            }<br /><br />            //return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />            copy_ram_to_eem();<br />    }<br /><br /><br /><br />    uint8_t klawisz_wcisniety2(void)<br />       {<br />               if( KEY_DOWN2 )                                  // klawisz wciśnięty ?<br />               {<br />                       _delay_ms(80);                          // czas drgań styków<br />                       if( KEY_DOWN2 ){<br />                           ram_th.histereza++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                           if(ram_th.histereza&gt;=5){<br />                                   ram_th.histereza = 0;<br />                           }<br />                       }<br /><br />               }<br /><br />               //return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />               copy_ram_to_eem();<br />       }<br /><br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />                lcd_locate(1,y);<br /><br />                if(ram_th.temp_zadana &lt;=9){<br />                        lcd_int(0);<br />                }<br /><br />            lcd_int(ram_th.temp_zadana);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    void display_histereza(uint8_t y)<br />    {<br /><br />                lcd_locate(1,y);<br /><br /><br />              //  if(histereza &lt;=9){<br />               //         lcd_int(0);<br />               // }<br />            lcd_str(&quot;\x81&quot;);<br />            lcd_int(ram_th.histereza);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    uint8_t termostat()<br />    {<br />    switch(subzero)<br />    {<br />    case 0:<br />    if((ram_th.temp_zadana-ram_th.histereza)&gt;cel) PRZEKAZNIK_ON;<br />    else{<br />    if((ram_th.temp_zadana+ram_th.histereza)&lt;=cel)PRZEKAZNIK_OFF;<br />    }<br />    break;<br />    case 1:<br />    if(ram_th.temp_zadana&lt;cel) PRZEKAZNIK_ON;<br />    break;<br />    }<br /><br /><br />    }<br /><br />    uint8_t chlodzenie()<br />   {<br /><br /><br />    //switch(subzero)<br />    //{<br />    //case 0:<br />    if((ram_th.temp_zadana+ram_th.histereza)&lt;=cel)PRZEKAZNIK_ON2;<br />    else{<br />    if((ram_th.temp_zadana-ram_th.histereza)&gt;cel)PRZEKAZNIK_OFF2;<br />    }<br />    //break;<br />    //case 1:<br />    //if(temp_zadana&gt;cel) PRZEKAZNIK_ON2;<br />    //break;<br />    //}<br /><br /><br />    }<br /><br />    // funkcjia zapisy danych z EEPRM do RAM<br />    void copy_eem_to_ram(void){<br />    eeprom_read_block(&amp;ram_th, &amp;eem_th, sizeof(ram_th));<br />    }<br /><br /><br />    // funkcjia zapisy danych z RAM do EEPROM<br />    void copy_ram_to_eem(void){<br />    eeprom_write_block(&amp;ram_th, &amp;eem_th, sizeof(ram_th));<br />    }<br /><br />    // funkcjia zapisująca dane z FLASH do RAM<br />    void copy_pgm_to_ram(void){<br />    memcpy_P (&amp;ram_th, &amp;pgm_th, sizeof(ram_th));<br />    }<br /><br />    // funkcjia ładowania danych fabrycznych<br />    void load_defaults(void){<br />    copy_pgm_to_ram();<br />    copy_ram_to_eem();<br />    }<br /><br /><br />    // funkcja do sprawdzania zawaroci danych w pamięci EEPROM<br />    void check_and_load_defaults(void){<br />    uint8_t i, len = sizeof(ram_th);<br />    uint8_t *ram_wsk = (uint8_t*) &amp;ram_th;<br />    copy_eem_to_ram();<br />    for(i=0; i&lt;len; i++){<br />    if(0xff==*ram_wsk++)continue;<br />    break;<br />    }<br />    if(i==len){<br />    load_defaults();<br />    }<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 28 cze 2014, o 13:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-26T17:14:53+01:00</updated>
<published>2014-06-26T17:14:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85825#p85825</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85825#p85825"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85825#p85825"><![CDATA[
Poradnik bardzo fajny!! Dzisiaj jeszcze raz oglądałem ale nie chce mi zadziałać. Celem zapisu do EEPROM są ostatnio ustawione wartości temp_zadana i histereza tak aby w przypadku zaniku napięcia po ponownym uruchomieniu były wyświetlone. Nie wiem jak to powinno wyglądać w kodzie <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" />. Coś pomijam ale niestety nie mogę wychwycić co, czy mógłby ktoś życzliwy zerknąć na poniższy kod?  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />kod:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 23-05-2014<br /> *      Author: Łukasz<br /> */<br /><br /><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 &lt;avr/eeprom.h&gt;<br /><br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisze KEY<br />    #define KEY_PIN (1&lt;&lt;PD7)                     //pin podłączenie klawisza temp_zadanej<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />    #define KEY_PIN2 (1&lt;&lt;PD6)                    //pin podłączenie klawisza histerezy<br />    #define KEY_DOWN2 !(PIND &amp; KEY_PIN2)<br /><br />    // Przekaźnik1<br />    #define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />    #define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />    #define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br />    // Przekaźnik2<br />   #define PRZEKAZNIK_PIN2 (1&lt;&lt;PC6)<br />   #define PRZEKAZNIK_ON2  PORTC |= PRZEKAZNIK_PIN2<br />   #define PRZEKAZNIK_OFF2 PORTC &amp;= ~(PRZEKAZNIK_PIN2)<br /><br />   // ustawienia fabryczne<br />//#define temp_zadana 22<br />//#define histereza 1<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    uint8_t klawisz_wcisniety2(void);<br /><br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br />    void display_histereza(uint8_t z);<br /><br />    uint8_t termostat(void);<br />    uint8_t chlodzenie(void);<br /><br />    void copy_ram_to_eem(void);           // funkcjia zapisuje dane z RAM do EEPROM<br />    void copy_eem_to_ram(void);           // funkcjia zapisuje dane z EEPROM do RAM<br />    void copy_pgm_to_ram(void);           // funkcjia zapisuje dane z FLASH do RAM<br />    void load_defaults(void);             // funkcjia ładowania danych fabrycznych<br />    void check_and_load_defaults(void);   // funkcja do sprawdzania i ładowania danych z EEPROM do RAM<br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;<br />    uint8_t histereza;<br /><br />    typedef struct{<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br />    uint8_t histereza;           // zmienna histereza w celu dopasowania punktu włączenia przkaźnika<br /><br />    } TTH;<br /><br />    extern TTH pgm_th PROGMEM;<br />    extern TTH eem_th EEMEM;<br />    extern TTH ram_th;<br /><br />    TTH pgm_th PROGMEM ={<br />    22,<br />    1,<br />    };<br />    TTH eem_th EEMEM;             // dane w pamięci EEPROM<br />    TTH ram_th;                   // dane w pamięci RAM<br /><br /><br />    const uint8_t znak_termo&#91;&#93; PROGMEM = {7,5,7,0,0,0,0,0};// wzór znaku termometru w pamięci FLASH<br />    const uint8_t znak_hist&#91;&#93;  PROGMEM = {4,14,4,0,31,0,14,0};// wzór znaku histerezy w pamięci FLASH<br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br />            DDRD &amp;= ~KEY_PIN2;               // kierunek pinu PD6 - wejściowy<br />            PORTD |= KEY_PIN2;<br /><br />            DDRC |= PRZEKAZNIK_PIN;<br />            DDRC |= PRZEKAZNIK_PIN2;<br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br />    lcd_defchar_P(0x80, znak_termo);             // załadowanie znaku temperatury do pamięci<br />    lcd_defchar_P(0x81, znak_hist);              // załadowanie znaku histerezy do pamięci<br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br /><br />    check_and_load_defaults();<br /><br /><br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0,2);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;Temp:&quot;));<br /><br />    lcd_locate(1,1);<br />    lcd_str_P(PSTR(&quot;TZ:&quot;));<br /><br />    lcd_locate(1,9);<br />    lcd_str_P(PSTR(&quot;H:&quot;));<br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        klawisz_wcisniety2();<br />        display_temp_zadana(4);<br />        termostat();<br />        chlodzenie();<br />        display_histereza(11);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<br />            lcd_int(cel);<br />            lcd_str(&quot;.&quot;);<br />            lcd_int(cel_fract_bits);<br />            lcd_str(&quot;\x80&quot;);<br />            lcd_str(&quot;C&quot;);<br />    }<br /><br /><br />    /* Procedura obsługi przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                        temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                        if(temp_zadana&gt;=38){<br />                                temp_zadana = 0;<br />                        }<br />                    }<br /><br />            }<br /><br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br /><br /><br />    uint8_t klawisz_wcisniety2(void)<br />       {<br />               if( KEY_DOWN2 )                                  // klawisz wciśnięty ?<br />               {<br />                       _delay_ms(80);                          // czas drgań styków<br />                       if( KEY_DOWN2 ){<br />                           histereza++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                           if(histereza&gt;=5){<br />                                   histereza = 0;<br />                           }<br />                       }<br /><br />               }<br /><br />               return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />       }<br /><br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />                lcd_locate(1,y);<br /><br />                if(temp_zadana &lt;=9){<br />                        lcd_int(0);<br />                }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    void display_histereza(uint8_t y)<br />    {<br /><br />                lcd_locate(1,y);<br /><br /><br />              //  if(histereza &lt;=9){<br />               //         lcd_int(0);<br />               // }<br />            lcd_str(&quot;\x81&quot;);<br />            lcd_int(histereza);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    uint8_t termostat()<br />    {<br />    switch(subzero)<br />    {<br />    case 0:<br />    if((temp_zadana-histereza)&gt;cel) PRZEKAZNIK_ON;<br />    else{<br />    if((temp_zadana+histereza)&lt;=cel)PRZEKAZNIK_OFF;<br />    }<br />    break;<br />    case 1:<br />    if(temp_zadana&lt;cel) PRZEKAZNIK_ON;<br />    break;<br />    }<br /><br /><br />    }<br /><br />    uint8_t chlodzenie()<br />   {<br /><br /><br />    //switch(subzero)<br />    //{<br />    //case 0:<br />    if((temp_zadana+histereza)&lt;=cel)PRZEKAZNIK_ON2;<br />    else{<br />    if((temp_zadana-histereza)&gt;cel)PRZEKAZNIK_OFF2;<br />    }<br />    //break;<br />    //case 1:<br />    //if(temp_zadana&gt;cel) PRZEKAZNIK_ON2;<br />    //break;<br />    //}<br /><br /><br />    }<br /><br />    // funkcjia zapisy danych z EEPRM do RAM<br />    void copy_eem_to_ram(void){<br />    eeprom_read_block(&amp;ram_th, &amp;eem_th, sizeof(ram_th));<br />    }<br /><br /><br />    // funkcjia zapisy danych z RAM do EEPROM<br />    void copy_ram_to_eem(void){<br />    eeprom_write_block(&amp;ram_th, &amp;eem_th, sizeof(ram_th));<br />    }<br /><br />    // funkcjia zapisująca dane z FLASH do RAM<br />    void copy_pgm_to_ram(void){<br />    memcpy_P (&amp;ram_th, &amp;pgm_th, sizeof(ram_th));<br />    }<br /><br />    // funkcjia ładowania danych fabrycznych<br />    void load_defaults(void){<br />    copy_pgm_to_ram();<br />    copy_ram_to_eem();<br />    }<br /><br /><br />    // funkcja do sprawdzania zawaroci danych w pamięci EEPROM<br />    void check_and_load_defaults(void){<br />    uint8_t i, len = sizeof(ram_th);<br />    uint8_t *ram_wsk = (uint8_t*) &amp;ram_th;<br />    copy_eem_to_ram();<br />    for(i=0; i&lt;len; i++){<br />    if(0xff==*ram_wsk++)continue;<br />    break;<br />    }<br />    if(i==len){<br />    load_defaults();<br />    }<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 26 cze 2014, o 17:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-25T15:14:43+01:00</updated>
<published>2014-06-25T15:14:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85737#p85737</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85737#p85737"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85737#p85737"><![CDATA[
<div class="quotetitle">fajter napisał(a):</div><div class="quotecontent"><br />Panowie jak zapisać do eeprom wartość zmiennej temp_zadana w powyższym kodzie? chodzi o to aby ostatnio ustawiona temperatura była wczytana ponownie po uruchomieniu urządzenia.<br /></div><br /><br />a może warto by tak jednak sięgnąć czasem do bloga ? hmmm ?<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html" >http://mirekk36.blogspot.com/2012/11/av ... iazek.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 25 cze 2014, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-25T15:11:36+01:00</updated>
<published>2014-06-25T15:11:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85736#p85736</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85736#p85736"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85736#p85736"><![CDATA[
Panowie jak zapisać do eeprom wartość zmiennej temp_zadana w powyższym kodzie? chodzi o to aby ostatnio ustawiona temperatura była wczytana ponownie po uruchomieniu urządzenia. Czy to tak powinno wyglądać?<br /><br />przykład kodu:<br /><br />[syntax=c]uint8_t temp_zadana = zmienna;<br />static EEMEM uint8_t zmienna_w_eepromie = 'temp_zadana'; <br /><br />int main(void) <br />{ <br />    eeprom_write_byte(&amp;zmienna_w_eepromie, 'zmienna'); <br />    uint8_t zmienan = eeprom_read_byte(&amp;zmienna_w_eepromie);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 25 cze 2014, o 15:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-25T11:54:14+01:00</updated>
<published>2014-06-25T11:54:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85723#p85723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85723#p85723"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=85723#p85723"><![CDATA[
<strong><span style="font-size: 150%; line-height: normal">CHŁODZENIE JUŻ DZIAŁA! OKAZAŁO SIĘ, ŻE PRZEKAŹNIK ŹLE STYKAŁ! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /></span></strong><br /><br />Porzuciłem na razie zabawę ze sterowaniem GSM. Termostat na grzanie działa ale postanowiłem jeszcze dodać mu funkcję chłodzenia i pojawił się problem. Napisałem funkcję chłodzenia w analogiczny sposób do funkcji termostatu niestety nie wiem dlaczego działa tylko teraz przekaźnik2(chłodzenie), natomiast przekaźnik1 grzania(funkcja termostat) nie działa. Ogólnie chodzi o to aby przekaźnik2 zwierał gdy przekaźnik1 się rozwiera. Coś musi być sprzeczne ale niestety nie wiem co?<br /><br />Poniżej kod programu: <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 />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisze KEY<br />    #define KEY_PIN (1&lt;&lt;PD7)                     //pin podłączenie klawisza temp_zadanej<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />    #define KEY_PIN2 (1&lt;&lt;PD6)                    //pin podłączenie klawisza histerezy<br />    #define KEY_DOWN2 !(PIND &amp; KEY_PIN2)<br /><br />    // Przekaźnik1<br />    #define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />    #define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />    #define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br />    // Przekaźnik2<br />    #define PRZEKAZNIK_PIN2 (1&lt;&lt;PC6)<br />    #define PRZEKAZNIK_ON2  PORTC |= PRZEKAZNIK_PIN2<br />    #define PRZEKAZNIK_OFF2 PORTC &amp;= ~(PRZEKAZNIK_PIN2)<br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    uint8_t klawisz_wcisniety2(void);<br /><br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br />    void display_histereza(uint8_t z);<br /><br />    uint8_t termostat(void);<br />    uint8_t chlodzenie(void);<br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br />    uint8_t histereza;           // zmienna histereza w celu dopasowania punktu włączenia przkaźnika<br /><br /><br />    const uint8_t znak_termo&#91;&#93; PROGMEM = {7,5,7,0,0,0,0,0};// wzór znaku termometru w pamięci FLASH<br />    const uint8_t znak_hist&#91;&#93;  PROGMEM = {4,14,4,0,31,0,14,0};// wzór znaku histerezy w pamięci FLASH<br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br />            DDRD &amp;= ~KEY_PIN2;               // kierunek pinu PD6 - wejściowy<br />            PORTD |= KEY_PIN2;<br /><br />            DDRC |= PRZEKAZNIK_PIN;<br />            DDRC |= PRZEKAZNIK_PIN2;<br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br />    lcd_defchar_P(0x80, znak_termo);             // załadowanie znaku temperatury do pamięci<br />    lcd_defchar_P(0x81, znak_hist);              // załadowanie znaku histerezy do pamięci<br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0,2);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;Temp:&quot;));<br /><br />    lcd_locate(1,1);<br />    lcd_str_P(PSTR(&quot;TZ:&quot;));<br /><br />    lcd_locate(1,9);<br />    lcd_str_P(PSTR(&quot;H:&quot;));<br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        klawisz_wcisniety2();<br />        display_temp_zadana(4);<br />        termostat();<br />        chlodzenie();<br />        display_histereza(11);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<br />            lcd_int(cel);<br />            lcd_str(&quot;.&quot;);<br />            lcd_int(cel_fract_bits);<br />            lcd_str(&quot;\x80&quot;);<br />            lcd_str(&quot;C&quot;);<br />    }<br /><br /><br />    /* Procedura obsługi przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                        temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                        if(temp_zadana&gt;=38){<br />                                temp_zadana = 0;<br />                        }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br /><br /><br />    uint8_t klawisz_wcisniety2(void)<br />       {<br />               if( KEY_DOWN2 )                                  // klawisz wciśnięty ?<br />               {<br />                       _delay_ms(80);                          // czas drgań styków<br />                       if( KEY_DOWN2 ){<br />                           histereza++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                           if(histereza&gt;=5){<br />                                   histereza = 0;<br />                           }<br />                       }<br /><br />               }<br /><br />               return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />       }<br /><br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />                lcd_locate(1,y);<br /><br />                if(temp_zadana &lt;=9){<br />                        lcd_int(0);<br />                }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    void display_histereza(uint8_t y)<br />    {<br /><br />                lcd_locate(1,y);<br /><br /><br />              //  if(histereza &lt;=9){<br />               //         lcd_int(0);<br />               // }<br />            lcd_str(&quot;\x81&quot;);<br />            lcd_int(histereza);<br />            lcd_str(&quot;\x80\C&quot;);<br />    }<br /><br />    uint8_t termostat()<br />    {<br />    switch(subzero)<br />    {<br />    case 0:<br />    if((temp_zadana-histereza)&gt;cel) PRZEKAZNIK_ON;<br />    else{<br />    if((temp_zadana+histereza)&lt;=cel)PRZEKAZNIK_OFF;<br />    }<br />    break;<br />    case 1:<br />    if(temp_zadana&lt;cel) PRZEKAZNIK_ON;<br />    break;<br />    }<br /><br /><br />    }<br /><br />    uint8_t chlodzenie()<br />    {<br /><br /><br />    switch(subzero)<br />    {<br />    case 0:<br />    if((temp_zadana+histereza)&lt;cel)PRZEKAZNIK_ON2;<br />    else{<br />    if((temp_zadana-histereza)&gt;cel)PRZEKAZNIK_OFF2;<br />    }<br />    //break;<br />    //case 1:<br />    //if(temp_zadana&gt;cel) PRZEKAZNIK_ON2;<br />    //break;<br />    }<br /><br /><br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 25 cze 2014, o 11:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-06-05T15:44:04+01:00</updated>
<published>2014-06-05T15:44:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83481#p83481</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83481#p83481"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83481#p83481"><![CDATA[
Jeszcze jedno co do funkcji termostat() bo widzę, że wciąż robisz małego babola. Twoja funkcja nie zwraca żadnego rezultatu a deklarujesz ją jako zwracającą rezultat. W ciele funkcji nie masz instrukcji &quot;return coś tam&quot;. Kompilator na pewno sypie ci warningiem, którego ignorujesz. Jeśli funkcja nie zwraca rezultatu to powinieneś zrobić tak<br />[syntax=c]void termostat(void)[/syntax].<br /><br />Poza tym w definicji funkcji wywaliłeś słówko void. Nie wiem czy to błąd ale trzymajmy się dobrego stylu programowania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />[syntax=c]void termostat(void)<br />{<br />      if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />      else {if((subzero==1) &amp; (temp_zadana&lt;cel) ) PRZEKAZNIK_ON;<br />       else PRZEKAZNIK_OFF;<br />      }<br />}[/syntax]<br /><br />A w samej funkcji powinno być raczej użyte &quot;and&quot; logiczne <strong>&amp;&amp;</strong> a nie bitowe <strong>&amp;</strong>.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 5 cze 2014, o 15:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-06-04T19:06:54+01:00</updated>
<published>2014-06-04T19:06:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83387#p83387</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83387#p83387"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83387#p83387"><![CDATA[
Co do telefonu to zainteresuj sie SIM900D lub jakąś starą nokią którą można sterować poprzez RS232 z tego co się nie mylę <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=1628">majster</a> — 4 cze 2014, o 19:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-04T12:14:05+01:00</updated>
<published>2014-06-04T12:14:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83345#p83345</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83345#p83345"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83345#p83345"><![CDATA[
Celna uwaga zapomniałem, że ekran się sam nie czyści:) termostat już działa poprawnie problemem było subzero <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Chciałbym jeszcze zrobić powiadamianie przez SMS ze starego telefonu. Pomysł wyglądałby tak, że telefon ma wysyłać sms w przypadku gdy układ nie jest wstanie osiągnąć zadanej temperatury. Wiadomość w telefonie byłaby zapisana na stałe, a uC za pomocą kabelków przylutowanych do klawiatury tel. przechodziłby kolejne poziomy menu telefonu. Samo wysłanie sms z punktu widzenia programu wydaje się proste, ale co zastosować żeby układ wiedział kiedy ma wysłać tego smsa? np. gdy minie godzina od ustawienie zadanej temperatury a ta nie zostanie osiągnięta.<br /><br />funkcja powinna wyglądać tak:<br /><br />[syntax=c]uint8_t termostat()<br />    {<br /><br /><br />        if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />            else {if((subzero==1) &amp; (temp_zadana&lt;cel) ) PRZEKAZNIK_ON;<br />            else PRZEKAZNIK_OFF;<br />            }<br /><br /><br /><br />    }[/syntax]<br /><br /><br />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 /><br />    #include &quot;LCD/lcd44780.h&quot;<br />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisz KEY 1<br />    #define KEY_PIN (1&lt;&lt;PD7)<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />    // Przekaźnik<br />    #define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />    #define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />    #define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br />    uint8_t termostat(void);<br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    int8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br />            DDRC |= PRZEKAZNIK_PIN;<br /><br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />    else<br />    {<br />            lcd_locate(0,6);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />    lcd_locate(1,0);<br />    lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        display_temp_zadana(7);<br />        termostat();<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />                            else<br />                            {<br />                                    lcd_locate(0,6);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<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 przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                        temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                        if(temp_zadana&gt;=36){<br />                                temp_zadana = 0;<br />                        }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />                lcd_locate(1,y);<br /><br />                if(temp_zadana &lt;=9){<br />                        lcd_int(0);<br />                }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;C&quot;);<br />    }<br /><br />    uint8_t termostat()<br />    {<br /><br /><br />        if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />            else {if((subzero==1) &amp; (temp_zadana&lt;cel) ) PRZEKAZNIK_ON;<br />            else PRZEKAZNIK_OFF;<br />            }<br /><br /><br /><br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 4 cze 2014, o 12:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-06-04T10:59:31+01:00</updated>
<published>2014-06-04T10:59:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83336#p83336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83336#p83336"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83336#p83336"><![CDATA[
Poprawiłem na szybko twój program i mi na ATB działa. <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 />#include &quot;1Wire/ds18x20.h&quot;<br /><br />// klawisz KEY 1<br />#define KEY_PIN1 (1&lt;&lt;PD7)<br />#define KEY_PIN2 (1&lt;&lt;PD6)<br />//#define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />// Przekaźnik<br />#define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />#define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />#define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br /><br />uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />void display_temp(uint8_t x);<br />void display_temp_zadana(uint8_t y);<br />void termostat(void);<br /><br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) );<br />void zwieksz(void);<br />void zmniejsz(void);<br /><br />volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />int8_t temp_zadana=22, temp_aktualna;          // zmienna temperatura zadana<br /><br />uint8_t subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br />uint8_t key1_lock, key2_lock;<br /><br /><br />int main(void)                                          // główna pfunkcja proframu<br />{<br />DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />DDRD &amp;= ~KEY_PIN1 | KEY_PIN2;               // kierunek pinu PD7 - wejściowy<br />PORTD |= KEY_PIN1 | KEY_PIN2;               // podciągnięcie pinu do VCC<br /><br />DDRC |= PRZEKAZNIK_PIN;<br /><br /><br />/*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br />lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />_delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />/* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />if(DS18X20_OK == DS18X20_read_meas_single(DS18B20_ID, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />else<br />{<br />lcd_locate(0,6);<br />lcd_str(&quot;error&quot;);<br /><br />}<br /><br />sei();                                       // włączamy globalne przerwania<br /><br />lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br />/* wykonywanie operacji w pętlni nieskonczonej */<br />while(1)<br />{<br />key_press( &amp;key1_lock, &amp;PIND, KEY_PIN1, zwieksz );<br />key_press( &amp;key2_lock, &amp;PIND, KEY_PIN2, zmniejsz );<br /><br />//klawisz_wcisniety();<br />display_temp_zadana(7);<br />termostat();<br /><br />if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />{<br /><br />if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />if( 1 == (sekundy % 2))<br />{                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />if(DS18X20_OK == DS18X20_read_meas_single(DS18B20_ID, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />else<br />{<br />lcd_locate(0,6);<br />lcd_str(&quot;error&quot;);<br /><br />}<br />}<br /><br />s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />} // koniec sprawdzania flagi<br />}     // koniec pętli nieskończonej<br />}<br /><br />/* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />void display_temp(uint8_t x)<br />{<br />lcd_locate(0,x);<br />if(subzero) lcd_str(&quot;-&quot;);<br />else lcd_str(&quot; &quot;);<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 przerwań */<br />ISR(TIMER0_COMP_vect)<br />{<br />static uint8_t cnt = 0;<br />if(++cnt&gt;99){<br />s1_flag = 1;<br />sekundy++;<br />if(sekundy&gt;59) sekundy = 0;<br />cnt = 0;<br />}<br />}<br /><br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br />void zwieksz(void)<br />{<br />if(temp_zadana &lt; 36) temp_zadana++;<br />}<br /><br />void zmniejsz(void)<br />{<br />if(temp_zadana &gt; -10) temp_zadana--;<br />}<br /><br /><br />void display_temp_zadana(uint8_t y)<br />{<br />if(temp_zadana &lt; 0)<br />{<br />lcd_locate(1,y);<br />if(temp_zadana &gt;=-9){<br />lcd_str(&quot; &quot;);<br />}<br />lcd_int(temp_zadana);<br />lcd_str(&quot;C&quot;);<br /><br />}<br />else<br />{<br />lcd_locate(1,y);<br />lcd_str(&quot; &quot;);//usuń znak minus<br />if(temp_zadana &lt;=9){<br />lcd_str(&quot; &quot;);<br />}<br />lcd_int(temp_zadana);<br />lcd_str(&quot;C&quot;);<br /><br />}<br /><br />}<br /><br />void termostat(void)<br />{<br />    if(subzero) temp_aktualna = cel * -1;<br />    else temp_aktualna = cel;<br /><br /><br />if(temp_aktualna &lt; temp_zadana) PRZEKAZNIK_ON;<br />else if(temp_aktualna &gt; (temp_zadana + 1)) PRZEKAZNIK_OFF;   //histereza 1*C<br /><br />}[/syntax]<br /><br />Poprawiłem tą linię kodu [syntax=c]DS18X20_read_meas_single(DS18B20_ID, &amp;subzero, &amp;cel, &amp;cel_fract_bits)[/syntax] Bo u mnie nie odczytywało temperatury jeśli miałem tak jak ty.<br /><br />Do obsługi klawiszy wykorzystałem funkcje z bloga Mirka. Dzięki temu w prosty sposób dodałem drugi klawisz zmniejszający temperaturę zadaną. <br /><br />Kodu nie sprawdzałem na temperaturach ujemnych ale na dodatnich u mnie działa.<br /><br />Kod pisałem na szybko i nie sprawdzałem go dogłębnie więc nie wiem czy w każdych warunkach będzie działał dobrze. Potraktuj go jako bazę do własnych modyfikacji <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=204">jacekk232</a> — 4 cze 2014, o 10:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-06-04T06:25:16+01:00</updated>
<published>2014-06-04T06:25:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83310#p83310</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83310#p83310"/>
<title type="html"><![CDATA[Re: Odp: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83310#p83310"><![CDATA[
<div class="quotetitle">fajter napisał(a):</div><div class="quotecontent"><br />właśnie sprawdziłem na różne sposoby i niestety nie działa Twój sposób, a powinien nie wiem dlaczego tak jest... na wyświetlaczu dodatkowo pojawiło się w linii temperatury rzeczywistej dodatkowe C... hm dziwne...<br /></div><br /><br />Z tym dodatkowym C to nic dziwnego jezeli do temp rzeczywistej doszedl - to znak stopnia poszedl w prawo jak znak - zniknal to C zostalo o 1 znak w prawo wysuniete bo go nie wyczysciles. Mozesz dac warunek ze jezeli tmperatura ujemna to lcd_locate jest 7 a jak dodatnia to 8 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> bedzie znak C raz wartosc zadana zawsze wyrownana.<br /><br />Wysłane z telefonu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 4 cze 2014, o 06:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-03T22:42:06+01:00</updated>
<published>2014-06-03T22:42:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83299#p83299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83299#p83299"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83299#p83299"><![CDATA[
właśnie sprawdziłem na różne sposoby i niestety nie działa Twój sposób, a powinien nie wiem dlaczego tak jest... na wyświetlaczu dodatkowo pojawiło się w linii temperatury rzeczywistej dodatkowe C... hm dziwne...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 3 cze 2014, o 22:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-06-03T22:18:31+01:00</updated>
<published>2014-06-03T22:18:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83298#p83298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83298#p83298"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83298#p83298"><![CDATA[
To może zrób tak.<br />Zmienna temp_zadana jako int8_t. Dodatkowo stwórz nowa zmienną też jako int8_t [syntax=c]int8_t temp_zdana, temp_aktualana;[/syntax]<br /><br />Potem przeliczenie temperatury aby w zmiennej temp_aktualana mogła się znajdować temperatura dodatnia jak i ujemna<br />[syntax=c]if(subzero) temp_aktualana = cel * -1;<br />else temp_aktualana = cel;[/syntax]<br /><br />Następnie proste porównanie<br />[syntax=c]if(temp_aktualana &lt; temp_zadana) PRZEKAZNIK_ON;<br />else if(temp_aktualana &gt; (temp_zadana + 1)) PRZEKAZNIK_OFF;   //histereza 1*C[/syntax]<br />Dodatkowo mała histereza o wartości jednego stopnia aby przypadkiem przekaźnik nie klapał na przejściu temperatur.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 3 cze 2014, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-03T21:38:11+01:00</updated>
<published>2014-06-03T21:38:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83293#p83293</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83293#p83293"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83293#p83293"><![CDATA[
niestety ta zmiana nie działa, dla np temp zadanej 1*C gdy temperatura rzeczywista jest -2*C dioda lekko się tli dla -1*C dioda działa dla 1*C działa dla 2*C lekko tli a powinna gasnąć całkowicie jak i też dla każdej większej ujemnej temp powinna się palić zawsze.<br /><br />nie wiem dlaczego tak się dzieje ;/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 3 cze 2014, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-06-03T21:05:52+01:00</updated>
<published>2014-06-03T21:05:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83286#p83286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83286#p83286"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83286#p83286"><![CDATA[
W tym warunku[syntax=c]if(subzero=1) {if((temp_zadana&lt;=cel) | (temp_zadana&gt;= cel))[/syntax] zamiast sumy bitowej <strong>|</strong> powinieneś użyć sumy logocznej <strong>||</strong> czyli powinno być tak[syntax=c]if(subzero=1) {if((temp_zadana&lt;=cel) || (temp_zadana&gt;= cel))[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 3 cze 2014, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-03T20:50:05+01:00</updated>
<published>2014-06-03T20:50:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83284#p83284</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83284#p83284"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83284#p83284"><![CDATA[
Panowie dopisałem funkcję termostatu, układ ma działać w ten sposób:<br />gdy np. temperatura zadana(temp_zadana) jest równa 26*C to układ ma grzać gdy temperatur aktualna(cel) jest niższa np. 24*C lub jest ujemna np. -2 lub -30. Otóż funkcja napisana przeze menie działa nie do końca poprawnie, tzn. gdy temperatura jest ujemna lub dodatnia czyli mniejsza od zadanej dioda symbolizując przekaźnik się świeci pełną mocą natomiast gdy temperatura na czujniku przewyższy temperaturą zadaną dioda zamiast zagasić się całkowicie świeci bardzo lekkim łukiem. Jak waszym zdaniem powinna wyglądać taka funkcja?:)<br />Funkcja niepoprawnie działająca:<br /><br />    uint8_t termostat()<br />    {<br />    f(subzero=1) {if((temp_zadana&lt;=cel) | (temp_zadana&gt;= cel))<br />    //PRZEKAZNIK_ON;<br />    else PRZEKAZNIK_OFF;<br />    }<br />    if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />    else PRZEKAZNIK_OFF;<br />    }<br /><br />Funkcja poprawnie działająca ale nie dla wyższych wartości ujemnych od temp. zadanej:<br /><br />    uint8_t termostat()<br />    {<br />    if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />    else PRZEKAZNIK_OFF;<br />    }<br /><br />Kod programu:<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 />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisz KEY 1<br />    #define KEY_PIN (1&lt;&lt;PD7)<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br />    // Przekaźnik<br />    #define PRZEKAZNIK_PIN (1&lt;&lt;PC1)<br />    #define PRZEKAZNIK_ON  PORTC |= PRZEKAZNIK_PIN<br />    #define PRZEKAZNIK_OFF PORTC &amp;= ~(PRZEKAZNIK_PIN)<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br />    uint8_t termostat(void);<br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br />            DDRC |= PRZEKAZNIK_PIN;<br /><br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />    else<br />    {<br />            lcd_locate(0,6);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />    lcd_locate(1,0);<br />    lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        display_temp_zadana(7);<br />        termostat();<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(6);<br />                            else<br />                            {<br />                                    lcd_locate(0,6);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<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 przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                        temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                        if(temp_zadana&gt;=36){<br />                                temp_zadana = 0;<br />                        }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />                lcd_locate(1,y);<br /><br />                if(temp_zadana &lt;=9){<br />                        lcd_int(0);<br />                }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;C&quot;);<br />    }<br /><br />    uint8_t termostat()<br />    {<br />    //if(subzero=1) {if((temp_zadana&lt;=cel) | (temp_zadana&gt;= cel))<br />    //PRZEKAZNIK_ON;<br />    //else PRZEKAZNIK_OFF;<br />    //}<br />    if(temp_zadana&gt;=cel) PRZEKAZNIK_ON;<br />    else PRZEKAZNIK_OFF;<br />    }<br /><br />    //koniec[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 3 cze 2014, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-06-03T17:16:02+01:00</updated>
<published>2014-06-03T17:16:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83237#p83237</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83237#p83237"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83237#p83237"><![CDATA[
Spoko nic się nie dzieje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> cieszę się że działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Dla na s dużą motywacją jest przycisk POMÓGŁ <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> mile widziany <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />W trakcie testowałem u siebie na ATB i nie było mocnych musiało zadziałać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />mam 3x jedna sztuka zawsze wolna do szybkich testów <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=1628">majster</a> — 3 cze 2014, o 17:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-03T17:20:40+01:00</updated>
<published>2014-06-03T17:09:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83236#p83236</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83236#p83236"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83236#p83236"><![CDATA[
działa Panowie!! jesteście nieocenieni!!! i tak szybcy że nie mogłem nadążyć!!! Pierwszy raz piszę na forum internetowym więc wybaczcie mi moją gapowatość:)<br /><br /><br />Panowie, a czy po 35 przyciśnięciach klawisza pojawia wam się 1C? bo mi pojawia się na LCD 1CC dopiero 10 wymazuje to zero.<br /><br /><br />w grałem kod od &quot;gumeni&quot; i teraz poprawnie się zmienia, bardzo dziękuję:) teraz zostało &quot;tylko&quot; napisać funkcje termostatu <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 3 cze 2014, o 17:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gumeni]]></name></author>
<updated>2014-06-03T17:08:21+01:00</updated>
<published>2014-06-03T17:08:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83235#p83235</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83235#p83235"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83235#p83235"><![CDATA[
Potwierdzam musi działać:) .<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 />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisz KEY 1<br />    #define KEY_PIN (1&lt;&lt;PD7)<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br /><br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />    lcd_locate(1,0);<br />    lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        display_temp_zadana(8);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<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 przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                    temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                    if(temp_zadana&gt;=36){<br />                    temp_zadana = 0;<br />                    }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />    lcd_locate(1,y);<br /><br />    if(temp_zadana &lt;=9){<br />    lcd_int(0);<br />    }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;.0C&quot;);<br />    }<br />    //koniec[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3088">gumeni</a> — 3 cze 2014, o 17:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-06-03T17:07:04+01:00</updated>
<published>2014-06-03T17:07:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83234#p83234</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83234#p83234"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83234#p83234"><![CDATA[
<div class="quotetitle">fajter napisał(a):</div><div class="quotecontent"><br />to znaczy że u Ciebie ten kod działa? <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> <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 />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />// klawisz KEY 1<br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PINC &amp; KEY_PIN)<br /><br />uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />void display_temp(uint8_t x);<br />void display_temp_zadana(uint8_t y);<br /><br /><br />volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />int main(void)                                          // główna pfunkcja proframu<br />{<br />        DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />        PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />        DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />        PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br /><br />/*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />_delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />/* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else<br />{<br />        lcd_locate(0,7);<br />        lcd_str(&quot;error&quot;);<br /><br />}<br /><br />sei();                                       // włączamy globalne przerwania<br /><br />lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br />display_temp_zadana(8);<br /><br /><br />/* wykonywanie operacji w pętlni nieskonczonej */<br />while(1)<br />{<br />        if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />        {<br /><br />                if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                        if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                        else<br />                        {<br />                                lcd_locate(0,7);<br />                                lcd_str(&quot;error&quot;);<br /><br />                        }<br />                }<br /><br />                s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />        } // koniec sprawdzania flagi<br />}     // koniec pętli nieskończonej<br /><br /><br /><br />klawisz_wcisniety();[/syntax]<br /></div><br /><br />Nie ten anie ale ten co podaję tak:<br /><br />dodałem jeszcze małą poprawkę stylistyczną wyświetlającą temp zadaną<br /><br />[syntax=c]void display_temp_zadana(uint8_t y)<br />    {<br />    lcd_locate(1,y);<br /><br />    if(temp_zadana &lt;=9){<br />    lcd_int(0);<br />    }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;.0C&quot;);<br />    }[/syntax]<br /><br />Skopiuj całość i ci zadziała <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><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 />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisz KEY 1<br />    #define KEY_PIN (1&lt;&lt;PD7)<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br /><br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />    lcd_locate(1,0);<br />    lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        display_temp_zadana(8);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<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 przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                    temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                    if(temp_zadana&gt;=36){<br />                    temp_zadana = 0;<br />                    }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />    lcd_locate(1,y);<br /><br />    if(temp_zadana &lt;=9){<br />    lcd_int(0);<br />    }<br /><br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;.0C&quot;);<br />    }<br />    //koniec[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 3 cze 2014, o 17:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fajter]]></name></author>
<updated>2014-06-03T17:03:26+01:00</updated>
<published>2014-06-03T17:03:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83233#p83233</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83233#p83233"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83233#p83233"><![CDATA[
to znaczy że u Ciebie ten kod działa? <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> <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 />#include &quot;1Wire/ds18x20.h&quot;<br /><br /><br />// klawisz KEY 1<br />#define KEY_PIN (1&lt;&lt;PD7)<br />#define KEY_DOWN !(PINC &amp; KEY_PIN)<br /><br />uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />void display_temp(uint8_t x);<br />void display_temp_zadana(uint8_t y);<br /><br /><br />volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />int main(void)                                          // główna pfunkcja proframu<br />{<br />        DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />        PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />        DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />        PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br /><br />/*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />_delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />/* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else<br />{<br />        lcd_locate(0,7);<br />        lcd_str(&quot;error&quot;);<br /><br />}<br /><br />sei();                                       // włączamy globalne przerwania<br /><br />lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br />display_temp_zadana(8);<br /><br /><br />/* wykonywanie operacji w pętlni nieskonczonej */<br />while(1)<br />{<br />        if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />        {<br /><br />                if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                        if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                        else<br />                        {<br />                                lcd_locate(0,7);<br />                                lcd_str(&quot;error&quot;);<br /><br />                        }<br />                }<br /><br />                s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />        } // koniec sprawdzania flagi<br />}     // koniec pętli nieskończonej<br /><br /><br /><br />klawisz_wcisniety();[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4637">fajter</a> — 3 cze 2014, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2014-06-03T17:02:27+01:00</updated>
<published>2014-06-03T17:02:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83231#p83231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83231#p83231"/>
<title type="html"><![CDATA[Re: Problem z budową termostatu ATmega32 i DS18B20]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7289&amp;p=83231#p83231"><![CDATA[
<div class="quotetitle">fajter napisał(a):</div><div class="quotecontent"><br />niestety nie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /></div><br /><br /><br />Tutaj jest prawidłowy kod testowałem na ATB 1.4a pink i u mnie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Więc i u ciebie musi.<br />Kilka baboli jeszcze znalazłem<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 />    #include &quot;1Wire/ds18x20.h&quot;<br /><br />    // klawisz KEY 1<br />    #define KEY_PIN (1&lt;&lt;PD7)<br />    #define KEY_DOWN !(PIND &amp; KEY_PIN)<br /><br /><br />    uint8_t klawisz_wcisniety(void);        // deklaracja funkcji<br />    void display_temp(uint8_t x);<br />    void display_temp_zadana(uint8_t y);<br /><br /><br />    volatile uint8_t s1_flag;     // flaga tyknięcia timera co 1 sekundę<br />    volatile uint8_t sekundy;     // licznik sekund od 0 do 59 s<br />    uint8_t temp_zadana;          // zmienna temperatura zadana<br /><br /><br /><br /><br />    uint8_t  familycode, subzero, cel, cel_fract_bits;      // znak temperatury, częć całkowita, czeć dziesiętna temperatury,<br /><br /><br />    int main(void)                                          // główna pfunkcja proframu<br />    {<br />            DDRA |= (1&lt;&lt;PA7);                                   // ustawienie kierunku na bicie 8 podswietlenia jako wyjcie<br />            PORTA |= (1&lt;&lt;PA7);                                  // włącznie podwietlenie poprzez ustawienie stanu wysokiego na pinie PA7<br /><br />            DDRD &amp;= ~KEY_PIN;               // kierunek pinu PD7 - wejściowy<br />            PORTD |= KEY_PIN;               // podciągnięcie pinu do VCC<br /><br /><br />    /*** Ustawienie trybu i parametrów Timera0 dla częstotliwoći taktoeania procesora 8MHz ***/<br />    TCCR0 |= (1&lt;&lt;WGM01);                         // włączenie trybu licznika CTC<br />    TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);              // ustawienie preskalera na 1024<br />    OCR0 = 77;                                   // podział przez 78 w rejestrze przepełnienia OCR<br />    TIMSK |= (1&lt;&lt;OCIE0);                         // zezwolenie na przerwanie Compare Match z częstotliwocia około 100 razy na 1s<br /><br /><br />    lcd_init();                                  // funkcja wykonufująca procedurę inicjalizacji wywietlacza LCD<br /><br /><br /><br />    DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);  //wysyła rozkaz wykonania pomiaru do czujnika<br />    _delay_ms(750);                                  // czas potrzebny na dokonanie pomiary przez czujnik<br /><br /><br />    /* Odczytujemy temperaturę z czujnika o ile został wykryty i wywietlamy temperaturę */<br />    if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />    else<br />    {<br />            lcd_locate(0,7);<br />            lcd_str(&quot;error&quot;);<br /><br />    }<br /><br />    sei();                                       // włączamy globalne przerwania<br /><br />    lcd_locate(0, 0);                            // wyswietl napisy w zerowej lini LCD<br />    lcd_str_P(PSTR(&quot;T.Oto.&quot;));<br /><br />    lcd_locate(1,0);<br />    lcd_str_P(PSTR(&quot;T.Zad.&quot;));<br /><br /><br /><br /><br /><br /><br />    /* wykonywanie operacji w pętlni nieskonczonej */<br />    while(1)<br />    {<br />        klawisz_wcisniety();<br />        display_temp_zadana(8);<br /><br />            if(s1_flag)                              // sprawdzenie flagi tyknięć timera programowego co 1 s<br />            {<br /><br />                    if( 0 == (sekundy % 2)) DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL);      // co 3s gdy reszta z dzielenie modulo równa jest 1 wysyłaj roskaz pomiaru do czujników<br />                    if( 1 == (sekundy % 2)) {                                                    // c0 3s gdy reszta z dzielenia modulo równa jest 2, czyli 1s po rozkazie konwersji odczytaj i wywietl temp z czujnika jeżeli nie pokaż komunikat o błędzie<br />                            if(DS18X20_OK == DS18X20_read_meas_single(familycode, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(7);<br />                            else<br />                            {<br />                                    lcd_locate(0,7);<br />                                    lcd_str(&quot;error&quot;);<br /><br />                            }<br />                    }<br /><br />                    s1_flag = 0;                        // zerujemy flagę aby jeden raz w ciągu sekundy wykonac operację<br /><br />            } // koniec sprawdzania flagi<br />    }     // koniec pętli nieskończonej<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />    }<br /><br />    /* Funkcja do wywietlania wartosci temperatury na wywietlaczu LCD w pozycji X */<br />    void display_temp(uint8_t x)<br />    {<br />            lcd_locate(0,x);<br />            if(subzero) lcd_str(&quot;-&quot;);<br />            else lcd_str(&quot; &quot;);<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 przerwań */<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt = 0;<br />                            if(++cnt&gt;99){<br />                                    s1_flag = 1;<br />                                    sekundy++;<br />                                    if(sekundy&gt;59) sekundy = 0;<br />                                    cnt = 0;<br />                            }<br />    }<br /><br />    // definicja funkcji<br />    uint8_t klawisz_wcisniety(void)<br />    {<br />            if( KEY_DOWN )                                  // klawisz wciśnięty ?<br />            {<br />                    _delay_ms(80);                          // czas drgań styków<br />                    if( KEY_DOWN ){<br />                    temp_zadana++ ;     // jeśli wciśnięty?  zakończ funkcję<br /><br />                    if(temp_zadana&gt;=36){<br />                    temp_zadana = 0;<br />                    }<br />                    }<br /><br />            }<br /><br />            return 0;       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br /><br />    void display_temp_zadana(uint8_t y)<br />    {<br />            lcd_locate(1,y);<br />            lcd_int(temp_zadana);<br />            lcd_str(&quot;C&quot;);<br />    }<br />    //koniec[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">gumeni napisał(a):</div><div class="quotecontent"><br />[syntax=c]#define KEY_DOWN !(PINC &amp; KEY_PIN)[/syntax]<br /><br />powinno być:<br />[syntax=c]#define KEY_DOWN !(PIND &amp; KEY_PIN)[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />bo przecież podłączasz przycisk pod PORTD a dokładnie PD7<br /></div><br /><br /><br />I znów mnie ubiegł <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 3 cze 2014, o 17:02</p><hr />
]]></content>
</entry>
</feed>