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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-27T15:07:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=16641&amp;mode</id>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-27T15:07:38+01:00</updated>
<published>2016-10-27T15:07:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173008#p173008</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173008#p173008"/>
<title type="html"><![CDATA[Re: Pomiar czasu w przerwaniu działa nie za każdym razem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173008#p173008"><![CDATA[
<div class="quotetitle">Daro69 napisał(a):</div><div class="quotecontent"><br />Witam,<br />Czy masz zdefiniowane więcej niż 1 klawisz.<br /></div><br />na razie tylko jeden klawisz pod wejście 2.<br /><br />przeniosłem to ostatnie else  z 39 linijki wyżej po else if (32 linijka) i wydaje się trochę lepiej działać ale dalej daleko jest do właściwego działania.<br />Coś muszę chyba podejść do tematu jeszcze raz bo nic z tego nie będzie. Funkcja onSteep działa tylko w przerwaniu a potem program ją omija. Chyba będzie trzeba podejść do tematu, że w przerwaniu ustawiamy tylko flagi a w programie głównym na tych flagach będą wykonywane instrukcje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 27 paź 2016, o 15:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2016-10-27T14:50:51+01:00</updated>
<published>2016-10-27T14:50:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173006#p173006</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173006#p173006"/>
<title type="html"><![CDATA[Re: Pomiar czasu w przerwaniu działa nie za każdym razem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=173006#p173006"><![CDATA[
Witam,<br />Nie przyjrzałem się dokladnie bo jestem w pracy i to jest w C++.<br />Czy masz zdefiniowane więcej niż 1 klawisz.<br />Jeżeli tak to zakomentuj pozostałe i zobacz czy się poprawilo.<br />Jezeli tak, to wszystko co chcesz wykonać po puszczeniu klawisza wpisz w warunku <br />Jeżeli wszystkie klawisze puszczone. Bo pomimo naciskania pierwszego w funkcji drugiego systematycznie wykonuje się ostatni warunek.<br />Mogłem cos przegapić bo czytałem pobieżnie..<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 27 paź 2016, o 14:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-27T13:43:13+01:00</updated>
<published>2016-10-27T13:43:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=172999#p172999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=172999#p172999"/>
<title type="html"><![CDATA[Pomiar czasu w przerwaniu działa nie za każdym razem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16641&amp;p=172999#p172999"><![CDATA[
Witajcie.<br /><br />Niby prosta sprawa, ale przez drgania styków coś nie działa w programie.<br />Próbowałem już różnych rozwiązań, ale żadne nie przynosi rezultatu. Może ktoś mi pomoże.<br />Program ma za zadanie po naciśnięciu przycisku zapisać do zmiennej startTime czas z millis() a po puszczeniu przycisku zapisać czas do stopTime. Jeśli wynik jest większy niż 50ms to zapisujemy do zmiennej czas_ms wynik odejmowania. <br />W funkcji loop wykonujemy przykładowy program jeśli czas_ms jest mniejszy niż 1000ms (tutaj akurat miganie diodą)<br />Program wygląda tak:<br />[syntax=cpp]#include &quot;Arduino.h&quot;<br />volatile unsigned long startTime, stopTime;<br />volatile long czas_ms;<br />volatile uint8_t button_state, button_press, button_release;<br /><br />void setup()<br />{<br />  Serial.begin(9600);<br />  pinMode(2, INPUT_PULLUP); //wejście podciągamy do VCC<br />  pinMode(13,OUTPUT); //LED wbudowana w UNO<br />  attachInterrupt(digitalPinToInterrupt(2), onStep, CHANGE); //przerwanie na pinie 2 na zmianę stanu wejścia<br />}<br /><br />void loop()<br />{<br />if ((czas_ms &lt; 1000)&amp;&amp;(button_state)) {<br />digitalWrite(13,HIGH);<br />delay(2000);<br />digitalWrite(13,LOW);<br />button_state = 0;<br />}<br />}<br /><br />void onStep()<br />{<br />  if (((digitalRead(2)) == 0) &amp;&amp; (!button_press)) { //Jeżeli naciśnięty przycisk (zwarty do masy) oraz flaga naciśnięcia nie ustawiona<br />  startTime = millis();  //zaczynamy odmierzać czas<br />  button_press = 1; //ustaw flagę<br />  } else if (((digitalRead(2)) == 1) &amp;&amp; (!button_release)){ //Jeżeli puszczony przycisk oraz flaga puszczenia nie ustawiona<br />  stopTime = millis();   //koniec odmierzania czasu<br />  button_release = 1; //ustaw flagę<br />  }<br />  if (stopTime &gt; startTime) {<br />  if ((stopTime - startTime)&gt;100) czas_ms = (stopTime - startTime); //100ms na drgania styków<br />  button_state = 1; //ustawiamy flagę <br />  button_press = 0; //zerujemy flagę naciśnięcia<br />  button_release = 0; //zerujemy flagę zwolniania<br /><br />  } else {<br />  if ((millis()-stopTime)&gt;300) { //jeśli wystąpią drgania styków to na wszelki wypadek wyzeruj flagi<br />  button_release = 0; <br />  button_press = 0;<br />  }<br />  }<br />}[/syntax]<br />i ogólnie działa, ale niestety nie za każdym naciśnięciem. Dodatkowo co jakiś czas w ogóle nie wchodzi do else i nie resetuje zmiennych button_release i button_press co praktycznie zawiesza program.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 27 paź 2016, o 13:43</p><hr />
]]></content>
</entry>
</feed>