Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/79: Рейтинг темы: голосов - 79, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
1

while (!KEY){} // Пока нажата

16.04.2015, 16:02. Показов 15140. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте, уже думал вырос из таких элементарных вещей.
Символ К дважды приходит, хотя должен 1 раз.
Первый раз он приходит когда кнопка нажата но пока не отжата, потом приходит по отжатию, Диод по нажатию загорается и гаснет по отжатию, отправка в одном блоке. Конденсатор на кнопке стоит, да и не в нем дело, задержку ставил один хрен.
Ведь пока кнопка не отжата кроме диода он должен стоять на while (!KEY){} ???

Код
#define GREEN PORTC.5
#define BLUE PORTC.4
#define RED PORTC.3
#define KEY PINB.1

#include <mego328p.h>
#include <1wire.h>
#include <delay.h>

void main(void)
{
DDRB=0;
PORTB=0b00000010; // кнопка
DDRC=0b00111000; // Светы
UCSR0B=(0<<RXCIE0) | (1<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
UBRR0H=0x00;
UBRR0L=0x67;
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

#asm("sei")

while (1)
{
if (!KEY)
{
BLUE=1;
while (!KEY){} // Пока нажата
if (w1_init()) UDR0=0xCA; //Отправить "К"
BLUE=0;
}

}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2015, 16:02
Ответы с готовыми решениями:

STM32 Blue Pill, не могу заставить таймер заткнуться, пока нажата кнопка
Здравствуйте, уважаемые форумчане! Помогите пожалуйста разобраться с проблемой, не пойму, что не...

Пока нажата клавиша
Приветствую всех. Просветите пожалуйста как сделать чтобы событие происходило пока нажата клавиша....

пока нажата кнопка. !
Имеются допустим 2 кнопки на каждую из них при нажатии выполняется действие . Проблема заключается...

Пока нажата кнопка выполнять
доброго времени суток. как сделать собственно сабж. выполнять действие пока нажата кнопка, reypress...

36
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 17:19 2
Цитата Сообщение от Ommykytotor
думал вырос из таких элементарных вещей

Конденсатор на кнопке стоит, да и не в нем дело, задержку ставил один хрен.
Код
#define GREEN PORTC.5
#define BLUE PORTC.4
#define RED PORTC.3
#define KEY PINB.1

PORTB=0b00000010; // кнопка М
DDRC=0b00111000; // Светы
Не выросли.
1) Я ни разу в жизни не ставил конденсаторы на кнопки. Дребезг устраняю программно.

2 )
PORTB=0b00000010; // кнопка - Магическое число!!!
DDRC=0b00111000; // Светы - Магическое число!!!
Приучите себя все определять и обрамлять в макросы, функции. В дальнейшем поправки будут только в одном месте. Без этого будете искать по всей программе и переправлять.

3) Выложен не весь код.

4) Почитайте этот цикл статей. Там много полезного можно почерпнуть.
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
16.04.2015, 17:32 3
1.всегда ставлю
3.весь
2. пофиг, сути не меняет, эти числа для всех тут давно не нигические, этот опроба работы функциии всего лишь
4. За статьи отдельное спасибо, но что по проге то?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 17:40 4
Цитата Сообщение от Ommykytotor
но что по проге то?
Про прогу ничего. Продолжайте ставить кондеры. Банальный дребезг.
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
16.04.2015, 17:50 5
понять дребез или нет можно загнав схему в протеус!
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
16.04.2015, 18:05 6
while (!KEY); - обычно писал так. Хотя должно быть равнозначно скобкам.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 18:23 7
Где ожидание конца передачи символа?
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
16.04.2015, 19:34 8
Да нет никаких ожиданий ровно как и задержек!
Код написан для вакуумной модели вселенной...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 20:09 9
Цитата Сообщение от kobzor
Код написан для вакуумной модели вселенной...
Где вы код увидели? Я в этой теме ни строчки кода не наблюдаю. Я ТСу направление дал. Несколько. Пусть разбирается дальше. Тут обсуждать больше нечего.
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
16.04.2015, 20:20 10
Эленентарно нужно было бы запретить обрабатывать следующее нажатие в течение 30-50мс.
Сам так и делаю. И можно не ставить кондеи на кнопки...
Но вообще странно: обычно кондейки микрофарад на 100, подключенного параллельно кнопке, хватало, чтобы дребезг устранить. Тут, видимо, какая-то уж очень говнистая кнопка.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 20:33 11
Доводы за и против использования конденсатора на кнопках:

Нужно знать, что такое дребезг контактов. И как с ним бороться. Кто-то использует самый простой дилетантский способ. Вешает конденсаторы. Время подавления дребезга подбирается емкостью кондера и сопротивлением подтягивающего резистора. Но, это:
а) жестко заданное время.
б) в момент включения девайса разряженный конденсатор начинает заряжаться от подтягивающего резистора. Это все равно, что кнопка нажата. Что влечет за собой ложные срабатывания.

