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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-07T21:15:45+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11942&amp;mode</id>
<entry>
<author><name><![CDATA[Adrian]]></name></author>
<updated>2015-06-07T21:15:45+01:00</updated>
<published>2015-06-07T21:15:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131208#p131208</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131208#p131208"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa 4x3]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131208#p131208"><![CDATA[
Zastąpiłem opóźnienia 10us tymi pustymi instrukcjami (cztery x nop) i wystarczyło.<br />Dzięki jeszcze raz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=672">Adrian</a> — 7 cze 2015, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-06-07T17:10:30+01:00</updated>
<published>2015-06-07T17:10:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131170#p131170</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131170#p131170"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa 4x3]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131170#p131170"><![CDATA[
Po wpisaniu jakiś stanów do rejestrów procesora musi minąć troszkę czasu aby te stany faktycznie pojawiły sie na odpowiednich wyjściach. Tak to w skrócie można wytłumaczyć. <br /><br />Opóźnienie 10us jest troszkę za duże i spokojnie wystarczyło by mniejsze. Podczas prób z klawiaturą matrycową z wykorzystaniem charlieplexingu wystarczyło jak dałem opóźnienie o wartości jednego taktu zegara za pomocą asemblerowego polecenia nop [syntax=asm]asm(&quot;nop&quot;);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 7 cze 2015, o 17:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adrian]]></name></author>
<updated>2015-06-07T16:57:00+01:00</updated>
<published>2015-06-07T16:57:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131167#p131167</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131167#p131167"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa 4x3]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131167#p131167"><![CDATA[
Dzięki za odpowiedź. <br />Po dodaniu opóźnień program działa poprawnie. <br />Jak to rozumieć? Wynik warunku if zostawał prawdziwy po zmianie na odczyt innej kolumny?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=672">Adrian</a> — 7 cze 2015, o 16:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-06-07T16:44:38+01:00</updated>
<published>2015-06-07T16:44:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131165#p131165</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131165#p131165"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa 4x3]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131165#p131165"><![CDATA[
Dla testu spróbuj ustawić małe opóźnienie między ustawieniem stanów na kolumnach a odczytem wierszy<br />[syntax=c]uint8_t spr_klawisz(void)//definicja funkcji sprawdzającej klawisze<br />{<br />        //pierwsza kolumna<br />        K1_ON;<br />        K2_OFF;<br />        K3_OFF;<br />        _delay_us(10);<br />        if (W1_DOWN ==1) klawisz = 1;<br />        if (W2_DOWN ==1) klawisz = 4;<br />        if (W3_DOWN ==1) klawisz = 7;<br />        if (W4_DOWN ==1) klawisz = 10;<br /> <br />        //druga kolumna<br />        K1_OFF;<br />        K2_ON;<br />        K3_OFF;<br />        _delay_us(10);<br />        if (W1_DOWN ==1) klawisz = 2;<br />        if (W2_DOWN ==1) klawisz = 5;<br />        if (W3_DOWN ==1) klawisz = 8;<br />        if (W4_DOWN ==1) klawisz = 0;<br /> <br />        //trzecia kolumna<br />        K1_OFF;<br />        K2_OFF;<br />        K3_ON;<br />        _delay_us(10);<br />        if (W1_DOWN ==1) klawisz = 3;//POWIELA STAN Z K1/W1<br />        if (W2_DOWN ==1) klawisz = 6;<br />        if (W3_DOWN ==1) klawisz = 9;<br />        if (W4_DOWN ==1) klawisz = 11;<br /> <br /> <br />        return klawisz;    //zwróć wartość klawisz<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 7 cze 2015, o 16:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adrian]]></name></author>
<updated>2015-06-07T15:36:09+01:00</updated>
<published>2015-06-07T15:36:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131154#p131154</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131154#p131154"/>
<title type="html"><![CDATA[Klawiatura matrycowa 4x3]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11942&amp;p=131154#p131154"><![CDATA[
Witam,<br />napisałem taki program testowy do klawiatury matrycowej 4x3.<br />[syntax=c]//dołączenie bibliotek<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//definicja wierszy i kolumn --------------------------------------------------<br />// kolumny jako wyjścia a wiersze sprawdzane jako wejścia<br /><br />//kolumny<br />#define K1 (1&lt;&lt;PC4)<br />#define K1_ON PORTC &amp;=~K1//aktywne 0<br />#define K1_OFF PORTC |= K1//nieaktywne 1<br /><br />#define K2 (1&lt;&lt;PC5)<br />#define K2_ON PORTC &amp;=~K2//aktywne 0<br />#define K2_OFF PORTC |= K2//nieaktywne 1<br /><br />#define K3 (1&lt;&lt;PD0)<br />#define K3_ON PORTD &amp;=~K3//aktywne 0<br />#define K3_OFF PORTD |= K3//nieaktywne 1<br /><br />//wiersze<br />#define W1 (1&lt;&lt;PC0)<br />#define W1_DOWN !(PINC &amp; W1)<br /><br />#define W2 (1&lt;&lt;PC1)<br />#define W2_DOWN !(PINC &amp; W2)<br /><br />#define W3 (1&lt;&lt;PC2)<br />#define W3_DOWN !(PINC &amp; W3)<br /><br />#define W4 (1&lt;&lt;PC3)<br />#define W4_DOWN !(PINC &amp; W4)<br />//------------------------------------------------------------------------------------<br /><br />//deklaracja zmiennycj i funkcji------------------------------------------------------<br />uint8_t spr_klawisz(void);//deklaracja funkcji sprawdzającej klawisze<br />uint8_t klawisz = 255;//zmienna przechowująca wartośc wsciśniętego klawisza<br />//------------------------------------------------------------------------------------<br /><br />int main(void)//program<br />{<br />//wyjścia i wejścia<br />DDRC |= K1;//kolumny jako wyjścia<br />PORTC |= K1;//podciągnięcie do 1<br />DDRC |= K2;<br />PORTC |= K2;<br />DDRD |= K3;<br />PORTD |= K3;<br /><br />DDRC &amp;=~(W1 | W2 | W3 | W4);//wiersze jako wejścia<br />PORTC |=(W1 | W2 | W3 | W4);//podciagniecie do 1<br /><br />DDRB = 0xFF;//port B jako wyjście<br />PORTB = 0xFF;//wszystkie piny podciągnięte do 1<br /><br />while(1)//pętla główna<br />{<br /><br />PORTB = spr_klawisz();//wyślij na PORTB wartośc klawisza<br /><br />}<br />}<br /><br />uint8_t spr_klawisz(void)//definicja funkcji sprawdzającej klawisze<br />{<br />//pierwsza kolumna<br />K1_ON;<br />K2_OFF;<br />K3_OFF;<br />if (W1_DOWN ==1) klawisz = 1;<br />if (W2_DOWN ==1) klawisz = 4;<br />if (W3_DOWN ==1) klawisz = 7;<br />if (W4_DOWN ==1) klawisz = 10;<br /><br />//druga kolumna<br />K1_OFF;<br />K2_ON;<br />K3_OFF;<br />if (W1_DOWN ==1) klawisz = 2;<br />if (W2_DOWN ==1) klawisz = 5;<br />if (W3_DOWN ==1) klawisz = 8;<br />if (W4_DOWN ==1) klawisz = 0;<br /><br />//trzecia kolumna<br />K1_OFF;<br />K2_OFF;<br />K3_ON;<br />if (W1_DOWN ==1) klawisz = 3;//POWIELA STAN Z K1/W1<br />if (W2_DOWN ==1) klawisz = 6;<br />if (W3_DOWN ==1) klawisz = 9;<br />if (W4_DOWN ==1) klawisz = 11;<br /><br /><br />return klawisz;//zwróc wartośc klawisz<br />}[/syntax]<br /><br />Problem polega na tym, że gdy wcisnę klawisz na przecięciu trzeciej kolumny z pierwszym wierszem, to do zmiennej klawisz wpisywana jest wartość klawisza pierwszego (czyli K1/W1).<br />Gdy przerobiłem program tak aby sprawdzać kolumny a nie wiersze, problem był podobny tylko z innym przyciskiem.<br />Wiem, że kod nie jest okazem optymalizacji, i że można to zrobić inaczej. Jednak interesuję mnie przyczyna wadliwego działania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=672">Adrian</a> — 7 cze 2015, o 15:36</p><hr />
]]></content>
</entry>
</feed>