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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-24T14:03:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11767&amp;mode</id>
<entry>
<author><name><![CDATA[MirekP]]></name></author>
<updated>2015-05-24T14:03:35+01:00</updated>
<published>2015-05-24T14:03:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=130001#p130001</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=130001#p130001"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=130001#p130001"><![CDATA[
Odkryłem ze za zawieszanie programu odpowiedzialna jest funkcja<br /><br /><br /><span style="color: #FF0000">Źle zamieszczony listing - Różowo-zielony J.</span><br /><br />Moje pytanie czy dochodzi tu do przepełnienia stosu używam tu zmiennych typu static. Jak obejść problem by nadal mieć możliwość uśredniania pomiarów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1621">MirekP</a> — 24 maja 2015, o 14:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jerrylu]]></name></author>
<updated>2015-05-23T16:17:59+01:00</updated>
<published>2015-05-23T16:17:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129926#p129926</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129926#p129926"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129926#p129926"><![CDATA[
Przede wszystkim zastosuj polecany przez Mirka sposób na debugowanie programu - debuger jednodiodowy.<br />Ustalisz tym sposobem, gdzie program utyka zaoszczędzając multum czasu.<br />Jak będziesz wiedział, gdzie jest problem, rozwiążesz go sam, lub zadasz konkretne pytanie.<br />Kodu w takiej postaci i ilości raczej nikt nie zechce analizować, jak już wczesniej wspomniano.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8719">jerrylu</a> — 23 maja 2015, o 16:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirekP]]></name></author>
<updated>2015-05-23T15:37:55+01:00</updated>
<published>2015-05-23T15:37:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129924#p129924</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129924#p129924"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129924#p129924"><![CDATA[
Pytanie czy zmniejszać czy zwiększać preskaler aby odmierzyć sekundę która opcja poprawi stabilność działania?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1621">MirekP</a> — 23 maja 2015, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirekP]]></name></author>
<updated>2015-05-23T11:04:00+01:00</updated>
<published>2015-05-23T11:04:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129901#p129901</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129901#p129901"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129901#p129901"><![CDATA[
Problem nie jest z menu bo jak zakomentuje obsługę menu to i tak sie zawiesi<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1621">MirekP</a> — 23 maja 2015, o 11:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-21T10:34:48+01:00</updated>
<published>2015-05-21T10:34:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129765#p129765</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129765#p129765"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129765#p129765"><![CDATA[
<div class="quotetitle">MirekP napisał(a):</div><div class="quotecontent"><br />Mam problem z programem który zawiesza mi się co jakiś czas<br /></div><br />Przyznam szczerze, że spróbowałem rzucić okiem, ale niestety ZAWIESZAM się za każdym razem czytając ten hektar kodu. Nie dziwię się więc, że procek się zawiesza ale i też sam autor co widać.<br /><br />Język C daje OGROMNE możliwości podziału projektu na logiczne bloki funkcjonalne w postaci funkcji, które można jeszcze umieszczać w różnych plikach projektu. Proponuję zacząć jednak uczyć się właśnie tego - jeśli chodzi o C ... a nie pisać takiego (proszę się nie obrazić) &quot;potworka&quot; .... Już to że milion linii kodu to pal pies - ale właśnie te zagnieżdżenia do tego w ramach jednego pliku ? masakra ....<br /><br />Tu jednak szczerze koledze polecam Bluebooka<br /><!-- m --><a class="postlink" href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />od tego warto zacząć - bo to co widać w załączniku w pierwszym poście to niestety tak jakby ktoś żywcem z Bascoma projekt przepisał <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 maja 2015, o 10:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2015-05-21T09:17:19+01:00</updated>
<published>2015-05-21T09:17:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129761#p129761</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129761#p129761"/>
<title type="html"><![CDATA[Re: Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129761#p129761"><![CDATA[
Właśnie, program dość nie czytelny - ale każdy ma swój styl ... <br />Polecam takie rozwiązanie, otóż weź sobie podłącz do pozostałych pinów (jeśli takie są) ledy, następnie w każdej z procedurek funkcji zapalaj i gaś leda po wyjściu z niej. Wtedy zobaczysz chociaż której procedurce się zawiesza... albo zamiast ledów np wypluwać na uarta znak informujący jaka procedurka czy sekcja programu działa...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 21 maja 2015, o 09:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirekP]]></name></author>
<updated>2015-05-20T21:55:40+01:00</updated>
<published>2015-05-20T21:55:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129738#p129738</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129738#p129738"/>
<title type="html"><![CDATA[Zawieszanie sie programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11767&amp;p=129738#p129738"><![CDATA[
Witam <br />Mam problem z programem który zawiesza mi się co jakiś czas, nie mam pomysłu co może być nie tak. Sprzętowo raczej jest wszystko ok bo inny prostszy program chodzi bez zażutu testowany 2 dni a ten poniżej przedstawiony co jkąś godzine ew 2 sie zawiesza. Dodam że korzystam do obsługi wyświetlacza led z standardowej biblioteki umieszczonej w bluebooku wyk przerwania z (timera 1). w załączniku plik main. Prosze o sugestie co może być nie tak. Pozdrawiam.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2015-04-07<br /> *       Autor: Mirosław Pastor<br /> *<br /><br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;LED/d_led.h&quot;<br /><br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br /><br />#define PCF8583_ADDR 0xA2<br /><br />//-----------------Flagi zgłoszenia przerwań-------------------------------------------------------<br />volatile uint8_t s1_flag; /* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t s0_flag; /* flaga tyknięcia timera t0 */<br />//-------------------------------------------------------------------------------------------------<br />//Definicja klawiszy funkcyjnych<br />#define MENU_KEY (1&lt;&lt;PD5)<br />#define UP_KEY (1&lt;&lt;PD7)<br />#define DOWN_KEY (1&lt;&lt;PD4)<br />#define ESC_KEY (1&lt;&lt;PD6)<br />#define KEY_PIN PIND<br /><br />//-------------------DEF ZNAKÓW MENU---------------------------------------------------------------<br />enum {<br />t = 14, t_dp, U, U_dp, H, H_dp, P, P_dp, Z, Z_dp, S, C, A, F, M, G, O, E, d<br />};<br />//-------------------------------------------------------------------------------------------------<br /><br />//------------------------ADC---------------------------------------------------------------------<br />#define VREF_256 (1&lt;&lt;REFS0)|(1&lt;&lt;REFS1) //REFS21<br />//----------------------<br />uint16_t pomiar(uint8_t kanal);<br />//-----------------------------------<br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br />// Rozmiar bufora służącego do wyliczania średniej z pomiarów ADC<br />#define SR 8<br />// Pomoc przy uśrednianiu wyników z ADC<br />typedef struct {<br />uint16_t ref_adc;<br />uint16_t ref_v;<br />uint16_t vol;<br /><br />} TVOL;<br /><br />//uint16_t tab_pom1&#91;3&#93; = { 0 }, tab_pom2&#91;3&#93; = { 0 }, tab_pom3&#91;3&#93; = { 0 };<br />//-------------------------------------------------------------------------------------------------<br /><br />//-----------------------EEPROM-------------------------------------------------------------------<br />// utworzenie typu u08, odpowiednika uint8_t aby kod był bardziej czytelny<br />typedef unsigned char u08;<br />typedef unsigned short u16;<br /><br />#define EEMEM __attribute__((section(&quot;.eeprom&quot;)))<br />// odczyt danych z pamięci EEPROM<br />void EI2C_read_buf(u08 device, u16 subAddr, u16 len, u08 *buf);<br />// zapis danych do pamięci EEPROM<br />void EI2C_write_buf(u08 device, u16 subAddr, u16 len, u08 *buf);<br />//Ustawienia użytkownika<br />typedef struct {<br />uint8_t his_pp;<br />uint8_t his_pc;<br />uint8_t delta_temp_pp;<br />uint8_t delta_temp_pc;<br />uint8_t minutyPP;<br />uint8_t godzPP;<br />uint8_t minutyPC;<br />uint8_t godzPC;<br />uint8_t czas_zal_godz_PP;<br />uint8_t czas_zal_min_PP;<br />uint8_t czas_zal_godz_PC;<br />uint8_t czas_zal_min_PC;<br />} DANE;<br /><br />//static uint8_t his_pp;<br />//static uint8_t his_pc;<br />//static uint8_t delta_temp_pp;<br />//static uint8_t delta_temp_pc;<br /><br />DANE store EEMEM;<br />DANE user_data;<br /><br />//-------------------------------------------------------------------------------------------------<br /><br />//-------------------FUNKCJE POMOCNICZE------------------------------------------------------------<br />void show_time(uint8_t sekundy, uint8_t minuty, uint8_t godziny);<br />void show_mesure(uint16_t mesure);<br />void show_option(uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4);<br />void show_setings(uint8_t d1, uint8_t d2, uint8_t value);<br />void get_vol(uint16_t adc, TVOL * voltage);<br />uint8_t klawisz_wcisniety(uint8_t klawisz);<br />void menu(DANE dane);<br />//-------------------------------------------------------------------------------------------------<br /><br />int main(void) {<br /><br />DDRD &amp;= ~(MENU_KEY | UP_KEY | DOWN_KEY | ESC_KEY);<br />PORTD |= (MENU_KEY | UP_KEY | DOWN_KEY | ESC_KEY);<br /><br />d_led_init();<br /><br />//-----------------------------<br /><br />/* ustawienie TIMER0 dla F_CPU=1MHz */<br />TCCR2 |= (1 &lt;&lt; WGM21); /* tryb CTC */<br />TCCR2 |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS20); /* preskaler = 64 */<br />OCR2 = 156; /* dodatkowy podział przez 156 (rej. przepełnienia) */<br />TIMSK |= (1 &lt;&lt; OCIE2); /* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 20ms (50 razy na sekundę) */<br /><br />//------------------------------<br />ADMUX |= VREF_256; //Zewnętrzne źródło napięcia odniesienia 2,56V<br />//włączenie modułu ADC ustawienie preskalera na 64<br />ADCSRA |= (1 &lt;&lt; ADEN) | (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS1) | (1 &lt;&lt; ADPS0); //64khz |(1&lt;&lt;ADPS0)<br /><br />TVOL adc1, adc2, adc3;<br />//DANE dane;<br /><br />adc1.ref_adc = 90;<br />adc1.ref_v = 24;<br />adc2.ref_adc = 90;<br />adc2.ref_v = 24;<br />adc3.ref_adc = 90;<br />adc3.ref_v = 24;<br /><br />//--------------------------------<br />// definiujemy sobie dla polepszenia czytelności programu typ wyliczeniowy<br />// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br />enum {<br />ss = 1, mm, hh<br />};<br />uint8_t bufor&#91;4&#93;; // rezerwacja bufora 4 bajty<br />uint8_t sekundy = 0, minuty = 0, godziny = 0;<br />uint16_t mesure_t1, mesure_t2, mesure_t3;<br /><br />sei();<br /><br />// Ustawianie czasu na godzinę: 18:34:00<br />bufor&#91;0&#93; = 0; // setne części sekundy<br />bufor&#91;1&#93; = dec2bcd(00); // sekundy<br />bufor&#91;2&#93; = dec2bcd(34); // minuty<br />bufor&#91;3&#93; = dec2bcd(18); // 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 />uint8_t d1, d2, d3, d4;<br />uint16_t wynik1, wynik2, wynik3;<br /><br />eeprom_busy_wait();<br />eeprom_read_block(&amp;user_data, &amp;store, sizeof(user_data));<br /><br />///----------------------------------<br /><br />///-------------------------------------<br /><br />while (1) {<br /><br />if (s1_flag) {<br />//odczyt 4 bajtów do bufora od adresu 0x01 z pamięci RAM naszego RTC<br />TWI_read_buf(PCF8583_ADDR, 0x01, 4, bufor);<br /><br />sekundy = bcd2dec(bufor&#91;ss&#93;);<br />minuty = bcd2dec(bufor&#91;mm&#93;);<br />godziny = bcd2dec(bufor&#91;hh&#93;);<br /><br />//wyswietlanie na LED pomiarów z kanałów 7,6,5 przetwornika A/C<br /><br />mesure_t1 = (pomiar(5));<br />mesure_t2 = (pomiar(4));<br />mesure_t3 = (pomiar(7));<br /><br />s1_flag = 0;<br />}<br /><br />if (klawisz_wcisniety(MENU_KEY))<br />menu(user_data);<br /><br />get_vol(mesure_t1, &amp;adc1);<br />get_vol(mesure_t2, &amp;adc2);<br />get_vol(mesure_t3, &amp;adc3);<br /><br />wynik1 = adc1.vol;<br />wynik2 = adc2.vol;<br />wynik3 = adc3.vol;<br /><br />if ((sekundy &gt;= 0) &amp;&amp; (sekundy &lt; 15)) {<br /><br />show_time(sekundy, minuty, godziny);<br /><br />}<br /><br />else if ((sekundy &gt;= 15) &amp;&amp; (sekundy &lt; 30)) {<br /><br />cy1 = 14;<br />cy2 = 12;<br />d3 = (wynik2) / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = (wynik2 - (d3 * 10));<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br /><br />} else if ((sekundy &gt;= 30) &amp;&amp; (sekundy &lt; 45)) {<br />cy1 = 14;<br />cy2 = 13;<br />d3 = (wynik3) / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = (wynik3 - (d3 * 10));<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br />} else if ((sekundy &gt;= 45) &amp;&amp; (sekundy &lt; 60)) {<br /><br />cy1 = 14;<br />cy2 = 11;<br />d3 = (wynik1) / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = (wynik1 - (d3 * 10));<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br />}<br /><br />};<br /><br />}<br />//------------FUNKCJE-POMOCNICZE-----------------------------<br />//-----------------------------------------------------------<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 />// odczyt danych z pamięci EEPROM<br />void EI2C_read_buf(u08 device, u16 subAddr, u16 len, u08 *buf) {<br /><br />while (len--) {<br />TWI_start();<br />TWI_write(device | ((subAddr &gt;&gt; 8) &lt;&lt; 1));<br />TWI_write(subAddr);<br />TWI_start();<br />TWI_write(device + 1);<br />*buf++ = TWI_read(NACK);<br />TWI_stop();<br />subAddr++;<br />}<br /><br />}<br /><br />// zapis danych do pamięci EEPROM<br />void EI2C_write_buf(u08 device, u16 subAddr, u16 len, u08 *buf) {<br /><br />while (len--) {<br />TWI_start();<br />// ustawienie 9 bitu adresu pamięci EEPROM w ramach<br />// sprzętowego adresu urządzenia na pozycji bitu 1 (nr.2)<br />TWI_write(device | ((subAddr &gt;&gt; 8) &lt;&lt; 1));<br />TWI_write(subAddr);<br /><br />TWI_write(*buf++);<br /><br />TWI_stop();<br />_delay_ms(5); // oczekiwanie na zapis<br />subAddr++;<br />}<br />}<br />//--------------------------------------------<br />uint16_t pomiar(uint8_t kanal) {<br />//ustawienie wybranego kanalu w rejestrze ADMUX<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />//start pomiaru przez ustawienie bitu ADSC w rejestrze  ADCSR<br />ADCSRA |= (1 &lt;&lt; ADSC);<br />//oczekiwanie na koniec pomiaru dopuki bit ADSC jest =1<br />while (ADCSRA &amp; (1 &lt;&lt; ADSC))<br />;<br />//po zakończeniu pomiaru gdy bit ADSC =0 zwrucenie wyniku<br />// w postaci 16 bitowej wartosci z rejestrów ADCH oraz ADCL<br />return ADCW;<br />}<br />//----------------------WEKTORY-PRZERWAŃ-------------------------<br />//---------------------------------------------------------------<br /><br />// procedura obsługi przerwania od timera 2<br />ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t cnt = 0; /* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if (++cnt &gt; 50) { /* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag = 1; /* ustaw flagę tyknięcia sekundy */<br />cnt = 0; /* wyzeru licznik setnych ms */<br />}<br />}<br />// srednia ciągnięta z pomiarów ADC<br />void get_vol(uint16_t adc, TVOL * voltage) {<br />static uint16_t sr&#91;SR&#93;;<br />static uint8_t idx;<br />uint32_t sr1 = 0;<br />uint8_t i;<br /><br />sr&#91;idx&#93; = adc;<br />idx++;<br />if (idx &gt; 7)<br />idx = 0;<br /><br />for (i = 0; i &lt; SR; i++)<br />sr1 += sr&#91;i&#93;;<br />sr1 /= SR;<br />uint16_t wynik = (sr1 * (uint32_t) voltage-&gt;ref_v) / voltage-&gt;ref_adc;<br />voltage-&gt;vol = wynik;<br /><br />}<br />//---------------------------------------------------------------------<br /><br />void show_time(uint8_t sekundy, uint8_t minuty, uint8_t godziny) {<br /><br />uint8_t d1, d2, d3, d4;<br />d1 = godziny / 10;<br />if (d1)<br />cy1 = d1;<br />else<br />cy1 = 0;<br />d2 = godziny % 10;<br />if (d2)<br />cy2 = d2;<br />else<br />cy2 = 0;<br />d3 = minuty / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = minuty % 10;<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br />}<br /><br />void show_mesure(uint16_t mesure) {<br />uint16_t d3, d4;<br />d3 = mesure / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = mesure % 10;<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br />}<br />void show_setings(uint8_t d1, uint8_t d2, uint8_t value) {<br /><br />uint16_t d3, d4;<br /><br />if (d1)<br />cy1 = d1;<br />else<br />cy1 = 10;<br />if (d2)<br />cy2 = d2;<br />else<br />cy2 = 10;<br /><br />d3 = value / 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 0;<br />d4 = value % 10;<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 0;<br />}<br />void show_option(uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4) {<br /><br />if (d1)<br />cy1 = d1;<br />else<br />cy1 = 10;<br />if (d2)<br />cy2 = d2;<br />else<br />cy2 = 10;<br />if (d3)<br />cy3 = d3;<br />else<br />cy3 = 10;<br />if (d4)<br />cy4 = d4;<br />else<br />cy4 = 10;<br />}<br /><br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(KEY_PIN &amp; klawisz)) // klawisz wcisnięty?<br />{<br />_delay_ms(30); // czas drgania styków<br />if ((KEY_PIN &amp; klawisz))<br />return 1; //jesli tak zwróć 1<br />}<br />return 0; //jesli nie to 0<br />}<br /><br />void menu(DANE dane) {<br /><br />TIMSK &amp;= ~(1 &lt;&lt; OCIE2);<br /><br />show_option(10, 10, 10, 10);<br />uint8_t opcion = 1;<br />uint8_t bufor&#91;4&#93;; // rezerwacja bufora 4 bajty<br />uint8_t sekundy = 0, minuty = 0, godziny = 0;<br />//-----------------------do struktury-------------------------------------<br />//------------------------------------------------------------------------<br /><br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />opcion--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />opcion++;<br />}<br />if (opcion &gt;= 5)<br />opcion = 5; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (opcion &lt;= 1)<br />opcion = 1;<br /><br />switch (opcion) { //reakcja na nacisniete klawisze<br /><br />case 1:<br />show_option(C, Z, A, S);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br /><br />show_time(sekundy, minuty, godziny);<br /><br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />godziny = godziny + 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />minuty = minuty + 1;<br />}<br />if (godziny &gt; 24)<br />godziny = 0;<br />if (minuty &gt; 60)<br />minuty = 0;<br /><br />show_time(sekundy, minuty, godziny);<br /><br />bufor&#91;0&#93; = 0;<br />bufor&#91;1&#93; = dec2bcd(00); // sekundy<br />bufor&#91;2&#93; = dec2bcd(minuty); // minuty<br />bufor&#91;3&#93; = dec2bcd(godziny); // godziny<br />};<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 />break;<br />case 2:<br />show_option(H, 1, S, 10);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />uint8_t option_his = 1;<br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />option_his--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />option_his++;<br />}<br />if (option_his &gt;= 2)<br />option_his = 2; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (option_his &lt;= 1)<br />option_his = 1;<br />switch (option_his) {<br />case 1:<br />show_option(H, Z, P, P);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.his_pp = user_data.his_pp + 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.his_pp = user_data.his_pp - 1;<br />}<br />if (user_data.his_pp &gt;= 10)<br />user_data.his_pp = 10;<br /><br />if (user_data.his_pp &lt;= 1)<br />user_data.his_pp = 1;<br /><br />show_setings(P, P, user_data.his_pp);<br />}<br /><br />}<br />break;<br />case 2:<br />show_option(H, Z, P, C);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.his_pc = user_data.his_pc + 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.his_pc = user_data.his_pc - 1;<br />}<br />if (user_data.his_pc &gt;= 10)<br />user_data.his_pc = 10;<br /><br />if (user_data.his_pc &lt;= 1)<br />user_data.his_pc = 1;<br /><br />show_setings(P, C, user_data.his_pc);<br />}<br /><br /><br />}<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />}<br />break;<br />case 3:<br />show_option(P_dp, Z_dp, C, Z_dp);<br />//-----------------------------------<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />uint8_t option_zal_czas = 1;<br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />option_zal_czas--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />option_zal_czas++;<br />}<br />if (option_zal_czas &gt;= 2)<br />option_zal_czas = 2; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (option_zal_czas &lt;= 1)<br />option_zal_czas = 1;<br />switch (option_zal_czas) {<br />case 1:<br />show_option(P, P, 10, 10);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />uint8_t option_czasPP = 1;<br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />option_czasPP--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />option_czasPP++;<br />}<br />if (option_czasPP &gt;= 2)<br />option_czasPP = 2; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (option_czasPP &lt;= 1)<br />option_czasPP = 1;<br />switch (option_czasPP) {<br />case 1:<br />show_option(G, O, d, Z);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br /><br />show_time(0, user_data.minutyPP,<br />user_data.godzPP);<br /><br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.godzPP<br />= user_data.godzPP + 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.minutyPP<br />= user_data.minutyPP<br />+ 1;<br />}<br />if (user_data.godzPP &gt; 24)<br />user_data.godzPP = 0;<br />if (user_data.minutyPP &gt; 60)<br />user_data.minutyPP = 0;<br /><br />show_time(0, user_data.minutyPP,<br />user_data.godzPP);<br />};<br />}<br />break;<br />case 2:<br />show_option(C, Z, A, S);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br /><br />show_time(0, user_data.czas_zal_min_PP,<br />user_data.czas_zal_godz_PP);<br /><br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.czas_zal_godz_PP<br />= user_data.czas_zal_godz_PP<br />+ 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.czas_zal_min_PP<br />= user_data.czas_zal_min_PP<br />+ 1;<br />}<br />if (user_data.czas_zal_godz_PP &gt; 5)<br />user_data.czas_zal_godz_PP = 0;<br />if (user_data.czas_zal_min_PP &gt; 60)<br />user_data.czas_zal_min_PP = 0;<br /><br />show_time(0,<br />user_data.czas_zal_min_PP,<br />user_data.czas_zal_godz_PP);<br />};<br />}<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />}<br />break;<br />case 2:<br />show_option(P, C, 10, 10);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />uint8_t option_czasPC = 1;<br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />option_czasPC--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />option_czasPC++;<br />}<br />if (option_czasPC &gt;= 2)<br />option_czasPC = 2; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (option_czasPC &lt;= 1)<br />option_czasPC = 1;<br />switch (option_czasPC) {<br />case 1:<br />show_option(G, O, d, Z);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br /><br />show_time(0, user_data.minutyPC,<br />user_data.godzPC);<br /><br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.godzPC<br />= user_data.godzPC + 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.minutyPC<br />= user_data.minutyPC<br />+ 1;<br />}<br />if (user_data.godzPC &gt; 24)<br />user_data.godzPC = 0;<br />if (user_data.minutyPC &gt; 60)<br />user_data.minutyPC = 0;<br /><br />show_time(0, user_data.minutyPC,<br />user_data.godzPC);<br />};<br />}<br />break;<br />case 2:<br />show_option(C, Z, A, S);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br /><br />show_time(0, user_data.czas_zal_min_PC,<br />user_data.czas_zal_godz_PC);<br /><br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.czas_zal_godz_PC<br />= user_data.czas_zal_godz_PC<br />+ 1;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.czas_zal_min_PC<br />= user_data.czas_zal_min_PC<br />+ 1;<br />}<br />if (user_data.czas_zal_godz_PC &gt; 5)<br />user_data.czas_zal_godz_PC = 0;<br />if (user_data.czas_zal_min_PC &gt; 60)<br />user_data.czas_zal_min_PC = 0;<br /><br />show_time(0,<br />user_data.czas_zal_min_PC,<br />user_data.czas_zal_godz_PC);<br />};<br />}<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />}<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />}<br />//-----------------------------------------<br />break;<br />case 4:<br />show_option(t, E, M, P);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />uint8_t option_delta_temp = 1;<br />do {<br />if (klawisz_wcisniety(DOWN_KEY)) {<br />option_delta_temp--;<br />}<br />if (klawisz_wcisniety(UP_KEY)) {<br />option_delta_temp++;<br />}<br />if (option_delta_temp &gt;= 2)<br />option_delta_temp = 2; //jezeli przekroczono wyznaczoną liczbe opcji zatrzymaj sie na ostatniej<br />if (option_delta_temp &lt;= 1)<br />option_delta_temp = 1;<br />switch (option_delta_temp) {<br />case 1:<br />show_option(t_dp, Z_dp, P, P);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.delta_temp_pp++;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.delta_temp_pp--;<br />}<br />if (user_data.delta_temp_pp &gt;= 40)<br />user_data.delta_temp_pp = 40;<br /><br />if (user_data.delta_temp_pp &lt;= 1)<br />user_data.delta_temp_pp = 1;<br /><br />show_setings(P, P, user_data.delta_temp_pp);<br />}<br /><br /><br />}<br />break;<br />case 2:<br />show_option(t_dp, Z_dp, P, C);<br />if (klawisz_wcisniety(MENU_KEY)) //edycja<br />{<br />while (!klawisz_wcisniety(ESC_KEY)) { //edycja dopóki nie naciśniemy ESC<br />if (klawisz_wcisniety(UP_KEY)) //zwiększenie<br />{<br />user_data.delta_temp_pc++;<br />}<br />if (klawisz_wcisniety(DOWN_KEY)) //zmniejszenie<br />{<br />user_data.delta_temp_pc--;<br />}<br />if (user_data.delta_temp_pc &gt;= 40)<br />user_data.delta_temp_pc = 40;<br /><br />if (user_data.delta_temp_pc &lt;= 1)<br />user_data.delta_temp_pc = 1;<br /><br />show_setings(P, C, user_data.delta_temp_pc);<br />}<br />}<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />}<br />break;<br />case 5:<br />show_option(F, U, M, C);<br />break;<br />}<br /><br />} while (!klawisz_wcisniety(ESC_KEY)); //jezeli nacisnięty klawisz ESCAPE zakończ<br />show_option(10, 10, 10, 10);<br /><br />eeprom_busy_wait();<br />eeprom_write_block(&amp;user_data, &amp;store, sizeof(user_data));<br /><br />TIMSK |= (1 &lt;&lt; OCIE2);<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1621">MirekP</a> — 20 maja 2015, o 21:55</p><hr />
]]></content>
</entry>
</feed>