Есть другой способ. Зная тип контактов, примерно знаем время подавления дребезга. И подавление дребезга осуществляется программно. В этом случае мы можем различать нажатия кнопок в любом временном интервале. Короткое нажатие, длительное нажатие, удержание.
Так же тут играет экономический фактор. Лишний конденсатор на плате - это лишние затраты. Начиная от контактов на плате и заканчивая самим конденсатором и местом на плате.
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
16.04.2015, 21:49 12
Зачем вобще делать что-то программно на микроконтроллере? Все заменим на аналог :)
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
16.04.2015, 22:42 13
Цитата Сообщение от dymyurk1978
Где ожидание конца передачи символа?
Ожидание конца передачи - время между сл. нажатием и временем зарядки.
А по оформлению и прочему порожнему, я ж говорю что 2 строки проверить как работает, и нужда ли задержка после инита() до передачи команды, как выяснилось нет! Ну и спасибо что про дребезг напомнили, В кучку попал кондер 6п8 вместо 6н8, ослеп видимо.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 22:49 14
Цитата Сообщение от Ommykytotor
...
Автоматное программирование. Гоу в гугол и читать цикл статей. Эти статьи дают хороший старт. В 8 части на примере матричной клавиатуры разжевано и показано, как делать опрос кнопок.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
16.04.2015, 22:53 15
А меня вот это повеселило )))
Цитата Сообщение от Iddy_Im
обычно кондейки микрофарад на 100, подключенного параллельно кнопке, хватало, чтобы дребезг устранить.
А вообще то я вот такой модуль использую... http://asis-kbr.ru/forum/viewtopys.php?f=13&t=173
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 23:18 16
Ошибка в том, что вы события опроса кнопок намертво привязываете к определенным действиям. Этим вы железобетонно связали программу и утратили гибкость в дальнейших разработках.
На самом деле должно быть так: проверка событий от модуля опроса кнопок. Если есть событие, считывание кода копки. То есть, модуль опроса выдает только наличие события и код кнопок. Кто получит эти коды, модулю опроса кнопок по барабану. Дальше в дело вступает автоматное программирование. Теперь внимание: наличие события и коды кнопок в разных состояниях могут выполнять разные действия.
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
16.04.2015, 23:29 17
dymyurk1978,
$define IF if(
Вы до такого еще не дописались? А то на маразм смахивает
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
16.04.2015, 23:40 18
Цитата Сообщение от Ommykytotor
...
Маразмом ваш начальный вопрос отдает, если на то пошло. Ваши пара строчек непонятно чего, но не кода, ваш затык и кондеры. Тут даже разбираться не в чем. Чтобы не разбираться в программе, вы поставили кондер. Вам же сложно понять, что такое дребезг.
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
16.04.2015, 23:49 19
Цитата Сообщение от ShodS
А меня вот это повеселило )))
И что там веселого? Ни ложных срабатываний, ни дребезга. Идеально работает. Просто лень обычно кондейки паять. Да и место они занимают — даже SMD...
А вообще, если бы на 500мкФ были бы кондеи 0603, я бы на кнопки тупо их ставил и не парился!
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
17.04.2015, 00:12 20
Цитата Сообщение от Iddy_Im
...
Припаивание конденсаторов на кнопки - это дилетантство. Как вы понять не можете, не нужны конденсаторы. Вам только один раз понять, что такое дребезг, как его подавлять. Написать один раз модуль опроса и больше никогда не париться по поводу кнопок и дребезга.
0
17.04.2015, 00:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2015, 00:12
Помогаю со студенческими работами здесь

Действие пока нажата кнопка
Всем привет, у меня такой вот вопрос. Как сделать проверку на нажатую кнопку на клавиатуре?...

Выполнение функции пока нажата UI кнопка
Здравствуйте. Как сделать так, что бы функция к примеру перемежение, выполнялась всегда пока нажата...

Перекрасить кнопку пока она нажата
Возможно ли как то сделать, что пока будет нажата кнопка на форме - у нее будет иной цвет?...

Цикл повторяющийся пока не нажата клавиша
Как написать на pascal abc.net цикл который повторяется пока не нажата определенная клавиша....

Реле замкнуто пока нажата клавиша 'd' на ПК
Народ ! Есть такая задача, управлять платой релюшек с помощью комповой клавиатуры, а точнее 4мя...

Движение пока нажата клавиша Delphi 7
Подскажите пожалуста как сделать в delphi 7 движение объекта пока нажата клавиша (Например нажал...

Воспроизведение мелодии, пока кнопка нажата
В игре есть фоновая музыка, она играет постоянно, как сделать медодию включающуюся по кнопке? Надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru