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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2023-03-19T17:08:15+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=24428&amp;mode</id>
<entry>
<author><name><![CDATA[Krzysiek]]></name></author>
<updated>2023-03-19T17:08:15+01:00</updated>
<published>2023-03-19T17:08:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236677#p236677</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236677#p236677"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236677#p236677"><![CDATA[
Witam chciałbym odpowiedzieć koledze Rafal9018 na jego pytanie. tak naprawdę to nie ja będę odpowiadał lecz &quot;Czat GPT&quot;<br />tak zwana sztuczna inteligencja. należy nauczy się zadawać pytania w odpowiedni sposób. Od razu zaznaczam ,że nie chcę podważy roli Mirka w nauczaniu programowania, pragnę zwrócić uwagę na nowe pomocne narzędzie na etapie nauki programowania. Zwłaszcza dla początkujących. Chciałbym ten post skierować do Mirka, niech zwróci uwalę na ten kod nie mam możliwości sprawdzenia tego kodu po prostu w tej chili nie mam żadnej klawiatury .<br /><br />[syntax=c]Pierwsze pytanie do GPT :<br /> Napisz program klawiatury matrycowej, Wiersze do portu C, PC0,PC1,PC2,PC3,PC4,PC5,PC6, PC7<br /> Kolumny do portu D. PD2 ,PD3,PD4 wykożystaj TIMER 0 dla Atmega 8 i kompilator &quot;Eckipse&quot;<br /><br />Niestety, jako model językowy, nie mam możliwości wykonania programu w języku maszynowym,<br /> który jest włączony do uruchomienia go na mikrokontrolerze Atmega 8.<br /> Mogę jednak wprowadzić ogólny algorytm rozwiązań takich zadań:<br /><br />Ustaw porty PC0-PC7 jako wyjście (kierunek bitów na wyjście)<br />Ustaw porty PD2-PD4 jako wejście (kierunek bitów na wejściu)<br />Ustaw stan początkowych portów PC0-PC7 na 0<br />Ustaw tryb pracy timera 0<br />Włącz przerwania timera 0<br />W funkcjach obsługi przerwania timera 0: a) Ustaw kolumnę (jeden z portów PD2-PD4) na stan wysoki b) <br />Odczytaj stan wierszy (porty PC0-PC7) i wykonaj działanie działania w funkcji od naciśniętego systemu c)<br /> Ustaw kolumnę na stan niski d ) Przejdź do następnej trasy e) Jeśli dotarłeś do ostatniej podróży, przejdź na pierwszą<br />Powtarzaj kroki 6a-6e w pętli nieskończonej<br />W kodzie programu należy oczywiście uwzględnić wszystkie potrzebne rejestry i zmienne,<br /> a także odpowiednio włączyć timer 0.<br /><br /><br /><br /><br /><br />Drugie pytanie prawie takie samo  .<br />Napisz przykład dla programu klawiatury matrycowej, Wiersze do portu C PC0,PC1,PC2,PC3,PC4,PC5,PC6, PC7 ,<br /> Kolumny do portu D, PD2 ,PD3,PD4 wykożystaj TIMER 0 dla Atmega 8 i napisz dla kompilatora &quot;Eckipse&quot;<br />Odpowiedź GPT , jeszcze nie za bardzo radzi sobie z gramatyką polską.<br /> <br />Oto przykładowy kod programu obsługującego klawiaturę matrycową na Atmega 8, <br />z włączonymi portami C (PC0-PC7) jako wiersze i porty D (PD2-PD4) jako moduł, oraz Timer 0 do odświeżania wszedł:<br /><br />C<br /><br />Skopiuj kod<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//definicje wierszy i kolumn<br />#define ROW_PORT PORTC<br />#define ROW_DDR DDRC<br />#define ROW_PIN PINC<br />#define COL_PORT PORTD<br />#define COL_DDR DDRD<br />#define COL_PIN PIND<br />#define COL1 PD2<br />#define COL2 PD3<br />#define COL3 PD4<br /><br />volatile uint8_t key_pressed = 0; //flaga sygnalizująca naciśnięcie klawisza<br />volatile uint8_t key_code = 0; //kod naciśniętego klawisza<br /><br />//tablica mapowania klawiszy na ich kody<br />const uint8_t keymap&#91;8&#93;&#91;3&#93; = {<br />    {'1', '2', '3'},<br />    {'4', '5', '6'},<br />    {'7', '8', '9'},<br />    {'*', '0', '#'},<br />    {'A', 'B', 'C'},<br />    {'D', 'E', 'F'},<br />    {'G', 'H', 'I'},<br />    {'J', 'K', 'L'}<br />};<br /><br />void keyboard_init() {<br />    ROW_DDR = 0xFF; //ustaw wszystkie wiersze jako wyjścia<br />    ROW_PORT = 0xFF; //ustaw stan początkowy wierszy na wysoki<br />    COL_DDR |= (1&lt;&lt;COL1) | (1&lt;&lt;COL2) | (1&lt;&lt;COL3); //ustaw kolumny jako wyjścia<br />    COL_PORT |= (1&lt;&lt;COL1) | (1&lt;&lt;COL2) | (1&lt;&lt;COL3); //ustaw stan początkowy kolumn na wysoki<br />    //ustaw timer 0 w tryb CTC, prescaler 64<br />    TCCR0 |= (1&lt;&lt;WGM01) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00);<br />    OCR0 = 156; //ustaw wartość licznika<br />    TIMSK |= (1&lt;&lt;OCIE0); //włącz przerwania dla timera 0<br />}<br /><br />ISR(TIMER0_COMP_vect) {<br />    static uint8_t col = 0;<br />    uint8_t row, mask;<br />    //ustaw kolumnę na stan wysoki<br />    COL_PORT |= (1&lt;&lt;(COL1+col));<br />    //odczytaj stan wierszy i sprawdź, który przycisk jest naciśnięty<br />    row = ROW_PIN;<br />    mask = 1;<br />    for (uint8_t i = 0; i &lt; 8; i++) {<br />        if ((row &amp; mask) == 0) { //znaleziono naciśnięty przycisk<br />            key_pressed = 1;<br />            key_code = keymap&#91;i&#93;&#91;col&#93;;<br />            break;<br />        }<br />        mask &lt;&lt;= 1;<br />    }<br />    //ustaw kolumnę na stan niski i przejdź do kolejnej<br />    COL_PORT &amp;= ~(1&lt;&lt;(COL1+col));<br />    col++;<br />    if (col &gt; 2) col = 0;<br />}<br /><br />int main() {<br />    keyboard_init();<br />    sei(); //włącz globalne przerw<br /><br /><br />Czat GPT zawiesił się skończył myślenie i uważał że skończył<br />Moje dodatkowe polecenie dl czat GPT<br /><br />dokończ program i dodaj komentarz<br />C<br /><br /><br />int main() {<br />    keyboard_init();<br />    sei(); //włącz globalne przerwania<br />    while(1) {<br />        if (key_pressed) { //jeśli naciśnięto klawisz<br />            //obsłuż naciśnięty klawisz (np. wyświetl na ekranie)<br />            //w tym przykładzie wyświetlamy kod naciśniętego klawisza na diodach LED<br />            PORTB = key_code;<br />            key_pressed = 0; //zresetuj flagę naciśnięcia klawisza<br />        }<br />    }<br />    return 0;<br />}<br />W funkcji main()po włączeniu globalnych przerwań w pętli głównej programu sprawdzamy,<br /> czy został naciśnięty jakiś klawisz (flaga key_pressedustawiona na 1). <br /> Jeśli tak, obsługujemy naciśnięty klawisz (np. wyświetlamy na ekranie).<br /> W tym celu dołączamy kod naciśniętego klawisza wyświetlamy na diodach LED połączonych z portem B.<br /> Następnie resetujemy flagę key_pressed.<br /><br />Program działa w sposób cykliczny - w każdej iteracji pętli głównej odświeżania jest interfejs i działa na naciśnięcie klawisza.<br /> Jeśli program ma być bardziej interaktywny,<br /> można dodać dodatkowe funkcje obsługi klawiszy i działania na ich naciśnięcia w czasie rzeczywistym.[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=637">Krzysiek</a> — 19 mar 2023, o 17:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ELEKTRON105]]></name></author>
<updated>2023-03-10T17:32:06+01:00</updated>
<published>2023-03-10T17:32:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236604#p236604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236604#p236604"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236604#p236604"><![CDATA[
<div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br />Proszę a o to lek na dolegliwość!!! cały cykl przekazany w sposób perfekcyjny i to w oryginalnym stylu z klasą <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=2242">ELEKTRON105</a> — 10 mar 2023, o 17:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[0livaw]]></name></author>
<updated>2023-03-10T12:12:37+01:00</updated>
<published>2023-03-10T12:12:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236601#p236601</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236601#p236601"/>
<title type="html"><![CDATA[Re: Klawiatura matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236601#p236601"><![CDATA[
Poniżej przykład użycia timer-a 0 do obsługi klawiatury (sekcja procedury.c):<br /><!-- m --><a class="postlink" href="https://www.e-tronix.eu/24,przykladowy-program-SU.html" >https://www.e-tronix.eu/24,przykladowy-program-SU.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1304">0livaw</a> — 10 mar 2023, o 12:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rafal9018]]></name></author>
<updated>2023-03-10T09:11:51+01:00</updated>
<published>2023-03-10T09:11:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236600#p236600</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236600#p236600"/>
<title type="html"><![CDATA[Klawiatura matrycowa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24428&amp;p=236600#p236600"><![CDATA[
Cześć,<br /><br />Panowie szukam inspiracji jak obsłużyć klawiaturę matrycową. Generalnie wiem jak to się powinno robić ale jak wszystkie kolumny i wiersze mam podłączone do jednego portu. Natomiast jak wiersze i kolumny są na osobnych portach to sprawia mi to pewien kłopot  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br /><br />Założenia:<br />Klawiatura 8x3<br /><br />Wiersze podłączone do portu C. PC0 - PC7<br />Kolumny podłączone do portu D. PD2 - PD4<br /><br />Samo sekwencję ustawiania odpowiednio zer i jedynek mam zrobioną ale jak zrobić odczyt klawisza z założeniem, że jeśli nacisnę dwa bądź więcej klawiszy będę miał taką informację. Nie chce zrobić lasu ifów  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3441">Rafal9018</a> — 10 mar 2023, o 09:11</p><hr />
]]></content>
</entry>
</feed>