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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-10-07T10:54:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19327&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-07T10:54:44+01:00</updated>
<published>2017-10-07T10:54:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196598#p196598</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196598#p196598"/>
<title type="html"><![CDATA[Re: Debouncing przycisku w przerwaniu i odbiór znaku przez U]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196598#p196598"><![CDATA[
<div class="quotetitle">Vroobee napisał(a):</div><div class="quotecontent"><br />Pierwsza z nich to debouncing przycisku w przerwaniu INT0/INT1 w ATmedze 328p<br /></div><br /><br /><div class="quotetitle">Vroobee napisał(a):</div><div class="quotecontent"><br />ale chciałem się dowiedzieć czy to jest optymalne rozwiązanie do eliminacji drgań styków<br /></div><br />Przepraszam uprzejmie, nie chodzi mi o to żeby dogryzać czy jakieś przytyki robić - no ale to jest pomysł zupełnie i to totalnie z kosmosu. W ogóle po co ten IF w przerwaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> toż ty rozbroiłeś tę moją procedurę z bloga ... i jakieś resztki jej ciała wrzuciłeś do przerwania. Ten IF w przerwaniu nigdy nie zadziała - po co on tam w ogóle ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Nie masz żadnego debouncingu - ot reaguje ci przerwanie przy pierwszym zboczu i to tyle - a jak przyjdą inne przerwania w wyniku drgań to też się wykona ich cała seria <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... <br /><br />sam przeanalizuj przez chwilę ten kod który pokazałeś to się zdziwisz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i solidnie uśmiejesz gwarantuję<br /><br />ustawiasz key_lock na 1, po to żeby za chwilę sprawdzać czy jest różny od zera i niby gdy klawisz wciśnięty to go zwiększasz o jeden i po co ? skoro za chwilę poleci kolejne przerwanie a ty znowu key_lock na 1 ustawiasz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> toż te linie kompletnie nie mają sensu w tym przerwaniu, jak byś zostawił tylko te dwie<br /><br />                menu_state = 1;<br />                timer = 0;<br /><br />to działać ci będzie tak samo ...<br /><br />CAŁA zaleta tej mojej procedury z bloga polega na tym, że działa bez użycia przerwań i działa bardzo dobrze ... <br /><br /><div class="quotetitle">Vroobee napisał(a):</div><div class="quotecontent"><br />Za cholerę nie chce mi to działać przy wykorzystaniu tej funkcji np. w takim zapisie:<br /></div><br />Bo nie rozumiesz jak działa ta funkcja ... ona nie jest blokująca i gdy nic nie nadleci to zwróci ZERO ... <br /><br />ty może jeszcze nie do końca rozumiesz jak działają bufory cykliczne ... funkcja getc pozwala pobierać pojedyncze znaki z tego bufora ale jeśli coś do niego dotarło ... <br /><br />tyle razy pisałem i pokazuję w poradnikach wideo - że pełny i śliczny odbiór ale UWAGA! stringów czyli komunikację ASCII i to na zdarzeniach pokazałem dopiero w Greenbooku -  którego polecam<br /><br />zaś w Bluebooku pokazałem jak za pomocą funkcji getc pobierać sobie pojedyncze znaki - ale pewnie nie zajrzałeś do tego przykładu w książce (na pendrive/albo na CD)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 7 paź 2017, o 10:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Vroobee]]></name></author>
<updated>2017-10-07T10:41:02+01:00</updated>
<published>2017-10-07T10:41:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196596#p196596</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196596#p196596"/>
<title type="html"><![CDATA[Debouncing przycisku w przerwaniu i odbiór znaku przez UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19327&amp;p=196596#p196596"><![CDATA[
Szanowni Państwo,<br /><br />piszę w dwóch sprawach, o których chciałbym dowiedzieć się nieco więcej i rozwiać wątpliwości.<br />Pierwsza z nich to debouncing przycisku w przerwaniu INT0/INT1 w ATmedze 328p. Napisałem sobie w programie taki oto kod wykorzystując debouncing wskazany przez p. Mirka:<br />[syntax=c]ISR(INT0_vect){<br />key_lock = 1;<br />menu_state = 1;<br />timer = 0;<br />if (key_lock &amp;&amp; (PIND &amp; SW1)){<br />key_lock++;<br />}<br />}[/syntax]<br />Na moje oko działa on poprawnie w zaprojektowanym przeze mnie układzie ale chciałem się dowiedzieć czy to jest optymalne rozwiązanie do eliminacji drgań styków w microswitch'u przy użyciu przerwań.<br /><br />Druga sprawa to odbiór danych z UART przy użyciu funkcji p. Mirka z bluebooka. Mianowicie funkcji uart_getc(), - nazwa przerobiona ze względu na układ bluetooth BLE, który wykorzystuję:<br />[syntax=c]char RN4871_get_c(void) {<br />    // sprawdzamy czy indeksy są równe<br />    if ( UART_RxHead == UART_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART_RxTail = (UART_RxTail + 1) &amp; UART_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    return UART_RxBuf&#91;UART_RxTail&#93;;<br />}<br /><br />// definiujemy procedurę obsługi przerwania odbiorczego, zapisującą dane do bufora cyklicznego<br />ISR( USART_RX_vect ) {<br />    register uint8_t tmp_head;<br />    register char data;<br /><br /><br />    data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART_RxHead + 1) &amp; UART_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART_RxTail ) {<br />    // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />    // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />    // nasz wąż zacząłby zjadać własny ogon<br />    //UART_RxHead = UART_RxTail;<br />    } else {<br />    UART_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />    UART_RxBuf&#91;tmp_head&#93; = data; // wpisujemy odebrany bajt do bufora<br />    }<br />}[/syntax]<br /><br />Za cholerę nie chce mi to działać przy wykorzystaniu tej funkcji np. w takim zapisie:<br />[syntax=c]char c = RN4871_get_c();<br />uart_putc(c);[/syntax]<br /><br />Jeśli ktoś zwróci uwagę na jakieś szczególne przypadki działania tej funkcji to byłbym wdzięczny. Na razie bez cudów - po prostu odbieranie jednego znaku nie działa. Procek ten sam ATmega328p. Dodam jeszcze, że funkcja:<br />[syntax=c]char uart_getc(void){<br />while ( !(UCSR0A &amp; (1&lt;&lt;RXC0)) );<br />return UDR0;<br />}[/syntax]<br />Działa BEZ ZARZUTU - znaki odbiera. Tylko wolałbym wykorzystać bufor cykliczny i przerwania, a nie robić odbiór danych w pętli main.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5942">Vroobee</a> — 7 paź 2017, o 10:41</p><hr />
]]></content>
</entry>
</feed>