как минимум потому, что вы не читали, как надо опрашивать кнопку - а я для вас подробно все описывал. категорически недопустимо работать с кнопкаи, опрашивая 1 раз пин порта! сколько раз еще надо повторить?!
а сколько раз надо опрашивать? я делал так как вы писали, но у меня не получилось
как надо делать правильно?
я после условия поставил задержу-антидребезг в 50 мс, вроде вышло и работает
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
Добавлено: Ср янв 18, 2012 11:47:45
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
ploop писал(а):
А то получается - делай так, и будет те щааастье... а как работает не понимаем...
обижаешь, начальник! я всегда объясняю, почему надо делать так, как я советую:
Мастер Ломастер писал(а):
не можете поймать нажатие кнопки? поступайте, как я вам рассказывал итак, задача: есть порт МК, к которому на землю подключено до 8 кнопок. надо отловить их нажатия. как поступить? заранее настроить порт на ввод с встроенными подтяжками, тогда чтение порта с ненажатыми кнопками вернет единицы во всех разрядах байта, а если будет что-то нажато - в том месте будет ноль. кнопка может "дребезжать", т.е. некоторое время (10-25 мс) не иметь постоянного контакта - этого нужно избежать. как? опрашиваем порт, запоминаем результат. ждем 10-25 мс и снова опрашиваем порт, сравнивая результат с запомненным: если они совпали, значит, дребезг уже закончился (или не начинался) и считаны именно данны о нажатых кнопках. теперь, когда на словах разобрались с алгоритмом, опишем его на языке Си, вспоминая ранее данные рекомендации о кодах кнопок:
Код:
#define KEY_1 (1<<PB0) #define KEY_2 (1<<PB1) // и так далее хоть все 8 кнопок #define ANY_KEY (KEY_1 | KEY_2) /* тут надо перечислить все существующие кнопки, и не слушайте тех, кто скажет, что скобки лишние */ #define NO_KEY 0
// настройка порта на ввод с подтяжками - делается где-то в начале main() DDRB &= ~ANY_KEY; PORTB |= ANY_KEY;
// функция получения кода нажатых кнопок unsigned char get_key_pressed(void){ unsigned char key; key = ~(PINB & ANY_KEY); delay_ms(15); // задержка для подавления дребезга if(key == ~(PINB & ANY_KEY)) return key; else return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка }
разумеется, лучше кодам кнопок давать более осмысленные имена, например не KEY_1, а NEXT_EFFEKT_KEY и т.п. - это позволит получить более читабельную программу.
вопросы?
но заставлять-то не могу - вот и делают все "вроде работает", а через 5 минут снова вопросы...
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А то получается - делай так, и будет те щааастье... а как работает не понимаем...
обижаешь, начальник! я всегда объясняю, почему надо делать так, как я советую:
Мастер Ломастер писал(а):
не можете поймать нажатие кнопки? поступайте, как я вам рассказывал итак, задача: есть порт МК, к которому на землю подключено до 8 кнопок. надо отловить их нажатия. как поступить? заранее настроить порт на ввод с встроенными подтяжками, тогда чтение порта с ненажатыми кнопками вернет единицы во всех разрядах байта, а если будет что-то нажато - в том месте будет ноль. кнопка может "дребезжать", т.е. некоторое время (10-25 мс) не иметь постоянного контакта - этого нужно избежать. как? опрашиваем порт, запоминаем результат. ждем 10-25 мс и снова опрашиваем порт, сравнивая результат с запомненным: если они совпали, значит, дребезг уже закончился (или не начинался) и считаны именно данны о нажатых кнопках. теперь, когда на словах разобрались с алгоритмом, опишем его на языке Си, вспоминая ранее данные рекомендации о кодах кнопок:
Код:
#define KEY_1 (1<<PB0) #define KEY_2 (1<<PB1) // и так далее хоть все 8 кнопок #define ANY_KEY (KEY_1 | KEY_2) /* тут надо перечислить все существующие кнопки, и не слушайте тех, кто скажет, что скобки лишние */ #define NO_KEY 0
// настройка порта на ввод с подтяжками - делается где-то в начале main() DDRB &= ~ANY_KEY; PORTB |= ANY_KEY;
// функция получения кода нажатых кнопок unsigned char get_key_pressed(void){ unsigned char key; key = ~(PINB & ANY_KEY); delay_ms(15); // задержка для подавления дребезга if(key == ~(PINB & ANY_KEY)) return key; else return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка }
разумеется, лучше кодам кнопок давать более осмысленные имена, например не KEY_1, а NEXT_EFFEKT_KEY и т.п. - это позволит получить более читабельную программу.
вопросы?
но заставлять-то не могу - вот и делают все "вроде работает", а через 5 минут снова вопросы...
// функция получения кода нажатых кнопок unsigned char get_key_pressed(void) { unsigned char key; key = ~(PIND & ANY_KEY); delay(15); // задержка для подавления дребезга if(key == ~(PIND & ANY_KEY)) return key; else return NO_KEY; // если дребезг - вернем 0, что будет означать: не нажата ни одна кнопка }
int main( void ) { char del; int i;
PORTB = 0xFF; DDRB = 0xFF;
DDRD &= ~ANY_KEY; PORTD |= ANY_KEY;
while(1)
{ //PORTB = PIND;
switch(get_key_pressed()) // при помощи функции get_key_pressed получаем код нажатой кнопки { case KEY_5: // след.эффект effect++; if (effect>3) effect = 0; break; }
switch(effect) { case 0: PORTB=0x00; break; case 1: PORTB=0xFF; break; case 2: PORTB=0xFF; del = 5 / delitel; i = interval * del ; delay(i); PORTB=0x00; i = interval * (1/del); delay(i); break; } } return 0; }
Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
Добавлено: Ср янв 18, 2012 12:00:04
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
не работает? а почему, вы разобрались? я этот подход применяю в своих программах - работает отлично, почему у вас не работает? мне за вас всю программу написать?
подсказку последнюю помните? про то, что надо как-то дожидаться отпускания кнопки или что-то подобное делать, чтобы быстро-быстро не делать кучу действий на одно нажатие, помните? попробуйте теперь, с учетом новых знаний сделать - получится или нет?
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
не работает? а почему, вы разобрались? я этот подход применяю в своих программах - работает отлично, почему у вас не работает? мне за вас всю программу написать?
подсказку последнюю помните? про то, что надо как-то дожидаться отпускания кнопки или что-то подобное делать, чтобы быстро-быстро не делать кучу действий на одно нажатие, помните? попробуйте теперь, с учетом новых знаний сделать - получится или нет?
не надо писать за меня, прошу указать в какой строчке чего у меня не хватает... я выложил весь код
Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
Добавлено: Ср янв 18, 2012 13:00:51
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
AR_AROV писал(а):
ничего не загорается, ни в схеме ни в протеусе (((
да, век живи - век учись моя вина: сам всех учу правилам преобразования типов, и сам же попал на это правило. код функции опроса кнопок надо чуть-чуть видоизменить:
? Спешу огорчить, виновата как раз неправильная последовательность действий. А-ля, ставлю в скобки все что вижу
эх, гуру, гуру... слона-то вы и не приметили. то, на что вы обратили внимание - это ЛЕЧЕНИЕ, а преобразование типов в другом месте мешало. даю подсказку. вот так НЕ РАБОТАЛО:
P.S. кстати, гуру - это слово какого рода? а то иной раз хочется сказать "эта гура" или "это гуру"...
P.P.S. признаюсь честно: мало того, что первоначальный код был с ошибкой преобразования типа, но и скобки я поставил тоже зря. поспешил, однако. вышеприведенные 2 примера работали и не работали для кода PORTB = get_key_pressed(); - для других применений первая версия была бы непригодна, к сожалению... она, конечно, работала бы в последнем варианте, но возвращала бы не совсем те значения, что ожидались. спешка до добра не доводит
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Опять появился какой-то мифический код, которого небыло ранее.
Мастер Ломастер писал(а):
да, век живи - век учись моя вина: сам всех учу правилам преобразования типов, и сам же попал на это правило. код функции опроса кнопок надо чуть-чуть видоизменить: Код: unsigned char get_key_pressed(void){ unsigned char key; key = ~PIND & ANY_KEY; delay(15); if(key == (~PIND & ANY_KEY)) return key; else return NO_KEY; } извините, оплошал...
Немного отличается от приведенного выше, не правдо ли?
Мне уже даже интересно, ваш последний пример, который "РАБОТАЛО" где работало? оно изначально НЕ РАБОТАЛО. Оно может РАБОТАЛО, только если внести еще несколько поправок.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения