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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23638&amp;mode</id>
<entry>
<author><name><![CDATA[mario2015]]></name></author>
<updated>2021-03-04T14:36:05+01:00</updated>
<published>2021-03-04T14:36:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231279#p231279</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231279#p231279"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231279#p231279"><![CDATA[
Spróbuj tak:<br /><br />[syntax=c]while(1){<br />  <br /> if (stan1 == 1) {<br /><br />        kier++;<br />        stan1=0;}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8867">mario2015</a> — 4 mar 2021, o 14:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-03-03T20:44:46+01:00</updated>
<published>2021-03-03T20:44:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231266#p231266</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231266#p231266"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231266#p231266"><![CDATA[
Próbuję  poprawić obsługę styków udało mi się .<br />Wynikiem tego jak wciskam klawisz  KEY1_PIN zmienna stan1=1 , jak puszczam stan1=0 wydawało by się że jest ok ale nie do końca <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />  napotkałem na problem:<br /><br />[syntax=c]while(1) {<br /><br />if (stan1==1) kier++;<br /><br /><br />}[/syntax]<br /><br />I stało się tak że zmienna kier nie zmienia się co jeden tylko przelatuje dosyć szybko<br /><br />Jakie warunki ustawić żeby zmienna przyjęła 1 na jeden obieg pętli (może jakiś zatrzask ) rozjaśnijcie mi proszę<br /><br />Ustawienia funkcji wciśnięcia przycisku są takie:<br /><br />[syntax=c]key_press1(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br />  stan1=1;<br />  // reakcja na PRESS (wcinięcie przycisku)<br /><br /><br /> } else if( *klock &amp;&amp; key_press ) {<br /> (*klock)++;<br /> stan1=0;<br /> }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 3 mar 2021, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-03-02T22:49:33+01:00</updated>
<published>2021-03-02T22:49:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231263#p231263</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231263#p231263"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231263#p231263"><![CDATA[
Trochę poprawiłem poprzez wprowadzenie struktury , ale te If y denerwują mnie , a ja  nie mam pomysłu żeby było bardziej fachowo.<br />Myślałem żeby warunki zamknąć w jakiejś jednej funkcji podpowiedzcie jak mogę to zrobić?<br />Proszę o jakąś nawet małą wskazówkę<br /><br />Pokaże zmodyfikowany program:<br /><br />[syntax=c]// ######################################################################################################################################<br />//                                             ATMEGA 32  F 16000000 MHZ<br />//<br />//<br />// ######################################################################################################################################<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />//#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;EEKRANY/ekrany.h&quot;<br /><br />  struct {<br />   uint8_t xpoz;<br />   uint8_t ypoz;<br />   uint8_t poziom;<br />   char menu_1&#91;20&#93;;<br />   char menu_2&#91;20&#93;;<br />   char menu_3&#91;20&#93;;<br />   char menu_4&#91;20&#93;;<br /><br />} MENU;<br /><br /><br />uint8_t klawisz_wcisniety(uint8_t klawisz);<br />//uint8_t wynik (uint8_t kier_menu,uint8_t  stan_klawisz1, uint8_t  stan_klawisz2);<br /><br />// timery programowe<br /><br />volatile uint16_t Timer1,Timer ;<br />uint8_t sw1=0,flagg;<br />uint8_t stan_klawisz1,stan_klawisz2,t;<br />char tablica&#91;20&#93;;<br /><br /><br /><br /> void miganie (void);<br /> void FunkcjaDoModyfikacjiStringa  (char * twojnowystring);<br /> void FunkcjaDoWyswietlaniaStringa (char * tu_tez_twojstring, uint8_t pozycja_x,uint8_t pozycja_y);<br /><br />#define KEY1_PIN (1&lt;&lt;PD3)        // piny wejsciowe do obslugi menu<br />#define KEY2_PIN (1&lt;&lt;PD4)        // piny wejsciowe do obslugi menu<br /><br />uint8_t key_lock,x,kier_menu;    // kkier,menu_kier,stan_menu,sw;<br />uint16_t kier=0;                 // zmienna potrzebna do zmiany pokazywanych komórek<br />uint16_t y=0;<br /><br />// ---------------------   główna funkcja  programu main() -----------------------<br />int main(void)  {<br />                    MENU.poziom =1;<br />                DDRA |= (1&lt;&lt;PA7);<br />                PORTA |=(1&lt;&lt;PA7);<br />                DDRD &amp;= ~(KEY1_PIN);   // JAKO WEJSCIE<br />DDRD &amp;= ~(KEY2_PIN);   // JAKO WEJSCIE<br /><br />    PORTD |= KEY1_PIN;    // DODCIAGNIECIE DO VCC<br />    PORTD |= KEY2_PIN;    // PODCIAGNIECIE DO VCC<br /><br />/* timer2 - konfiguracja silnika timerów programowych */<br />TCCR2  |= (1&lt;&lt;WGM21);     // tryb pracy CTC<br />TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2   = 78;              // przerwanie  porównania co 10ms (100Hz)<br />TIMSK  = (1&lt;&lt;OCIE2);      // Odblokowanie przerwania ComareMatch<br /><br /> lcd_init();              // inicjalizacja lcd<br /> lcd_cls();               // kasowanie ekranu<br /><br /><br />sei();                  // globalne odblokowanie przerwania<br /><br /><br />// *************** pętla główna programu<br />while(1) {<br /><br /><br />     stan_klawisz1=klawisz_wcisniety ( KEY1_PIN );<br />     stan_klawisz2=klawisz_wcisniety ( KEY2_PIN );<br />     if (kier&gt;8191) kier=0;   // wartośc 8191 okresla rozmiar pamieci Eprom i ilosc nacisniec przycisku jest powyzej zerowana<br />     if (kier_menu&gt;3) kier_menu=0;<br /><br />     if( klawisz_wcisniety ( KEY1_PIN ) ){<br />     kier++;<br />     kier_menu++;<br />     }<br />     if( klawisz_wcisniety ( KEY2_PIN ) ){<br />     kier--;<br />     kier_menu--;<br />     }<br />      if( (kier_menu==0) &amp;&amp; MENU.poziom!=1 ) {<br /><br /><br />      if(  klawisz_wcisniety ( KEY1_PIN ) ){<br />                              FunkcjaDoModyfikacjiStringa(&quot;Kopiow&quot;);<br />                              MENU.xpoz=0;<br />                              MENU.ypoz=0;<br />                              MENU.poziom=1;<br />                              FunkcjaDoWyswietlaniaStringa( tablica,MENU.xpoz,MENU.ypoz);<br />                                           }<br />                                             }<br />     if( kier_menu==1 &amp;&amp; MENU.poziom!=2 ) {<br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br />                          FunkcjaDoModyfikacjiStringa(&quot;odczyt&quot;);<br />                          MENU.xpoz=1;<br />                          MENU.ypoz=0;<br />                          MENU.poziom=2;<br />                          FunkcjaDoWyswietlaniaStringa(tablica,MENU.xpoz,MENU.ypoz);<br /><br />                                          }<br /><br />                                       }<br />      if( kier_menu==2 &amp;&amp; MENU.poziom!=3) {<br /><br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br /><br />                        FunkcjaDoModyfikacjiStringa(&quot;Testow&quot;);<br />                        MENU.xpoz=0;<br />                        MENU.ypoz=8;<br />                        MENU.poziom=3;<br />                        FunkcjaDoWyswietlaniaStringa(tablica,MENU.xpoz,MENU.ypoz);<br />                                                 }<br />                                                 }<br />      if( kier_menu==3 &amp;&amp; MENU.poziom!=4) {<br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br />                    FunkcjaDoModyfikacjiStringa(&quot;Parametr&quot;);<br />                    MENU.xpoz=1;<br />                    MENU.ypoz=8;<br />                    MENU.poziom=4;<br />                    FunkcjaDoWyswietlaniaStringa(tablica,MENU.xpoz,MENU.ypoz);<br /><br />                                          }<br /><br />                                             }<br /><br /><br /><br />miganie();<br /><br /><br />                                                                  lcd_locate(3,12);<br />                                      lcd_int(MENU.xpoz);<br />                                      lcd_locate(3,14);<br />                                      lcd_int(MENU.ypoz);<br />                                      // kier_menu++;<br />                                      lcd_locate(3,8);<br />                                      lcd_int(MENU.poziom);<br /><br />      }<br /> }<br />uint8_t klawisz_wcisniety(uint8_t klawisz)<br /><br /> {<br />               if(!key_lock &amp;&amp; ! ( PIND &amp; klawisz) )<br />                   {<br />               key_lock=1;<br />              //_delay_ms(40);    // To jest niefahowe ale narazie tak wstawiłem<br />                 if( ! ( PIND &amp; klawisz) ) return 1;<br />                  }else if ( key_lock &amp;&amp; (PIND &amp; klawisz)) key_lock++;<br />       return 0;<br /> }<br /><br /> //*** przerwanie Timer2 CompareM<br />ISR(TIMER2_COMP_vect) {<br /><br />uint16_t n;<br /><br />n = Timer1;   /* 100Hz Timer */<br />if (n) Timer1 = --n;<br /><br />n = Timer;   /* 100Hz Timer */<br />if (n) Timer = --n;<br /><br /> }<br />void miganie (void){<br /><br />if (!Timer) {<br /><br />                                                          lcd_locate(0,0);<br />                                      lcd_str (&quot;Kopiow&quot;);<br />                                      lcd_locate(1,0);<br />                                      lcd_str (&quot;Odczyt&quot;);<br />                                      lcd_locate(0,8);<br />                                      lcd_str (&quot;Testow&quot;);<br />                                      lcd_locate(1,8);<br />                                      lcd_str (&quot;Parametr&quot;);<br />                                      lcd_locate(3,0);<br />                                      lcd_str (tablica);<br /><br /><br /><br /><br /> if( !sw1 ){<br />                                                                  lcd_locate(0,0);<br />                                       lcd_str (&quot;Kopiow&quot;);<br />                                       lcd_locate(1,0);<br />                                       lcd_str (&quot;Odczyt&quot;);<br />                                       lcd_locate(0,8);<br />                                       lcd_str (&quot;Testow&quot;);<br />                                       lcd_locate(1,8);<br />                                       lcd_str (&quot;Parametr&quot;);<br />                                       lcd_locate(3,0);<br />                                       lcd_str (tablica);<br /><br /> }<br /> else {                                          lcd_locate(MENU.xpoz,MENU.ypoz);<br />                                             lcd_str      (&quot;        &quot;);<br /><br /><br /> }<br /> sw1^=1;<br /><br /><br />        Timer =40;<br />   }<br /><br />}<br />void FunkcjaDoModyfikacjiStringa   (char * twojnowystring) {              // Tablica zawsze przekazywana jako wskaznik<br />        strcpy(tablica, twojnowystring);                                  // Dla uproszczenia twojnowystring&#91;&#93; &lt;= tablica&#91;&#93;<br /><br />}<br /><br />void FunkcjaDoWyswietlaniaStringa (char * tu_tez_twojstring, uint8_t pozycja_x,uint8_t pozycja_y) {<br /><br /><br />        lcd_locate(pozycja_x,pozycja_y);<br /><br />        lcd_str(tu_tez_twojstring);<br />        lcd_str      (&quot;        &quot;);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 2 mar 2021, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-03-02T09:46:21+01:00</updated>
<published>2021-03-02T09:46:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231257#p231257</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231257#p231257"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231257#p231257"><![CDATA[
Bardzo dziękuje za zainteresowanie tematem, już odpowiadam : <br />Założenie jest takie aby pozycja menu na którą chcę zatwierdzić po prostu migała, skorzystałem z przykładu z poradników gdzie Mirek pokazywał jak mogę zamigać np. w przerwaniu.<br />Ta zmienna sw1 służy tylko do tego celu.<br />Oczywiście dyleya wywaliłem i trochę poprawiło działanie programu.<br />Ale stoję trochę w miejscu bo jak zmieniam pozycje menu wciskając  KEY1_PIN to pozycje menu przeskakują i migają ale raz- że dzieje się to bardzo brzydko bo do ustalenia miga dziwnie wszystko.<br />Druga sprawa jak już miga dane menu to chciałem drugim przyciskiem KEY2_PIN to zatwierdzić i wejść do obsługi kolejnych  programów.<br />Problem polega na tym że nie mam pomysłu jak to zrobić.<br />Próbowałem pokazać wideo ale coś mi nie wyszło.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 2 mar 2021, o 09:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mario2015]]></name></author>
<updated>2021-03-01T19:28:09+01:00</updated>
<published>2021-03-01T19:28:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231248#p231248</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231248#p231248"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231248#p231248"><![CDATA[
A do czego służy ci zmienna sw1 w linii &quot;176      sw1^=1;&quot;, bo nie bardzo to widzę, chyba , że pominąłem coś w kodzie.<br />Widzę tylko jej deklarację w linii 22 i sprawdzanie ifem w linii 167, po czym ma się zmienić na stan przeciwny w linii 176.<br />No ale ta zmienna nigdzie w programie się nie zmienia i zawsze wynosi 0 tak jak ją zadeklarowałeś na początku programu. Chyba, że coś przeoczyłem.<br />Wstaw ten program po poprawkach, (już bez tego delaya) i pokaż gdzie zmienna sw1 jest jakoś przeliczana czy coś.<br />Może jestem już trochę ślepy i nie dowidzę albo coś pominąłem. Wskaż mi to.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8867">mario2015</a> — 1 mar 2021, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-03-01T09:02:24+01:00</updated>
<published>2021-03-01T09:02:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231245#p231245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231245#p231245"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231245#p231245"><![CDATA[
Dzięki za podpowiedz . Masz racje ten _delay to troche słabe i wycofałem go. Spowodowało to trochę poprawę tzn szybkość działania przycisku , ale zmienna kier zmienia się za szybko tzn, przeskakuje o 2.<br />Chętnie coś pewnie zmiennie najpierw w obsłudze styku - masz może jakąś sprawdzoną procedurę?<br />Ale największy problem jest w tym że zmienna kier_menu nie zawsze z gazda się z przypisanym parametrem który miga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 1 mar 2021, o 09:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mario2015]]></name></author>
<updated>2021-02-28T11:00:32+01:00</updated>
<published>2021-02-28T11:00:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231234#p231234</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231234#p231234"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231234#p231234"><![CDATA[
Co do przycisków to wejdź sobie na bloga Mirka tu:<br /><a href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html"  class="postlink">http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html</a><br />Bardzo fajnie i szczegółowo opisuje obsługę klawisza i eliminację drgań styków.<br />U ciebie funkcja obsługi klawisza jest powiedziałbym delikatnie nie za bardzo, choć podobna do Mirkowej ale nie do końca. <br />No i ten Delay w tej funkcji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8867">mario2015</a> — 28 lut 2021, o 11:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-02-27T23:46:31+01:00</updated>
<published>2021-02-27T23:46:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231231#p231231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231231#p231231"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231231#p231231"><![CDATA[
Tak na pewno ale w tym momencie większym moim problemem jest to że przycisk działa wolno i nie zdąży zawsze w określone zadanie w menu.<br />Czyli naciskam zmienia się   kierunek_menu a miga inna sekwencja , dodatkowo dżinie miga menu jak naciskam przycisk.<br /> <br />Oczywiście zbudowanie struktury to fajna sprawa i dziękuję za wskazówkę i zajmę się analizą.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 27 lut 2021, o 23:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2021-02-27T22:29:00+01:00</updated>
<published>2021-02-27T22:29:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231230#p231230</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231230#p231230"/>
<title type="html"><![CDATA[Re: Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231230#p231230"><![CDATA[
Cieszę się, że stringi na LCD już działają <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Co do menu, strasznie dużo tu ifów. Nie lepiej byłoby opakować to w jakąś strukturę? Mogłaby ona przechowywać np: pozycję menu, poziom menu, wskaźnik do funkcji wywoływanej w danej opcji itd.? I wskaźnik na taką strukturę łatwo byłoby też przekazać. To tak na gorąco wymyślam.<br /><br />Polecam tu przy okazji jeden z najlepszych moim zdaniem poradników Mirka o strukturach i wskaźnikach przy konstrukcji gry w Snake'a: <a href="https://www.youtube.com/watch?v=MOgXcDJ29B0"  class="postlink">https://www.youtube.com/watch?v=MOgXcDJ29B0</a><br /><br />A na przyszłość, warto moim zdaniem zainteresować się tematem list jednokierunkowych (linked lists). Technika może okazać się przydatna przy założeniu, że menu w przyszłości ma być rozbudowane i łatwo modyfikowalne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10748">Makowka</a> — 27 lut 2021, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[AKSELINEK]]></name></author>
<updated>2021-02-27T20:12:51+01:00</updated>
<published>2021-02-27T20:12:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231229#p231229</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231229#p231229"/>
<title type="html"><![CDATA[Moje menu ale strasznie słabe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23638&amp;p=231229#p231229"><![CDATA[
Witam.<br />Pytałem wcześniej o pewne podpowiedzi dotyczące tworzone przeze mnie prostego menu w celu uczenia się języka C.<br />Koledzy mi dużo podpowiedzieli i coś tam się udało, ale chciałbym się dowiedzieć jak mogłem ten program napisać w sposób bardziej profesjonalny bo ten na pewno jest banalny <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />Największym problemem jest zła obsługa klawisza , klawisz nie zawsze działa  poprawnie tzn. kierunek menu się zmienia ale naciśnięcie krótkie powoduje złą reakcje programu.<br />Jak mogę spróbować to lepiej obsłużyć ?<br /><br />Pokaże program:<br /><br />[syntax=c]// ######################################################################################################################################<br />//                                             ATMEGA 32  F 16000000 MHZ<br />//<br />//<br />// ######################################################################################################################################<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />//#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;EEKRANY/ekrany.h&quot;<br /><br />uint8_t klawisz_wcisniety(uint8_t klawisz);<br /><br />// timery programowe<br /><br />volatile uint16_t Timer1,Timer ;<br />uint8_t sw1=0,flagg;<br />uint8_t stan_klawisz1,stan_klawisz2,t,poz,ypoz;<br />char tablica&#91;20&#93;;<br /><br /> void miganie (void);<br /> void FunkcjaDoModyfikacjiStringa  (char * twojnowystring);<br /> void FunkcjaDoWyswietlaniaStringa (char * tu_tez_twojstring, uint8_t pozycja_x,uint8_t pozycja_y);<br /><br />#define KEY1_PIN (1&lt;&lt;PD3)        // piny wejsciowe do obslugi menu<br />#define KEY2_PIN (1&lt;&lt;PD4)        // piny wejsciowe do obslugi menu<br /><br />uint8_t key_lock,x,kier_menu;    // kkier,menu_kier,stan_menu,sw;<br />uint16_t kier=0;                 // zmienna potrzebna do zmiany pokazywanych komórek<br />uint16_t y=0;<br /><br /><br />// ---------------------   główna funkcja  programu main() -----------------------<br />int main(void)  {<br /><br />                DDRA |= (1&lt;&lt;PA7);<br />                PORTA |=(1&lt;&lt;PA7);<br />                DDRD &amp;= ~(KEY1_PIN);   // JAKO WEJSCIE<br />DDRD &amp;= ~(KEY2_PIN);   // JAKO WEJSCIE<br /><br />    PORTD |= KEY1_PIN;    // DODCIAGNIECIE DO VCC<br />    PORTD |= KEY2_PIN;    // PODCIAGNIECIE DO VCC<br /><br />/* timer2 - konfiguracja silnika timerów programowych */<br />TCCR2  |= (1&lt;&lt;WGM21);     // tryb pracy CTC<br />TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br />OCR2   = 78;              // przerwanie  porównania co 10ms (100Hz)<br />TIMSK  = (1&lt;&lt;OCIE2);      // Odblokowanie przerwania ComareMatch<br /><br /> lcd_init();              // inicjalizacja lcd<br /> lcd_cls();               // kasowanie ekranu<br /><br /><br />sei();                  // globalne odblokowanie przerwania<br /><br /><br />// *************** pętla główna programu<br />while(1) {<br /><br /><br /><br />     if (kier&gt;8191) kier=0;   // wartośc 8191 okresla rozmiar pamieci Eprom i ilosc nacisniec przycisku jest powyzej zerowana<br />     if (kier_menu&gt;3) kier_menu=0;<br /><br />     if( klawisz_wcisniety ( KEY1_PIN ) ){<br />     kier++;<br />     kier_menu++;<br />     }<br />     if( klawisz_wcisniety ( KEY2_PIN ) ){<br />     kier--;<br />     kier_menu--;<br />     }<br />      if( kier_menu==0 ) {<br /><br /><br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br />                              FunkcjaDoModyfikacjiStringa(&quot;Kopiow&quot;);<br />                              poz=0;<br />                              ypoz=0;<br />                              FunkcjaDoWyswietlaniaStringa(tablica,poz,ypoz);<br />                                           }<br />                                             }<br />     if( kier_menu==1 ) {<br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br />                          FunkcjaDoModyfikacjiStringa(&quot;Odczyt&quot;);<br />                          poz=1;<br />                          ypoz=0;<br />                          FunkcjaDoWyswietlaniaStringa(tablica,poz,ypoz);<br /><br />                                          }<br /><br />                                       }<br />      if( kier_menu==2 ) {<br /><br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br /><br />                        FunkcjaDoModyfikacjiStringa(&quot;Testow&quot;);<br />                        poz=0;<br />                        ypoz=8;<br /><br />                        FunkcjaDoWyswietlaniaStringa(tablica,poz,ypoz);<br />                                                 }<br />                                                 }<br />      if( kier_menu==3 ) {<br />      if( klawisz_wcisniety ( KEY1_PIN ) ){<br />                    FunkcjaDoModyfikacjiStringa(&quot;Parametr&quot;);<br />                    poz=1;<br />                    ypoz=8;<br />                    FunkcjaDoWyswietlaniaStringa(tablica,poz,ypoz);<br /><br />                                          }<br /><br />                                             }<br /><br /><br /><br />miganie();<br /><br />                                      lcd_locate(3,12);<br />                                      lcd_int(kier_menu);<br /><br />      }<br /> }<br />uint8_t klawisz_wcisniety(uint8_t klawisz)<br /><br /> {<br />               if(!key_lock &amp;&amp; ! ( PIND &amp; klawisz) )<br />                   {<br />               key_lock=1;<br />               _delay_ms(80);    // To jest niefahowe ale narazie tak wstawiłem<br />                 if( ! ( PIND &amp; klawisz) ) return 1;<br />                  }else if ( key_lock &amp;&amp; (PIND &amp; klawisz)) key_lock++;<br />       return 0;<br /> }<br /><br /> //*** przerwanie Timer2 CompareM<br />ISR(TIMER2_COMP_vect) {<br /><br />uint16_t n;<br /><br />n = Timer1;   /* 100Hz Timer */<br />if (n) Timer1 = --n;<br /><br />n = Timer;   /* 100Hz Timer */<br />if (n) Timer = --n;<br /><br /> }<br />void miganie (void){<br /><br />if (!Timer) {<br /><br />                                                          lcd_locate(0,0);<br />                                      lcd_str (&quot;Kopiow&quot;);<br />                                      lcd_locate(1,0);<br />                                      lcd_str (&quot;Odczyt&quot;);<br />                                      lcd_locate(0,8);<br />                                      lcd_str (&quot;Testow&quot;);<br />                                      lcd_locate(1,8);<br />                                      lcd_str (&quot;Parametr&quot;);<br /><br /><br /> if( !sw1 ){<br /><br /><br /> }<br /> else {                                          lcd_locate(poz,ypoz);<br />                                             lcd_str      (&quot;        &quot;);<br /><br /><br /> }<br /> sw1^=1;<br /><br /><br />        Timer =40;<br />   }<br /><br />}<br />void FunkcjaDoModyfikacjiStringa   (char * twojnowystring) {              // Tablica zawsze przekazywana jako wskaznik<br />        strcpy(tablica, twojnowystring);                                  // Dla uproszczenia twojnowystring&#91;&#93; &lt;= tablica&#91;&#93;<br /><br />}<br /><br />void FunkcjaDoWyswietlaniaStringa (char * tu_tez_twojstring, uint8_t pozycja_x,uint8_t pozycja_y) {<br />    lcd_cls();<br /><br />        lcd_locate(pozycja_x,pozycja_y);<br /><br />        lcd_str(tu_tez_twojstring);<br />        lcd_str      (&quot;        &quot;);<br />}[/syntax]<br /><br />Próbowałem  wysłać wideo ale coś nie poszło.<br />Dodatkowo w czasie przełączania  wyświetlanie nie jest stabilne .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18152">AKSELINEK</a> — 27 lut 2021, o 20:12</p><hr />
]]></content>
</entry>
</feed>