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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-10-14T21:50:39+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=1993&amp;mode</id>
<entry>
<author><name><![CDATA[icer_cmg]]></name></author>
<updated>2013-10-14T21:50:39+01:00</updated>
<published>2013-10-14T21:50:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=52992#p52992</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=52992#p52992"/>
<title type="html"><![CDATA[Re: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=52992#p52992"><![CDATA[
Miałem problem z kodem kolegi ANTYSTATYCZNY.<br />Objawy były takie:<br /><br />po inicjacji lcd jest pusty.<br />naciskam krótko 'p' i otrzymuję 4d, jak puszcze to f0<br />naciskam krótko 'p' i otrzymuję a6, jak puszcze to f0<br />naciskam krótko 'p' i otrzymuję a6, jak puszcze to f0<br />naciskam krótko 'o' i otrzymuję a6, jak puszcze to f0<br />naciskam krótko 'o' i otrzymuję a2, jak puszcze to f0<br />naciskam długo 'o' i otrzymuję a2, po chwili 44, jak puszcze to f0<br />naciskam długo 'o' i otrzymuję a2, po chwili 44, jak puszcze to f0<br />naciskam długo 'p' i otrzymuję a2, po chwili 4d, jak puszcze to f0<br />naciskam długo 'p' i otrzymuję a6, po chwili 4d, jak puszcze to f0<br /><br />niżej przedstawiam zmodyfikowany plik z jedną linijką ekstra ode mnie<br /><br />[syntax=c]/*<br />     * kbd.c<br />     *  Created on: 22-12-2012<br />     *      Author: Arek<br />     */<br />    #include &lt;avr/io.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &quot;kbd.h&quot;<br /><br />    volatile uint8_t kbd_flag, status, scancode, tx_data;<br />    volatile uint16_t rx_data;<br /><br />    static inline void  dir_in(void)<br />    {<br />            KBD_DIR &amp;= ~(DATA_PIN|CLK_PIN);<br />            MCUCSR &amp;= ~(1&lt;&lt;ISC2);                                           //falling<br />            status = RX;<br />    }<br />    static inline void dir_out(void)<br />    {<br />            KBD_DIR |= (DATA_PIN|CLK_PIN);<br />            MCUCSR |= (1&lt;&lt;ISC2);                                            //rising<br />            status = TX;<br />    }<br /><br />    void kbd_hard_init(void);<br />    void kbd_send_data(uint8_t * data);<br /><br />    void kbd_hard_init(void)<br />    {<br />            dir_in();<br />            GICR |=  (1&lt;&lt;INT2);<br />    }<br />    ISR(INT2_vect)<br />    {<br />            static uint8_t bit_cnt = 11,temp;<br />            switch(status)<br />            {<br />            case RX:<br />            if(!kbd_flag)<br />                    {<br />                            if((KBD_PIN&amp;DATA_PIN))rx_data|=0x400; //logic 1<br />                            rx_data = (rx_data &gt;&gt; 1);                         //shift right<br />                            if (!(--bit_cnt))<br />                            {<br />                                    scancode=(uint8_t)(rx_data&amp;0xff) ;//stop and parity bit removal<br />                                    kbd_flag++;                                                 //all bits received<br />                                    if (scancode ==0xf0) kbd_flag--;                          //moja zmiana usuwająca 0xf0               <br />                                    bit_cnt = 11;<br />                            }<br />                    }<br />                    break;//*******************end of Rx code*******************************<br />            case TX:<br />                            if(bit_cnt==11) KBD_PORT &amp;= ~DATA_PIN;  //send start bit (allways zero)<br />                            else<br />                            if(bit_cnt&lt;11 &amp;&amp; bit_cnt&gt;2)                             //send data from LSB to MSB<br />                            {<br />                                    if((tx_data&amp;0x01))<br />                                    {<br />                                            KBD_PORT |= DATA_PIN;                   //logical 1<br />                                            temp++;                                                 //bits@high level  counter<br />                                    }<br />                                    else KBD_PORT &amp;= ~DATA_PIN;                     //logical 0<br />                                    tx_data &gt;&gt;=1;                                           //shift right<br />                            }<br />                            else<br />                            if(bit_cnt == 2)                                                //send parity bit<br />                            {<br />                                    if(!(temp%2))KBD_PORT |= DATA_PIN;      //parity bit(one)<br />                                    else KBD_PORT &amp;= ~DATA_PIN;                     //parity bit(zero)<br />                            }<br />                            else<br />                            if(bit_cnt ==1) KBD_PORT |= DATA_PIN;   //stop bit (allways one)<br />                            else<br />                            if(!(--bit_cnt))<br />                            {<br />                                    bit_cnt = 11;<br />                                    dir_in();                                                       //prepare to wait for ACK bit<br />                                    status = ACK;<br />                            }<br />                    break;//***********************end of TX code******************************<br />            case ACK:<br />                    if((KBD_PIN&amp;DATA_PIN))<br />                    {<br />                            //error... to do (ie. turn led ON)<br />                    }<br />                    else<br />                    {<br />                            status = RX;                                            //byte sent properly, prepare to Rx<br />                    }<br />                    break;//*******************end of checking ACK bit**********************<br />            }<br />    }<br />    void kbd_send_data(uint8_t *data)<br />    {<br />            GICR &amp;= ~(1&lt;&lt;INT2);                                                     //int2 disabled for a little while<br />            dir_out();<br />            KBD_PORT &amp;= ~CLK_PIN;                                           //force low level<br />            KBD_DIR &amp;= ~CLK_PIN;                                            //clock as input<br />            MCUCSR |= (1&lt;&lt;ISC2);                                            //rising edge<br />            GICR |= (1&lt;&lt;INT2);                                                      //int2 enabled<br />            tx_data = *data;<br />    }[/syntax]<br /><br /><span style="color: #FF0000">Kody wklejamy przy pomocy syntax=c - Różowy J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1636">icer_cmg</a> — 14 paź 2013, o 21:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-29T00:01:10+01:00</updated>
<published>2012-12-29T00:01:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22366#p22366</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22366#p22366"/>
<title type="html"><![CDATA[Re: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22366#p22366"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />Mirek, dzięki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Zabieram się za analizę i naukę. Kod działa jak brzytwa, mogę podczas  wysyłania komend zmieniających stan diod na klawiaturze  naciskać  klawisze jak mi się zywnie podoba i na LCD  ładnie wszystko się pokazuje (w mojej prywatnej wersji obsługi lcd)<br /></div> No i tego można się było spodziewać po tak napisanym przerwaniu. Dlatego tylko zwróciłem uwagę - że gdyby tam, że gdyby coś .... gdyby sprawa życia i śmierci .... to wtedy można dodać to co opisałem. Ale wiadomo to nie chodzi tylko o ten kod - taki nawyk może się przydać przecież w innych sytuacjach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 gru 2012, o 00:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-28T23:38:30+01:00</updated>
<published>2012-12-28T23:38:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22358#p22358</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22358#p22358"/>
<title type="html"><![CDATA[Re: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22358#p22358"><![CDATA[
W związku z zapytaniem na PRIV <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> pragnę Panu odpowiedzieć - że wprawdzie nie jestem w stanie ocenić merytorycznie kodu bo się tym nie bawiłem, ale po efektach które pokazujesz widać że pod tym względem jest OK <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc nawet tego oceniać nie trzeba. Pytałeś czy można skrócić kod przerwania .... więc tu mała uwaga albo dwie małe uwagi.<br /><br />1. długi kod przerwania wcale nie oznacza długiego czasu wykonywania przerwania a u ciebie jest on pięknie podzielony switch'em, oraz IF'ami na logiczne bloki, dodatkowo ładnie wyprowadzone flagi do EVENT'sów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> mniam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... więc praktycznie nic dodać nic ująć, tym bardziej jeśli czasowo się to wyrabia w praktyce<br /><br />2. ale oczywiście w takich konstrukcjach, gdyby zależało na większym wyżyłowaniu czasu i skracaniu o dosłownie każdy cykl zegara to jednak można coś tam poprawić - spójrz na poprawkę części case TX:<br /><br />[syntax=c]        case TX:<br />                if(bit_cnt==11) KBD_PORT &amp;= ~DATA_PIN;  //send start bit (allways zero)<br />                else<br />                if(bit_cnt&lt;11 &amp;&amp; bit_cnt&gt;2)                             //send data from LSB to MSB<br />                {<br />                        if((tx_data&amp;0x01))<br />                        {<br />                                KBD_PORT |= DATA_PIN;                   //logical 1<br />                                temp++;                                                 //bits@high level  counter<br />                        }<br />                        else KBD_PORT &amp;= ~DATA_PIN;                     //logical 0<br />                        tx_data &gt;&gt;=1;                                           //shift right<br />                }<br />                else<br />                if(bit_cnt == 2)                                                //send parity bit<br />                {<br />                        if(!(temp%2))KBD_PORT |= DATA_PIN;      //parity bit(one)<br />                        else KBD_PORT &amp;= ~DATA_PIN;                     //parity bit(zero)<br />                }<br />                else<br />                if(bit_cnt ==1) KBD_PORT |= DATA_PIN;   //stop bit (allways one)<br />                else<br />                if(!(--bit_cnt))<br />                {<br />                        bit_cnt = 11;<br />                        dir_in();                                                       //prepare to wait for ACK bit<br />                        status = ACK;<br />                }<br />        break;//***********************end of TX code******************************[/syntax]<br /><br />jak widzisz dodałem kilka poleceń else i pomyśl teraz jak to działało bez nich a jak z nimi hmmm?<br /><br />bez tych else - załóżmy że w przerwaniu w tym case - sprawdzany jest pierwszy warunek - i niezależnie czy spełniony czy nie - musi zostać sprawdzony jeszcze każdy kolejny na takiej samej zasadzie. Jak mówię to i tak jest BARDZO krótko i dobry kod, ale jakby się właśnie uprzeć to dodanie tych elsów spowoduje, że gdy tylko pierwszy warunek z listy się wykona - to QUNIEC każdy kolejny już nie będzie sprawdzany nawet - więc łatwo sobie wyobrazić że jeszcze zyskamy w niektórych przebiegach dodatkowe cykle czasu na obsługę przerwania<br /><br />to chyba tyle tak na gorąco <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 gru 2012, o 23:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miszczo]]></name></author>
<updated>2012-12-28T17:29:17+01:00</updated>
<published>2012-12-28T17:29:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22327#p22327</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22327#p22327"/>
<title type="html"><![CDATA[Re: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22327#p22327"><![CDATA[
To jeszcze ode mnie po naszemu <!-- m --><a class="postlink" href="http://leon-instruments.blogspot.com/2011/09/avr-klawiatura-ps2.html" >http://leon-instruments.blogspot.com/20 ... a-ps2.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=78">miszczo</a> — 28 gru 2012, o 17:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kris_gor]]></name></author>
<updated>2012-12-28T08:58:19+01:00</updated>
<published>2012-12-28T08:58:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22280#p22280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22280#p22280"/>
<title type="html"><![CDATA[Re: Odp: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22280#p22280"><![CDATA[
<div class="quotetitle">kila napisał(a):</div><div class="quotecontent"><br />Witam!<br /><br />Skąd kolega miał materiały, aby napisać taką obsługę? Poczytałbym o tym, ale z dobrego źródła. Zaznaczam, że nie mam jeszcze zielonej książki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> <br /><br />Pzdr<br /></div><br /><br />W sieci coś idzie wygrzebać na ten temat, np. takiego gotowca:<br /><br /><a href="http://www.electronics-base.com/index.php/projects/complete-projects/108-avr-ps2-keyboard-key-readout"  class="postlink">http://www.electronics-base.com/index.php/projects/complete-projects/108-avr-ps2-keyboard-key-readout</a><br /><a href="http://www.8051projects.net/download-d200-ps2-keyboard-library-from-atmel.html"  class="postlink">http://www.8051projects.net/download-d200-ps2-keyboard-library-from-atmel.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=366">kris_gor</a> — 28 gru 2012, o 08:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kila]]></name></author>
<updated>2012-12-28T05:22:00+01:00</updated>
<published>2012-12-28T05:22:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22278#p22278</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22278#p22278"/>
<title type="html"><![CDATA[Re: Odp: Wstęp do obsługi klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1993&amp;p=22278#p22278"><![CDATA[
Witam!<br /><br />Skąd kolega miał materiały, aby napisać taką obsługę? Poczytałbym o tym, ale z dobrego źródła. Zaznaczam, że nie mam jeszcze zielonej książki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> <br /><br />Pzdr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=699">kila</a> — 28 gru 2012, o 05:22</p><hr />
]]></content>
</entry>
</feed>