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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-02T11:34:21+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11565&amp;mode</id>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-02T11:34:21+01:00</updated>
<published>2015-05-02T11:34:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128058#p128058</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128058#p128058"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128058#p128058"><![CDATA[
<div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />Co konkretnie masz na myśli?<br /></div><br />Mam na myśli MODE Timer1 - CTC. Wydaje mi się, że wartością TOP jest 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 2 maja 2015, o 11:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-05-02T10:44:27+01:00</updated>
<published>2015-05-02T10:44:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128051#p128051</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128051#p128051"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128051#p128051"><![CDATA[
<div class="quotetitle">Wirnick napisał(a):</div><div class="quotecontent"><br />A co myślisz o wartości TOP. Jaką wartość przyjmuje?<br /></div><br /><br />Co konkretnie masz na myśli?<br />Co do przewań, to one MUSZĄ działać z dwóch powodów:<br /><br />1) Używam biblioteki UART na buorach cyklicznych, gdzie kolejne bajty są odbierane i wysyłane w przerwaniu.<br />2) Używam też odtwarzania dźwięku z karty SD, który korzysta z Timer0 - ta część też działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 2 maja 2015, o 10:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-02T10:33:03+01:00</updated>
<published>2015-05-02T10:33:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128049#p128049</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128049#p128049"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128049#p128049"><![CDATA[
A co myślisz o wartości TOP. Jaką wartość przyjmuje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 2 maja 2015, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-05-02T10:21:15+01:00</updated>
<published>2015-05-02T10:21:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128047#p128047</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128047#p128047"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128047#p128047"><![CDATA[
<div class="quotetitle">Wirnick napisał(a):</div><div class="quotecontent"><br />UART działa bez sei - jeszcze się upewnię, bo to było wczoraj.<br />Wydaje mi się, że init_time() to nie time_init() - ale sprawdź to.<br /></div><br /><br />To oczywiście pomyłka popełniona podczas pisania posta...<br />Co jeszcze w takim razie może przeciwdziałać wykonywaniu przerwań? Jakiś fusebit?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 2 maja 2015, o 10:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2015-05-02T10:15:46+01:00</updated>
<published>2015-05-02T10:15:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128045#p128045</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128045#p128045"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128045#p128045"><![CDATA[
UART działa bez sei - jeszcze się upewnię, bo to było wczoraj.<br />Wydaje mi się, że init_time() to nie time_init() - ale sprawdź to.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 2 maja 2015, o 10:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-05-02T10:07:27+01:00</updated>
<published>2015-05-02T10:07:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128043#p128043</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128043#p128043"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128043#p128043"><![CDATA[
Tak, widziałem ten kod. Okazuje się, że problem leży gdzie indziej. Po bliższym przyjrzeniu się pracy układu okazuje się, że nie wykonuje się przerwanie timera. Początkowo używałem w tym celu tryby CTC w Timer2, potem spróbowałem też na Timer1.<br /><br />W tej chwili kod obsługi przerwania wygląda następująco:<br /><br />[syntax=c]extern void time_init (void) {<br />TCCR1B |= (1 &lt;&lt; WGM12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);<br />TCNT1 = 0;<br />OCR1A = 171;<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />ISR (TIMER1_COMPA_vect) {<br />mil++;<br />if (Timer1) {<br />Timer1--;<br />}<br /><br />PORTC ^= (1 &lt;&lt; PC0);<br />}[/syntax]<br /><br />Wartość zmiennej mil nie wzrasta, dioda podłączona do PC0 nie pulsuje.<br />W funkcji main() została wywołana funkcja init_time() oraz sei(). Działa też UART, więc wygląda na to, że globalne przerwania są w porządku. Co może być powodem takiego zachowania? Uszkodzona Atmega?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 2 maja 2015, o 10:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T19:10:21+01:00</updated>
<published>2015-05-01T19:10:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128013#p128013</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128013#p128013"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=128013#p128013"><![CDATA[
zajrzyj do projektu wielozadaniowego - na DVD - masz tę wersję funkcji?<br /><br />[syntax=c]/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************<br /> * AUTOR: Mirosław Kardaś<br /> * ZALETY:<br /> * - nie wprowadza najmniejszego spowalnienia<br /> * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku)<br /> * - można przydzielić różne akcje dla trybu REPEAT i pojedynczego kliknięcia<br /> * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL)<br /> *<br /> * Wymagania:<br /> * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz)<br /> *<br /> * Parametry wejściowe:<br /> * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt)<br /> *  *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB<br /> *  key_mask - maska klawisza np: (1&lt;&lt;PB3)<br /> *  rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT<br /> *  rep_wait - czas oczekiwania do przejścia do trybu REPEAT<br /> *  push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku<br /> *  rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT<br /> **************************************************************************************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) )[/syntax]<br /><br />chyba nie?<br /><br />widzisz co tu jest dodatkowo ? --&gt; key_state<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 19:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-05-01T16:23:14+01:00</updated>
<published>2015-05-01T16:23:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127980#p127980</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127980#p127980"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127980#p127980"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent">Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie<br /></div><br />To się zaczyna od obsługi klawiatury matrycowej a nie od obsługi pojedynczych klawiszy. Tu jest twój pierwszy i podstawowy błąd</div><br /><br />Wyraziłem się mało precyzyjnie. Nie chodzi mi o możliwość sprawdzania, czy wciśnięta została kombinacja przycisków.<br />Przyciski wciąż będą sprawdzane pojedynczo. Nie chcę jedynie, żeby wciśnięcie kolejnego przycisku przed puszczeniem pierwszego zakłóciło działanie układu. Czyli:<br /><br />1) Wciskamy przycisk 1 - funkcja filtruje odbicia i czeka na jego puszczenie. Do tego czasu funkcja nadrzędna zwraca 0 do pętli głównej.<br />2) Wciskamy przycisk 2 - funkcja filtruje odbicia i czeka na jego puszczenie. Do tego czasu funkcja nadrzędna zwraca 0 do pętli głównej.<br />3) Puszczamy przycisk 1 - funkcja nadrzędna zwraca wartość 1 do pętli głównej.<br />4) Puszczamy przycisk 2 - funkcja nadrzędna zwraca wartość 2 do pętli głównej.<br />5) Funkcja nadrzędna wraca do stanu domyślnego - przy każdym wywołaniu zwraca do pętli głównej 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 1 maja 2015, o 16:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T15:02:51+01:00</updated>
<published>2015-05-01T15:02:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127966#p127966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127966#p127966"/>
<title type="html"><![CDATA[Re: Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127966#p127966"><![CDATA[
<div class="quotetitle">Atlantis napisał(a):</div><div class="quotecontent"><br />Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie<br /></div><br />To się zaczyna od obsługi klawiatury matrycowej a nie od obsługi pojedynczych klawiszy. Tu jest twój pierwszy i podstawowy błąd<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 15:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-05-01T14:50:55+01:00</updated>
<published>2015-05-01T14:50:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127965#p127965</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127965#p127965"/>
<title type="html"><![CDATA[Drgania styków bez blokowania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11565&amp;p=127965#p127965"><![CDATA[
Próbuję napisać własną funkcję filtrowania drgań styków, wzorując się delikatnie na przykładzie z niebieskiej książki. Jestem jednak zmuszony wprowadzić kilka zmian:<br /><br />1) Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie. Dla każdego mam przygotowane osobne zmienne, które podaję przez wskaźnik.<br />2) Funkcja ma zwracać wartość 1, gdy wykryje kompletną sekwencję: wciśnięcie przycisku  -&gt; przytrzymanie przez minimum 200 ms, puszczenie przycisku. W każdym innym przypadku zwraca wartość 0.<br />3) Funkcja operuje nie na timerach sprzętowych obsługiwanych w przerwaniu, ale na funkcji millis(), działającej dokładnie jak w Arduino (chodzi mi o kompatybilność kodu z tą pratformą).<br />4) Funkcja debounce_key() będzie wywoływana kolejno w ramach funkcji nadrzędnej, z różnymi paramtrami. Gdy któreś wywołanie zwróci 1, funkcja nadrzędna zwróci numer klawisza, który będzie dalej wykorzystywany w pętli głównej.<br /><br />Kod wygląda tak:<br /><br />[syntax=c]uint8_t debounce_key (volatile uint8_t *KPIN, uint8_t keymask, volatile key_state_t *key_state, volatile uint32_t *key_time) {<br /><br />uint8_t key_press;<br /><br />key_press = !(*KPIN &amp; keymask);<br /><br />if (*key_state == IDLE) {<br />if (key_press) {<br />*key_state = DEBOUNCE;<br />*key_time = millis();<br />LED_ON;<br />}<br />}<br />else if (*key_state == DEBOUNCE) {<br />if ( key_press) {<br />if ( ( key_time &amp;&amp; (millis() &gt; (*key_time + 200))) ) {<br />*key_state = PRESSED;<br />}<br />}<br />else {<br />*key_state = IDLE;<br />*key_time = 0;<br />}<br />}<br />else if (!key_press &amp;&amp; (*key_state == PRESSED)) {<br />*key_state = IDLE;<br />*key_time = 0;<br />return 1;<br />}<br /><br />return 0;<br />}[/syntax]<br /><br />W funkcji nadrzędnej funkcje obsługiwane są następująco:<br /><br />[syntax=c]extern uint8_t ReadKey (void) {<br /><br />static key_state_t key_start = IDLE;<br />static key_state_t key1 = IDLE;<br /><br />static uint32_t key_start_time = 0;<br />static uint32_t key1_time = 0;<br /><br /><br />if ( debounce_key(&amp;PINB, (1 &lt;&lt; PB3), &amp;key_start, &amp;key_start_time) ) return START_KEY;<br />if ( debounce_key(&amp;PIND, (1 &lt;&lt; PD2), &amp;key1, &amp;key1_time) ) return 1;<br /><br />return 0;<br /><br />}[/syntax]<br /><br />Niestety, kod nie chce działać. Zwieranie pinów do których mają być podpięte przyciski nie daje żadnego rezultatu.<br />Ktoś z Was widzi błąd?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 1 maja 2015, o 14:50</p><hr />
]]></content>
</entry>
</feed>