<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Подавление дребезга контактов - алгоритм]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=39865&amp;type=atom" />
	<updated>2018-10-02T17:39:39Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=39865</id>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=462112#p462112" />
			<content type="html"><![CDATA[<p><strong>s.xbatob</strong>, а там не будет частых нажатий. Включили, настроили, а дальше максимум 5 нажатий в сутки.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-10-02T17:39:39Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=462112#p462112</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=462111#p462111" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[s.xbatob]]></name>
				<uri>https://linuxforum.ru/profile.php?id=36272</uri>
			</author>
			<updated>2018-10-02T16:52:12Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=462111#p462111</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=462109#p462109" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mogul82 пишет:</cite><blockquote><p>А разве стандартные SDK под контролеры не предостовляют таких средств ?</p></blockquote></div><p>Их сложно с программой подружить, проще было своё с нуля написать. Давно уже сделал всё.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-10-02T13:41:07Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=462109#p462109</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=462107#p462107" />
			<content type="html"><![CDATA[<p>А разве стандартные SDK под контролеры не предостовляют таких средств ?</p>]]></content>
			<author>
				<name><![CDATA[mogul82]]></name>
				<uri>https://linuxforum.ru/profile.php?id=3309</uri>
			</author>
			<updated>2018-10-02T13:37:32Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=462107#p462107</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461978#p461978" />
			<content type="html"><![CDATA[<p>В общем, задача решена. Потренировался на том, с чего начинают большинство юзеров Arduino - часы с будильником, датой (с учётом високосного года) и т.д.<br />Работает идеально, алгоритм был правильный. Когда нарисую схему - выложу. Да, схемы нет, собиралось на макетной плате сразу <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /> .</p><p>За подсказки всем спасибо!</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-20T19:24:09Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461978#p461978</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461868#p461868" />
			<content type="html"><![CDATA[<p>Мне так удобнее - быстродействие лучше.<br />Кстати, нормально работает, вчера вечером потестировал. Правки были ещё, но уже технические.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-04T09:51:25Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461868#p461868</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461867#p461867" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[user160]]></name>
				<uri>https://linuxforum.ru/profile.php?id=28106</uri>
			</author>
			<updated>2018-09-04T09:29:41Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461867#p461867</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461862#p461862" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-03T17:37:09Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461862#p461862</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461861#p461861" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p><strong>user160</strong>, Вы не совсем правы. Основная проблема в том, что в это время надо выполнять другие действия, такие, как обновление экрана, вычисления, сбор информации с датчиков...</p></blockquote></div><p>Вероятно я неточно выразился. Я описал только ту часть алгоритма, которая обрабатывает события нажатий кнопки. Это отнюдь не означает, что все ресурсы компьютера должны быть сосредоточены только на кнопках.</p>]]></content>
			<author>
				<name><![CDATA[user160]]></name>
				<uri>https://linuxforum.ru/profile.php?id=28106</uri>
			</author>
			<updated>2018-09-03T16:19:42Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461861#p461861</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461851#p461851" />
			<content type="html"><![CDATA[<p><strong>user160</strong>, Вы не совсем правы. Основная проблема в том, что в это время надо выполнять другие действия, такие, как обновление экрана, вычисления, сбор информации с датчиков...</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-03T05:50:28Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461851#p461851</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461850#p461850" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[s.xbatob]]></name>
				<uri>https://linuxforum.ru/profile.php?id=36272</uri>
			</author>
			<updated>2018-09-02T21:09:34Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461850#p461850</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461849#p461849" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rizado пишет:</cite><blockquote><p>Но меня интересует программное подавление</p></blockquote></div><p>Ваш длинный текст упрощаю. <br />Выявленное событие перехода кнопки в любое другое состояние: 0-&gt; 1 или 1 -&gt; 0 должно запускать таймер (таймаут), в течении которого система на другие переходы (из-за возможного дребезга) не реагирует. После таймаута возобновить &quot;прослушку&quot; событий переходов.</p>]]></content>
			<author>
				<name><![CDATA[user160]]></name>
				<uri>https://linuxforum.ru/profile.php?id=28106</uri>
			</author>
			<updated>2018-09-02T19:11:46Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461849#p461849</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461842#p461842" />
			<content type="html"><![CDATA[<p><strong>Oleg65</strong>, Вы правы, знаю о таком способе. Но меня интересует программное подавление, чтобы меньше усложнять схему.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-02T09:45:59Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461842#p461842</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461841#p461841" />
			<content type="html"><![CDATA[<p><strong>Rizado</strong>, может не совсем я прав, но для сглаживания дребезга контактов используются RC цепочки на землю или триггеры Шмидта. Но, ИМХО, получить квадратную форму сигнала все равно не получится, но хороший меандр - да.&nbsp; <img src="https://linuxforum.ru/img/smilies/bw.gif" alt="bw" /></p>]]></content>
			<author>
				<name><![CDATA[Oleg65]]></name>
				<uri>https://linuxforum.ru/profile.php?id=21806</uri>
			</author>
			<updated>2018-09-02T09:19:50Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461841#p461841</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подавление дребезга контактов - алгоритм]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=461839#p461839" />
			<content type="html"><![CDATA[<p><strong>s.xbatob</strong>, благодарю. Буду делать.<br />Вчера собрал схему на AVR (кроме кнопок), сделал обработчик прерывания, реализовал отсчёт времени (каждое 50-е прерывание). С дребезгом буду пробовать сегодня уже.</p>]]></content>
			<author>
				<name><![CDATA[Rizado]]></name>
				<uri>https://linuxforum.ru/profile.php?id=23158</uri>
			</author>
			<updated>2018-09-02T07:59:54Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=461839#p461839</id>
		</entry>
</feed>
