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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-27T20:49:18+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11386&amp;mode</id>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-27T20:49:18+01:00</updated>
<published>2015-04-27T20:49:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127640#p127640</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127640#p127640"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127640#p127640"><![CDATA[
Dziękuję za wskazówki. Posiedzę nad tematem alarmów przez kilka dni i mam nadzieję przedstawię jakiś kod do oceny. Bez pomocy Kolegi myślę, że się pewnie nie obejdzie <br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 27 kwi 2015, o 20:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-27T19:23:16+01:00</updated>
<published>2015-04-27T19:23:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127628#p127628</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127628#p127628"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127628#p127628"><![CDATA[
Programowy alarm będzie łatwiej ogarnąć i będzie więcej możliwości chociaż sam układ ma też ciekawe możliwości. Jeśli układ miałby pracować tylko z baterii, gdzie procesor byłby wyłączony przez większość czasu to wtedy alarm układu RTC będzie wskazany w innym przypadku lepiej niech się procesor pomęczy. Alarm codzienny to tylko porównanie minut i godzin z minutami i godzinami alarmu. Jak są równe to ustawienie flagi. W pętli while timer programowy może na podstawie tej flagi sterować buzzerem, a wciśnięcie dowolnego przycisku powinno ją zerować i następnego dnia warunek ustawi ją z powrotem. Przydałby się też wyłączyć alarm / wyzerować flagę automatycznie po przykładowo 5 minutach alarmu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 27 kwi 2015, o 19:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-27T17:05:08+01:00</updated>
<published>2015-04-27T16:57:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127604#p127604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127604#p127604"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127604#p127604"><![CDATA[
Witam!<br />Dzięki. Kompilator zgłasza błąd:<br />../08_TWI_PCF8583_obsluga_daty_nazwy_dni_tygodnia_settings_3.c:554:6: error: conflicting types for 'zapisz_czas'<br /><br />P.S. Zadeklarowałem funkcję (nową postać), błędu nie ma.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br />W tym samym momencie tako zrobiłem. Spróbuję coś zapisać do PCF-a.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 50 minutach ]</span></strong><br /><br />Przetestowałem od razu na lutym 2016 (29 dni)! Działa znakomicie. Jeszcze raz serdecznie dziękuję za przeprowadzenie mnie przez tajniki programowania zegara w C. Apetyt rośnie wraz z każdą nową umiejętnością. Teraz jeszcze myślę o alarmie do tego zegara, ale jak czytałem temat jest trudny i słabo opisany. Poleca się raczej tworzenie alarmów w avr, a nie korzystanie z tego wbudowanego w PCF-a. Czy Twoje zdanie jest podobne?<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 27 kwi 2015, o 16:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-27T16:41:15+01:00</updated>
<published>2015-04-27T16:41:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127600#p127600</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127600#p127600"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127600#p127600"><![CDATA[
<div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Nie wiem jak przekazać nowo ustawione parametry do funkcji.<br /></div><br />Najpierw funkcja musi mieć odpowiednią postać tzn. w nawiasach wypisuje się zmienne tej funkcji, które zostaną zmienione z zewnątrz podczas wywołania. To są tzw. argumenty formalne, które funkcja zna i jak widać poniżej wykonuje na nich operacje. Oprócz tego funkcja ma swoje zmienne lokalne np. bufor czy rok_kopia itd.<br />[syntax=c]void zapisz_czas(<br />uint8_t dzien_write,<br />uint8_t miesiac_write,<br />uint8_t dzien_tygodnia_write,<br />uint8_t godzina_write,<br />uint8_t minuta_write,<br />uint8_t sekunda_write,<br />uint16_t rok_write<br />)<br />{<br /><br />uint8_t bufor&#91;5&#93;;<br /><br />uint8_t rok_kopia;<br />uint16_t  pelny_rok;<br /><br />pelny_rok = rok_write;<br />rok_kopia = rok_write % 4; //reszta z dzielenia przez 4<br /><br />godzina_write = dec2bcd(godzina_write);<br />minuta_write = dec2bcd(minuta_write);<br />sekunda_write = dec2bcd(sekunda_write);<br /><br />rok_write = (rok_write % 4);<br />rok_write = dec2bcd(rok_write);<br />rok_write = (rok_write &lt;&lt; 6);<br /><br />dzien_write = dec2bcd(dzien_write);<br />dzien_write = (rok_write) | (dzien_write);<br /><br />miesiac_write = dec2bcd(miesiac_write);<br />//dzien_tygodnia_write = miesiac_write;<br />dzien_tygodnia_write = (dzien_tygodnia_write &lt;&lt; 5);<br />miesiac_write = (dzien_tygodnia_write) | (miesiac_write);<br /><br />// Ustawianie czasu i daty<br />bufor&#91;0&#93; = sekunda_write;      // sekundy<br />bufor&#91;1&#93; = minuta_write;       // minuty<br />bufor&#91;2&#93; = godzina_write;      // godziny<br />bufor&#91;3&#93; = dzien_write;<br />bufor&#91;4&#93; = miesiac_write;<br /><br />TWI_write_buf( PCF8583_ADDR, 0x02, 5, bufor);<br /><br />//zapis zmiennych roku<br />bufor&#91;0&#93; = pelny_rok &gt;&gt; 8;       //MSB<br />bufor&#91;1&#93; = (uint8_t) pelny_rok; //LSB<br />bufor&#91;2&#93; = rok_kopia;          // rok 0-3<br /><br />TWI_write_buf( PCF8583_ADDR, 0x10, 3, bufor);<br /><br />}[/syntax]<br /><br />Jak korzysta się z takiej funkcji to w odpowiednie miejsca trzeba podstawić wartości lub jakieś zmienne. Wtedy mówi się, że to są tzw. argumenty aktualne funkcji. Funkcja przekopiowuje wartości tych zmiennych do swoich argumentów formalnych i wykonuje dalsze operacje.<br />[syntax=c]zapisz_czas(dni,<br />miesiace,<br />dzien_tygodnia,<br />godziny,<br />minuty,<br />sekundy,<br />pelny_rok<br />);[/syntax]<br />lub<br />[syntax=c]zapisz_czas(27,<br />4,<br />0,<br />17,<br />38,<br />46,<br />2015<br />);[/syntax]<br /><br />Odnośnie roku to wystarczy obliczyć resztę z dzielenia przez 4. Jak powyżej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 27 kwi 2015, o 16:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-26T22:48:57+01:00</updated>
<published>2015-04-26T22:48:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127567#p127567</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127567#p127567"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127567#p127567"><![CDATA[
Bardzo, bardzo dziękuję. Działa znakomicie. Przeprowadziłeś mnie przez cały proces programowania zegara od koncepcji do kodu. Klikam ponownie z wielkim przekonaniem i życzliwością &quot;pomógł&quot;. Jak sam wspomniałeś dobrze byłoby się teraz dobrać do daty (różne ilości dni w zależności od miesiąca). Jutro popracuję nad zapisem ustawionego czasu do pamięci: key_save_nacisniety, teoretycznie wiem, że ciało zapsu funkcji powinno być wyposażone w coś takiego&quot;<br /><br />[syntax=c]// odkomentowujemy tylko na czas programowania godzinyw RTC z podtrzymaniem i wgrywmy wsad, a następnie<br />        // komentujemy i ponownie wgrywamy wsad - podtrzymanie bateryjne zapamiętało poprzednią godzinę!<br /><br />       godzina_write = 12;<br />    minuta_write = 16;<br />    sekunda_write = 15;<br />    dzien_write = 22;<br />    miesiac_write = 04;<br />    rok_write = 2015;<br />    pelny_rok = 2015;<br />    rok_kopia = 3;<br />    dzien_tygodnia_write=2;<br /><br />    godzina_write = dec2bcd(godzina_write);<br />    minuta_write = dec2bcd(minuta_write);<br />    sekunda_write = dec2bcd(sekunda_write);<br /><br />    rok_write = (rok_write % 4);<br />    rok_write = dec2bcd(rok_write);<br />    rok_write = (rok_write&lt;&lt;6);<br /><br />    dzien_write = dec2bcd(dzien_write);<br />    dzien_write = (rok_write) | (dzien_write);<br /><br />    miesiac_write = dec2bcd(miesiac_write);<br />    //dzien_tygodnia_write = miesiac_write;<br />    dzien_tygodnia_write = (dzien_tygodnia_write&lt;&lt;5);<br />    miesiac_write = (dzien_tygodnia_write) | (miesiac_write);<br /><br />    // Ustawianie czasu i daty<br />    bufor&#91;0&#93; = sekunda_write;// sekundy<br />    bufor&#91;1&#93; = minuta_write;// minuty<br />    bufor&#91;2&#93; = godzina_write;// godziny<br />    bufor&#91;3&#93; = dzien_write;<br />    bufor&#91;4&#93; = miesiac_write;<br /><br />    // zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />    TWI_write_buf( PCF8583_ADDR, 0x02, 5, bufor );<br /><br />    //zapis zmiennych roku<br />    bufor&#91;0&#93; = pelny_rok&gt;&gt;8;       //MSB<br />    bufor&#91;1&#93; = (uint8_t)pelny_rok; //LSB<br />    bufor&#91;2&#93; = rok_kopia;          // rok 0-3<br /><br />    TWI_write_buf( PCF8583_ADDR, 0x10, 3, bufor );<br /><br />    // zapis tekstu do pamięci EEPROM od adresu 253, dlatego aby tekst<br />    // został zapisany w jednym i drugim banku pamięci<br />*/[/syntax]<br /><br />P.S. Dzisiaj zmagam się z zagadnieniem zapisu nowo ustawionego czasu i daty do PCF8583. Zadeklarowałem i zdefiniowałem funkcję zapisz_czas i przypisałem ją do klawisza KEY_SAVE. Gdy ustawię godzinę i datę na sztywno zapis przebiega poprawnie, ale gdy próbuję zmiennym w funkcji przypisać nowo ustawione wartości to nie działa. Nie wiem jak przekazać nowo ustawione parametry do funkcji. Myślę tak: gdy godziny=23, to przekazanie tego do funkcji mogłoby wyglądać tak: godzina_write = godziny, ale to nie działa. Proszę o podpowiedź.<br /><br />[syntax=c]void zapisz_czas()<br />{<br /><br />uint8_t bufor&#91;5&#93;;<br />uint8_t dzien_write, miesiac_write, dzien_tygodnia_write, godzina_write, minuta_write, sekunda_write, rok_kopia;<br />uint16_t rok_write, pelny_rok;<br /><br /> godzina_write = 15;<br /> minuta_write = 55;<br /> sekunda_write = 00;<br /> dzien_write = 27;<br /> miesiac_write = 04;<br /> rok_write = 2015;<br /> pelny_rok = 2015;<br /> rok_kopia = 3;<br /> dzien_tygodnia_write = 0;<br /><br /> godzina_write = dec2bcd(godzina_write);<br /> minuta_write = dec2bcd(minuta_write);<br /> sekunda_write = dec2bcd(sekunda_write);<br /><br /> rok_write = (rok_write % 4);<br /> rok_write = dec2bcd(rok_write);<br /> rok_write = (rok_write&lt;&lt;6);<br /><br /> dzien_write = dec2bcd(dzien_write);<br /> dzien_write = (rok_write) | (dzien_write);<br /><br /> miesiac_write = dec2bcd(miesiac_write);<br /> //dzien_tygodnia_write = miesiac_write;<br /> dzien_tygodnia_write = (dzien_tygodnia_write&lt;&lt;5);<br /> miesiac_write = (dzien_tygodnia_write) | (miesiac_write);<br /><br /> // Ustawianie czasu i daty<br /> bufor&#91;0&#93; = sekunda_write;// sekundy<br /> bufor&#91;1&#93; = minuta_write;// minuty<br /> bufor&#91;2&#93; = godzina_write;// godziny<br /> bufor&#91;3&#93; = dzien_write;<br /> bufor&#91;4&#93; = miesiac_write;<br /><br />TWI_write_buf( PCF8583_ADDR, 0x02, 5, bufor );<br /><br /> //zapis zmiennych roku<br /> bufor&#91;0&#93; = pelny_rok&gt;&gt;8;       //MSB<br /> bufor&#91;1&#93; = (uint8_t)pelny_rok; //LSB<br /> bufor&#91;2&#93; = rok_kopia;          // rok 0-3<br /><br /> TWI_write_buf( PCF8583_ADDR, 0x10, 3, bufor );<br /><br /> }[/syntax]<br /><br />Myślę, że rozwiązałem &quot;ustawianie&quot; nazwy dnia tygodnia&quot;. Ustawienia 0-6 byłyby bardzo uciążliwe i niepraktyczne. [syntax=c]dzien_tygodnia_write = 0;[/syntax] Funcja wykorzystująca algortym Zellera zwraca na podstawie daty indeksy do tablicy z nazwami dni tygodnia i ustawia je automatycznie. Wydaje się, że działa poprawnie.<br /><br />Kłopotliwe wydaje się mi programowanie numeru roku (0-3) [syntax=c]rok_kopia = 3;[/syntax] Gdy ustawię np. rok 2016 to do PCF-a należy przekazać 0 itd. Trzeba chyba na sztywno przypisać cyfry do najbliższych lat, ale jest to mało eleganckie. Może są inne rozwiązania?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 26 kwi 2015, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-26T22:37:58+01:00</updated>
<published>2015-04-26T22:37:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127563#p127563</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127563#p127563"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127563#p127563"><![CDATA[
A masz to w ten sposób:<br />[syntax=c]switch (ustaw) {<br />case 1: // godziny<br />widac_godziny = ~widac_godziny;<br />widac_minuty = 0;<br />widac_sekundy = 0;<br />break;<br />case 2: // minuty<br />widac_godziny = 0;<br />widac_minuty = ~widac_minuty;<br />widac_sekundy = 0;<br />break;<br />case 3: // sekundy<br />widac_godziny = 0;<br />widac_minuty = 0;<br />widac_sekundy = ~widac_sekundy;<br />break;<br />default:<br />widac_godziny = 0;<br />widac_minuty = 0;<br />widac_sekundy = 0;<br />break;<br />} // nawias switch<br /><br />// godziny - wyświetlanie czasu na LCD<br />lcd_locate(0, 4);<br />if (!widac_godziny)<br />{<br />if (godziny &lt; 10)<br />lcd_str(&quot;0&quot;);<br />lcd_int(godziny);<br />}<br />else<br />{<br />lcd_str(&quot;  &quot;);<br />}<br />lcd_str(&quot;:&quot;);<br />// minuty - wyświetlanie czasu na LCD<br />lcd_locate(0, 7);<br />if (!widac_minuty)<br />{<br />if (minuty &lt; 10)<br />lcd_str(&quot;0&quot;);<br />lcd_int(minuty);<br />}<br />else<br />{<br />lcd_str(&quot;  &quot;);<br />}<br />lcd_str(&quot;:&quot;);<br />// sekundy - wyświetlanie czasu na LCD<br />lcd_locate(0, 10);<br />if (!widac_sekundy)<br />{<br />if (sekundy &lt; 10)<br />lcd_str(&quot;0&quot;);<br />lcd_int(sekundy);<br />}<br />else<br />{<br />lcd_str(&quot;  &quot;);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 26 kwi 2015, o 22:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-26T22:33:42+01:00</updated>
<published>2015-04-26T22:33:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127561#p127561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127561#p127561"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127561#p127561"><![CDATA[
Witam!<br /><br />Dzięki wielkie. Działa prawie dobrze. Jednakże w trybie ustawiania migają tylko godziny (ustaw=1), gdy ustaw=2 lub 3 nie widać minut i sekund. Co może być przyczyną?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 26 kwi 2015, o 22:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-26T22:12:02+01:00</updated>
<published>2015-04-26T22:12:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127558#p127558</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127558#p127558"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127558#p127558"><![CDATA[
Aby klawisz set mógł zmienić zmienną ustaw należy dodać taką możliwość. Tego brakowało:<br />[syntax=c]if (0 == ustaw)<br />{<br />if (int0_flag)<br />{<br />   //kod odczytu<br />int0_flag = 0;<br />} // nawias: if(int0_flag)<br />//tutaj należy dodac sprawdzanie flagi key_set_nacisniety <br />if (key_set_nacisniety) <br />{<br />key_set_nacisniety = 0;<br />ustaw = 1;<br />}<br />} // nawias: if (0 == ustaw)[/syntax]<br /><br />Klawisz set źle działa, bo masz błąd w kodzie:<br /><div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />[syntax=c]if ( !(PINB &amp; KEY_SET) &amp;&amp; key_set_zablokowany == 0) // klawisz KEY_UP był zwolniony i został wciśnięty<br />                 {<br />                         key_set_nacisniety = 1;<br />                         key_set_zablokowany = 1;<br />                 }<br />                 else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />                 {<br />                         key_set_zablokowany = 0;<br />                 }[/syntax]<br /></div><br />przy else if powinien być KEY_SET a jest KEY_DOWN. Pomyłki się zdarzają.<br /><br /><br />Czasu nie widać bo masz zmienne ustawione na zero więc w warunku sprawdzania powinno być:<br />[syntax=c]if( !widac_godziny ) //z negają logiczną[/syntax]<br /><br />I jeszcze należy dodać default w switchu sterowania wyświetlaniem:<br />[syntax=c]default:<br />   widac_godziny = 0;<br />   widac_minuty = 0;<br />   widac_sekundy = 0;<br />   break;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 26 kwi 2015, o 22:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-26T11:22:40+01:00</updated>
<published>2015-04-26T11:22:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127503#p127503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127503#p127503"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127503#p127503"><![CDATA[
Witam!<br />Złożyłem wszystkie części w całość (bez obsługi ustawiania daty), ale wystąpił nieoczekiwany problem. Kompilator zgłasza niestety błąd w 3 miejscach. Przy kompilacjach każdej z osobna części &quot;zegarowej&quot; i &quot;settingowej&quot; nie było problemów. Coś źle posklejałem. Proszę o pomoc.<br /><br />Błedy:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/9310/13d0428f11fd36f4465e3cfad4dac4b1.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/13d0428f11fd36f4465e3cfad4dac4b1.png" alt="Obrazek" /></a><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/9310/689ff9b33e23859fd102f2ed326b6384.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/689ff9b33e23859fd102f2ed326b6384.png" alt="Obrazek" /></a><br /><br />Kod w całości:<br /><br />[syntax=c]/*<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;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;math.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />//#include &quot;I2C_SOFT/i2c_soft.h&quot;<br />#define PCF8583_ADDR 0xA2<br /><br />// makrodefinicje przycisków do ustawiania zegara<br />#define KEY_SET  (1&lt;&lt;PB0)<br />#define KEY_UP   (1&lt;&lt;PB1)<br />#define KEY_DOWN (1&lt;&lt;PB2)<br />#define KEY_SAVE (1&lt;&lt;PB3)<br />// podświetlenie zegara<br />#define LED_BKT  (1&lt;&lt;PC7)<br /><br />//napisy w pamięci programu nie zużywają RAM<br />const char pn&#91;&#93; PROGMEM = &quot;PON&quot;;<br />const char wt&#91;&#93; PROGMEM = &quot;WTO&quot;;<br />const char sr&#91;&#93; PROGMEM = &quot;SRO&quot;;<br />const char cz&#91;&#93; PROGMEM = &quot;CZW&quot;;<br />const char pi&#91;&#93; PROGMEM = &quot;PIA&quot;;<br />const char sb&#91;&#93; PROGMEM = &quot;SOB&quot;;<br />const char nd&#91;&#93; PROGMEM = &quot;NIE&quot;;<br />const char nic&#91;&#93; PROGMEM = &quot;            &quot;;<br />//tablica wskaźników w pamięci programu nie zużywa RAM<br />const char * const napisy_dni&#91;&#93; PROGMEM = {pn, wt, sr, cz, pi, sb, nd, nic};<br /><br />// flaga zmieniana w przerwaniu i sprawdzana w pętli głównej<br />volatile uint8_t int0_flag = 1;<br />// definicje timerów programowych<br />volatile uint16_t SoftTimer1, SoftTimer2;<br /><br />// deklaracja funcji - konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// deklaracja funcji - konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br />// deklaracja funkcji zapisującej czas do PCF8583 po ustawieniu<br />void zapisz_czas();<br /><br />int main(void) {<br /><br />// podświetlenie LCD<br />DDRC |= LED_BKT;<br />PORTC |= LED_BKT;<br /><br />// podciągnięcie linii przycisków do VCC<br />PORTB |= (KEY_SET | KEY_UP | KEY_DOWN | KEY_SAVE);<br /><br />// przerwanie INT0 (magistrala TWI/I2C<br />    MCUCR |= (1&lt;&lt;ISC01); // wyzwalanie zboczem opadającym<br />    GICR |= (1&lt;&lt;INT0);   // odblokowanie przerwania<br />    PORTD |= (1&lt;&lt;PD2);   // podciągnięcie pinu INT0 do VCC<br /><br />    // ustawienia timera sprzętowego wybranego jako podstawa czasu timerów sprzętowych<br />    TCCR2  |= (1&lt;&lt;WGM21);                      // tryb: CTC<br />    TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);   // preskaler: 1024<br />    OCR2  = 108;                               // rozdzielczosć: 10ms (100Hz)<br />    TIMSK  = (1&lt;&lt;OCIE2);                       // odblokowanie przerwania CompareMatch<br /><br />    /* definiujemy dla polepszenia czytelności programu typ wyliczeniowy<br />     wskazujący nam później na odpowiednie indeksy w tablicy (buforze) */<br />    enum {ss, mm, hh, dd, mimi};<br />    uint8_t bufor&#91;5&#93;; // rezerwacja bufora 5 bajtów<br />    uint8_t sekundy, minuty, godziny, dni, miesiace, rok, dzien_tygodnia, dzien_write, miesiac_write, dzien_tygodnia_write, godzina_write, minuta_write, sekunda_write, rok_kopia;<br />    uint16_t rok_write, pelny_rok;<br /><br />    // deklaracje zmiennych przypisanych do przycisków<br />    uint8_t key_set_nacisniety = 0;<br />    uint8_t key_save_nacisniety = 0;<br />    uint8_t key_up_nacisniety = 0;<br />    uint8_t key_down_nacisniety = 0;<br />    uint8_t key_up_zablokowany = 0;<br />    uint8_t key_down_zablokowany = 0;<br />    uint8_t key_set_zablokowany = 0;<br />    uint8_t widac_godziny = 0;<br />    uint8_t widac_minuty = 0;<br />    uint8_t widac_sekundy = 0;<br />    uint8_t ustaw = 0;<br /><br />    // inicjalizacja magistrali I2C/TWI z prędkością 100kHz<br />    i2cSetBitrate(100);<br /><br />    // inicjalizacja wyświetlacza LCD<br />    lcd_init();<br /><br />    // zgoda globalna na przerwania<br />    sei();<br /><br />/*<br />    // odkomentowujemy tylko na czas programowania godzinyw RTC z podtrzymaniem i wgrywmy wsad, a następnie<br />        // komentujemy i ponownie wgrywamy wsad - podtrzymanie bateryjne zapamiętało poprzednią godzinę!<br /><br />       godzina_write = 12;<br />    minuta_write = 16;<br />    sekunda_write = 15;<br />    dzien_write = 22;<br />    miesiac_write = 04;<br />    rok_write = 2015;<br />    pelny_rok = 2015;<br />    rok_kopia = 3;<br />    dzien_tygodnia_write=2;<br /><br />    godzina_write = dec2bcd(godzina_write);<br />    minuta_write = dec2bcd(minuta_write);<br />    sekunda_write = dec2bcd(sekunda_write);<br /><br />    rok_write = (rok_write % 4);<br />    rok_write = dec2bcd(rok_write);<br />    rok_write = (rok_write&lt;&lt;6);<br /><br />    dzien_write = dec2bcd(dzien_write);<br />    dzien_write = (rok_write) | (dzien_write);<br /><br />    miesiac_write = dec2bcd(miesiac_write);<br />    //dzien_tygodnia_write = miesiac_write;<br />    dzien_tygodnia_write = (dzien_tygodnia_write&lt;&lt;5);<br />    miesiac_write = (dzien_tygodnia_write) | (miesiac_write);<br /><br />    // Ustawianie czasu i daty<br />    bufor&#91;0&#93; = sekunda_write;// sekundy<br />    bufor&#91;1&#93; = minuta_write;// minuty<br />    bufor&#91;2&#93; = godzina_write;// godziny<br />    bufor&#91;3&#93; = dzien_write;<br />    bufor&#91;4&#93; = miesiac_write;<br /><br />    // zapis 4 bajtów z bufora pod adres 0x01 w pamięci RAM naszego RTC<br />    TWI_write_buf( PCF8583_ADDR, 0x02, 5, bufor );<br /><br />    //zapis zmiennych roku<br />    bufor&#91;0&#93; = pelny_rok&gt;&gt;8;       //MSB<br />    bufor&#91;1&#93; = (uint8_t)pelny_rok; //LSB<br />    bufor&#91;2&#93; = rok_kopia;          // rok 0-3<br /><br />    TWI_write_buf( PCF8583_ADDR, 0x10, 3, bufor );<br /><br />    // zapis tekstu do pamięci EEPROM od adresu 253, dlatego aby tekst<br />    // został zapisany w jednym i drugim banku pamięci<br />*/<br /><br />     while(1)<br />     {<br />    //{<br />            if (0 == ustaw)<br />        {<br />            if(int0_flag)<br />            {<br />            // odczyt 5 bajtów do bufora od adresu 0x01 z pamięci RAM naszego RTC<br />            TWI_read_buf( PCF8583_ADDR, 0x02, 5, bufor );<br />            sekundy = bcd2dec( bufor&#91;ss&#93; );<br />            minuty = bcd2dec( bufor&#91;mm&#93; );<br />            godziny = bcd2dec( bufor&#91;hh&#93; );<br />            //dni = bcd2dec( bufor&#91;dd&#93; );<br />            //miesiace = bcd2dec( bufor&#91;mimi&#93; );<br /><br />            rok = bufor&#91;dd&#93;;<br />            rok = (rok&gt;&gt;6);<br />            rok = bcd2dec(rok);<br /><br />            dni = bufor&#91;dd&#93;;<br />            dni = (dni &amp; 0x3F);<br />            dni = bcd2dec(dni);<br /><br />            dzien_tygodnia = bufor&#91;mimi&#93;;<br />            dzien_tygodnia = (dzien_tygodnia&gt;&gt;5);<br />            dzien_tygodnia = bcd2dec(dzien_tygodnia);<br /><br />            miesiace = bufor&#91;mimi&#93;;<br />            miesiace = (miesiace &amp; 0x1F);<br />            miesiace = bcd2dec(miesiace);<br /><br />            TWI_read_buf( PCF8583_ADDR, 0x10, 3, bufor );<br /><br />            rok_kopia = bufor&#91;2&#93;;<br />            pelny_rok = (bufor&#91;0&#93;&lt;&lt;8) + (bufor&#91;1&#93;);<br />            if(rok_kopia &lt; rok) {<br />            pelny_rok = pelny_rok + rok - rok_kopia;<br />            } else if(rok_kopia &gt; rok) {<br />              pelny_rok = pelny_rok + rok + 4 - rok_kopia;<br />            }<br />            if(rok_kopia != rok)<br />            {<br />            bufor&#91;0&#93; = pelny_rok&gt;&gt;8;<br />            bufor&#91;1&#93; = (uint8_t)pelny_rok;<br />            bufor&#91;2&#93; = rok;     // rok 0-3<br />            TWI_write_buf( PCF8583_ADDR, 0x10, 3, bufor );<br />            }<br />            int0_flag = 0;<br />            } // nawias: if(int0_flag)<br />       } // nawias: if (0 == ustaw)<br /><br />           else<br /><br />           {<br />             switch(ustaw)<br />             {<br />              case 1: // godziny<br />                            if(key_up_nacisniety)<br />                            {<br />                            key_up_nacisniety = 0;<br />                            godziny++;<br />                            if(godziny &gt; 23) godziny = 0;<br />                            }<br />                            if(key_down_nacisniety)<br />                            {<br />                            key_down_nacisniety = 0;<br />                            godziny--;<br />                            if(godziny &gt; 23) godziny = 23;<br />                            }<br />                            break;<br />                    case 2: // minuty<br />                            if(key_up_nacisniety)<br />                            {<br />                            key_up_nacisniety = 0;<br />                            minuty++;<br />                            if(minuty &gt; 59) minuty = 0;<br />                            }<br />                            if(key_down_nacisniety)<br />                            {<br />                            key_down_nacisniety = 0;<br />                            minuty--;<br />                            if(minuty &gt; 59) minuty = 59;<br />                            }<br />                            break;<br />                    case 3: // sekundy<br />                            if(key_up_nacisniety)<br />                            {<br />                            key_up_nacisniety = 0;<br />                            sekundy++;<br />                            if(sekundy &gt; 59) sekundy = 0;<br />                            }<br />                            if(key_down_nacisniety)<br />                            {<br />                            key_down_nacisniety = 0;<br />                            sekundy--;<br />                            if(sekundy &gt; 59) sekundy = 59;<br />                            }<br />                            break;<br />                   default:<br />                            break;<br />             } // nawias switch<br /><br />               if(key_set_nacisniety)<br />               {<br />               key_set_nacisniety = 0;<br />               ++ustaw;<br />              if(ustaw &gt; 3) ustaw = 1;<br />               }<br /><br />               if (key_save_nacisniety)<br />               {<br />               key_save_nacisniety = 0;<br />               if(ustaw &gt; 0) zapisz_czas();<br />               ustaw = 0;<br />               }<br />           } // nawias elese<br /><br />         if (0 == SoftTimer1) // SoftTimer1 zmniejszany co 10ms w przerwaniu TIMERA2<br />         {<br />         SoftTimer1 = 4; // częstość wykonywania kodu od (0 == SoftTimer1) do klamry zamykającej 40ms (podstawa czasu 10ms (TIMER2)<br />         if ( !(PINB &amp; KEY_UP) &amp;&amp; key_up_zablokowany == 0 )<br />         {<br />         key_up_nacisniety = 1;<br />         key_up_zablokowany = 1;<br />         }<br />         else if ( PINB &amp; KEY_UP)<br />         {<br />         key_up_zablokowany = 0;<br />         }<br /><br />         if ( !(PINB &amp; KEY_DOWN) &amp;&amp; key_down_zablokowany == 0) // klawisz KEY_UP był zwolniony i został wciśnięty<br />         {<br />         key_down_nacisniety = 1;<br />         key_down_zablokowany = 1;<br />         }<br />         else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />         {<br />         key_down_zablokowany = 0;<br />         }<br /><br />         if ( !(PINB &amp; KEY_SET) &amp;&amp; key_set_zablokowany == 0) // klawisz KEY_UP był zwolniony i został wciśnięty<br />         {<br />         key_set_nacisniety = 1;<br />         key_set_zablokowany = 1;<br />         }<br />         else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />         {<br />         key_set_zablokowany = 0;<br />         }<br />         } // nawais: SoftTimer1<br /><br />         if (0 == SoftTimer2) // SoftTimer2 zmniejszany co 10ms w przerwaniu TIMERA2<br /><br />         {<br />         SoftTimer2 = 20;<br /><br />         switch(ustaw)<br />         {<br />          case 1: // godziny<br />           widac_godziny = ~widac_godziny;<br />                     widac_minuty = 0;<br />                     widac_sekundy = 0;<br />                     break;<br />             case 2: // minuty<br />                     widac_godziny = 0;<br />                     widac_minuty = ~widac_minuty;<br />                     widac_sekundy = 0;<br />                     break;<br />             case 3: // sekundy<br />                     widac_godziny = 0;<br />                     widac_minuty = 0;<br />                     widac_sekundy = ~widac_sekundy;<br />                     break;<br />                     } // nawias switch<br /><br />             // godziny - wyświetlanie czasu na LCD<br />             lcd_locate(0,4);<br />             if(widac_godziny)<br />             {<br />             if(godziny &lt; 10) lcd_str(&quot;0&quot;);<br />             lcd_int(godziny);<br />             }<br />             else<br />             {<br />             lcd_str(&quot;  &quot;);<br />             }<br />             lcd_str(&quot;:&quot;);<br />             // minuty - wyświetlanie czasu na LCD<br />             lcd_locate(0,7);<br />             if(widac_minuty)<br />             {<br />             if(minuty &lt; 10) lcd_str(&quot;0&quot;);<br />             lcd_int(minuty);<br />             }<br />             else<br />             {<br />          lcd_str(&quot;  &quot;);<br />             }<br />             lcd_str(&quot;:&quot;);<br />             // sekundy - wyświetlanie czasu na LCD<br />             lcd_locate(0,10);<br />             if(widac_sekundy)<br />             {<br />             if(sekundy &lt; 10) lcd_str(&quot;0&quot;);<br />             lcd_int(sekundy);<br />             }<br />             else<br />             {<br />             lcd_str(&quot;  &quot;);<br />             }<br /><br />             // do celów testowych<br />             lcd_locate(0,0);<br />             lcd_str(&quot;F&quot;);<br />             lcd_int(int0_flag);<br />             lcd_locate(0,14);<br />             lcd_str(&quot;U&quot;);<br />             lcd_int(ustaw);<br /><br />             lcd_locate(1,1);<br />             if( dni &lt; 10 ) lcd_str(&quot;0&quot;);<br />             lcd_int(dni);<br />             lcd_str(&quot;-&quot;);<br />             if( miesiace &lt; 10 ) lcd_str(&quot;0&quot;);<br />             lcd_int(miesiace);<br />             lcd_str(&quot;-&quot;);<br />             //lcd_int(rok);<br />             //lcd_str(&quot; &quot;);<br />             lcd_int(pelny_rok);<br />             lcd_str(&quot; &quot;);<br />             //lcd_int(dzien_tygodnia);<br />             //lcd_str(&quot;  &quot;);<br />             lcd_str_P((const char *)pgm_read_word(&amp;napisy_dni&#91;dzien_tygodnia&#93;));<br /><br />          } // nawais: SoftTimer2<br /><br />      } // nawias: while<br />} // nawias: main<br /><br />// procedura obsługi przerwania INT 0<br /><br />     ISR( INT0_vect )<br />     {<br />         int0_flag = 1;<br />         DDRC |= (1&lt;&lt;PC6);<br />         PORTC ^= (1&lt;&lt;PC6);<br />     }<br /><br />     ISR(TIMER2_COMP_vect){<br />         uint16_t n;<br />         n = SoftTimer1;<br />         if(n) SoftTimer1 = --n;<br />         n = SoftTimer2;<br />         if (n) SoftTimer2 = --n;<br />     }<br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec)<br />{<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd)<br />{<br />return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}[/syntax]<br /><br />Pozdrawiam<br /><br />P.S. Poczyniłem kilka obserwacji, ale nie bardzo wiem jak je interpretować:<br /><br />1. Gdy zainicjuję zmienną ustaw wartością 1:<br />[syntax=c]volatile uint8_t ustaw = 1;[/syntax]<br /><br />to po restarcie zegar wchodzi od razu w tryb programowania i mrugają godziny, które można ustawiać (flaga =1, ustaw=1) [A]. Kolejne naciśnięcie sprawia, że można ustawiać sekundy bo ustaw zmienia wartość od razu na 3 z pominięciem 2, jednakże sekundy już nie mrugają [B]. Po 8. naciśnięiu klawisza SET zegar wyświetla nową godzinę (na niby bo fukcja zapisz_czas jeszcze nie działa) flaga ustawia się na 0 i zmienna ustaw też przyjmuje wartość 0. To koniec, bo kolejne wciśnięcie klawisza SET nie powoduje przejścia zegara w tryb programowania [C].<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/9310/015b49317c5332b644f6061042d1268f.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/015b49317c5332b644f6061042d1268f.jpg" alt="Obrazek" /></a> [A]<br /><a href="http://forum.atnel.pl/_obrazki/o/9310/db91bb8da0725964873efbb177c2ebc4.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/db91bb8da0725964873efbb177c2ebc4.jpg" alt="Obrazek" /></a> [B]<br /><a href="http://forum.atnel.pl/_obrazki/o/9310/ed6db182ff973c5e75383e03f4d7316d.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/ed6db182ff973c5e75383e03f4d7316d.jpg" alt="Obrazek" /></a> [C]<br /><br />2. Gdy zainicjuję zmienną ustaw wartością 1:<br />[syntax=c]volatile uint8_t ustaw = 0;[/syntax]<br /><br />to po restarcie zegar jest martwy i nie wyświetla godziny. Naciskanie klawisza set nie pomaga (dioda w przerwaniu INT0 zmienia stan co sekundę):<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/9310/f0dc489558749bffa8fe7c67895f18b0.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9310/f0dc489558749bffa8fe7c67895f18b0.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 26 kwi 2015, o 11:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-25T23:21:03+01:00</updated>
<published>2015-04-25T23:21:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127484#p127484</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127484#p127484"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127484#p127484"><![CDATA[
Dziękuję bardzo za kolejne merytoryczne porady. Rano siadam do projektu, wykorzystam Twoje podpowiedzi, ustosunkuję się do pytań oraz napiszę o efektach. Niepokoi mnie ustawianie daty, ale odłożę myśl o tym na później. Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 25 kwi 2015, o 23:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-25T21:31:47+01:00</updated>
<published>2015-04-25T21:31:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127468#p127468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127468#p127468"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127468#p127468"><![CDATA[
No i przekonałeś się, że brak flagi key_..._zablokowany psuje działanie klawiszy, bo zmienne zmieniają się zbyt szybko. Z kolei zwiększenie czasu spowodowałoby, że klawisz musiałby być trzymany dłużej.<br /><br />Ostatni kod wygląda już spoko. Nie potrzebnie wyrzuciłeś procedurę obsługi przerwania ISR( INT0_vect ) to w niczym nie przeszkadzało, a teraz musisz to dodać. Nie wiem też po co wprowadziłeś sobie nowe zmienne, które określasz jako &quot;zmienne, które będą ustawiane&quot; to przecież mogą być te same zmienne które odczytałeś z zegara (te po konwersji). Dlatego odczyt zegara jest blokowany, aby odczyt nie kłócił się z ustawianiem. Zastanów się, przecież jak ustawia się zegar to chce się zmienić czas, który jest w tym momencie i dlatego nowe zmienne nie są potrzebne i tylko skomplikują sprawę.<br /><br />Ad. 1. Podałem gotowe rozwiązanie. Masz takie zmienne widac_..., które w tej części kodu zmieniają swój stan na przeciwny jak zmienna ustaw ma odpowiednią wartość np. dla godzin ustaw = 1. Teraz wyświetlasz godziny zawsze, a należy to zrobić tylko jak zmienna widac_godziny ma wartość 1, a w innym razie dwie spacje, aby godziny zniknęły i to wszystko.<br /><br />Ad. 2. To jest troszkę inaczej. Tam, gdzie teraz masz sprawdzanie w warunku zmiennej int0_flag dodaj to co było wcześniej tylko bez używania funkcji lcd_..., bo wyświetlanie jest w dalszej części (TWI_read_buf itd.) Zmienna int0_flag ustawiana jest w przerwaniu co sekundę, bo układ zegara co sekundę zmienia stan wyjścia INT.<br /><br />Ad. 3. Tą funkcję w zasadzie też masz gotową. Należy część kodu, która na starcie zapisywała bufor do zegara (TWI_write_buf i to co powyżej). Flagę int0_flag zostaw w spokoju.<br /><br />A odnośnie pytania skąd warunek w kodzie [syntax=c]if(ustaw &gt; 7) ustaw = 0;[/syntax]<br />to przedstawia się to następująco dla zmiennej ustaw:<br />0 - odczyt zegara - normalna praca<br />1 - ustawianie godzin / miganie godzin<br />2 - ustawianie minut / miganie minut<br />3 - ustawianie sekund / miganie sekund<br />4 - ustawianie pełnego roku / miganie pełnego roku<br />5 - ustawianie miesiąca / miganie miesiąca<br />6 - ustawianie dnia / miganie dnia<br />7 - ustawianie dnia tygodnia / miganie dnia tygodnia<br /><br />Dużo tego, ale w zasadzie jest całkiem podobnie. Na pocieszenie dodam, że to nie koniec, bo należałoby zadbać o to, żeby dni miesiąca miały inną inną wartość maksymalną podczas ustawiania w zależności od miesiąca i roku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 kwi 2015, o 21:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-25T10:38:17+01:00</updated>
<published>2015-04-25T10:38:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127442#p127442</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127442#p127442"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127442#p127442"><![CDATA[
Witam!<br />Odnoście kluczowych dla mnie porad Kolegi Krauser. Napisałem krótki kod symulujący ustawianie zegara (zmienne do ustawienia: h, m, s). Zasymulowałem naciskanie klawisza SET poprzez przypisanie zmiennej ustaw wartości 1 lub 2. Oprogramowałem przyciski: KEY_UP i KEY_DOWN. Efekt jest nie do końca zgodny z oczekiwaniem. W zależności od wartości zmiennej ustaw wybieram do ustawienia h lub m. Po naciśnięciu KEY_UP lub KEY_DOWN odpowiednia liczba (h lub m) zwiększa się lub zmniejsza o kilka (nie o jeden), a co gorsze pojawiają się dziwne wartości pozostałych zmiennych np. s, którymi nie steruję. Wygląda jakby liczył 256 kroków. Dlaczego tak się dzieje?<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 />#include &quot;LCD/lcd44780.h&quot;<br /><br />// definicja przycisków do ustawiania zegara<br />#define KEY_SET  (1&lt;&lt;PB0)<br />#define KEY_UP   (1&lt;&lt;PB1)<br />#define KEY_DOWN (1&lt;&lt;PB2)<br />#define KEY_SAVE (1&lt;&lt;PB3)<br />// podświetlenie zegara<br />#define LED_BKT  (1&lt;&lt;PC7)<br /><br />// definicje timerów programowych<br />volatile uint16_t SoftTimer1, SoftTimer2;<br /><br />int main(void)<br />{<br />// podciągnięcie linii przycisków do VCC<br />PORTB |= (KEY_SET | KEY_UP | KEY_DOWN | KEY_SAVE);<br /><br />// podświetlenie LCD<br />DDRC |= LED_BKT;<br />PORTC |= LED_BKT;<br /><br />// ustawienia timera sprzętowego wybranego jako podstawa czasu timerów sprzętowych<br />    TCCR2  |= (1&lt;&lt;WGM21);                      // tryb CTC<br />    TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);   // preskaler 1024<br />    OCR2  = 108;                               // rozdzielczosć 10ms<br />    TIMSK  = (1&lt;&lt;OCIE2);                       // odblokowanie CompareMatch<br /><br />    // deklaracje zmiennych przypisanych do przycisków<br />    uint8_t key_set_nacisniety = 0;<br />    uint8_t key_save_nacisniety = 0;<br />    uint8_t key_up_nacisniety = 0;<br />    uint8_t key_down_nacisniety = 0;<br /><br />    uint8_t ustaw = 2;<br />uint8_t int0_flag = 0;<br /><br />// deklaracje zmiennych, które będą ustawiane<br />uint8_t h, m, s;<br />h = 14, m = 15, s = 23;<br /><br /><br />sei();<br />    lcd_init();<br /><br /><br />    while(1)<br />        {<br />            if (0 == ustaw)<br />            {<br />            if(int0_flag)<br />            {<br />             // tylko odczyt i przetwarzanie czasu<br />            }<br />            }<br />            else<br />            {<br />            switch(ustaw)<br />            {<br />            case 1: // godziny<br />if(key_up_nacisniety)<br />{<br />key_up_nacisniety = 0;<br />h++;<br />if(h &gt; 23) h = 0;<br />}<br /><br />if(key_down_nacisniety)<br />{<br />key_down_nacisniety = 0;<br />h--;<br />if(h &gt; 23) h = 23;<br />}<br />break;<br /><br />case 2: // minuty<br />if(key_up_nacisniety)<br />{<br />key_up_nacisniety = 0;<br />m++;<br />if(m &gt; 59) m = 0;<br />}<br />if(key_down_nacisniety)<br />{<br />key_down_nacisniety = 0;<br />m--;<br />if(m &gt; 59) h = 59;<br />}<br />                    break;<br />            default:<br />            break;<br /><br /><br />            } // nawias switch<br />            } // nawias elese<br /><br />    // Ta wartość określa jak często będzie się wykonywać fragment kodu od if (0 == SoftTimer1) do klamry zamykającej.<br />    if (0 == SoftTimer1) //SoftTimer1 zmniejszany co 10ms w przerwaniu timera<br />           {<br />           SoftTimer1 = 4; // częstość wykonywania kodu od (0 == SoftTimer1) do klamry zamykającej 40ms<br />           if ( !(PINB &amp; KEY_UP) ) // klawisz KEY_UP był zwolniony i został wciśnięty<br />           {<br />           key_up_nacisniety = 1;<br />           }<br />           else if ( PINB &amp; KEY_UP) //klawisz jest puszczony<br />           {<br />           }<br />           if ( !(PINB &amp; KEY_DOWN) ) // klawisz KEY_UP był zwolniony i został wciśnięty<br />           {<br />           key_down_nacisniety = 1;<br />           }<br />           else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />           {<br />           }<br />           }<br /><br />                if (0 == SoftTimer2)<br /><br />                {<br />                    SoftTimer2 = 10;<br />                    //if (key_up_nacisniety)<br />                    //{<br />                    //key_up_nacisniety = 0;<br />                    //h++;<br />                    //}<br /><br />                    //if (key_down_nacisniety)<br />                    //{<br />                    //key_down_nacisniety = 0;<br />                    //h--;<br />                    //}<br /><br />                    lcd_locate(0,3);<br />                    lcd_int(h);<br />                    lcd_str(&quot;  &quot;);<br />                    lcd_int(m);<br />                    lcd_str(&quot;  &quot;);<br />                    lcd_int(s);<br />                    lcd_locate(1,0);<br />                    lcd_str(&quot;flaga:&quot;);<br />                    lcd_int(int0_flag);<br />                    lcd_str(&quot; ustaw:&quot;);<br />                    lcd_int(ustaw);<br /><br /><br /><br />                }<br />        }<br />}<br /><br />ISR(TIMER2_COMP_vect){<br />        uint16_t n;<br />        n = SoftTimer1;<br />        if(n) SoftTimer1 = --n;<br />        n = SoftTimer2;<br />        if (n) SoftTimer2 = --n;<br />}[/syntax]<br /><br />Pozdrawiam<br /><br />P.S. 1 Zapanowałem nad wyświetlaczem. Zliczanie było dobre tylko wszystko przesuwało się na LCD przy zmianie godziny z dwucyfrowej na jednocyfrową.<br /><br />P.S. 2<br /><br />Zrobiłem mały postęp we wdrażaniu kodu Kolegi Krauser. Stan na chwilę obecną jest taki:<br />1. Zmienna ustaw dostaje &quot;na sztywno&quot; wartość 1 (ustawianie godzin).<br />2. Klawisz SET (PB0) przyciskany kilkakrotnie zmienia wartość zmiennej ustaw (pytanie: skąd warunek &gt; 7 w kodzie: [syntax=c]if(ustaw &gt; 7) ustaw = 0;[/syntax] (zmieniłem 0 na jeden, aby na razie nie blokować edycji). Klawisz SET zachowuje się nieco dziwnie tzn. pierwsze wciśnięcie zmienia 1 na 3, a kolejne już dobrze 3 na 2 na 1 i znów 3 (dlaczego na początku pętli pomijana jest 2?)<br />3. Klawisze KEY_UP i KEY_DOWN zmieniają prawidłowo wartość godzin, minut i sekund (w górę i w dół).<br /><br />Pozostały wg mnie do opracowania 3 zagadnienia:<br />1. Mruganie godzin, minut i sekund w zależności od wartości zmiennej ustaw (próbowałem wdrożyć fragment kodu kolegi Krauser w &quot;ciele&quot; SoftTimer2, ale na razie bez skutku). Bez tego ustawiający zegar będzie działał po omacku i ustawiał to co akurat wypadło po naciśnięciu klawisza SET.<br />2. Sprzężenie tego kodu z kodem zegara i sterowanie flagą into0_flag. Czuję instynktownie, że ze zmianą tej flagi będzie związane wejście w tryb ustawiania godziny oraz, że  zmiana ta nastąpi po naciśnięciu klawisza SET. Wtedy zmienna ustaw przyjmie wartość np. 1 i będzie można ustawiać godziny itd. <br />3. Opracowanie funkcji zapisz_czas (). Wciśnięcie klawisza SAVE ma spowodować ponowną zmianę into0_flag i uruchomić funkcję zapisu czasu do PCF8583.<br />Czy właściwie to rozumiem?<br /><br />Tak wygląda kod na chwilę obecną:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />// definicja przycisków do ustawiania zegara<br />#define KEY_SET  (1&lt;&lt;PB0)<br />#define KEY_UP   (1&lt;&lt;PB1)<br />#define KEY_DOWN (1&lt;&lt;PB2)<br />#define KEY_SAVE (1&lt;&lt;PB3)<br />// podświetlenie zegara<br />#define LED_BKT  (1&lt;&lt;PC7)<br /><br />// definicje timerów programowych<br />volatile uint16_t SoftTimer1, SoftTimer2;<br />void zapisz_czas();<br /><br />int main(void)<br />{<br />        // podciągnięcie linii przycisków do VCC<br />        PORTB |= (KEY_SET | KEY_UP | KEY_DOWN | KEY_SAVE);<br /><br />        // podświetlenie LCD<br />        DDRC |= LED_BKT;<br />        PORTC |= LED_BKT;<br /><br />        // ustawienia timera sprzętowego wybranego jako podstawa czasu timerów sprzętowych<br />    TCCR2  |= (1&lt;&lt;WGM21);                      // tryb CTC<br />    TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);   // preskaler 1024<br />    OCR2  = 108;                               // rozdzielczosć 10ms<br />    TIMSK  = (1&lt;&lt;OCIE2);                       // odblokowanie CompareMatch<br /><br />    // deklaracje zmiennych przypisanych do przycisków<br />    uint8_t key_set_nacisniety = 0;<br />    uint8_t key_save_nacisniety = 0;<br />    uint8_t key_up_nacisniety = 0;<br />    uint8_t key_down_nacisniety = 0;<br />    uint8_t key_up_zablokowany = 0;<br />    uint8_t key_down_zablokowany = 0;<br />    uint8_t key_set_zablokowany = 0;<br />    uint8_t widac_godziny = 0;<br />    uint8_t widac_minuty = 0;<br />    uint8_t widac_sekundy = 0;<br /><br />    uint8_t ustaw = 1;<br />    uint8_t int0_flag = 0;<br /><br />    // deklaracje zmiennych, które będą ustawiane<br />    uint8_t h, m, s;<br />    h = 15, m = 36, s = 23;<br /><br /><br />        sei();<br />    lcd_init();<br /><br /><br />    while(1)<br />        {<br />            if (0 == ustaw)<br />            {<br />                if(int0_flag)<br />                {<br />                 // tylko odczyt i przetwarzanie czasu<br />                }<br />            }<br />            else<br />            {<br />                switch(ustaw)<br />                {<br />                case 1: // godziny<br />                        if(key_up_nacisniety)<br />                        {<br />                        key_up_nacisniety = 0;<br />                        h++;<br />                        if(h &gt; 23) h = 0;<br />                        }<br />                        if(key_down_nacisniety)<br />                        {<br />                        key_down_nacisniety = 0;<br />                        h--;<br />                        if(h &gt; 23) h = 23;<br />                        }<br />                        break;<br />                case 2: // minuty<br />                        if(key_up_nacisniety)<br />                        {<br />                        key_up_nacisniety = 0;<br />                        m++;<br />                        if(m &gt; 59) m = 0;<br />                        }<br />                        if(key_down_nacisniety)<br />                        {<br />                        key_down_nacisniety = 0;<br />                         m--;<br />                        if(m &gt; 59) m = 59;<br />                        }<br />                        break;<br /><br />                case 3: // sekundy<br />                        if(key_up_nacisniety)<br />                        {<br />                        key_up_nacisniety = 0;<br />                        s++;<br />                        if(s &gt; 59) s = 0;<br />                        }<br />                        if(key_down_nacisniety)<br />                        {<br />                        key_down_nacisniety = 0;<br />                        s--;<br />                        if(s &gt; 59) s = 59;<br />                        }<br />                        break;<br />                 default:<br />                        break;<br />                } // nawias switch<br /><br />                if(key_set_nacisniety)<br />                {<br />                key_set_nacisniety = 0;<br />                ++ustaw;<br />if(ustaw &gt; 3) ustaw = 1;<br />                }<br /><br />                if (key_save_nacisniety)<br />                {<br />                key_save_nacisniety = 0;<br />                if(ustaw &gt; 0) zapisz_czas();<br />                ustaw = 0;<br />                }<br /><br /><br />            } // nawias elese<br /><br />        // Ta wartość określa jak często będzie się wykonywać fragment kodu od if (0 == SoftTimer1) do klamry zamykającej.<br />        if (0 == SoftTimer1) //SoftTimer1 zmniejszany co 10ms w przerwaniu timera<br />           {<br />           SoftTimer1 = 4; // częstość wykonywania kodu od (0 == SoftTimer1) do klamry zamykającej 40ms<br />           if ( !(PINB &amp; KEY_UP) &amp;&amp; key_up_zablokowany == 0 ) // klawisz KEY_UP był zwolniony i został wciśnięty<br />           {<br />           key_up_nacisniety = 1;<br />           key_up_zablokowany = 1;<br />           }<br /><br />           else if ( PINB &amp; KEY_UP) //klawisz jest puszczony<br />           {<br />           key_up_zablokowany = 0;<br />           }<br /><br />           if ( !(PINB &amp; KEY_DOWN) &amp;&amp; key_down_zablokowany == 0) // klawisz KEY_UP był zwolniony i został wciśnięty<br />           {<br />           key_down_nacisniety = 1;<br />           key_down_zablokowany = 1;<br />           }<br /><br />           else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />           {<br />           key_down_zablokowany = 0;<br />           }<br /><br />           if ( !(PINB &amp; KEY_SET) &amp;&amp; key_set_zablokowany == 0) // klawisz KEY_UP był zwolniony i został wciśnięty<br />           {<br />           key_set_nacisniety = 1;<br />           key_set_zablokowany = 1;<br />           }<br /><br />           else if ( PINB &amp; KEY_DOWN) //klawisz jest puszczony<br />           {<br />           key_set_zablokowany = 0;<br />           }<br /><br />           }<br /><br />           if (0 == SoftTimer2)<br /><br />                {<br />                    SoftTimer2 = 10;<br />                    //if (key_up_nacisniety)<br />                    //{<br />                    //key_up_nacisniety = 0;<br />                    //h++;<br />                    //}<br /><br />                    //if (key_down_nacisniety)<br />                    //{<br />                    //key_down_nacisniety = 0;<br />                    //h--;<br />                    //}<br /><br />                    lcd_locate(0,4);<br />                    if(h &lt; 10) lcd_str(&quot;0&quot;);<br />                    lcd_int(h);<br />                    lcd_str(&quot;:&quot;);<br />                    lcd_locate(0,7);<br />                    if(m &lt; 10) lcd_str(&quot;0&quot;);<br />                    lcd_int(m);<br />                    lcd_str(&quot;:&quot;);<br />                    lcd_locate(0,10);<br />                    if(s &lt; 10) lcd_str(&quot;0&quot;);<br />                    lcd_int(s);<br /><br />                    lcd_locate(1,0);<br />                    lcd_str(&quot;flaga:&quot;);<br />                    lcd_int(int0_flag);<br />                    lcd_str(&quot; ustaw:&quot;);<br />                    lcd_int(ustaw);<br /><br /><br /><br />                }<br />        }<br />}<br /><br />ISR(TIMER2_COMP_vect){<br />        uint16_t n;<br />        n = SoftTimer1;<br />        if(n) SoftTimer1 = --n;<br />        n = SoftTimer2;<br />        if (n) SoftTimer2 = --n;<br />}[/syntax]<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 25 kwi 2015, o 10:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-24T21:56:52+01:00</updated>
<published>2015-04-24T21:56:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127426#p127426</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127426#p127426"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127426#p127426"><![CDATA[
Teraz po jednokrotnym przyciśnięciu zlicza po dwa w górę, a po przytrzymaniu też zlicza tylko bardzo szybko. Warunki zrobiły się jakieś takie ubogie.<br /><br />[syntax=c]if (0 == SoftTimer1) //SoftTimer1 zmniejszany co 10ms w przerwaniu timera<br />                {<br />                        SoftTimer1 = 4;<br />                        if ( !(PINB &amp; (1 &lt;&lt; PB0)) ) //klawisz na PB0 był puszczony i został wciśnięty<br />                        {<br />                                key_set_nacisniety = 1;<br />                        }<br />                        else if ( PINB &amp; (1 &lt;&lt; PB0)) //klawisz jest puszczony<br />                        {<br /><br />                        }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 24 kwi 2015, o 21:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-24T21:50:32+01:00</updated>
<published>2015-04-24T21:50:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127425#p127425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127425#p127425"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127425#p127425"><![CDATA[
Różnica będzie przy trzymaniu klawisza. Zakomentowałeś w złym miejscu, a jak sobie usuniesz tą zmienną to wystarczy też usunąć ją z kodu i poprawnie się skompiluje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 kwi 2015, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-24T21:05:40+01:00</updated>
<published>2015-04-24T21:05:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127421#p127421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127421#p127421"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127421#p127421"><![CDATA[
Nic się nie zmieniło - nadal zlicza w górę po naciśnięciu PB0. Coś robię źle!<br /><br />[syntax=c]//uint8_t key_set_zablokowany = 1;<br />uint8_t key_set_nacisniety = 0;<br />uint8_t licznik = 0;[/syntax]<br /><br />Coś jest nie tak z tymi warunkami. Może źle napisałem?<br /><br />[syntax=c]SoftTimer1 = 4;<br />                             if ( !(PINB &amp; (1 &lt;&lt; PB0)) &amp;&amp; key_set_zablokowany == 0) //klawisz na PB0 był puszczony i został wciśnięty<br />                             {<br />                                     key_set_zablokowany = 1;<br />                                     key_set_nacisniety = 1;<br />                             }<br />                             else if ( PINB &amp; (1 &lt;&lt; PB0)) //klawisz jest puszczony<br />                             {<br />                                     key_set_zablokowany = 0;<br />                             }[/syntax]<br /><br />Nie mogę wyrzucić zmiennej key_set_zablokowany bo zrujnuję warunki!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 24 kwi 2015, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-24T20:59:20+01:00</updated>
<published>2015-04-24T20:59:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127420#p127420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127420#p127420"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127420#p127420"><![CDATA[
A teraz zmień:<br />[syntax=c]key_set_zablokowany = 1;[/syntax]<br />na:<br />[syntax=c]//key_set_zablokowany = 1;[/syntax]<br />albo w ogóle wywal tą zmienną i zobacz co się stanie. <br /><br />Na autoinkrementację są lepsze sposoby.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 kwi 2015, o 20:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-24T20:40:48+01:00</updated>
<published>2015-04-24T20:40:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127418#p127418</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127418#p127418"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127418#p127418"><![CDATA[
Uzyskałem efekt zwiększania liczby o jeden przy każdym naciśnięciu przycisku PB0. Rozumiem, że po restarcie, warunek pierwszy jest spełniony i możliwe są ustawienia licznika. Czuję, że stąd już krok (ale duży) do zaimplementowania tego w moim zegarze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 24 kwi 2015, o 20:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-24T20:11:44+01:00</updated>
<published>2015-04-24T20:11:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127415#p127415</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127415#p127415"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127415#p127415"><![CDATA[
<div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Rozumiem, że do przycisku SET, przypisane są zmienne: key_set_zablokwany (tzn. „dłuższe” przytrzymanie), key_set_nacisniety (tzn. „krótkie naciśnięcie).<br /></div><br />Jest tylko krótkie naciśnięcie. <em>key_set_zablokwany</em> blokuje ustawianie zmiennej <em>key_set_nacisniety</em> w przypadku trzymania klawisza.<br /><div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Jakie działania są wykonywane po sprawdzeniu tych warunków?<br /></div><br />Zmienna <em>key_set_nacisniety</em> jest używana w innej części kodu. Tam, gdzie wyświetlamy coś na LCD.<br /><div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Skąd wartość SoftTimer=4?<br /></div><br />Ta wartość określa jak często będzie się wykonywać fragment kodu od if (0 == SoftTimer1) do klamry zamykającej. W tym przypadku 40 ms. Procesor jest zbyt szybki dla niektórych operacji i w taki sposób wykonuje się różne akcje co określony czas.<div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Jak przejść w tryb programowania, aby godzina (hh) zaczęła mrugać na LCD. Nie bardzo ogarniam całość „blokowo”.<br /></div> Masz to w części kodu z drugim timerem programowym. Ta część kodu wykonuje się co 100ms, ale skoro masz już ten krótki kod testowy to tamto zostaw na chwilę. Rzuć okiem na ten kod:<br />[syntax=c]volatile uint16_t SoftTimer1, SoftTimer2;<br /> <br />int main(void)<br />{<br />        uint8_t key_set_zablokowany = 0;<br />        uint8_t key_set_nacisniety = 0;<br />        uint8_t licznik = 0; <br />        PORTB |= (1&lt;&lt;PB0); //podciągnięcie wejścia do plusa zasilania<br />        TCCR2  |= (1&lt;&lt;WGM21);   // CTC<br />        TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // 1024<br />        OCR2  = 108;   // 10ms<br />        TIMSK  = (1&lt;&lt;OCIE2); // odblokowanie CompareMatch<br /> <br />        sei();<br />        lcd_init();<br /> <br />        while(1)<br />        {<br />                if (0 == SoftTimer1) //SoftTimer1 zmniejszany co 10ms w przerwaniu timera<br />                {<br />                        SoftTimer1 = 4;<br />                        if ( !(PINB &amp; (1 &lt;&lt; PB0)) &amp;&amp; key_set_zablokowany == 0) //klawisz na PB0 był puszczony i został wciśnięty<br />                        {<br />                                key_set_zablokowany = 1;<br />                                key_set_nacisniety = 1;<br />                        }<br />                        else if ( PINB &amp; (1 &lt;&lt; PB0)) //klawisz jest puszczony<br />                        {<br />                                key_set_zablokowany = 0;<br />                        }<br />                        //itd.<br />                }<br />                if (0 == SoftTimer2)<br />                {<br />                        SoftTimer2 = 10;<br />                        if (key_set_nacisniety)<br />                        {<br />                                key_set_nacisniety = 0;<br />                                ++licznik;<br />                        }<br />                        lcd_locate(0,0);<br />lcd_int(licznik);<br />lcd_str(&quot;  &quot;);<br />                }<br />        }<br />}<br /> <br />ISR(TIMER2_COMP_vect){<br />        uint16_t n;<br />        n = SoftTimer1;<br />        if(n) SoftTimer1 = --n;<br />        n = SoftTimer2;<br />        if (n) SoftTimer2 = --n;<br />}[/syntax]<br /><br />PS. zwróć uwagę na to wyrażenie:<br />!(PINB &amp; (1 &lt;&lt; PB0)) bo musiałem poprawić<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 kwi 2015, o 20:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-24T18:16:25+01:00</updated>
<published>2015-04-24T18:16:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127404#p127404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127404#p127404"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127404#p127404"><![CDATA[
Witam!<br />Ponownie proszę o dalszą pomoc w ustawianiu godziny.<br />Utworzyłem dwa timery programowe: SoftTimer1 i SoftTimer2 dekrementowane co 10ms w przerwaniu CompareMatch timera sprzętowego TIMER2. Czy dobrze je zdefiniowałem?<br /><br />[syntax=c]volatile uint16_t SoftTimer1, SoftTimer2;<br /><br />int main(void)<br />{<br /><br />TCCR2  |= (1&lt;&lt;WGM21);   // CTC<br />TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // 1024<br />OCR2  = 108;   // 10ms<br />TIMSK  = (1&lt;&lt;OCIE2); // odblokowanie CompareMatch<br /><br />sei();<br /><br />while(1)<br />{<br /><br />}<br />}<br /><br />ISR(TIMER2_COMP_vect){<br />uint16_t n;<br />n = SoftTimer1;<br />if(n) SoftTimer1 = --n;<br />n = SoftTimer2;<br />if (n) SoftTimer2 = --n;<br />}[/syntax]<br /><br />Teraz chciałbym oprogramować przycisk SET (PB0), aby wejść w tryb ustawiania zegara. Analizuję kod Kolegi Krauser i trochę się pogubiłem.<br /><br />[syntax=c]if (0 == SoftTimer1) //SoftTimer1 zmniejszany co 10ms w przerwaniu timera<br />                {<br />                        SoftTimer1 = 4;<br />                        if ((!PINB &amp; (1 &lt;&lt; PB0)) &amp;&amp; key_set_zablokowany == 0) //klawisz na PB0 był puszczony i został wciśnięty<br />                        {<br />                                key_set_zablokowany = 1;<br />                                key_set_nacisniety = 1;<br />                        }<br />                        else if ( PINB &amp; (1 &lt;&lt; PB0)) //klawisz jest puszczony<br />                        {<br />                                key_set_zablokowany = 1;<br />                        }<br />                        //itd.<br />                }[/syntax]<br /><br />Rozumiem, że do przycisku SET, przypisane są zmienne: key_set_zablokwany (tzn. „dłuższe” przytrzymanie), key_set_nacisniety (tzn. „krótkie naciśnięcie). W pierwszym obiegu pętli while sprawdzamy czy przycisk SET jest naciśnięty oraz czy zmienna key_set_zablokowany ma wartość 0. Jeżeli tak (oba warunki prawdziwe) to zmienna key_set_zablokowany zmienia wartość na 1, a zmienna key_set_nacisniety przyjmuje wartość 1. Jeżeli nie to sprawdzamy drugi warunek po elese: czy klawisz SET jest zwolniony. Jeżeli tak to zmiennej key_set_zablokowany przypisujemy wartość 0. <br />Jakie działania są wykonywane po sprawdzeniu tych warunków? Skąd wartość SoftTimer=4? Jak przejść w tryb programowania, aby godzina (hh) zaczęła mrugać na LCD. Nie bardzo ogarniam całość „blokowo”.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 24 kwi 2015, o 18:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-23T22:48:58+01:00</updated>
<published>2015-04-23T22:48:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127325#p127325</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127325#p127325"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127325#p127325"><![CDATA[
Dziękuję, jutro się pomęczę i dam znać co z tego wynknie. Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 23 kwi 2015, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-23T22:34:47+01:00</updated>
<published>2015-04-23T22:34:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127323#p127323</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127323#p127323"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127323#p127323"><![CDATA[
Wartość do tych zmiennych przypisuje się po to, że by później sprawdzając w warunkach co w nich jest sterować działaniem programu i dobrze myślisz, że trzeba je sobie zdefiniować wcześniej. Dla ułatwienia napisz sobie prosty licznik wciśnięć klawisza z prezentacją wyniku na LCD i pobaw się. Jak to opanujesz to nie stracisz czasu w razie pomyłki w dużym kodzie, gdzie trudno będzie wyłapać błąd.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 kwi 2015, o 22:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-23T22:10:03+01:00</updated>
<published>2015-04-23T22:10:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127316#p127316</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127316#p127316"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127316#p127316"><![CDATA[
Czyli reasumując warunek można zrozumieć tak:<br />Jeżeli przycisk jest przyciśnięty i przytrzymany to zmiennej key_set_zablokowany i key_set_nacisniety przypisujemy wartość 1 (co to oznacza?)<br />w przeciwnym razie przycisk jest puszczony i zmiennej key_set_zablokowany przypisujemy wartość 0.<br /><br />Rozumiem, że klawiszem set przerywamy odczyt czasu i wchodzimy w tryb ustawiania. i na początku musimy zdefiniować zmienne przydatne w trybie ustawiania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 23 kwi 2015, o 22:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-04-24T20:12:24+01:00</updated>
<published>2015-04-23T21:49:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127306#p127306</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127306#p127306"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127306#p127306"><![CDATA[
Dobrze interpretujesz. Zmienna key_set_zablokowany służy do tego, że jak klawisz jest trzymany to zmienna key_set_nacisniety nie zostanie ponownie ustawiona. Zmienna key_set_nacisniety jest używana do przekazania informacji, że klawisz został wciśnięty do innego kawałka kodu. Przy okazji zauważyłem, że zrobiłem błąd bo jak klawisz jest puszczony key_set_nacisniety powinna zostać wyzerowana, aby po ponownym naciśnięciu warunki były spełnione i kolejne wciśnięcie odnotowane:<br />[syntax=c]if ( !(PINB &amp; (1 &lt;&lt; PB0)) &amp;&amp; key_set_zablokowany == 0) //klawisz na PB0 był puszczony i został wciśnięty<br />{<br />   key_set_zablokowany = 1; <br />   key_set_nacisniety = 1;<br />}<br />else if ( PINB &amp; (1 &lt;&lt; PB0)) //klawisz jest puszczony<br />{<br />   key_set_zablokowany = 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 kwi 2015, o 21:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[avrfun]]></name></author>
<updated>2015-04-23T21:31:51+01:00</updated>
<published>2015-04-23T21:31:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127299#p127299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127299#p127299"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127299#p127299"><![CDATA[
Dziękuję bardzo - właśnie posiłkuję się BB i poradnikami, ale nie wiem czy mój tok myślenia o tym warunku jest poprawny?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9310">avrfun</a> — 23 kwi 2015, o 21:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-04-23T21:28:11+01:00</updated>
<published>2015-04-23T21:28:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127296#p127296</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127296#p127296"/>
<title type="html"><![CDATA[Re: Problem z obsługą PCF8583 w języku C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11386&amp;p=127296#p127296"><![CDATA[
<div class="quotetitle">avrfun napisał(a):</div><div class="quotecontent"><br />Bardzo to skomplikowane. Gdzie mógłbym poczytać o obsłudze klawiszy z użyciem timerów programowych?<br /></div><br />W Bluebooku i na blogu <!-- w --><a class="postlink" href="http://www.mirekk36.blogspot.com" >www.mirekk36.blogspot.com</a><!-- w --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 23 kwi 2015, o 21:28</p><hr />
]]></content>
</entry>
</feed>