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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-02T13:41:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=17205&amp;mode</id>
<entry>
<author><name><![CDATA[Krlk]]></name></author>
<updated>2017-01-02T13:41:28+01:00</updated>
<published>2017-01-02T13:41:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178818#p178818</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178818#p178818"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178818#p178818"><![CDATA[
Zegarek działa zgodnie z założeniami. Dziękuję! <br /><br />Lekcja na przyszłość, warto odpocząć jak się utknie, ego nie jest najważniejsze <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=15073">Krlk</a> — 2 sty 2017, o 13:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-01-02T12:01:46+01:00</updated>
<published>2017-01-02T12:01:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178807#p178807</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178807#p178807"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178807#p178807"><![CDATA[
Dodatkowo zmień na:<br />[syntax=c]#include &lt;util/delay.h&gt;[/syntax]<br /><br />Tutaj jest błąd:<br />[syntax=c]// testowa dioda<br />TEST_LED_PORT |= TEST_LED;<br />TEST_LED_PORT |= TEST_LED; // dioda off[/syntax] <br /><br />A jeśli zadeklarujesz zmienną static uint8_t licznik1;, którą masz w przerwaniu jako zmienną globalną uint8_t licznik1;to później możesz napisać:<br />[syntax=c]if ( (licznik0 == 1) &amp;&amp; ( licznik1&lt;=29 ) ) // kropka(GG.MM  MM.SS)<br />            {<br />                    SEGMENTY_PORT &amp;= ~SEG_DP;    <br /> <br />            }[/syntax]  <br />zamiast:<br />[syntax=c]if(licznik0 == 1) // kropka(GG.MM  MM.SS)<br />            {<br />                    SEGMENTY_PORT &amp;= ~SEG_DP;    <br /> <br />            }[/syntax]<br />Aby ta cyfra z kropką nie migała, trzeba jeszcze zwiększyć trochę odświeżanie np OCR0=171 czyli 250Hz<br />Ostatni element tablicy const uint8_t cyfry[] PROGMEM tak na prawdę jest niepotrzebny:<br />[syntax=c]~(SEG_DP),[/syntax]<br /><br />OCR2 powinno być równe 107, a nie 108. <br /><br />No i na koniec musisz jeszcze gdzieś wywołać tą funkcję:<br />[syntax=c]zmiana_wys(stan);[/syntax]<br /><br />Pozdrawiam <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=7157">anshar</a> — 2 sty 2017, o 12:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2017-01-02T07:24:44+01:00</updated>
<published>2017-01-02T07:24:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178794#p178794</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178794#p178794"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178794#p178794"><![CDATA[
Poza tym chochlikiem w sposobie odczytywania stanu bitów portu,<br />jeszcze mało znaczący, ale też duszek.<br />w przerwaniu wartość wyliczana w pętli to min. 1 max 99 = 99 a nie 100. (przydało by się else).  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />[syntax=c]// Zliczanie sekund<br />ISR(TIMER2_COMP_vect) { // wchodze tu 100 razy na sekunde<br />       <br />        static uint8_t licznik1;<br />       <br />        if(licznik1 == 99) {<br />               <br />                czas(); // czas(); - wykonuje 1 raz na sekunde<br />                licznik1 = 0;<br />        }       <br />        else    licznik1++;<br />};[/syntax]<br />teraz jest od 0 do 99 = 100. setnym działaniem jest tylko wpisanie zera - bez inkrementacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 2 sty 2017, o 07:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-01-02T06:36:33+01:00</updated>
<published>2017-01-02T06:36:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178793#p178793</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178793#p178793"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178793#p178793"><![CDATA[
<div class="quotetitle">Krlk napisał(a):</div><div class="quotecontent"><br />                if( !key_lock &amp;&amp; !(PORT_KEY &amp; KEY ) ) {<br />                        key_lock=50000;<br />                       <br />                        TEST_LED_PORT &amp;= ~TEST_LED;<br />                        //_delay_ms(10000);<br />                       <br />                        //stan ^= true;<br />                                               <br />                } else if( key_lock &amp;&amp; (PORT_KEY &amp; KEY ) ) key_lock++;<br /></div><br />Bo to NIGDY nie ma prawa zadziałać, zajrzyj na bloga i porównaj toż masz tam poprawny kod<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 sty 2017, o 06:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krlk]]></name></author>
<updated>2017-01-02T05:32:16+01:00</updated>
<published>2017-01-02T05:32:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178792#p178792</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178792#p178792"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178792#p178792"><![CDATA[
Przeniosłem sei(); przed pętlę while, a obie procedury obsługi przerwań napisałem w pliku z funkcjami, pliku.c (tam gdzie jest funkcja &quot;init_IO&quot;), ale w dalszym ciągu nie wchodzę do zdażenia &quot;PRES BUT&quot;...myślałem że to może coś sprzętowego, ale po podłączenia pinu 7 portu C, na którym mam zdefiniowany przycisk, zarówno do GND i VCC płytki, nie mam reakcji więc to prawie na pewno kwestia programowa...<br /><br />Ten projekcik to zwykły zegarek na wyświetlaczu siedmiosegmentowym zestawu ATB. Płytka Atnel ma standardowo 4 moduły cyfr, wszystko działa, to znaczy kiedy chcę wyświetlić godzinę i minuty albo minuty i sekundy, ale do skończenia całości zostało mi do zrealizowania przełączanie pomiędzy tymi stanami czyli wyświetlaniem GG:MM i MM:SS po przyciśnięciu guzika...niby najprostsza rzecz na świecie...no i właśnie z nią mam ten problem... <br /><br />Wrzucę niżej jak wygląda całość kodu może czegoś się dopatrzycie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Był bym wdzięczny <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />zegar.h:<br />[syntax=c]// zegar.h<br /><br />#ifndef MULTIPLEKS_H_<br />#define MULTIPLEKS_H_<br /><br /><br />// definicje portu i rejestru kierunkowego dla SEGMENTÓW wysw<br />#define SEGMENTY_PORTPORTA<br />#define SEGMENTY_KIERUNEKDDRA<br /><br />// definicje portu i rejestru kierunkowego dla ANOD wysw<br />#define ANODY_PORTPORTC<br />#define ANODY_KIERUNEKDDRC<br /><br />// definicje bitów dla ANOD<br />#define ANODA_1(1&lt;&lt;0)<br />#define ANODA_2(1&lt;&lt;1)<br />#define ANODA_3(1&lt;&lt;2)<br />#define ANODA_4(1&lt;&lt;3)<br /><br />#define MASKA_ANODY (ANODA_1 | ANODA_2 | ANODA_3 | ANODA_4)<br /><br />// definicje bitów dla SEGMENTÓW<br />#define SEG_A(1&lt;&lt;0)<br />#define SEG_B(1&lt;&lt;1)<br />#define SEG_C(1&lt;&lt;2)<br />#define SEG_D(1&lt;&lt;3)<br />#define SEG_E(1&lt;&lt;4)<br />#define SEG_F(1&lt;&lt;5)<br />#define SEG_G(1&lt;&lt;6)<br />#define SEG_DP(1&lt;&lt;7)<br /><br />extern uint8_t cyfry_do_wys&#91;6&#93;;<br /><br />// czas na wyświetlacz<br />extern uint8_t g1;<br />extern uint8_t g2;<br />extern uint8_t m1;<br />extern uint8_t m2;<br />extern uint8_t s1;<br />extern uint8_t s2;<br /><br />// sprawdzenie czy wcisniety klawisz<br />extern _Bool stan; <br /><br />//<br />#define MIN2_PLUS ((s1 == 5) &amp; (s2 ==9))<br />#define GODZ2_PLUS ((m1 == 5) &amp; (m2 == 9))<br /><br />// przycisk<br />#define PORT_KEY PORTC<br />#define KEY (1&lt;&lt;PC7)<br /><br />// testowa dioda<br />#define TEST_LED(1&lt;&lt;PC6)<br />#define TEST_LED_PORTPORTC<br /><br /><br />// moje funkcje<br />void init_IO(void);// inicjalizacja wejść wyświetlacza 7 segmentowego<br />void czas(void);// funkcja wpisujaca godzine do tablicy cyfr wyswietlanych na wyswietlaczu<br />void zmiana_wys(_Bool zm_wys);// zmiana z GG:MM na MM:SS po wciśnięciu but<br /><br />#endif /* MULTIPLEKS_H_ */[/syntax]<br /><br /><br /><br />zegar.c:<br />[syntax=c]// zegar.c<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br />#include &quot;zegar.h&quot;<br /><br />const uint8_t cyfry&#91;&#93; PROGMEM = {<br />~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F ),// 0<br />~(SEG_B | SEG_C),// 1<br />~(SEG_A | SEG_B | SEG_D | SEG_E | SEG_G),// 2<br />~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G),// 3<br />~(SEG_B | SEG_C | SEG_F | SEG_G),// 4<br />~(SEG_A | SEG_C | SEG_D | SEG_F | SEG_G),// 5<br />~(SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G),// 6<br />~(SEG_A | SEG_B | SEG_C | SEG_F),// 7<br />~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G),                // 8<br />~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G),// 9<br />~(SEG_DP),// .<br />};<br /><br />uint8_t cyfry_do_wys&#91;6&#93;; // zmienna tablicowa zawierająca cyfry do wyświetlenia<br /><br />// czas na wyświetlacz<br />uint8_t g1;<br />uint8_t g2;<br />uint8_t m1;<br />uint8_t m2;<br />uint8_t s1;<br />uint8_t s2;<br /><br />// sprawdzenie czy wcisniety klawisz<br />_Bool stan = true;<br /><br /><br />void init_IO(void) {<br />// przycisk<br />DDRC &amp;= ~KEY;<br />PORT_KEY |=  KEY;<br /><br />// testowa dioda<br />TEST_LED_PORT |= TEST_LED;<br />TEST_LED_PORT |= TEST_LED; // dioda off<br /><br /><br />SEGMENTY_KIERUNEK|= 0xff;// ustawienie portu katod(segmentow) jako wyjścia<br />SEGMENTY_PORT|= 0xff;// wygaszam wszystkie segmenty przez podanie 1 na katody<br /><br />ANODY_KIERUNEK|= ANODA_1 | ANODA_2 | ANODA_3 | ANODA_4;// ustawienie anod jako wyjsc<br />ANODY_PORT|= ANODA_1 | ANODA_2 | ANODA_3 | ANODA_4;// w ATB 1.05 zastosowano kluczowanie nap przez tranzystory PNP, a emiter jest na Vcc, czyli dla 1 na bazie potencjał będzie 0, a dla 0 potencjał na bazie będzie 1. <br /><br /><br />//********************************************************************************************** TIMERY<br /><br />// TIMER0<br />TCCR0 |= (1&lt;&lt; WGM01);// Tryb pracy CTC<br />TCCR0 |= (1&lt;&lt;CS02);// prescaler = 256<br />OCR0 = 215;// 200 Hz <br />TIMSK |= (1&lt;&lt;OCIE0);// Pryb przerwania dla TIMER0 - CompareMatch<br /><br />// TIMER2<br />TCCR2 |= (1&lt;&lt; WGM21);// Tryb pracy CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20);// prescaler = 1024<br />OCR2 = 108;// 100 Hz = 0.01 s<br />TIMSK |= (1&lt;&lt;OCIE2);// Pryb przerwania dla TIMER0 - CompareMatch<br />}<br /><br />//*************************************************************************************************** PRZERWANIA<br /><br />// Multipleksowanie wyświetlacza<br />ISR(TIMER0_COMP_vect) { // funkcja przerwań, tu piszę CO MA SIĘ DZIA PODCZAS PRZERWANIA!!!<br /><br />static uint8_t licznik0; //static - zmienna istnieje przez cały czas trwania programu, Prawie zmienna globalna! <br />// nie jest tak że cały czas tworzę od nowa tą zmienną? nie powinna się wyzerować za każdym razem???<br /><br />ANODY_PORT |= MASKA_ANODY; // wygaszenie <br /><br />SEGMENTY_PORT = pgm_read_byte(&amp;cyfry&#91;cyfry_do_wys&#91;licznik0&#93;&#93;);<br /><br /><br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (~(1&lt;&lt;licznik0) &amp; MASKA_ANODY); // cykliczne przełączanie wyświetlaczy<br /><br />if (licznik0 == 1) // kropka(GG.MM  MM.SS)<br />{<br />SEGMENTY_PORT &amp;= ~SEG_DP;<br />}<br /><br />licznik0++;<br />if(licznik0 &gt;3) licznik0 =0;<br /><br />};<br /><br /><br />// Zliczanie sekund<br />ISR(TIMER2_COMP_vect) { // wchodze tu 100 razy na sekunde<br /><br />static uint8_t licznik1;<br /><br />if(licznik1 == 99) {<br /><br />czas();// czas(); - wykonuje 1 raz na sekunde<br />licznik1 = 0;<br />}<br /><br />licznik1++;<br />};<br /><br /><br />void czas(void) { <br /><br />// g1g2:m1m2:s1:s2<br /><br />// MIN2_PLUS -&gt; ((s1 == 5) &amp; (s2 ==9))<br />// GODZ2_PLUS -&gt; ((m1 == 5) &amp; (m2 == 9))<br /><br />// g1<br />if ((g1 &lt;2) &amp; (g2 == 9) &amp; GODZ2_PLUS &amp; MIN2_PLUS ){<br />if((g1 == 1) &amp; (g2 ==9) &amp; GODZ2_PLUS &amp; MIN2_PLUS) {<br />g1=2;<br />g2=0;<br />goto skok;<br />}<br />g1++;<br />}<br />else if((g1 == 2) &amp; (g2 == 3) &amp; GODZ2_PLUS &amp; MIN2_PLUS) {<br />g1=0;<br />g2=0;<br />goto skok;<br />}<br /><br />// g2<br />//dla 19 lub 10<br />if ((g1 &lt; 2) &amp; (g2 &lt; 9) &amp; GODZ2_PLUS &amp; MIN2_PLUS){<br />g2++;<br />} <br />else if((g1 &lt; 2) &amp; (g2 == 9) &amp; GODZ2_PLUS &amp; MIN2_PLUS) {<br />g2 = 0;<br />}<br /><br />//dla 23<br />else if((g1 &gt; 1) &amp; (g2 &lt; 3) &amp; GODZ2_PLUS &amp; MIN2_PLUS) {<br />g2++;<br />}<br /><br />skok:<br /><br />// m1<br />if ((m1&lt;5) &amp; (m2 == 9) &amp; MIN2_PLUS){<br />m1++;<br />} <br />else if(GODZ2_PLUS &amp; MIN2_PLUS){<br />m1 = 0;<br />}<br /><br />// m2<br />if ((m2&lt;9) &amp; MIN2_PLUS){<br />m2++;<br />}<br />else if ((m2 ==9) &amp; MIN2_PLUS){<br />m2 =0;<br />}<br /><br />// s1<br />if ((s1 &lt; 5) &amp; (s2 == 9)){<br />s1++;<br />}<br />else if (MIN2_PLUS){<br />s1 =0;<br />}<br /><br />//s2<br />    if (s2 == 9) {<br />s2 = 0;<br />    }<br />else {<br />s2++;<br />}<br /><br />// wpisanie godziny<br />cyfry_do_wys&#91;0&#93; = g1; <br />cyfry_do_wys&#91;1&#93; = g2;<br />cyfry_do_wys&#91;2&#93; = m1;<br />cyfry_do_wys&#91;3&#93; = m2;<br />cyfry_do_wys&#91;4&#93; = s1;<br />cyfry_do_wys&#91;5&#93; = s2;<br /><br />};<br /><br /><br />// Przełączanie  GG:MM na MM:SS<br />void zmiana_wys(_Bool zm_wys){<br />if(!zm_wys){<br />cyfry_do_wys&#91;0&#93; = m1;<br />cyfry_do_wys&#91;1&#93; = m2;<br />cyfry_do_wys&#91;2&#93; = s1;<br />cyfry_do_wys&#91;3&#93; = s2;<br />} <br />else{<br />cyfry_do_wys&#91;0&#93; = g1;<br />cyfry_do_wys&#91;1&#93; = g2;<br />cyfry_do_wys&#91;2&#93; = m1;<br />cyfry_do_wys&#91;3&#93; = m2;<br />}<br /><br />};[/syntax]<br /><br /><br />main.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br />#include &lt;avr/delay.h&gt;<br /><br />#include &quot;Lib/zegar.h&quot;<br /><br /><br />uint16_t key_lock;<br /><br />int main(void)<br />{<br />init_IO(); // inicjalizacja I/O<br /><br />// godzina początkowa g1g2:m1m2:s1s2<br />g1=2;<br />g2=3;<br />m1=4;<br />m2=9;<br />s1=5;<br />s2=4;<br /><br />// Czy dobre dane wejściowe?<br />g1=(g1&gt;2) ? 2 : g1;// dla g1<br />// dla g2<br />if ((g1&lt;2) &amp; (g2&gt;9)){<br />g2=9;<br />}<br />else if ((g1&gt;1) &amp; (g2&gt;3)) {<br /><br />g2 = 3;<br />}<br />m1=(m1&gt;5) ? 5 : m1;// dla m1<br />m2=(m2&gt;9) ? 9 : m2;// dla m2<br />s1=(s1&gt;5) ? 5 : s1;// dla s1<br />s2=(s2&gt;9) ? 9 : s2;// dla s2<br /><br /><br />sei();<br /><br />while(1) {<br />if( !key_lock &amp;&amp; !(PORT_KEY &amp; KEY ) ) {<br />key_lock=50000;<br /><br />TEST_LED_PORT &amp;= ~TEST_LED;<br />//_delay_ms(10000);<br /><br />//stan ^= true;<br /><br />} else if( key_lock &amp;&amp; (PORT_KEY &amp; KEY ) ) key_lock++;<br /><br />//TEST_LED_PORT ^= TEST_LED;<br />//_delay_ms(1000);<br />}<br />}[/syntax]<br /><br /><br />Siedzę nad tym całą noc, ale jestem już tak bardzo tym sfrustrowany że nie ma szans żebym dzisiaj coś znalazł <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak naprawdę to program jest gotowy o ile załapie przycisk...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15073">Krlk</a> — 2 sty 2017, o 05:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2017-01-02T04:21:36+01:00</updated>
<published>2017-01-02T04:21:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178791#p178791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178791#p178791"/>
<title type="html"><![CDATA[Re: Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178791#p178791"><![CDATA[
sei(); powinno znajdować się tuż przed pętlą główną while(1).<br />Czy masz napisane procedury obsługi tych przerwań?<br />Przynajmniej tak:<br />[syntax=c]ISR(TIMER0_COMP_vect) {<br /><br />}<br />ISR(TIMER2_COMP_vect) {<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 2 sty 2017, o 04:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krlk]]></name></author>
<updated>2017-01-02T02:49:06+01:00</updated>
<published>2017-01-02T02:49:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178790#p178790</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178790#p178790"/>
<title type="html"><![CDATA[Przyciski a przetwania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17205&amp;p=178790#p178790"><![CDATA[
Cześć, ostatnio napisałem mały programik wykorzystujący timery i przerwania w trybie CTC, teraz chciałem dodać obsługę klawisza.<br />Dodałem obsługę taką jak na blogu Pana Mirka:<br /><br />[syntax=c]while(1) {<br /> <br />  if( !key_lock &amp;&amp; !(PINC &amp; KEY1 ) ) {<br />   key_lock = 50000;<br /> <br />   // reakcja na PRESS (wcinięcie przycisku)<br />   PORTC ^= LED;<br /> <br />  } else if( key_lock &amp;&amp; (PINC &amp; KEY1 ) ) key_lock++;<br /> } <br />}[/syntax]<br /><br />I tu pojawia się pewne ALE...nie mogę wejść do zdażenia &quot;PRESS&quot;...<br /><br />Dla przetestowania wstawiłem sobie tam zapalanie diody ale co bym nie robił to ta nie chce się załączyć...<br /><br />Oczywiście próbowałem również podstawowej wersji detekcji wciśnięcia:<br />[syntax=c]if(!(PINC &amp; (1&lt;&lt;PC7)){...}[/syntax]<br />i nic...<br /><br />Tu rodzi się moje pytanie. <strong><span style="font-size: 100%; line-height: normal">Czy przerwanie może w jakiś sposób zakłócić odczyt wciśnięcia klawisza? </span></strong><br /><br />Poniżej, najistotniejsze fragmenty kodu, z punktu widzenia tego posta.<br /><br />main.c:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />...<br />...<br />...<br /><br /><br />uint16_t key_lock;<br /><br />int main(void)<br />{<br />sei();<br /><br />init_IO(); //inicjalizacja I/O<br /><br />        ...<br />        ...<br />        ...<br /><br />while(1) {<br /><br /><br />if( !key_lock &amp;&amp; !(PORT_KEY &amp; KEY ) ) {<br />key_lock=50000;<br /><br />TEST_LED_PORT ^= TEST_LED;<br />_delay_ms(10000);<br /><br />} else if( key_lock &amp;&amp; (PORT_KEY &amp; KEY ) ) key_lock++;<br /><br />//TEST_LED_PORT ^= TEST_LED;<br />//_delay_ms(1000);<br /><br /><br />if (!(PORT_KEY &amp; KEY)) {<br /><br />TEST_LED_PORT &amp;= ~TEST_LED;<br /><br />//zmiana_wys(stan);<br /><br />//stan ^= true;<br />}<br />}<br /><br />}[/syntax]<br /><br />biblioteka z funkcja &quot;init_IO&quot;.c:<br />[syntax=c]void init_IO(void) {<br />// przycisk<br />DDRC &amp;= ~KEY;<br />PORT_KEY |=  KEY;<br /><br />// testowa dioda<br />DDRC |= TEST_LED;<br />TEST_LED_PORT |= TEST_LED; // dioda off<br />...<br />        ...<br />        ...<br /><br />// TIMER0<br />TCCR0 |= (1&lt;&lt; WGM01);// Tryb pracy CTC<br />TCCR0 |= (1&lt;&lt;CS02);// prescaler = 256<br />OCR0 = 215;// 200 Hz <br />TIMSK |= (1&lt;&lt;OCIE0);// Pryb przerwania dla TIMER0 - CompareMatch<br /><br />// TIMER2<br />TCCR2 |= (1&lt;&lt; WGM21);// Tryb pracy CTC<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20);// prescaler = 1024<br />OCR2 = 108;// 100 Hz = 0.01 s<br />TIMSK |= (1&lt;&lt;OCIE2);// Pryb przerwania dla TIMER0 - CompareMatch<br />}[/syntax]<br /><br />plik z definicjami plik.h:<br />[syntax=c]// przycisk<br />#define PORT_KEY PORTC<br />#define KEY (1&lt;&lt;PC7)<br /><br />// testowa dioda<br />#define TEST_LED(1&lt;&lt;PC6)<br />#define TEST_LED_PORTPORTC[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15073">Krlk</a> — 2 sty 2017, o 02:49</p><hr />
]]></content>
</entry>
</feed>