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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-20T17:56:04+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=11495&amp;mode</id>
<entry>
<author><name><![CDATA[Morcinek92]]></name></author>
<updated>2015-06-20T17:56:04+01:00</updated>
<published>2015-06-20T17:56:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=132263#p132263</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=132263#p132263"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=132263#p132263"><![CDATA[
Dziękuję zeta za odpowiedź . Miałeś racje po ponownym zaprogramowaniu wszystko działa <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=903">Morcinek92</a> — 20 cze 2015, o 17:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[zeta1]]></name></author>
<updated>2015-06-13T09:37:59+01:00</updated>
<published>2015-06-13T09:37:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=131649#p131649</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=131649#p131649"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=131649#p131649"><![CDATA[
Witam. Miałem ten sam problem który powstał przy próbie przestawienia temperatury . Nie wiem dlaczego tak się stało i ie dało się nic zrobić. Wyjąłem procesor jeszcze raz go zaprogramowałem i znowu wszystko działa . Czyli to nie są zwarcia czy błędy w elektronice a w programie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10196">zeta1</a> — 13 cze 2015, o 09:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Artmag]]></name></author>
<updated>2015-04-27T13:39:04+01:00</updated>
<published>2015-04-27T13:39:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127591#p127591</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127591#p127591"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127591#p127591"><![CDATA[
Przepraszam. Tak to jest jak w pracy przegląda się tematy. Na twoim miejscu sprawdziłbym elektronicznie czy wszystko jest wporządku. Jeżeli program i sterownik działał do tej pory to nie powinno być raczej problemu w programie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7772">Artmag</a> — 27 kwi 2015, o 13:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[j23]]></name></author>
<updated>2015-04-26T19:53:26+01:00</updated>
<published>2015-04-26T19:53:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127543#p127543</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127543#p127543"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127543#p127543"><![CDATA[
<div class="quotetitle">Morcinek92 napisał(a):</div><div class="quotecontent"><br />(...)// Show an overload OFL (Over F Load)<br /><br />czyli rozumiem że to przeciążenie . Ale skąd one się bierze i jak zostało zmierzone ??<br />Wypiąłem grzałki i nadal to samo... (...)<br /></div><br /><br />Prawdopodobnie chodzi o część kodu od linii 174, ale konkretnie to od linii 195, tzn.<br />[syntax=c]if (buff &gt; 999) {<br />                // Show an overload OFL (Over F Load)<br /> <br />                g_display_buff&#91;1&#93; = 14;<br />                g_display_buff&#91;2&#93; = 13;<br />        }[/syntax]<br />Tylko, że nie wiem jaki był zamysł Phill'a... Dobrze by było, żeby to Kolega Phill się tutaj wypowiedział o ile to nie tajemnica jak ten algorytm działa.<br />W każdym razie ewidentnie w programie występuje przepełnienie przewidzianej skali, z której ma być obliczona temperatura (przepełnienie bufora). Ten bufor to prawdopodobnie spróbkowana wartość napięcia od czujnika temperatury (jeszcze nie konkretna wartość temperatury). Jako maksymalna wartość przyjęto 999 i wszystko co będzie powyżej nie ma być próbkowane. Tak w każdym razie ja to widzę, ale mogę się oczywiście gdzieś mylić za co z góry przepraszam (za wprowadzanie w błąd).<br />Piszesz, że wyłączyłeś grzałki i nadal jest OFL... To znaczy, że tam gdzie dochodzi próbkowany sygnał z DS18B20 nadal występuje maksymalna wartość? Trochę dziwne.. Może jakieś zwarcie jest w układzie? Sprawdziłeś te czujniki gdzieś przy innym MCU czy dostarczają prawidłowe dane?<br /><br />To tyle co udało mi się doczytać. Mam nadzieję, że odrobinę pomogłem.<br />Powodzenia w dalszym rozwiązywaniu problemu.<br /><br />Pozdrawiam! j23 Jarek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4504">j23</a> — 26 kwi 2015, o 19:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Morcinek92]]></name></author>
<updated>2015-04-26T14:33:15+01:00</updated>
<published>2015-04-26T14:33:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127519#p127519</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127519#p127519"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127519#p127519"><![CDATA[
Wróżenie z fusów ? <br />W poście który napisałem zawarte są wszystkie informację .. <br />Schemat ? jest na stronie autora podałem link no ale proszę <br /><!-- m --><a class="postlink" href="http://jumperone.com/files/2011/10/thermostat-project-part2/ThermostatV2.pdf" >http://jumperone.com/files/2011/10/ther ... statV2.pdf</a><!-- m -->  <br /><br />Czujnik temperatury wykluczam ponieważ wskazania ma prawidłowe<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=903">Morcinek92</a> — 26 kwi 2015, o 14:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Artmag]]></name></author>
<updated>2015-04-26T14:29:28+01:00</updated>
<published>2015-04-26T14:29:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127517#p127517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127517#p127517"/>
<title type="html"><![CDATA[Re: Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127517#p127517"><![CDATA[
Wróżenie z fusów to specjalność wróżby. Stawiam na czujnik temperatury. Jak zapodałbyś jakiś schemat byłoby łatwiej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7772">Artmag</a> — 26 kwi 2015, o 14:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Morcinek92]]></name></author>
<updated>2015-04-26T11:09:18+01:00</updated>
<published>2015-04-26T11:09:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127501#p127501</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127501#p127501"/>
<title type="html"><![CDATA[Attiny2313 - Termostat by Phil]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11495&amp;p=127501#p127501"><![CDATA[
Hejka, <br /><br />Już ponad rok temu zbudowałem termostat według projektu Phila który służy mi w wytrawiarce.<br /><a href="http://jumperone.com/2011/10/thermostat-project-part2/"  class="postlink">http://jumperone.com/2011/10/thermostat-project-part2/</a><br /><br />Dotychczas wszystko działało bez zarzutów , do wczoraj : ( <br />Zapomniałem jej wyłączyć i 24 godz była użytkowana. Do wyjścia mam podłączone 2 grzałki po 100W. <br />Na wyświetlaczu pojawia mi się aktualna temperatura i wskazuje ona prawidłową wartość oraz zmienia się pod wpływem zmiany temperatury. Wartość histerezy też mogę zmieniać  bez problemów , ale  w momencie kiedy chce zmienić temperaturę główną czy to w górę czy w dół to wyświetla się napis na wyświetlaczu &quot; OFL &quot; nie mam pojęcia jak przywrócić termostat do prawidłowej pracy. <br /><br />Phil udostępnia wsad do procesora : <br /><br />main.c<br />[syntax=c]#define F_CPU 8000000UL<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &quot;types.h&quot;<br /><br /><br />#ifndef _BV<br />#define _BV(x) (1&lt;&lt;x)<br />#endif<br /><br />#define BUTTON_1_PINPIND<br />#define BUTTON_1_PNPD4<br />#define BUTTON_2_PINPIND<br />#define BUTTON_2_PNPD5<br />#define BUTTON_3_PINPIND<br />#define BUTTON_3_PNPD6<br /><br />#define RELAY_PORTPORTD<br />#define RELAY_PNPD0<br /><br />#define LED_PORTPORTB<br />#define LED_PNPB2<br /><br />#define RELAY_ON() {RELAY_PORT |= _BV(RELAY_PN);}<br />#define RELAY_OFF() {RELAY_PORT &amp;= ~_BV(RELAY_PN);}<br />#define RELAY_TOGGLE() { RELAY_PORT ^= _BV(RELAY_PN);}<br /><br />#define LED_ON() {LED_PORT |= _BV(LED_PN);}<br />#define LED_OFF() {LED_PORT &amp;= ~_BV(LED_PN);}<br />#define LED_TOGGLE() {LED_PORT ^= _BV(LED_PN);}<br /><br />#define TSENS_PORTPORTD<br />#define TSENS_PINPIND<br />#define TSENS_DDRDDRD<br />#define TSENS_PNPD1<br />#define TSENS_BIT(TSENS_PIN &amp; _BV(TSENS_PN))<br />#define TSENS_PULL_LOW(){ TSENS_DDR |= _BV(TSENS_PN);  }<br />#define TSENS_LISTEN(){ TSENS_DDR &amp;= ~_BV(TSENS_PN); }<br /><br />#define DISP_DELAY 2<br /><br />#define DISP_OFF() {PORTB &amp;= 0x1F;}<br />#define DISP_DIGIT1() {PORTB &amp;= 0x1F; PORTB |= 0x20;}<br />#define DISP_DIGIT2() {PORTB &amp;= 0x1F; PORTB |= 0x40;}<br />#define DISP_DIGIT3() {PORTB &amp;= 0x1F; PORTB |= 0x80;}<br />#define DISP_DIGIT_ALL() {PORTB |= 0xE0;}<br /><br />#define DISP_A_PORTPORTB<br />#define DISP_A_PN_BV(PB4)<br />#define DISP_B_PORTPORTA<br />#define DISP_B_PN_BV(PA1)<br />#define DISP_C_PORTPORTB<br />#define DISP_C_PN_BV(PB0)<br />#define DISP_D_PORTPORTB<br />#define DISP_D_PN_BV(PB1)<br />#define DISP_E_PORTPORTA<br />#define DISP_E_PN_BV(PA0)<br />#define DISP_F_PORTPORTB<br />#define DISP_F_PN_BV(PB3)<br />#define DISP_G_PORTPORTD<br />#define DISP_G_PN_BV(PD3)<br />#define DISP_DP_PORTPORTD<br />#define DISP_DP_PN_BV(PD2)<br /><br /><br />// All those display port definitions take less space than if to use hex values to set multiple pins at a time.<br />// Stupid compiler! )) This firmware needs assembly lang. face lift..<br /><br />//#define DISP_SET_ZERO() { PORTA &amp;= 0xFC; PORTB &amp;= 0xE4; PORTD &amp;= 0xF3; } // This one takes more space<br />#define DISP_SET_ZERO() { PORTA &amp;= ~_BV(PA1); PORTA &amp;= ~_BV(PA0); PORTB &amp;= ~_BV(PB4); PORTB &amp;= ~_BV(PB3); PORTB &amp;= ~_BV(PB1); PORTB &amp;= ~_BV(PB0); PORTD &amp;= ~_BV(PD3); PORTD &amp;= ~_BV(PD2); }<br />#define DISP_ALL_ON() { PORTA |= _BV(PA1); PORTA |= _BV(PA0); PORTB |= _BV(PB4); PORTB |= _BV(PB3); PORTB |= _BV(PB1); PORTB |= _BV(PB0); PORTD |= _BV(PD3); PORTD |= _BV(PD2); }<br />#define DISP_DP_ON() { DISP_DP_PORT |= DISP_DP_PN; }<br />#define DISP_DP_OFF() { DISP_DP_PORT &amp;= ~DISP_DP_PN; }<br /><br /><br />void DispS1(void){ DISP_SET_ZERO(); DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; }<br />void DispS2(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_G_PORT |= DISP_G_PN; DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; }<br />void DispS3(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS4(void){ DISP_SET_ZERO(); DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS5(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS6(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS7(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN;}<br />void DispS8(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS9(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispS0(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN;}<br />void DispSE(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispSr(void){ DISP_SET_ZERO(); DISP_E_PORT |= DISP_E_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispSH(void){ DISP_SET_ZERO(); DISP_B_PORT |= DISP_B_PN; DISP_C_PORT |= DISP_C_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br />void DispSL(void){ DISP_SET_ZERO(); DISP_D_PORT |= DISP_D_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN;}<br />void DispSF(void){ DISP_SET_ZERO(); DISP_A_PORT |= DISP_A_PN; DISP_E_PORT |= DISP_E_PN; DISP_F_PORT |= DISP_F_PN; DISP_G_PORT |= DISP_G_PN;}<br /><br />void (*g_disp_number_function_arr&#91;&#93;)(void) = {DispS0,DispS1,<br />DispS2,DispS3,<br />DispS4,DispS5,<br />DispS6,DispS7,<br />DispS8,DispS9,<br />DispSE, DispSr,<br />DispSH, DispSL,<br />DispSF<br /> };<br /><br /><br />// Info to display<br />// 3 digits + 3 decimal points (0 - no point, &gt;0 - point)<br />u08 g_display_buff&#91;6&#93; = {0, 0, 0, 0, 0, 0};<br /><br />#define DISP_MODE_TEMPERATURE0<br />#define DISP_MODE_SETPOINT1<br />#define DISP_MODE_HYST2<br />u08 g_disp_mode = DISP_MODE_TEMPERATURE;<br />u16 g_disp_mode_timer = 0;<br /><br />// Mode state variable for setting temperature in 1s steps instead of 0.1s<br />//u08 bQuickStepMode = FALSE;<br /><br />#define VAL_TO_DISPLAY_THERM0<br />#define VAL_TO_DISPLAY_SETPOINT1<br />#define VAL_TO_DISPLAY_HYST2<br /><br /><br />typedef struct{<br />u16  current_temp;<br />u08  current_temp_sign;<br />u16  set_point_temp;<br />u08  set_point_temp_sign;<br />u16  hysteresis;<br />} ThermStruct;<br /><br />ThermStruct g_therm_struct;<br /><br />// Temperature readings from DS18B20<br />u16convert g_temperature;<br /><br />// Initialize all that crap :)<br />void Init(void) {<br />// Initialize all ports<br />DDRA = _BV(PA1)|_BV(PA0);<br />DDRB = 0xFF; // all pins to output<br />DDRD = _BV(PD3)|_BV(PD2)|_BV(PD0);<br /><br />PORTA = 0x00;<br />PORTB = 0x00;<br />PORTD = 0x00;<br />}<br /><br />// Write to EEPROM<br />void EEPROMWrite(u08 address, u08 data) {<br />// Wait for completion of previous write<br />while(EECR &amp; (1&lt;&lt;EEPE)) {}<br />// Set up address and data registers<br />EEAR = address;<br />EEDR = data;<br />// Write logical one to EEMPE<br />EECR |= (1&lt;&lt;EEMPE);<br />// Start eeprom write by setting EEPE<br />EECR |= (1&lt;&lt;EEPE);<br />}<br /><br />// Read from EEPROM<br />u08 EEPROMRead(u08 address) {<br />// Wait for completion of previous write<br />while(EECR &amp; (1&lt;&lt;EEPE)) {}<br />// Set up address register<br />EEAR = address;<br />// Start eeprom read by writing EERE<br />EECR |= (1&lt;&lt;EERE);<br />// Return data from data register<br />return EEDR;<br />}<br /><br />// Moves temperature readings to display buffer.<br />void ThermToDisplay(ThermStruct *therm, u08 val_to_display) {<br />u16 buff = 0;<br />buff = therm-&gt;current_temp;<br /><br />switch (val_to_display){<br />case VAL_TO_DISPLAY_THERM:<br />buff = therm-&gt;current_temp;<br />break;<br />case VAL_TO_DISPLAY_SETPOINT:<br />buff = therm-&gt;set_point_temp;<br />break;<br />case VAL_TO_DISPLAY_HYST:<br />buff = therm-&gt;hysteresis;<br />break;<br />default:<br />break;<br />}<br /><br />// Clean Display Buffer<br />g_display_buff&#91;0&#93; = g_display_buff&#91;1&#93; = g_display_buff&#91;2&#93; = g_display_buff&#91;3&#93; = g_display_buff&#91;4&#93; = g_display_buff&#91;5&#93; = 0;<br /><br />if (buff &gt; 999) {<br />// Show an overload OFL (Over F Load)<br /><br />g_display_buff&#91;1&#93; = 14;<br />g_display_buff&#91;2&#93; = 13;<br />} else {<br />// Single digit<br />if (buff &lt; 10) {<br />g_display_buff&#91;2&#93; = buff;<br />g_display_buff&#91;4&#93; = 1; // Decimal point<br />}<br />// Two digits<br />else if (buff &gt;= 10 &amp;&amp; buff &lt;= 99) {<br />g_display_buff&#91;1&#93; = buff / 10;<br />g_display_buff&#91;2&#93; = buff % 10;<br />g_display_buff&#91;4&#93; = 1; // Decimal point<br />}<br />// Three digits<br />else {<br />g_display_buff&#91;0&#93; = buff / 100;<br />buff %= 100;<br />g_display_buff&#91;1&#93; = buff / 10;<br />g_display_buff&#91;2&#93; = buff % 10;<br />g_display_buff&#91;4&#93; = 1; // Decimal point<br />}<br /><br />if (val_to_display == VAL_TO_DISPLAY_THERM &amp;&amp; therm-&gt;current_temp_sign){<br />// If temperature is negative<br />g_display_buff&#91;5&#93; = 1;<br />}<br />}<br />}<br /><br /><br />// Display digits stored in g_display_buff<br />void DisplayUpdate(void) {<br />DISP_OFF();<br />g_disp_number_function_arr&#91; g_display_buff&#91;0&#93; &#93;();<br />if (g_display_buff&#91;3&#93;) DISP_DP_ON();<br />DISP_DIGIT1();<br />_delay_ms(DISP_DELAY);<br /><br />DISP_OFF();<br />g_disp_number_function_arr&#91; g_display_buff&#91;1&#93; &#93;();<br />if (g_display_buff&#91;4&#93;) DISP_DP_ON();<br />DISP_DIGIT2();<br />_delay_ms(DISP_DELAY);<br /><br />DISP_OFF();<br />g_disp_number_function_arr&#91; g_display_buff&#91;2&#93; &#93;();<br />if (g_display_buff&#91;5&#93;) DISP_DP_ON();<br />DISP_DIGIT3();<br />_delay_ms(DISP_DELAY);<br />}<br /><br /><br />// Check buttons state (if any were pressed)<br />void ButtonsChk(void) {<br />u08 buttons_value;<br />static u08 is_button_pressed = FALSE;<br />static u08 buttons_old_state = 0x70;<br />// Read all three buttons state at once<br />// If none is pressed the value will be 0x70<br />buttons_value = PIND &amp; 0x70; // Mask out all other pins<br /><br />// ON BUTTON PRESS<br />if (buttons_value != 0x70 &amp;&amp; !is_button_pressed) {<br />buttons_old_state = buttons_value;<br />is_button_pressed = TRUE;<br />}<br />// ON BUTTON RELEASE<br />else if (buttons_value == 0x70 &amp;&amp; is_button_pressed) {<br />g_disp_mode_timer = 0;<br />is_button_pressed = FALSE;<br />switch (buttons_old_state){<br />case 0x60: // Button one<br />if (g_disp_mode != DISP_MODE_HYST) {<br />if ( g_therm_struct.set_point_temp &gt; 1 &amp;&amp; g_therm_struct.set_point_temp &gt; (g_therm_struct.hysteresis/2) )<br />g_therm_struct.set_point_temp--;<br />g_disp_mode = DISP_MODE_SETPOINT;<br />} else {<br />if ( g_therm_struct.hysteresis &gt; 2 )<br />g_therm_struct.hysteresis--;<br />}<br />break;<br />case 0x50: // Button two<br />if (g_disp_mode != DISP_MODE_HYST) {<br />// 97.5 degrees, because of the max hysteresis/2 == 2.5 degrees<br />if (g_therm_struct.set_point_temp &lt; 975)<br />g_therm_struct.set_point_temp++;<br />g_disp_mode = DISP_MODE_SETPOINT;<br />} else {<br />if ( g_therm_struct.hysteresis &lt; 50 &amp;&amp; g_therm_struct.set_point_temp &gt; ((g_therm_struct.hysteresis/2)+2) )<br />g_therm_struct.hysteresis++;<br />}<br />break;<br />case 0x30: // Button three<br />g_disp_mode = DISP_MODE_HYST;<br />break;<br />case 0x40: // Buttons 1 &amp; 2<br />break;<br />case 0x10: // Buttons 2 &amp; 3<br />break;<br />case 0x20: // Buttons 1 &amp; 3<br />break;<br />default:<br />break;<br />}<br />}<br />}<br /><br />// Returns 0 if the sensor is present, 1 otherwise<br />u08 OneWireReset(void) {<br />u08 status;<br />TSENS_PULL_LOW();<br />_delay_us(485);<br />TSENS_LISTEN();<br />_delay_us(72);<br />status = TSENS_BIT;<br />_delay_us(425);<br />return status;<br />}<br /><br />// Read Bit Function<br />u08 OneWireReadBit(void) {<br />u08 bit;<br />TSENS_PULL_LOW();<br />_delay_us(3);<br />TSENS_LISTEN();<br />_delay_us(15);<br />bit = TSENS_BIT;<br />return bit;<br />}<br /><br />// Write bit Function<br />void OneWireWriteBit(u08 bit) {<br />TSENS_PULL_LOW();<br />_delay_us(2);<br />if (bit == 1) TSENS_LISTEN();<br />_delay_us(105);<br />TSENS_LISTEN();<br />}<br /><br />// Read BYTE Function<br />u08 OneWireReadByte(void) {<br />u08 byte = 0;<br />u08 i;<br />for (i=0;i&lt;8;i++) {<br />if (OneWireReadBit()) byte|=0x01&lt;&lt;i;<br />_delay_us(120);<br />}<br />return byte;<br />}<br /><br />// Write BYTE Function<br />void OneWireWriteByte(u08 byte) {<br />u08 i;<br />u08 temp;<br /><br />for (i=0;i&lt;8;i++) {<br />temp = byte&gt;&gt;i;<br />temp &amp;= 0x01;<br />OneWireWriteBit(temp);<br />}<br />_delay_us(105);<br />}<br /><br />// Process temperature readings from DS18B20<br />// which should be stored in g_temperature, prior<br />// to calling this function<br />void ExtractTherm(u16 sensor_data, ThermStruct *therm) {<br />// This function is designed for working with 12bit<br />// temperature reading from DS18B20 sensor.<br /><br />u16 decimal_part;<br /><br />// If temperature is negative<br />if (sensor_data &amp; 0x8000) {<br />// 1 if negative temperature<br />therm-&gt;current_temp_sign = 1;<br />// Remove sign bits<br />sensor_data &amp;= 0x0FFF;<br />// Two's complement<br />sensor_data = (~sensor_data) + 1;<br />} else {<br />// 0 if positive temperature<br />therm-&gt;current_temp_sign = 0;<br />}<br /><br />// Extract number after decimal point<br />// and multiply it by 0.0625 (625)<br />decimal_part = sensor_data &amp; 0x000F;<br />decimal_part *= 625;<br />decimal_part /= 1000;<br />// Shift to leave whole degree<br />sensor_data &amp;= 0x0FFF;<br />sensor_data &gt;&gt;= 4;<br /><br />// Shift decimal point to the right.<br />// Example: 15.2 degrees will be converted to 152<br />therm-&gt;current_temp = ((u08)sensor_data * 10) + (u08)decimal_part;<br />}<br /><br />// Check if temperature is reached the set point<br />// and control the relay accordingly<br />void SetPointTemperatureCheck(ThermStruct *therm) {<br />static u08 is_relay_on = FALSE;<br /><br />// If current temperature is positive<br />if (!therm-&gt;current_temp_sign) {<br />// If relay is off<br />if (is_relay_on == FALSE) {<br />if (therm-&gt;current_temp &lt;= therm-&gt;set_point_temp - (therm-&gt;hysteresis/2)) {<br />is_relay_on = TRUE;<br />}<br />}<br />// If relay is on<br />else {<br />if (therm-&gt;current_temp &gt;= therm-&gt;set_point_temp + (therm-&gt;hysteresis/2)) {<br />is_relay_on = FALSE;<br />}<br />}<br />}<br />// If the temperature is negative<br />else {<br />is_relay_on = TRUE;<br />}<br /><br /><br />if (is_relay_on == TRUE) {<br />RELAY_ON();<br />LED_ON();<br />}<br />else {<br />RELAY_OFF();<br />LED_OFF();<br />}<br />}<br /><br />void DisplayTherm(void) {<br />static u08 conversion_time_counter = 0;<br /><br />if (conversion_time_counter == 0) {<br /><br />if (!OneWireReset()) {<br /><br />OneWireWriteByte(0xCC);<br /><br />OneWireWriteByte(0x44);<br />conversion_time_counter++;<br />}<br />}<br />else if (conversion_time_counter &gt; 0 &amp;&amp; conversion_time_counter &lt;= 200){<br />conversion_time_counter++;<br />}<br />else if (conversion_time_counter &gt; 200) {<br />// Read Temperature After Conversion is Complete<br />conversion_time_counter = 0;<br />if (!OneWireReset()) {<br />// Skip ROM command<br />OneWireWriteByte(0xCC);<br />// Read Scratchpad command<br />OneWireWriteByte(0xBE);<br />g_temperature.bytes.low  = OneWireReadByte();<br />g_temperature.bytes.high = OneWireReadByte();<br /><br />// Convert DS18B20 data into whole temperature,<br />// decimal part and sign and put it to baTherm<br />ExtractTherm(g_temperature.value, &amp;g_therm_struct);<br />// Move baTherm to display buffer<br />ThermToDisplay(&amp;g_therm_struct, VAL_TO_DISPLAY_THERM);<br />// Main thermostat function<br />SetPointTemperatureCheck(&amp;g_therm_struct);<br />}<br />}<br />}<br /><br />/*****************************************************************************/<br />int main(void)<br />{<br />g_disp_mode_timer = 0;<br /><br />_delay_ms(100);<br />Init();<br /><br />// Check if MCU EEPROM has any previous settings stored or not<br />// 0x88 if settings is there<br />u08 first_time_flag = 0;<br />first_time_flag = EEPROMRead(5);<br />u16convert temperature_buf;<br /><br />// If EEPROM is empty<br />if (first_time_flag != 0x88) {<br />// Setpoint Temperature to 10.0<br />EEPROMWrite(0,0x00);<br />EEPROMWrite(1,0x64);<br />// Hysteresis to 1.0<br />EEPROMWrite(2,0x00);<br />EEPROMWrite(3,0x0A);<br />// Sign to positive<br />EEPROMWrite(4,0x00);<br />// And first_time_flag<br />EEPROMWrite(5,0x88);<br />// Set the initial setpoint params.<br />g_therm_struct.hysteresis = 4; //(0x000A) 1.0 degrees C<br />g_therm_struct.set_point_temp = 10; //(0x0064) 25.0 degrees C<br />g_therm_struct.set_point_temp_sign = 0;<br />}<br />// If some data in EEPROM is present (6th byte == 0x88)<br />else {<br />// Read Set Point Temperature<br />temperature_buf.bytes.high = EEPROMRead(0);<br />temperature_buf.bytes.low  = EEPROMRead(1);<br />g_therm_struct.set_point_temp = temperature_buf.value;<br />// Read Hysteresis value<br />temperature_buf.bytes.high = EEPROMRead(2);<br />temperature_buf.bytes.low  = EEPROMRead(3);<br />g_therm_struct.hysteresis = temperature_buf.value;<br />// Read sign<br />g_therm_struct.set_point_temp_sign = EEPROMRead(4);<br />}<br /><br />//<br />// Main program cycle<br />//<br />    while(1) {<br />DisplayUpdate();<br />ButtonsChk();<br /><br />switch (g_disp_mode){<br />case DISP_MODE_TEMPERATURE:<br />DisplayTherm();<br />break;<br />case DISP_MODE_SETPOINT:<br />ThermToDisplay(&amp;g_therm_struct, VAL_TO_DISPLAY_SETPOINT);<br />break;<br />case DISP_MODE_HYST:<br />ThermToDisplay(&amp;g_therm_struct, VAL_TO_DISPLAY_HYST);<br />break;<br />default:<br />break;<br />}<br /><br />// If no buttons is pressed, wait for some time and switch to Temperature display<br />if (g_disp_mode != DISP_MODE_TEMPERATURE &amp;&amp; g_disp_mode_timer &lt; 350) {<br />g_disp_mode_timer++;<br />}<br />else if (g_disp_mode != DISP_MODE_TEMPERATURE &amp;&amp; g_disp_mode_timer &gt;= 350) {<br />g_disp_mode = DISP_MODE_TEMPERATURE;<br />g_disp_mode_timer = 0;<br /><br />// Write settings to EEPROM<br />temperature_buf.value = g_therm_struct.set_point_temp;<br />EEPROMWrite(0, temperature_buf.bytes.high);<br />EEPROMWrite(1, temperature_buf.bytes.low);<br />temperature_buf.value = g_therm_struct.hysteresis;<br />EEPROMWrite(2, temperature_buf.bytes.high);<br />EEPROMWrite(3, temperature_buf.bytes.low);<br />EEPROMWrite(4, g_therm_struct.set_point_temp_sign);<br />}<br /><br />}<br /><br />return 0;<br />}[/syntax]<br /><br />types.h<br /><br />[syntax=c]/*<br /> * types.h<br /> *<br /> * Created: 10/28/2011 7:01:10 PM<br /> *  Author: Phil Levchenko<br /> * Email: phil at jumperone dot com<br /> *    Site: www.JumperOne.com<br /> * License: Licensed under Creative Commons Attribution-ShareAlike License 3.0<br /> *          http://creativecommons.org/licenses/by-sa/3.0/<br /> *<br /> *    This firmware comes WITHOUT ANY WARRANTIES and may contain MISTAKES,<br /> *    so use it AT YOUR OWN RISK!!!<br /> *<br /> */<br /><br /><br />#ifndef __TYPES_H_<br />#define __TYPES_H_<br /><br /><br />typedef unsigned char  u08;<br />typedef unsigned int   u16;<br />typedef unsigned long  u32;<br /><br />typedef signed char s08;<br />typedef signed int  s16;<br />typedef signed long s32;<br /><br /><br />typedef struct{<br />u08 low;<br />u08 high;<br />} u16bytes;<br /><br />typedef union{<br />u16 value;<br />u16bytes bytes;<br />} u16convert;<br /><br />typedef struct{<br />u08 byte1;<br />u08 byte2;<br />u08 byte3;<br />u08 byte4;<br />} u32bytes;<br /><br />typedef struct{<br />u16 low;<br />u16 high;<br />} u32words;<br /><br />typedef union{<br />u32 value;<br />u32bytes bytes;<br />u32words words;<br />} u32convert;<br /><br /><br />#define NULL 0<br /><br />#define ON  1<br />#define OFF 0<br /><br />#ifndef TRUE<br />#define TRUE 1<br />#endif<br /><br />#ifndef FALSE<br />#define FALSE 0<br />#endif<br /><br /><br />#endif /* __TYPES_H_ */[/syntax]<br /><br />Według programu :<br /><br />// Show an overload OFL (Over F Load)<br /><br />czyli rozumiem że to przeciążenie . Ale skąd one się bierze i jak zostało zmierzone ??<br />Wypiąłem grzałki i nadal to samo... <br /><br />W czym może być problem??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=903">Morcinek92</a> — 26 kwi 2015, o 11:09</p><hr />
]]></content>
</entry>
</feed>