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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-22T23:57:46+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7539&amp;mode</id>
<entry>
<author><name><![CDATA[artur85]]></name></author>
<updated>2014-06-22T23:57:46+01:00</updated>
<published>2014-06-22T23:57:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85424#p85424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85424#p85424"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa 3x4 z diodami - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85424#p85424"><![CDATA[
Witam, <br />Niech kolega podmieni ciało funkcji FindKey na to<br />[syntax=c]uint8_t FindKey(void)<br />{<br />uint8_t cyfra = 255;<br /><br />//sprawdzenie czy naciśnięto klawisz w pierwszym wierszu<br />PORTC = (((~(1&lt;&lt;PC4))&amp;0xF0)|(PORTC&amp;0x0F));<br />_delay_us(10);<br />if (!(PINC &amp; (1&lt;&lt;PC0)))<br />cyfra=1;//1<br />if (!(PINC &amp; (1&lt;&lt;PC1)))<br />cyfra=2;//2<br />if (!(PINC &amp; (1&lt;&lt;PC2)))<br />cyfra=3;//3<br /><br />//sprawdzenie czy naciśnięto klawisz w drugim wierszu<br />PORTC = (((~(1&lt;&lt;PC5))&amp;0xF0)|(PORTC&amp;0x0F));<br />_delay_us(10);<br />if (!(PINC &amp; (1&lt;&lt;PC0)))<br />cyfra= 4;//4<br />if (!(PINC &amp; (1&lt;&lt;PC1)))<br />cyfra= 5;//5<br />if (!(PINC &amp; (1&lt;&lt;PC2)))<br />cyfra= 6;//6<br /><br /><br />//sprawdzenie czy naciśnięto klawisz w pierwszym wierszu<br />PORTC = (((~(1&lt;&lt;PC6))&amp;0xF0)|(PORTC&amp;0x0F));<br />_delay_us(10);<br />if (!(PINC &amp; (1&lt;&lt;PC0)))<br />cyfra= 7;//7<br />if (!(PINC &amp; (1&lt;&lt;PC1)))<br />cyfra= 8;//8<br />if (!(PINC &amp; (1&lt;&lt;PC2)))<br />cyfra= 9;//9<br /><br /><br />//sprawdzenie czy nacisnieto klawisz w drugim wierszu<br />PORTC = (((~(1&lt;&lt;PC7))&amp;0xF0)|(PORTC&amp;0x0F));<br />_delay_us(10);<br />if (!(PINC &amp; (1&lt;&lt;PC0)))<br />cyfra= 10;//10<br />if (!(PINC &amp; (1&lt;&lt;PC1)))<br />cyfra= 11;//11<br />if (!(PINC &amp; (1&lt;&lt;PC2)))<br />cyfra= 12;//12<br />return cyfra;<br />}[/syntax]<br /> a nuż coś ruszy  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />pisane na szybko i nie sprawdzone<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 24 minutach ]</span></strong><br /><br />Wydaje mi się że problem tkwi w tym, że port C nie jest maskowany, np: <div class="quotetitle">Xseomres napisał(a):</div><div class="quotecontent"><br />PORTC = 0xDF;//1101 1111<br /></div>przez co piny PC0 - PC3 są z automatu ustawione jako &quot;1&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1212">artur85</a> — 22 cze 2014, o 23:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xseomres]]></name></author>
<updated>2014-06-22T22:54:18+01:00</updated>
<published>2014-06-22T22:54:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85420#p85420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85420#p85420"/>
<title type="html"><![CDATA[Klawiatura matrycowa 3x4 z diodami - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7539&amp;p=85420#p85420"><![CDATA[
Mam problem z obsługą klawiatury matrycowej 3x4 z diodami. Poglądowy schemat poniżej. Przy czym nie zawiera on dodatkowego kondensatora na każdym przełączniku oraz jest dla wersji klawiatury 4x4.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/4808/c0a3a11bdb01434f62bcf03de6df14d2.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4808/c0a3a11bdb01434f62bcf03de6df14d2.png" alt="Obrazek" /></a><br /><br />Klawiatura podłączona do standardowej płytki EVB5 z procesorem Atmega32A za pomocą portu C(0-7) oraz D2 - przerywanie INT0<br />Mam następujący kod do obsługi tej kombinacji:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &quot;lcd.h&quot;<br /><br />//czas<br />volatile uint16_t timer_counter = 0; //zlicza wywołania Timer0<br />volatile uint16_t time_cur_sec = 0; //aktualny czas w sekundach<br />volatile uint16_t licznik = 0; //licznik wywołań przycisku<br />//flagi<br />volatile _Bool int0_occur = 1;<br /><br />ISR(TIMER0_OVF_vect) {<br />    timer_counter++;         //zostaje podniesiona wartość licznika przepełnieni timera<br />    if (timer_counter == 61)//jeżeli nastąpi 61 przepełnień to upłynie około 1sekunda<br />    {<br />        time_cur_sec++;   //minęła 1 sekunda<br />        timer_counter = 0; //zerowanie timera odpowiedzialnego za zliczanie przepełnień timera<br />    }<br />}<br />ISR(INT0_vect)<br />{<br />    int0_occur = 1;<br />    //PORTC = 0x0F;<br />}<br />ISR (BADISR_vect){}<br />void INT0_Init(void);<br />void Timer0_Init(void);<br />uint8_t FindKey(void);<br /><br />int main(void) {<br />    INT0_Init();    //inicjalizacja przerywań dla klawiatury matrycowej<br />    Timer0_Init();  //inicjalizacja timera<br />    sei();          //uruchomienie przerywań<br />    <br />    LCDInit(LS_BLINK | LS_ULINE); //Inicjalizacja LCD<br />    LCDClear();                   //Czyszczenie wyświetlacza<br /><br />    DDRC = 0xF0; //ustawienie pinów wej/wyj: 1111 0000<br />    PORTC = 0x0F;//ustawienei stanu wyskiego na pinach: 0000 1111<br />    <br />    while(1){<br />        if (int0_occur == 1)//wciśnięto przycisk<br />        {<br />            licznik++;<br />            uint8_t key = FindKey();<br />            _delay_ms(100);<br />            int0_occur=0;<br /><br />            LCDClear();<br />            LCDWriteIntXY(7,1,licznik,3);<br />            LCDWriteIntXY(7,0,key,3);<br />        }<br />    }<br />}<br />void INT0_Init(void){<br />    DDRD= 0x00; //PORTD wejściem<br />    PORTD = 0xFF; //PORTD podciagniety do VCC<br />    MCUCR |= 1&lt;&lt;ISC01;//zbocze opadajace<br />    GICR |= 1&lt;&lt;INT0; //włączenie przerwania INT0<br />}<br />void Timer0_Init(void) {<br />    TCCR0 |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00); //Ustawia wartość prescalera FCPU/1024<br />    TIMSK |= (1 &lt;&lt; TOIE0); //Ustawia zdarzenie przepełnienia timera na włączone<br />    TCNT0 = 0; //inicializuje licznik timera<br />}<br />uint8_t FindKey(void) {<br />    uint8_t cyfra = 255;<br />    //wiersz 1<br />    PORTC = 0xEF;//1110 1111<br />    asm volatile(&quot;nop&quot;);<br />    if(bit_is_clear(PINC, 0)) cyfra = 1;//1<br />    if(bit_is_clear(PINC, 1)) cyfra = 2;//2<br />    if(bit_is_clear(PINC, 2)) cyfra = 3;//3<br />    //wiersz 2<br />    PORTC = 0xDF;//1101 1111<br />    asm volatile(&quot;nop&quot;);<br />    if(bit_is_clear(PINC, 0)) cyfra = 4;//4<br />    if(bit_is_clear(PINC, 1)) cyfra = 5;//5<br />    if(bit_is_clear(PINC, 2)) cyfra = 6;//6<br />    //wiersz 3<br />    PORTC = 0xBF;//1011 1111<br />    asm volatile(&quot;nop&quot;);<br />    if(bit_is_clear(PINC, 0)) cyfra = 7;//7<br />    if(bit_is_clear(PINC, 1)) cyfra = 8;//8<br />    if(bit_is_clear(PINC, 2)) cyfra = 9;//9<br />    //wiersz 4<br />    PORTC = 0x7F;//0111 1111<br />    asm volatile(&quot;nop&quot;);<br />    if(bit_is_clear(PINC, 0)) cyfra = 10;//10<br />    if(bit_is_clear(PINC, 1)) cyfra = 11;//11<br />    if(bit_is_clear(PINC, 2)) cyfra = 12;//12<br />    <br />    return cyfra;<br />    }[/syntax]<br /><br />Problem polega na tym, że zwracana liczba przez funkcję <strong>FindKey(void)</strong> jest zawsze wartością z ostatniego wiersza. Tak jak by, to co jest przed komentarzem <strong>//wiersz 4</strong> nie było wykonywane. Czyli ciągle dostaje wartość 10,11 lub 12. Piny C 0-3 reagują prawidłowo. Natomiast Piny 4-7 reaguje tylko ten który jest ostatni w funkcji FindKey(). Czyli w podanym kodzie będzie to 7. Moje pytanie jest, co przeoczyłem lub źle zrobiłem? Dlaczego jedna tylko kolumna jest sprawdzana?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4808">Xseomres</a> — 22 cze 2014, o 22:54</p><hr />
]]></content>
</entry>
</feed>