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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14599&amp;mode</id>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-02-21T22:37:25+01:00</updated>
<published>2016-02-21T22:37:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154380#p154380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154380#p154380"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154380#p154380"><![CDATA[
[syntax=c]_delay_ms(10);[/syntax] to czekanie wieczności <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Nawet jak masz jakieś duże pojemności na tej tych kolumnach, to wystarczy dać znacznie mniejszy czas. Czy jak dajesz tylko mikrosekundowe opóźnienia, to także miałeś problem (zamień w delay ms na us <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />)? [syntax=c]_delay_us(10);[/syntax]<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 21 lut 2016, o 22:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ghann]]></name></author>
<updated>2016-02-21T21:32:02+01:00</updated>
<published>2016-02-21T21:32:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154368#p154368</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154368#p154368"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154368#p154368"><![CDATA[
Zaczołem kombinować i oto efekty:<br /><br />[syntax=c]// sekwencja dla pierwszej kolumny<br /><br /><br />    PORTC &amp;= ~(1&lt;&lt;PC3);             // zerujemy kolumnę pierwszą<br />    _delay_ms(10);<br /><br />  //if (!(PIND &amp; (1&lt;&lt;PD3))) switch_flag = 4;<br />    if (!(PIND &amp; (1&lt;&lt;PD4)))    switch_flag = 1;   //sprawdzenie wiersza pierwszego<br />    if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 2;       //sprawdzenie wiersza drugiego<br />    if (!(PIND &amp; (1&lt;&lt;PD2)))    switch_flag = 3;     //sprawdzenie wiersza trzeciego<br /><br />    PORTC |= (1&lt;&lt;PC3);<br /><br /><br />    // sekwencja dla drugiej kolumny<br /><br />    PORTC &amp;= ~(1&lt;&lt;PC4);  // zerujemy kolumnę drugą<br />    _delay_ms(10);<br /><br />  // if (!(PIND &amp; (1&lt;&lt;PD3))) switch_flag = 4;<br />    if (!(PIND &amp; (1&lt;&lt;PD4))) switch_flag = 4;  //sprawdzenie wiersza pierwszeg<br />    if (!(PIND &amp; (1&lt;&lt;PD1)))   switch_flag = 5;      //sprawdzenie wiersza drugiego<br />    if (!(PIND &amp; (1&lt;&lt;PD2)))   switch_flag = 6;      //sprawdzenie wiersza trzeciego<br /><br />    PORTC |= (1&lt;&lt;PC4);<br /><br />    // sekwencja dla trzeciej kolumny<br />    //<br /><br />    PORTC &amp;= ~(1&lt;&lt;PC5);// zerujemy kolumnę trzecią<br />    _delay_ms(10);<br /><br />  // if (!(PIND &amp; (1&lt;&lt;PD3))) switch_flag = 4;<br />    if (!(PIND &amp; (1&lt;&lt;PD4)))  switch_flag = 7; //sprawdzenie wiersza pierwszego<br />    if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 8;       //sprawdzenie wiersza drugiego<br />    if (!(PIND &amp; (1&lt;&lt;PD2)))   switch_flag = 9;      //sprawdzenie wiersza trzeciego<br /><br />    PORTC |= (1&lt;&lt;PC5);[/syntax]<br /><br /><br />No i wszystko działa <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6944">Ghann</a> — 21 lut 2016, o 21:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-02-21T21:05:26+01:00</updated>
<published>2016-02-21T21:05:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154354#p154354</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154354#p154354"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154354#p154354"><![CDATA[
Czy nie działa Ci zawsze pierwszy wiersz dla każdej kolumny?<br />Czy jak dodasz mały delay (np. _delay_us(5);) pomiędzy każdym wystawieniem zera na kolumnie (PORTC &amp;= ~(1&lt;&lt;PCx);) a sprawdzeniem stanu też masz ten sam problem?<br /><br />Na jakich pinach masz podpięty wyświetlacz LCD?<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 21 lut 2016, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Bartek123]]></name></author>
<updated>2016-02-21T20:46:16+01:00</updated>
<published>2016-02-21T20:46:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154342#p154342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154342#p154342"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154342#p154342"><![CDATA[
A spróbuj po każdej instrukcji if nawet jeśli jest jedna instrukcja dać nawiasy klamrowe. Jak mi się uda i będę miał czas to zrobię taką klawiaturkę(projekt już jest myślę, że jutro wytrawię) i podłącze i będę kombinował co jest nie tak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10617">Bartek123</a> — 21 lut 2016, o 20:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ghann]]></name></author>
<updated>2016-02-21T17:52:09+01:00</updated>
<published>2016-02-21T17:52:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154309#p154309</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154309#p154309"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154309#p154309"><![CDATA[
Niestety Panowie nic się nie zmieniło  <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />  Dalej to samo  <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=6944">Ghann</a> — 21 lut 2016, o 17:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-02-21T16:11:11+01:00</updated>
<published>2016-02-21T16:11:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154283#p154283</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154283#p154283"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154283#p154283"><![CDATA[
Przed każdym pierwszym ifem wstaw małe opóźnienie w formie jednego lub dwóch asemblerowych poleceń nop<br />[syntax=asm]asm volatile(&quot;nop\n\t&quot;::);<br />asm volatile(&quot;nop\n\t&quot;::);[/syntax]<br />W zasadzie jedna instrukcja powinna wystarczyć.<br /><br />Opóźnienie jest potrzebne, bo po wpisaniu odpowiedniego stanu do rejestru wyjściowego, ten stan fizycznie na porcie pojawi się z małym opóźnieniem.<br /><br />Czyli od wpisania zera w tym miejscu<br />[syntax=c]PORTC &amp;= ~(1&lt;&lt;PC3);             // zerujemy kolumnę pierwszą[/syntax]<br />do faktycznego wystawienia stanu niskiego na pinie PA3 mija jeden takt zegara.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 21 lut 2016, o 16:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-02-21T15:29:32+01:00</updated>
<published>2016-02-21T15:29:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154278#p154278</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154278#p154278"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154278#p154278"><![CDATA[
Zrób tak i zobacz czy działa prawidłowo:<br /><br />[syntax=c]//początek twojego kodu<br />lcd_init();<br />lcd_cls();<br /><br />DDRC |= (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) ;          // kolumny wyjścia<br />PORTC |= (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) ;         //dodaj tą linijkę<br /><br />//ta linijka niżej jest nie potrzebna<br />//DDRD &amp;= ~(1&lt;&lt;PD1) &amp; ~(1&lt;&lt;PD0) &amp; ~(1&lt;&lt;PD2);       // wiersze wejścia<br />     <br />PORTD |= (1&lt;&lt;PD0) | (1&lt;&lt;PD1) | (1&lt;&lt;PD2);<br /><br />DDRB |= (1&lt;&lt;PB1);                                                          // wyjście LED<br />     <br />        while(1){<br /><br />//reszta twojego kodu[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 13 minutach ]</span></strong><br /><br />Spróbuj też dodać linijkę:<br />[syntax=c]asm(&quot;nop&quot;);[/syntax]<br />po linijce:<br />[syntax=c]PORTC &amp;= ~(1&lt;&lt;PC3);             // zerujemy kolumnę pierwszą[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 21 lut 2016, o 15:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ghann]]></name></author>
<updated>2016-02-21T13:52:51+01:00</updated>
<published>2016-02-21T13:52:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154268#p154268</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154268#p154268"/>
<title type="html"><![CDATA[Klawiatura matrycowa cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14599&amp;p=154268#p154268"><![CDATA[
Witam. Z pomocą kolegów z forum powstał krótki kod do obsługi klawiatury matrycowej 3x3. O to cały kod:<br /><br />[syntax=c]#include &lt;stdio.h&gt;<br />        #include &lt;avr/io.h&gt;<br />        #include &lt;util/delay.h&gt;<br />        #include &quot;LCD/lcd44780.h&quot;<br />        #include &lt;avr/interrupt.h&gt;<br />     <br />     <br />     <br />         uint8_t switch_flag = 0;<br />     <br />        int main(void){<br />     <br />        lcd_init();<br />        lcd_cls();<br />     <br />         DDRC |= (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) ;          // kolumny wyjścia<br />     <br />     <br />     <br />         DDRD &amp;= ~(1&lt;&lt;PD1) &amp; ~(1&lt;&lt;PD0) &amp; ~(1&lt;&lt;PD2);       // wiersze wejścia<br />     <br />         PORTD |= (1&lt;&lt;PD1) | (1&lt;&lt;PD0) | (1&lt;&lt;PD2) | (1&lt;&lt;PD3);<br />     <br />     <br />     <br />         DDRB |= (1&lt;&lt;PB1);                                                          // wyjście LED<br />     <br />     <br />        while(1){<br />     <br />            // sekwencja dla pierwszej kolumny<br />     <br />     <br />        PORTC &amp;= ~(1&lt;&lt;PC3);             // zerujemy kolumnę pierwszą<br />     <br />       <br />        if (!(PIND &amp; (1&lt;&lt;PD0)))    switch_flag = 1;   //sprawdzenie wiersza pierwszego<br />        if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 2;       //sprawdzenie wiersza drugiego<br />        if (!(PIND &amp; (1&lt;&lt;PD2)))    switch_flag = 3;     //sprawdzenie wiersza trzeciego<br />     <br />        PORTC |= (1&lt;&lt;PC3);<br />     <br />     <br />        // sekwencja dla drugiej kolumny<br />     <br />        PORTC &amp;= ~(1&lt;&lt;PC4);                         // zerujemy kolumnę drugą<br />     <br />       <br />        if (!(PIND &amp; (1&lt;&lt;PD0))) switch_flag = 4;  //sprawdzenie wiersza pierwszego<br />        if (!(PIND &amp; (1&lt;&lt;PD1)))   switch_flag = 5;      //sprawdzenie wiersza drugiego<br />        if (!(PIND &amp; (1&lt;&lt;PD2)))   switch_flag = 6;      //sprawdzenie wiersza trzeciego<br />     <br />        PORTC |= (1&lt;&lt;PC4);<br />     <br />        // sekwencja dla trzeciej kolumny<br />     <br />        PORTC &amp;= ~(1&lt;&lt;PC5);                         // zerujemy kolumnę trzecią<br />     <br />       <br />        if (!(PIND &amp; (1&lt;&lt;PD0)))  switch_flag = 7; //sprawdzenie wiersza pierwszego<br />        if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 8;       //sprawdzenie wiersza drugiego<br />        if (!(PIND &amp; (1&lt;&lt;PD2)))   switch_flag = 9;      //sprawdzenie wiersza trzeciego<br />     <br />        PORTC |= (1&lt;&lt;PC5);<br />     <br />        lcd_locate(0,5);<br />        lcd_int(switch_flag);<br />     <br />     // funkce dla danego klawisza<br />     <br />        if(switch_flag)<br />        {<br />          if(switch_flag == 1)<br />          { PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 2)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 3)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 4)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 5)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 6)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 7)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 8)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />          if(switch_flag == 9)<br />          {PORTB ^= (1&lt;&lt;PB1);<br />          }<br />     <br />     <br />     <br />     <br />          switch_flag = 0;<br />          _delay_ms(500);<br />        }<br />        }<br />        }<br /><br />GeSHi[/syntax]<br /><br />Zdefiniowanie połączeń klawiatury<br />[syntax=c]DDRC |= (1&lt;&lt;PC3) | (1&lt;&lt;PC4) | (1&lt;&lt;PC5) ;          // kolumny wyjścia <br /> <br />     DDRD &amp;= ~(1&lt;&lt;PD1) &amp; ~(1&lt;&lt;PD0) &amp; ~(1&lt;&lt;PD2);       // wiersze wejścia<br /> <br />     PORTD |= (1&lt;&lt;PD1) | (1&lt;&lt;PD0) | (1&lt;&lt;PD2) | (1&lt;&lt;PD3);[/syntax]<br /><br />Kod działa ale nie do końca, mianowicie. W tej wersji jak wyżej, nie działa pierwszy wiersz. Dlaczego ?? No właśnie nie wiem. . .  :/<br /><br />Zaczołem kombinować i zauważyłem pewną zależność. Jeżeli za komentowałem sprawdzanie pierwszego wiersza o tak:<br /><br />[syntax=c]//  if (!(PIND &amp; (1&lt;&lt;PD0)))    switch_flag = 1;   //sprawdzenie wiersza pierwszego<br />        if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 2;       //sprawdzenie wiersza drugiego<br />        if (!(PIND &amp; (1&lt;&lt;PD2)))    switch_flag = 3;     //sprawdzenie wiersza trzeciego[/syntax]<br /><br />To wiersz drugi przestał działać :/ No to doszedłem do wniosku że powinno coś być przed wierszem pierwszym. Wpadłem na głupi pomysł, wstawiłem przed wierszem pierwszym sprawdzenie jakby innego wiersza (nie istniejącego, nie podłączonego w rzeczywistości).<br /><br />[syntax=c]if (!(PIND &amp; (1&lt;&lt;PD3))) switch_flag = 4;  // Wiersz który nie istnieje<br />    if (!(PIND &amp; (1&lt;&lt;PD4)))    switch_flag = 1;   //sprawdzenie wiersza pierwszego<br />    if (!(PIND &amp; (1&lt;&lt;PD1)))  switch_flag = 2;       //sprawdzenie wiersza drugiego<br />    if (!(PIND &amp; (1&lt;&lt;PD2)))    switch_flag = 3;     //sprawdzenie wiersza trzeciego[/syntax]<br /><br />No i ku mojemu zdziwieniu, pierwszy wiersz zaczoł działać. Dla mnie jest to nie zrozumiałe dlaczego, coś jest źle zrobione tylko co :O  <br /><br />Proszę Was o pomoc i pomysły. Dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6944">Ghann</a> — 21 lut 2016, o 13:52</p><hr />
]]></content>
</entry>
</feed>