0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
|
|
1 | |
while (!KEY){} // Пока нажата16.04.2015, 16:02. Показов 15140. Ответов 36
Метки нет (Все метки)
Здраствуйте, уже думал вырос из таких элементарных вещей.
Символ К дважды приходит, хотя должен 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
|
16.04.2015, 16:02 | |
Ответы с готовыми решениями:
36
STM32 Blue Pill, не могу заставить таймер заткнуться, пока нажата кнопка Пока нажата клавиша пока нажата кнопка. ! Пока нажата кнопка выполнять |
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
0
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
|
16.04.2015, 22:53 | 15 |
А меня вот это повеселило )))
Сообщение от Iddy_Im
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
А вообще, если бы на 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 | |
17.04.2015, 00:12 | |
Помогаю со студенческими работами здесь
20
Действие пока нажата кнопка Выполнение функции пока нажата UI кнопка Перекрасить кнопку пока она нажата Цикл повторяющийся пока не нажата клавиша Реле замкнуто пока нажата клавиша 'd' на ПК Движение пока нажата клавиша Delphi 7 Воспроизведение мелодии, пока кнопка нажата Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |