<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Подавление дребезга контактов - алгоритм]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=39865</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=39865&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Подавление дребезга контактов - алгоритм».]]></description>
		<lastBuildDate>Tue, 02 Oct 2018 17:39:39 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=462112#p462112</link>
			<description><![CDATA[<p><strong>s.xbatob</strong>, а там не будет частых нажатий. Включили, настроили, а дальше максимум 5 нажатий в сутки.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Tue, 02 Oct 2018 17:39:39 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=462112#p462112</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=462111#p462111</link>
			<description><![CDATA[<div class="quotebox"><cite>mogul82 пишет:</cite><blockquote><p>А разве стандартные SDK под контролеры не предостовляют таких средств ?</p></blockquote></div><p>Там нет ничего сложного. Просто сам идея чисто программная: тикер, сдвиговой регистр, кое-какая логика его выходов... Для аппаратчиков не слишком понятная.<br />Но надо понимать, что по мере старения кнопки, возможно, придётся вводить коррективы. Особенно. если сдвиговый регистр всего лишь двухбитный. <img src="https://linuxforum.ru/img/smilies/ac.gif" alt="ac" /></p>]]></description>
			<author><![CDATA[null@example.com (s.xbatob)]]></author>
			<pubDate>Tue, 02 Oct 2018 16:52:12 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=462111#p462111</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=462109#p462109</link>
			<description><![CDATA[<div class="quotebox"><cite>mogul82 пишет:</cite><blockquote><p>А разве стандартные SDK под контролеры не предостовляют таких средств ?</p></blockquote></div><p>Их сложно с программой подружить, проще было своё с нуля написать. Давно уже сделал всё.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Tue, 02 Oct 2018 13:41:07 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=462109#p462109</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=462107#p462107</link>
			<description><![CDATA[<p>А разве стандартные SDK под контролеры не предостовляют таких средств ?</p>]]></description>
			<author><![CDATA[null@example.com (mogul82)]]></author>
			<pubDate>Tue, 02 Oct 2018 13:37:32 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=462107#p462107</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461978#p461978</link>
			<description><![CDATA[<p>В общем, задача решена. Потренировался на том, с чего начинают большинство юзеров Arduino - часы с будильником, датой (с учётом високосного года) и т.д.<br />Работает идеально, алгоритм был правильный. Когда нарисую схему - выложу. Да, схемы нет, собиралось на макетной плате сразу <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> .</p><p>За подсказки всем спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Thu, 20 Sep 2018 19:24:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461978#p461978</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461868#p461868</link>
			<description><![CDATA[<p>Мне так удобнее - быстродействие лучше.<br />Кстати, нормально работает, вчера вечером потестировал. Правки были ещё, но уже технические.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Tue, 04 Sep 2018 09:51:25 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461868#p461868</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461867#p461867</link>
			<description><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p>код функции, обновляющей дисплей и сканирующей кнопки</p></blockquote></div><p>По хорошему, в одной функции это делать нехорошо.<br />Лучше три функции: <br /></p><ul><li><p>одна функция на дисплей, </p></li><li><p>другая на прерывание от кнопок, </p></li><li><p>третья таймер, который вновь разрешает прерывание.</p></li></ul><p>Алгоритм таков: кнопка &quot;дёрнула&quot; прерывание. -&gt; 2-я функция &quot;слушатель&quot; прерывания запретила повторные прерывание от кнопки и вызвала третью (таймер).<br />Не знаю, возможен ли асинхронный вызов функций в Ардуино, а он здесь как раз нужен. <br />Суть в том, что 2-я функция должна вызвать 3-ю функцию (таймер), а сама 2-я должна завершиться не дожидаясь окончания работы 3-й.</p><p>3-я функция, по окончании своей работы, снова разрешает &quot;слушать&quot; прерывание для второй функции.</p><p>1-я функция для дисплея - за скобками.</p><p>Как-то так. ИМХО</p>]]></description>
			<author><![CDATA[null@example.com (user160)]]></author>
			<pubDate>Tue, 04 Sep 2018 09:29:41 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461867#p461867</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461862#p461862</link>
			<description><![CDATA[<p><strong>user160</strong>, возможно, мы просто не совсем поняли друг друга <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> .<br />В любом случае, считывание кнопок сегодня более-менее реализовал, пока разбираюсь - сделал из прибора часы <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> , пусть хоть время и дату показывает. Если интересно, вот код функции, обновляющей дисплей и сканирующей кнопки. Не идеально, но работает:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>void refreshDisplay() {
  byte i;
  boolean inLvl;

  // три переменные ниже - типа byte, объявлены в теле программы; хотя последнюю можно и локально, потом перенесу
  keyPressedPrev = keyPressedCurr;
  keyPressedCurr = 0;
  keysPressed = 0;

  // digits - byte array[27], в него пишем сегменты, которые надо включать, для единицы это 0B01100000, там ещё некоторые и буквы, и упрощённый знак градуса, и т.д.  
  // LEDisplay - byte array[8], а здесь только коды символов, для цифр 0-9 они совпадают с цифрами, для A-F это с 10 по 15 и т.д.
  for (i = 0; i &lt;=7; i++) {
    // сегменты пишем в регистр, экономия выводов
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, digits[LEDisplay[i]]);
    digitalWrite(latchPin, HIGH);
    digitalWrite(i + 2, HIGH);
    delayMicroseconds(666); // задержки в 2/3 миллисекунды хватает для нормальной яркости, там разисторы по 330 Ом
    // кнопки висят только на четырёх первых выводах, так что лишнее не сканируем
    if (i &lt; 4) {
      inLvl = digitalRead(keyInputPin) == HIGH;
      keyPressedCurr = (keyPressedCurr &lt;&lt; 1) | inLvl;
      if (inLvl) {
        keysPressed++;
      }
    }
    digitalWrite(i + 2, LOW);
  }
  // а если нажато больше одной - нам это не надо :)
  if (keysPressed &gt; 1) {
    keyPressedCurr = 0;
  }
}</code></pre></div></div></div><p>Что именно выводить - готовится отдельно от отображения. Проще разбить на маленькие логические блоки и их отдельно тестировать.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Mon, 03 Sep 2018 17:37:09 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461862#p461862</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461861#p461861</link>
			<description><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p><strong>user160</strong>, Вы не совсем правы. Основная проблема в том, что в это время надо выполнять другие действия, такие, как обновление экрана, вычисления, сбор информации с датчиков...</p></blockquote></div><p>Вероятно я неточно выразился. Я описал только ту часть алгоритма, которая обрабатывает события нажатий кнопки. Это отнюдь не означает, что все ресурсы компьютера должны быть сосредоточены только на кнопках.</p>]]></description>
			<author><![CDATA[null@example.com (user160)]]></author>
			<pubDate>Mon, 03 Sep 2018 16:19:42 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461861#p461861</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461851#p461851</link>
			<description><![CDATA[<p><strong>user160</strong>, Вы не совсем правы. Основная проблема в том, что в это время надо выполнять другие действия, такие, как обновление экрана, вычисления, сбор информации с датчиков...</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Mon, 03 Sep 2018 05:50:28 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461851#p461851</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461850#p461850</link>
			<description><![CDATA[<div class="quotebox"><cite>Oleg65 пишет:</cite><blockquote><p><strong>Rizado</strong>, может не совсем я прав, но для сглаживания дребезга контактов используются RC цепочки на землю или триггеры Шмидта. Но, ИМХО, получить квадратную форму сигнала все равно не получится, но хороший меандр - да.&nbsp; <img src="https://linuxforum.ru/img/smilies/bw.gif" alt="bw" /></p></blockquote></div><p>Проехали. Уже лет 30 как. Всё давным-давно решается программно. И клавиши сканируются, так что RC цепочки тут не поставить.</p>]]></description>
			<author><![CDATA[null@example.com (s.xbatob)]]></author>
			<pubDate>Sun, 02 Sep 2018 21:09:34 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461850#p461850</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461849#p461849</link>
			<description><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p>Но меня интересует программное подавление</p></blockquote></div><p>Ваш длинный текст упрощаю. <br />Выявленное событие перехода кнопки в любое другое состояние: 0-&gt; 1 или 1 -&gt; 0 должно запускать таймер (таймаут), в течении которого система на другие переходы (из-за возможного дребезга) не реагирует. После таймаута возобновить &quot;прослушку&quot; событий переходов.</p>]]></description>
			<author><![CDATA[null@example.com (user160)]]></author>
			<pubDate>Sun, 02 Sep 2018 19:11:46 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461849#p461849</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461842#p461842</link>
			<description><![CDATA[<p><strong>Oleg65</strong>, Вы правы, знаю о таком способе. Но меня интересует программное подавление, чтобы меньше усложнять схему.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Sun, 02 Sep 2018 09:45:59 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461842#p461842</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461841#p461841</link>
			<description><![CDATA[<p><strong>Rizado</strong>, может не совсем я прав, но для сглаживания дребезга контактов используются RC цепочки на землю или триггеры Шмидта. Но, ИМХО, получить квадратную форму сигнала все равно не получится, но хороший меандр - да.&nbsp; <img src="https://linuxforum.ru/img/smilies/bw.gif" alt="bw" /></p>]]></description>
			<author><![CDATA[null@example.com (Oleg65)]]></author>
			<pubDate>Sun, 02 Sep 2018 09:19:50 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461841#p461841</guid>
		</item>
		<item>
			<title><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=461839#p461839</link>
			<description><![CDATA[<p><strong>s.xbatob</strong>, благодарю. Буду делать.<br />Вчера собрал схему на AVR (кроме кнопок), сделал обработчик прерывания, реализовал отсчёт времени (каждое 50-е прерывание). С дребезгом буду пробовать сегодня уже.</p>]]></description>
			<author><![CDATA[null@example.com (Rizado)]]></author>
			<pubDate>Sun, 02 Sep 2018 07:59:54 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=461839#p461839</guid>
		</item>
	</channel>
</rss>
