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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-17T23:25:01+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=14001&amp;mode</id>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2016-01-17T23:25:01+01:00</updated>
<published>2016-01-17T23:25:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150909#p150909</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150909#p150909"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150909#p150909"><![CDATA[
Witam<br />Gdzieś już to było.<br />O ile dobrze pamiętam to po ustawieniu wyjścia w stan wysoki zrób zwykły _delay_ms(10);<br />powinno wystarczyć by wyjście się ustawiło zanim ruszy program dalej i przejdzie do głównej pętli.<br /><br />Pozdrawiam<br />Darek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 17 sty 2016, o 23:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-16T17:10:58+01:00</updated>
<published>2016-01-16T17:10:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150774#p150774</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150774#p150774"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150774#p150774"><![CDATA[
posuwam się do przodu z projektem, mam podłączone do wyjść diody sygnalizacyjne w ten sposób, że zapalane są stanem niskim, w momencie resetu urządzenia diody na ułamek sekundy zaświecają się, myślę że dlatego, że zanim na wyjściach pojawi się ustawiony stan wysoki przez chwilę jest tam zero , czy jest jakiś sposób eliminacji tego zjawiska?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 16 sty 2016, o 17:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-13T21:01:29+01:00</updated>
<published>2016-01-13T21:01:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150518#p150518</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150518#p150518"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150518#p150518"><![CDATA[
Dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 13 sty 2016, o 21:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-13T18:44:15+01:00</updated>
<published>2016-01-13T18:44:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150506#p150506</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150506#p150506"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150506#p150506"><![CDATA[
eeprom_write_byte() zapisuje jeden bajt pod wskazany adres. Następny bajt zapisujesz do następnej komórki, czyli dodajesz 1. Ale przy pomocy eeprom_write_byte() nie zapiszesz od razu zmiennej uint16_t za jednym wywołaniem. Aby zapisać zmienną dwubajtową to musisz sam zapisać starszy i młodszy bajt takiej zmiennej albo użyć funkcji nie byte a word (eeprom_write_word()).<br />Jak zapisujesz dwa bajty, a uint16_t, to dwa bajty, to zajmujesz wskazaną komórkę (1) i następną (2). Więc kolejną daną musisz zapisać do kolejnej komórki (3).<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 13 sty 2016, o 18:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-13T14:36:10+01:00</updated>
<published>2016-01-13T14:36:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150457#p150457</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150457#p150457"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150457#p150457"><![CDATA[
sprawdzę, mam tylko pytanie czy zapisując do EEPROM pojedynczo zmienne uint16_t (wg twojej podpowiedzi), muszę zwiększać adres w pamięci EEPROM o 2? tzn pierwsza zmienna pod adres 1 a następna pod 3?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 13 sty 2016, o 14:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-12T21:30:58+01:00</updated>
<published>2016-01-12T21:30:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150381#p150381</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150381#p150381"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150381#p150381"><![CDATA[
A sprawdź na początek samo zapisywanie i czytanie pojedynczych bajtów z eeprom.<br />Nigdy nie wierzyłem w zarządzanie pamięcią eeprom przez kompilator gcc i zawsze sam definiowałem pozycje dla danych w eeprom. Dlatego czytałem i zapisywałem następująco:<br />[syntax=c]#define EEPROM_POSITION_11<br /><br />uint8_t writeValue = 0x55;<br />uint8_t readValue;<br />eeprom_write_byte( (uint8_t *)EEPROM_POSITION_1, writeValue );<br />readValue = eeprom_read_byte ( (uint8_t *)EEPROM_POSITION_1 );[/syntax]<br />Wrzuć to i wyświetl sobie wartości zmiennych writeValue i readValue i zobacz czy są identyczne.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 12 sty 2016, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-12T16:59:39+01:00</updated>
<published>2016-01-12T16:59:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150335#p150335</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150335#p150335"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150335#p150335"><![CDATA[
<div class="quotetitle">zoom napisał(a):</div><div class="quotecontent"><br />tak<br /></div><br /><br />dziękuję<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />Jako, że jestem bliski obłędu, proszę kogoś kto ćwiczył z pamięcią EEPROM o przejżenie kilu poniższych linijek kodu<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;avr/eeprom.h&gt; // bibliotek do obsługi EEPROM<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;;<br /><br />void copy_ram_eep (void);<br />void copy_eep_ram (void);<br /><br /><br /><br />uint16_t t1,t2;<br /><br />typedef struct{<br />uint16_t k1On;<br />uint16_t k1Off;<br />} TCZAS;<br /><br />TCZAS ram_czas;// struktyra typu TCZAS zdefiniowana w RAM<br />TCZAS eep_czas EEMEM = {1,1}; //struktyra typu TCZAS zdefiniowana w EEPROM<br />//TCZAS const pgm_czas PROGMEM = {10,20};<br /><br /><br />int main(void){<br /><br /><br /><br /><br />lcd_init();<br />lcd_str(&quot;start...&quot;);<br />_delay_ms (1500);<br />lcd_cls();<br />lcd_str(&quot;start2...&quot;);<br />_delay_ms (1500);<br />lcd_cls();<br /><br /><br />    copy_eep_ram();<br /><br />    t1 = (ram_czas.k1On);<br />    t2 = (ram_czas.k1Off);<br /><br />    lcd_int(t1);<br />    lcd_locate(1,0);<br />    lcd_int(t2);<br /><br /><br /><br /><br /><br /><br /><br />//sei();//włączenie przerwań zaremowane<br />while(1){<br /><br />}<br /><br />}<br /><br />// funkacja do kopiowania z pamieci RAM do EEPROM<br />void copy_ram_eep (void) {<br />eeprom_write_block(&amp;ram_czas, &amp;eep_czas, sizeof (TCZAS));<br />}<br /><br />// funkcja do kopiowania z EEPROM do RAM<br /><br />void copy_eep_ram (void) {<br />eeprom_read_block(&amp;ram_czas, &amp;eep_czas, sizeof (TCZAS));[/syntax]<br /><br />definjuję struktury w RAM i EEPROM<br />w EEPROM wstawiam dane poczatkowe 1 i 1<br />kopiuję strukturę z EEPROM do RAM<br />wyświetlam zmienne z danymi ze struktury z RAM<br />a mi wyświetla t1= 8196<br />t2=4366<br /><br />może mógłby ktoś załadować ten kod u Siebie i sprawdzić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 12 sty 2016, o 16:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[zoom]]></name></author>
<updated>2016-01-12T12:31:29+01:00</updated>
<published>2016-01-12T12:31:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150320#p150320</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150320#p150320"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150320#p150320"><![CDATA[
tak<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=685">zoom</a> — 12 sty 2016, o 12:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-12T12:28:51+01:00</updated>
<published>2016-01-12T12:28:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150319#p150319</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150319#p150319"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150319#p150319"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?<br /></div><br />Tak. Ta funkcja eeprom_write_byte zapisuje jeden bajt do pamięci EEPROM.<br /><br />-- <br />Pozdrawiam,<br />Robert</div><br /><br />Ale czy potrafi NADPISAĆ (zastąpić) jedne dane drugimi w EEPROM?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 12 sty 2016, o 12:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-11T22:22:18+01:00</updated>
<published>2016-01-11T22:22:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150299#p150299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150299#p150299"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150299#p150299"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?<br /></div><br />Tak. Ta funkcja eeprom_write_byte zapisuje jeden bajt do pamięci EEPROM.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 11 sty 2016, o 22:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-11T19:06:36+01:00</updated>
<published>2016-01-11T19:06:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150281#p150281</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150281#p150281"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150281#p150281"><![CDATA[
Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 11 sty 2016, o 19:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-10T22:05:10+01:00</updated>
<published>2016-01-10T22:05:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150213#p150213</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150213#p150213"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150213#p150213"><![CDATA[
w funkcji int main(void) wpisałem:[syntax=c]copy_eem_ram(); // przepisanie czasów z EEPROM do RAM[/syntax]<br />w pętli po ustawieniu flagi wpisałem:[syntax=c]if (flaga_zap_eeprom){<br />TCZAS ram_czasy={<br />61,//godzinyK1ON*60+minutyK1ON,<br />11,//godzinyK1OFF*60+minutyK1OFF,<br />12,//godzinyK2ON*60+minutyK2ON,<br />13,//godzinyK2OFF*60+minutyK2OFF,<br />14,//godzinyK3ON*60+minutyK3ON,<br />15//godzinyK3OFF*60+minutyK3OFF,<br />   };<br /><br />copy_ram_eem();<br /><br />    flaga_zap_eeprom=0;<br /><br />   godzinyK1ON=(ram_czasy.k1_on/60);<br />   minutyK1ON=(ram_czasy.k1_on%60);<br />};[/syntax]<br /><br />czyli po uruchomieniu urządzenie powinienem mieć zapis z EEPROM do RAM, po ustwieniu flag_zap_eprom, powinno mi zapisać strukturę z RAM do EEPROM, ale nie zapisuje, ponieważ po wyłaczeniu zasilania otrzymuję jaieś dziwne dane, zamiast:<br />61/60 1 godzina<br />61%60 1 minuta czyli 01:01<br /><br />to mi wyświetla 136:36<br /><br />nie mogę sobie z tym poradzić, czy ktoś mi doradzi co robię nie tak? w bascomie już by było po sprawie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 10 sty 2016, o 22:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-10T17:59:31+01:00</updated>
<published>2016-01-10T17:59:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150180#p150180</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150180#p150180"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150180#p150180"><![CDATA[
kod zapisu zmiennych do struktury działa jak go umieszczę w int main (void)<br />[syntax=c]TCZAS ram_czasy={<br />10,//godzinyK1ON*60+minutyK1ON,<br />11,//godzinyK1OFF*60+minutyK1OFF,<br />12,//godzinyK2ON*60+minutyK2ON,<br />13,//godzinyK2OFF*60+minutyK2OFF,<br />14,//godzinyK3ON*60+minutyK3ON,<br />15,//godzinyK3OFF*60+minutyK3OFF,<br />};[/syntax]<br /><br />jeżeli umieszczę go gdzie kolwiek indziej czy to w jakiejś funkcji czy w petki głównej, nie działa i wyświetla <br />wykrzyknik z opisem TCZAS ram_czasy tutaj mam ostrzeżenie przy kompilacji &quot;unsued variable'ram_czasy'[Wunsued-variable]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 10 sty 2016, o 17:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-09T13:13:16+01:00</updated>
<published>2016-01-09T13:13:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150039#p150039</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150039#p150039"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=150039#p150039"><![CDATA[
Poradniki sporo wyjaśniły, ale coś nie mogę przepisać danych z RAM do EEPROM, mam poniższe struktury<br /><br />[syntax=c]typedef struct {<br />uint16_t k1_on; // czas włączenia kanał 1 w formacie godziny*60 plus minuty<br />uint16_t k1_off; // czas wyłączenia kanał 1 w formacie godziny*60 plus minuty<br />uint16_t k2_on;<br />uint16_t k2_off;<br />uint16_t k3_on;<br />uint16_t k3_ohh;<br />} TCZAS; // typ zmiennej strukturalnej, to nie jest definicja w żadnej pamięci<br /><br />TCZAS ram_czasy; // zmienna ram_czasy typu TCZAS utworzona w pamięci RAM<br />TCZAS eem_czasy EEMEM; // zmienna eem_czasy typu TCZAS utworzona w pamięci EEPROM<br />TCZAS const pgm_czasy PROGMEM={0,0,0,0,0,0}; // zmienna ram_czasy typu TCZAS utworzona w pamięci FLASH<br />                                       // musi byc zainicjowana wartosciami[/syntax]<br /><br /><br />Chcę załadować czasy do zmiennej strukturalnej w RAM <br />[syntax=c]//przypisanie czasów z kanałów do struktury RAM<br /><br />   TCZAS ram_czasy={<br />   godzinyK1ON*60+minutyK1ON,<br />godzinyK1OFF*60+minutyK1OFF,<br />godzinyK2ON*60+minutyK2ON,<br />godzinyK2OFF*60+minutyK2OFF,<br />godzinyK3ON*60+minutyK3ON,<br />godzinyK3OFF*60+minutyK3OFF,<br />   };<br />   copy_ram_eem();//Zapisanie czasów z RAM do EEPROM[/syntax]<br /><br />Funkcja <br />[syntax=c]//funkcja do kopiowania bloku (struktury) z RAM do EEPROM<br />void copy_ram_eem (void){<br />eeprom_write_block (&amp;ram_czasy, &amp;eem_czasy, sizeof (ram_czasy));<br />}[/syntax]<br /><br />ale nie zapisuje<br /><br />TCZAS ram_czasy tutaj mam ostrzeżenie przy kompilacji &quot;unsued variable'ram_czasy'[Wunsued-variable]<br /><br /><br />jeżeli<br /> [syntax=c]TCZAS ram_czasy={<br />   godzinyK1ON*60+minutyK1ON,<br />godzinyK1OFF*60+minutyK1OFF,<br />godzinyK2ON*60+minutyK2ON,<br />godzinyK2OFF*60+minutyK2OFF,<br />godzinyK3ON*60+minutyK3ON,<br />godzinyK3OFF*60+minutyK3OFF,<br />   };<br />   copy_ram_eem();//Zapisanie czasów z RAM do EEPROM[/syntax][/syntax]<br /><br />umieszczę w sekcji int main(void){, wówczas zapisuje do EEPROM <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 53 minutyach ]</span></strong><br /><br />w załączniku pełny kod<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;// biblioteka do obsługi pamieci FLASH<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;// bibliotka do obslugi EEPROM<br /><br /><br /><br />#include &quot;LCD/lcd44780.h&quot;     // biblioteka do obsługi LCD<br />#include &quot;I2C_TWI/i2c_twi.h&quot; // bibliotek do obslugi PCF8583<br />#include &quot;funkcje.h&quot;        // dołączenie pliku z funkcjami<br /><br />#define PCF8583_ADDR 0xA2// gdy A1 --&gt; VCC<br />// definicja pinów sterujących wyjściami<br />#define LED1 (1&lt;&lt;PC6)// definicje pinów<br />#define LED2 (1&lt;&lt;PC7)<br />#define LED3 (1&lt;&lt;PC5)<br />//#define LED1_ON PORTC &amp;= ~LED1<br />//#define LED1_OFF PORTC |= LED1<br />//#define LED2_ON PORTC &amp;= ~LED2<br />//#define LED2_OFF PORTC |= LED2<br /><br />// #define LED3_OFF PORTC |= LED3<br />#define LED3_TOG PORTC ^= LED3 // definicja diody migajacej<br /><br />#define KL1 (1&lt;&lt;PB0)// definicje klawiszy do Super Debunce wejście do menu<br />#define KL2 (1&lt;&lt;PB1)// definicja klawisza do Superdebunce zwiększenie godzin<br />#define KL3 (1&lt;&lt;PB2)// definicja klawisza do SuperDebunce zwiekszenie minut<br /><br /><br />uint8_t k1,k2,k3; // zmienne pomocnicze do obsługi Superdebunce<br /><br />//#define NULL 0<br />#define DEFAULT 0<br /><br /><br /><br />// definicja pinów przełaczników<br /> // definicje klawiszy do obsługi funkcji klawisza pojedeycze wcisniecie<br />#define KEY2 (1&lt;&lt;PD1)<br />#define KEY3 (1&lt;&lt;PD2)<br />#define KEY4 (1&lt;&lt;PD3)<br /><br /><br /><br /><br /><br /><br />uint8_t init;<br /><br /><br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />//typedef unsigned char  u08;<br />//typedef unsigned short u16;<br /><br /><br />uint8_t dec2bcd(uint8_t dec); // deklaracja  konwersja liczby dziesiętnej na BCD<br /><br />uint8_t bcd2dec(uint8_t bcd); // deklaracja konwersja liczby BCD na dziesiętną<br /><br /><br />void przycisk (void);<br />void licznik_na_lcd(void);<br />void licznik1_na_lcd(void);<br />void inicjalizuj_lcd (void);<br />void menu (void);<br />void zw_godzina (void); //funkcja do zwieksznia godziny przy ustawianiu czasu w menu<br />void zw_minuty (void); // funkcja do zwiekszania minut przy ustawianiu czasu<br />void zw_godzinaK1ON (void); // funkcja do zwiekszania godzin ON pierwszy kanał<br />void zw_minutyK1ON (void); //funkacja do zwiekszania minut ON pierwszy kanał<br /><br />void copy_ram_eem (void);<br />void copy_eem_ram (void);<br /><br /><br /><br /><br />void led1_xor(void) {<br />PORTC ^= LED1;<br />}<br /><br />void led2_xor(void) {<br />PORTC ^= LED2;<br />}<br /><br />uint8_t key_lock; // zmienne pomocnicze do funkcji klawisz pojedeyncze klikniecie<br />uint8_t key_lock1, key_lock2;<br /><br /><br /><br /><br />enum {ss=1, mm, hh};<br />//typ wyliczeniowy<br /><br />uint8_t bufor&#91;4&#93;;// rezerwacja bufora 4 bajty<br />uint8_t sekundy, minuty, godziny;<br />uint8_t  minuty_z,godziny_z;<br />uint8_t minutyK1ON, godzinyK1ON,minutyK1OFF,godzinyK1OFF;<br />uint8_t minutyK2ON, godzinyK2ON,minutyK2OFF,godzinyK2OFF;<br />uint8_t minutyK3ON, godzinyK3ON,minutyK3OFF,godzinyK3OFF;<br /><br /><br /> typedef struct {<br />uint16_t k1_on; // czas włączenia kanał 1 w formacie godziny*60 plus minuty<br />uint16_t k1_off; // czas wyłączenia kanał 1 w formacie godziny*60 plus minuty<br />uint16_t k2_on;<br />uint16_t k2_off;<br />uint16_t k3_on;<br />uint16_t k3_ohh;<br />} TCZAS; // typ zmiennej strukturalnej, to nie jest definicja w żadnej pamięci<br /><br />TCZAS ram_czasy; // zmienna ram_czasy typu TCZAS utworzona w pamięci RAM<br />TCZAS eem_czasy EEMEM; // zmienna eem_czasy typu TCZAS utworzona w pamięci EEPROM<br />TCZAS const pgm_czasy PROGMEM={0,0,0,0,0,0}; // zmienna ram_czasy typu TCZAS utworzona w pamięci FLASH<br />                                       // musi byc zainicjowana wartosciami<br /><br /><br /><br /><br /><br /><br /><br />int main(void){<br /><br />/*TCZAS ram_czasy={<br />10,//godzinyK1ON*60+minutyK1ON,<br />10,//godzinyK1OFF*60+minutyK1OFF,<br />10,//godzinyK2ON*60+minutyK2ON,<br />10,//godzinyK2OFF*60+minutyK2OFF,<br />10,//godzinyK3ON*60+minutyK3ON,<br />10,//godzinyK3OFF*60+minutyK3OFF,<br />};*/<br />//copy_ram_eem();//Zapisanie czasów z RAM do EEPROM<br /><br /><br /><br /><br /> DDRC |= LED1|LED2|LED3; // ustawienie PIN-ów jako wyjścia<br /><br />PORTB |= KL1|KL2|KL3; // podciaganie wejśc do 1, DDRB nie trzeba ustawiac na 0 ponieważ domyslnie<br />                      //jest wejściem<br />    PORTD |= KEY2|KEY3|KEY4;  // podciągamy linie klawiszy do VCC<br /><br /><br />timer2_init(); // odwolanie do funkcji ustawienia, inicjalizacja Timera2<br /><br />lcd_init();    // odwolanie do funkcji ustawienia inicjalizacja lcd<br /><br /><br />i2cSetBitrate( 100 ); // USTAWIAMY prędkość 100 kHz na magistrali I2C<br />sei(); // odblokowanie globalnych przerwań<br /><br />_delay_ms(10); // opóxnienie dla podciągnięcia pinów<br /><br /><br />copy_eem_ram(); // przepisanie czasów z EEPROM do RAM<br />godzinyK1ON=(ram_czasy.k1_on);// przypisanie do zmiennej godzinyK1ON danych ze struktury ram_czasy z pola k1_on<br />//minutyK1ON=(ram_czasy.k1_on % 60);<br /><br />/*--------------------------------- pętla główna programu------------------------------------*/<br />while(1){<br /><br />SuperDebounce(&amp;k1, &amp;PINB, KL1, 200, 500, menu, 0 ); // wejście do menu nastaw<br /><br /><br /><br />TWI_read_buf( PCF8583_ADDR, 0x01, 4, bufor );  // odczytanie czasu z PCF<br /><br />sekundy = bcd2dec( bufor&#91;ss&#93; );<br />minuty = bcd2dec( bufor&#91;mm&#93;);<br />godziny = bcd2dec( bufor&#91;hh&#93; );<br /><br />// wyświetlenie czasu na LCD<br />lcd_locate(1,0);<br />if( godziny &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(godziny);<br />lcd_str(&quot;:&quot;);<br />if( minuty &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(minuty);<br />lcd_str(&quot;:&quot;);<br />if( sekundy &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(sekundy);<br />lcd_locate(0,0);<br />lcd_str(&quot;STEROWNIK&quot;);<br /><br /><br />//if( !Timer2 ) {<br />//Timer2=100;<br />//PORTC^=LED3;<br />//}<br /><br /><br />}<br />}<br /><br />/* ----------------------------- definicje funkcji--------------------------------*/<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec) {<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br /><br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd) {<br />    return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}<br /><br /><br /><br /><br />// obsługa przycisku z pojedynczym wciśnieciem<br />void przycisk(void) {<br /><br /> if( !key_lock &amp;&amp; !(PIND &amp; KEY3 ) ) {<br />key_lock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  PORTD ^= LED3;<br /><br />  } else if( key_lock &amp;&amp; (PIND &amp; KEY3 ) ) key_lock=0;<br /><br />}<br /><br /><br /><br /><br /><br /><br /><br />void licznik_na_lcd(void) {<br />static uint8_t licznik;<br />if(init) {<br />lcd_locate(1,0);<br />lcd_str(&quot;licznik: &quot;);<br /><br />lcd_int(licznik);<br />licznik++;<br />if (licznik==24) licznik=0;<br />lcd_str(&quot;  &quot;);<br />}<br />}<br /><br />// funkcja do podświetlania wyświetlacza LCD<br />void inicjalizuj_lcd (void) {<br />if(!init) {<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7);<br />lcd_init();<br />lcd_str(&quot;Start...&quot;);<br />init=1;<br />}<br />}<br /><br />void licznik1_na_lcd(void) {<br />static uint8_t licznik;<br /><br />lcd_locate(1,0);<br />lcd_str(&quot;licznik: &quot;);<br /><br />lcd_int(licznik);<br />licznik++;<br />if (licznik==24) licznik=0;<br />lcd_str(&quot;  &quot;);<br /><br />}<br /><br /><br />/*---------------------Funkcja obsługi Menu ------------------------*/<br /><br />void menu (void){<br />//copy_eem_ram();<br />//godzinyK1ON=(ram_czasy.k1_on);<br /><br />uint8_t x;<br /><br />enum {czas=1,on_1,off_1,on_2,off_2,on_3,off_3 };<br /><br />x=0;<br />lcd_cls();<br />lcd_locate (0,0);<br />lcd_str(&quot;Ustawienia&quot;);<br />lcd_locate(1,1);<br />lcd_str(&quot;Zegar i ON OFF&quot;);<br /><br />   do {<br /><br /> if( !key_lock &amp;&amp; !(PIND &amp; KEY4 ) ) {<br /> key_lock=100;<br />  x++;<br />  lcd_cls();<br />          } else if( key_lock &amp;&amp; (PIND &amp; KEY4 ) ) key_lock=0;<br /><br /> switch(x){<br /><br /><br /> case czas:<br /> lcd_locate(0,0);<br /> lcd_str(&quot;Ustawienie czasu&quot;);<br /> lcd_locate(1,0);<br /> if( godziny &lt; 10 ) lcd_str(&quot;0&quot;);<br /> lcd_int(godziny);<br /> lcd_str(&quot;:&quot;);<br /> if( minuty &lt; 10 ) lcd_str(&quot;0&quot;);<br /> lcd_int(minuty);<br /><br /> SuperDebounce(&amp;k2, &amp;PINB, KL2, 200, 500, zw_godzina, zw_godzina );<br /> SuperDebounce(&amp;k3, &amp;PINB, KL3, 100, 500, zw_minuty, zw_minuty );<br /><br />  break;<br /> case on_1:<br /><br /> lcd_locate(0,0);<br /> lcd_str(&quot;Czas K1 ON 1&quot;);<br /> lcd_locate(1,0);<br /> lcd_locate(1,0);<br /> if( godzinyK1ON &lt; 10 ) lcd_str(&quot;0&quot;);<br /> lcd_int(godzinyK1ON);<br /> lcd_str(&quot;:&quot;);<br /> if( minutyK1ON &lt; 10 ) lcd_str(&quot;0&quot;);<br /> lcd_int(minutyK1ON);<br /> SuperDebounce(&amp;k2, &amp;PINB, KL2, 200, 500, zw_godzinaK1ON, zw_godzinaK1ON );<br /> SuperDebounce(&amp;k3, &amp;PINB, KL3, 100, 500, zw_minutyK1ON, zw_minutyK1ON );<br /><br />  break;<br /> case off_1:<br /> lcd_locate(0,0);<br /><br /> lcd_int(x);<br />  //_delay_ms(60);<br />  //lcd_cls();<br />  break;<br /> case 4:<br /> lcd_int(x);<br />  _delay_ms(60);<br />  lcd_cls();<br />  break;<br /> case 5:<br /> lcd_int(x);<br />    _delay_ms(60);<br /> lcd_cls();<br />  break;<br />  case 6:<br />  lcd_int(x);<br />  _delay_ms(60);<br />  lcd_cls();<br />  break;<br />  case 7:<br />  lcd_int(x);<br />   _delay_ms(60);<br />   lcd_cls();<br />   break;<br /><br /><br /> }<br /><br /><br /> }<br />  while (x&lt;8);<br /><br /><br />   //przypisanie czasów z kanałów do struktury RAM<br /><br />   TCZAS ram_czasy = {<br />         10,//godzinyK1ON*60+minutyK1ON,<br />      10,//godzinyK1OFF*60+minutyK1OFF,<br />      10,//godzinyK2ON*60+minutyK2ON,<br />      10,//godzinyK2OFF*60+minutyK2OFF,<br />      10,//godzinyK3ON*60+minutyK3ON,<br />      10,//godzinyK3OFF*60+minutyK3OFF,<br />         };<br />   copy_ram_eem();//Zapisanie czasów z RAM do EEPROM<br /><br /><br />   bufor&#91;0&#93; = 0;// setne części sekundy<br />   //bufor&#91;1&#93; = dec2bcd(0);// sekundy<br />   bufor&#91;2&#93; = dec2bcd(minuty);// minuty<br />   bufor&#91;3&#93; = dec2bcd(godziny);// godziny<br />   // zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />   TWI_write_buf( PCF8583_ADDR, 0x01, 4, bufor );<br /><br />   copy_ram_eem();//Zapisanie czasów z RAM do EEPROM<br /><br /><br /><br /><br /><br /><br /><br /><br />}<br /><br /><br />//funkcja do kopiowania bloku (struktury) z EEPROM do RAM<br /><br />void copy_eem_ram (void){<br />eeprom_read_block (&amp;ram_czasy, &amp;eem_czasy, sizeof (ram_czasy));<br />}<br /><br /><br />//funkcja do kopiowania bloku (struktury) z RAM do EEPROM<br />void copy_ram_eem (void){<br />eeprom_write_block (&amp;ram_czasy, &amp;eem_czasy, sizeof (ram_czasy));<br />}<br /><br />//Funkcje do ustawiania czasu godzin i minut<br />void zw_godzina (void){<br /> godziny++;<br /> if (godziny&gt;23) godziny=0;<br />}<br /><br />void zw_minuty (void){<br />  minuty++;<br />  if (minuty&gt;59) {<br />  minuty=0;<br />  //godziny++; wowczas przekroczenie 60 minut zwieksza rownierz godziny<br />  }<br />}<br /><br />void zw_godzinaK1ON (void){<br /> godzinyK1ON++;<br /> if (godzinyK1ON&gt;23) godzinyK1ON=0;<br /><br />}<br /><br />void zw_minutyK1ON (void){<br />minutyK1ON++;<br />if (minutyK1ON&gt;59) minutyK1ON=0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 9 sty 2016, o 13:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-03T21:51:25+01:00</updated>
<published>2016-01-03T21:51:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149598#p149598</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149598#p149598"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149598#p149598"><![CDATA[
Jak nie zamierzasz nigdy modyfikować, to możesz we flash. Ale takie parametry, to raczej będziesz potrzebował modyfikować. Więc zostaje eeprom.<br />Jak korzystać z eeprom, to masz dokładnie opowiedziane przez Mirka <a href="http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html"  class="postlink">http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html</a>.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 3 sty 2016, o 21:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2016-01-03T19:58:57+01:00</updated>
<published>2016-01-03T19:58:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149581#p149581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149581#p149581"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149581#p149581"><![CDATA[
Dzięki Robert, pomogło. Mam jeszcze pytanie gdzie najlepiej przechowywać godziny załączania i wyłączania, w pamięci flash czy eprom, chodzi aby nie gineły podczas braku zasilania, jaki są polecenia do zapisu i odczytu z tych pamięci?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 3 sty 2016, o 19:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-01T03:14:39+01:00</updated>
<published>2016-01-01T03:14:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149318#p149318</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149318#p149318"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149318#p149318"><![CDATA[
W przykładzie masz pętle wykonywaną dopóki x &lt; 5. Ostatni case jest dla 3. Dlatego jak zmienisz x z 3 na 4 to zostaje Ci na wyświetlaczu wartość z case 3, bo dla 4 nie wchodzisz do żadnego case i nie czyścisz ekranu.<br />Teoretycznie powinieneś w przypadkach cyklicznego czyszczenia i wyświetlania wartości widzieć miganie cyfry. Lecz operacja czyszczenia jest dość długa w porównaniu z innymi operacjami w pętli i pewnie wyświetlana informacja jest bardzo słabo lub całkowicie nie widoczna.<br /><br />Najprostszym rozwiązaniem jest przeniesienie całego switch-a do warunku sprawdzającego naciśnięcie klawisza i umieszczenie od razu po operacji x=x+1; Wtedy gdy zwiększasz x, to od razu wyświetlasz odpowiednie dane na ekranie. I będziesz robił to tylko raz dla danego x.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 1 sty 2016, o 03:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2015-12-31T20:29:32+01:00</updated>
<published>2015-12-31T20:29:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149307#p149307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149307#p149307"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149307#p149307"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />W pętli do {} jak masz wartość pasującą do danego case to czyścisz wyświetlasz i wypisujesz wartość x i tak w kółko. Więc nic nie widzisz, bo czas między kolejnymi wejściami do case i wyczyszczeniem lcd jest bardzo krótki.<br />Dodaj warunek sprawdzający czy zmieniła się wartość x i dopiero wtedy wchodź do wyświetleń w switch.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /></div><br /><br />OK to dlaczego przy ostatnim warunku case ładnie wyświetla, wszystko jedno czy ostatnim będzie 2, czy 3 czy 4 ?<br />A jednak masz rację jak dolożę _delay_ms pomiędzy lcd_int a lcd_cls to wszystko jest OK. Jak dodać warynek sprawdzający czy zmienił się x?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 31 gru 2015, o 20:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-31T20:25:24+01:00</updated>
<published>2015-12-31T20:25:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149306#p149306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149306#p149306"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149306#p149306"><![CDATA[
W pętli do {} jak masz wartość pasującą do danego case to czyścisz wyświetlasz i wypisujesz wartość x i tak w kółko. Więc nic nie widzisz, bo czas między kolejnymi wejściami do case i wyczyszczeniem lcd jest bardzo krótki.<br />Dodaj warunek sprawdzający czy zmieniła się wartość x i dopiero wtedy wchodź do wyświetleń w switch.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 31 gru 2015, o 20:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sz4t4n]]></name></author>
<updated>2015-12-31T20:19:42+01:00</updated>
<published>2015-12-31T20:19:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149305#p149305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149305#p149305"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149305#p149305"><![CDATA[
Czy po lcd_cls() nie trzeba ustawiać kursora  lcd_locate(1,1) ? Nie pamiętam już dokładnie ale może spróbuj ustawić kursor po czyszczeniu ekranu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=377">sz4t4n</a> — 31 gru 2015, o 20:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2015-12-31T20:27:04+01:00</updated>
<published>2015-12-31T20:01:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149304#p149304</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149304#p149304"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149304#p149304"><![CDATA[
Jestem na etapie budowania MENU, napisałem taki kod tak dla sprawdzenia i mam taki problem,funkcja menu rozpoczyna się od tego, że x=0 a więc na ekranie wyświetla się napis MENU i wartość X - 0, następnie po wciśnięciu klawisza KEY3 x zwiększa się o 1 czyli wynosi 1 na wyświetlaczu powinna się wyświetlić 1 po następnym wciśnięciu 2 niestety na wyświetlaczu nic się nie pojawia dopiero kiedy x=3 wyświetla się 3, zawsze wyświetla się x z ostatniego case, jeżeli usunę z case 2 instrukcję lcd_cls() wówczas na wyświetlaczu ma same dwójki więc switch działa,  a więc to chyba coś z obsługą wyświetlacza jest nie tak <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> , wydaje mi się że funkcja lcd_cls() coś nie tak dziala.  <br /><br />[syntax=c]void menu (void){<br />uint8_t x;<br />x=0;<br />lcd_cls();<br />lcd_locate (0,0);<br />    lcd_str(&quot;MENU&quot;);<br />    lcd_locate(1,1);<br />    lcd_int(x);<br /><br /><br />   do {<br /><br /><br /> if( !key_lock &amp;&amp; !(PIND &amp; KEY3 ) ) {<br /> key_lock=1;<br /><br />  x=x+1;<br />          } else if( key_lock &amp;&amp; (PIND &amp; KEY3 ) ) key_lock=0;<br /><br /> switch(x){<br /><br /> case 1:<br /> lcd_cls();<br /> lcd_int(x);<br /> break;<br /> case 2:<br /> lcd_cls();<br /> lcd_int(x);<br /> break;<br /> case 3:<br />  lcd_cls();<br />  lcd_int(x);<br />  break;<br /><br /> }<br /><br /> } while (x&lt;5);<br /><br /><br />}[/syntax]<br /><br /><br />Oczywiście wiem ,że jest SYLWESTER, ale ja siedzę w domu i nadrabiam naukę C dla AVR .<br /><br />WSZYSTKIEGO NAJLEPSZEGO W NOWYM 2016 ROKU.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 31 gru 2015, o 20:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2015-12-29T20:27:42+01:00</updated>
<published>2015-12-29T20:27:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149104#p149104</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149104#p149104"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=149104#p149104"><![CDATA[
Obejrzałem poradniki, jest łatwiej, chciałem sobie zrobić obsługę klawiszy za pomocą funkcji z poradnika Pana Mirka.[syntax=c]if( !key_lock &amp;&amp; !(PINC &amp; KEY1 ) ) {<br />   key_lock=1;<br /> <br />   // reakcja na PRESS (wcinięcie przycisku)<br />   PORTC ^= LED;<br /> <br />  } else if( key_lock &amp;&amp; (PINC &amp; KEY1 ) ) key_lock=0;<br /> <br /> }[/syntax]<br /><br />z tym, że pomyślałem, że zrobię sobie funkcję z parametrami, tzn, że do funkcji będę sobie wstawiał klawisz i dla próby LED który mam włączać i zrobiłem coś takiego:[syntax=c]void przycisk1 (uint8_t KEY, uint8_t LED){<br /><br />//key_lock=0;<br />if( !key_lock &amp;&amp; !(PIND &amp; KEY ) ) {<br />   key_lock=100;<br /><br />   // reakcja na PRESS (wcinięcie przycisku)<br />   PORTD ^= LED;<br /><br />  } else if( key_lock &amp;&amp; (PIND &amp; KEY ) ) key_lock=0;<br /><br /><br />}[/syntax]<br />i działa, ale tylko gdy mam użytą funkcję raz z jednym klawiszem, gdy użyję ją w programie np dwa razy z dwoma różnymi klawiszami to niestety ale nie działa należycie raz diodę zapala raz nie, coś mi się wydaje, że to ma związek ze zmienną key_lock, ale nie jestem pewien.<br /><br />Sprawdziłem jak do obsługi jednego przycisku dam np key_lock a do drugiego dam np key_lock_1 wówczas działa, ale jak bym chciał [syntax=c]void przycisk1 (uint8_t KEY, uint8_t LED, uint8_t key_lock)[/syntax] key_lock wstawić jako argument to już nie dziala.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 29 gru 2015, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-27T22:40:02+01:00</updated>
<published>2015-12-27T22:40:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148985#p148985</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148985#p148985"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148985#p148985"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />obsługa zewnętrznego zegara w Bascomie jest prosta w C trochę trudniej to wygląda.<br /></div>Wystarczy obejrzeć Mirkowe poradniki o RTC i będzie znacznie łatwiej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><a href="http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html"  class="postlink">http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html</a><br /><a href="http://mirekk36.blogspot.com/2015/05/rtc-synchronizacja-czasu-wieczny.html"  class="postlink">http://mirekk36.blogspot.com/2015/05/rtc-synchronizacja-czasu-wieczny.html</a><br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 27 gru 2015, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Hannibal9]]></name></author>
<updated>2015-12-27T18:06:41+01:00</updated>
<published>2015-12-27T18:06:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148972#p148972</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148972#p148972"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148972#p148972"><![CDATA[
Dziękuję, będę walczył. Zaczynam dopiero z C, obsługa zewnętrznego zegara w Bascomie jest prosta w C trochę trudniej to wygląda.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7324">Hannibal9</a> — 27 gru 2015, o 18:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-12-27T14:40:40+01:00</updated>
<published>2015-12-27T14:40:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148955#p148955</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148955#p148955"/>
<title type="html"><![CDATA[Re: Włącznik czasowy,]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14001&amp;p=148955#p148955"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />czy można godzinę i minuty przedstawić w postaci jednej liczby np pomnożyć godziny razy 60 i dodać minut<br /></div><br />Pomysł dobry równie jak wiele innych. To co chcesz zrobić, to po prostu nazywa się liczba minut od początku dnia (północy).<br />Jak to mówi Mirek, program można napisać na 101 sposobów i każdy może być równie dobry.<br />Dzięki takiemu podejściu przy porównaniach operujesz na jednej wartości 16 bitowej a nie na dwóch niezależnych 8 bitowowych (godzina i minuta). I może być ciutkę łatwiejsze w oprogramowaniu.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Dodatkowo dzięki takiemu podejściu bez dużych zmian możesz zaimplementować dodatkowe dodanie dnia tygodnia lub dnia miesiąca (dzień mnożysz przez 24*60), bo nadal mieścisz się tej samej liczbie 16-bitowej <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=3427">rskup</a> — 27 gru 2015, o 14:40</p><hr />
]]></content>
</entry>
</feed>