Easyelectronics.ru

Электроника для всех
Текущее время: 18 сен 2019, 23:04

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 01:00 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
Так только гуру программирования пишут.
Проглядел антидребезг и короткое/длинное press/release/repeat.
Я, как начинающий, обычно такую лабуду делаю в обработчике SysTick.
А в main/while достаточно __WFI поставить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 01:24 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
x893 писал(а):
Проглядел антидребезг и короткое/длинное press/release/repeat.
Антидребезг атоматически частотой скарирования давится. Разных нажатий ТС не просил :)

А хотите листинг покажу? Ну так, хотя бы основные моменты.
Show Вот это прерывание

Show А это основной цикл


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 12:23 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
VladislavS писал(а):
Антидребезг атоматически частотой скарирования давится. Разных нажатий ТС не просил :)


Тоесть в момент отпускания кнопки, сигнал начнет скакать от 0-1 и обратно... Какая бы не была частота... Момент считывания у тебя будет один единственный. В этот момент дребезга ты считаешь либо 0 либо 1 ( Зависит от момента). И если так неудачно совпадет, считаешь 1, хотя кнопка отпущена.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 14:32 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
besitzeruf писал(а):
И если так неудачно совпадет, считаешь 1, хотя кнопка отпущена.
Ну тогда да, случится страшное, об отпускании кнопки ты узнаешь только через 10 мс при следующем опросе. :)

BusMaster, завязывай там бухать. А то, то просишь код на С++
BusMaster писал(а):
Ждём предложений, в том числе и на С++.

То запрещаешь... Уж определись как-нибудь. А ещё лучше покажи "как надо".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 15:17 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
VladislavS писал(а):
Ну тогда да, случится страшное, об отпускании кнопки ты узнаешь только через 10 мс при следующем опросе. :)
Страшное или нет, но будет вызвана функция, которая что-то да сделает, хотя не должна была.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 15:25 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
besitzeruf писал(а):
VladislavS писал(а):
Ну тогда да, случится страшное, об отпускании кнопки ты узнаешь только через 10 мс при следующем опросе. :)
Страшное или нет, но будет вызвана функция, которая что-то да сделает, хотя не должна была.

Не будет. Чем считанная при дребезге на отпускании кнопки "1" отличается от постоянно нажатой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 15:37 
Старожил

Зарегистрирован: 16 авг 2012, 23:27
Сообщения: 1916
Откуда: Москва
besitzeruf писал(а):
И если так неудачно совпадет, считаешь 1, хотя кнопка отпущена.

Если считали "1", хотя кнопка уже отпущена, значит до этого она была всё таки нажата и считывалась "1" много раз, собственно всё то время пока кнопка была нажата, так собственно какая разница пользователь кнопку держал на 10мс дольше или это дребезг столько времени длился?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 16:24 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4255
Откуда: Кемеровская область, Киселевск
Если считали 0, а пользователь хотел 1? В итоге он сидит дрочит кнопку пока условие не совпадет. Это и есть проблема.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 17:14 
Старожил

Зарегистрирован: 16 авг 2012, 23:27
Сообщения: 1916
Откуда: Москва
Эм, период опроса обычно выбирают таким чтобы он был заведомо больше длительности дребезга, но при этом значительно короче чем минимальное время которое кнопка будет находиться в одном из состояний. Дребезг обычно длится не более 5мс, обычно короче, минимальное время нажатия на кнопку обычно более 100мс, и уж точно не меньше 50мс. Итого при периоде опроса кнопки в 10мс мы не увидим дребезга и при этом гарантированно поймаем нажатую кнопку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 20 авг 2019, 18:13 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
Обычно SysTick делается 1 ms
Задержку на дребезг можно любую сделать от 5 до 100 ms с шагом 1 ms
Короткое/длинное/повтор нажатие/отпускание тоже с шагом 1ms можно определять.
Проблема выведенного яйца не стоит. На две страницы развели дискуссию ни о чём.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 01:16 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
Доброго времени суток !

Весело тут !:)
Держи в копилку
Код:
void key_switch(uint8_t pin, void (*key_func)(uint8_t)) {
    static uint8_t denois = 0, sw = 0;
    if (!denois) {
        if (sw ^ (!!(GPIOx->IDR & pin))) {
            sw ^= 1; denois = 50;
            key_func(sw);
        }
    } else denois--;
}
void key_func(uint8_t key) {
// эта функция будет вызываться только при переключении кнопки
// в переменной key (0,1) будет флаг нового состояния кнопки
// denois это пауза между изменениями состояния во избежания дребезга
// функция key_switch вызывается в теле цикла, отслеживает переключение, борится с дребезгом
// и вызывает функцию на которую указывает key_func
}

как-то так


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 08:47 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
Попробовал. На плате STM32F411E-DISCO при тактовой 8 МГц, основном цикле состоящем только из key_switch(0,key_func); и включенной оптимизацией дребезжать перестаёт при значении denois=500. Так что, как минимум, разрядность переменной denois выбрана неверно. На 168 МГц потребуется около 10000. Заметил сколько условий я перечислил? Это и есть слабое место.

Ну и так, по мелочам. Что делать, если у меня кнопка на PA8, например, висит? Как мне её через uint8_t pin протащить? Наверное (GPIOx->IDR & (1<<pin) ) подразумевалось? Почему pin передана параметром, а GPIOx нет? Какое-то половинчатое решение.

Ну а в целом - работает. Но с таймером надёжнее.

Show Код


Show Ну и моё любимое - листинги :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 11:11 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3621
А вот давай теперь попросим тебя построчно объяснить ассемлерный код - что где делается. :) иль ты смотришь только на кол-во строчек? Да стопудово так и есть. Для тебя же важно похвастаться, как тому фотографу Петюне. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 12:07 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
Насмешил :) Вот скажи, ты на православном С вот такие оптимизации при записи бит по маске в регистры допускающие байтовый доступ каждый раз вручную в голове делаешь?
Код:
  template<uint32_t dmask>
  static inline void writeReg32(volatile uint32_t* reg, uint32_t value)
  {
    if constexpr (dmask == 0xFFFFFFFF)
      *reg = value;
    else if constexpr (dmask == 0x0000FFFF)
      *(volatile uint16_t*)reg = value;
    else if constexpr (dmask == 0xFFFF0000)
      *((volatile uint16_t*)reg + 1) = value >> 16;
    else if constexpr (dmask == 0x000000FF)
      *(volatile uint8_t*)reg = value;
    else if constexpr (dmask == 0x0000FF00)
      *((volatile uint8_t*)reg + 1) = value >> 8;
    else if constexpr (dmask == 0x00FF0000)
      *((volatile uint8_t*)reg + 2) = value >> 16;
    else if constexpr (dmask == 0xFF000000)
      *((volatile uint8_t*)reg + 3) = value >> 24;
    else
      *reg = (*reg & ~dmask) | value;
  }
Или просто не думаешь об этом? А вот "плюсанутые" думают об этом один раз, чтобы потом не думать каждый раз. Так что, иди лучше на пляж - там олинклюзив уже отурылся. :)


Последний раз редактировалось VladislavS 22 авг 2019, 20:50, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 12:14 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 415
Откуда: Киев
Что это за чудовище такое? Зачем оно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 12:23 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
Что бы будущие поколения программистов посмотрели и сказали:
- Какие чудаки жили раньше !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 12:34 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
MasterElectric писал(а):
Что это за чудовище такое? Зачем оно?

Метапрограммирование (ну или проще говря, кодо генерация). Позволяет писать оптимальный еод а также использовать все преимущества С++ по контролю за типом данных и многое другое... Если интересно, то вот
Kvasir
modm
ОСВР, написанная на шаблонах


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 12:54 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1009
MasterElectric писал(а):
Что это за чудовище такое? Зачем оно?

Допустим SPI1 висит на PA4/PA5/PA6/PA7, у 3-х из 4-х регистров настройки режимов GPIO на режим выделено 2 бита, итого получаются биты 8..15, т.е. можно вместо более громоздкого RMW просто записать данные во второй байт этих регистров. Либа для работы с портами это делает автоматические, т.к. она пишется один раз, то при желании можно позволить себе добавлять подобные оптимизации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 13:09 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4255
Откуда: Кемеровская область, Киселевск
Не нужны для периферии МК либы все пишется на чистом CMSIS. Т.е. это не проблема вообще. Проблемы с другими темами.
С++ тоже не нужен, достаточно ANSI C. Свои замашки оставьте для PC. С помощью Си все задачи решаются без проблем.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 13:33 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3621
Вот я о чем и говорю - если чел не научился логично мыслить, то он на любом языке напишет такую херь, что и сам в ней запутается, а потом будет врать про "да я специально допустил в коде ошибку! Не увольняйте меня, господин директор, я хули ганил просто!" :)) вот и вопрос - ну и хули ты там на ганил, когда надо было дело делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 14:21 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 415
Откуда: Киев
Reflector писал(а):
Допустим SPI1 висит на PA4/PA5/PA6/PA7, у 3-х из 4-х регистров настройки режимов GPIO на режим выделено 2 бита, итого получаются биты 8..15, т.е. можно вместо более громоздкого RMW просто записать данные во второй байт этих регистров. Либа для работы с портами это делает автоматические, т.к. она пишется один раз, то при желании можно позволить себе добавлять подобные оптимизации.


Спасибо стало понятнее... а то фраза
VladislavS писал(а):
Вот скажи, ты на православном С вот такие оптимизации при записи бит по маске в регистры допускающие байтовый доступ каждый раз вручную в голове делаешь?

немного не понял зачем для модификации бит по маске думать еще про байты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 21 авг 2019, 21:08 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 941
Oxford писал(а):
С помощью Си все задачи решаются без проблем.
Ну так то да, за исключением, разве что, стартапа кейловского. Можно даже на асме и в опкодах всё сделать. Но ведь на календаре 2019 год, почему не воспользоваться плодами прогресса?

Из свеженького. Казалось бы, обычная задача - конфигурация GPIO.
Show Код

Show Листинг
Компилятор сам рассортировал пины по портам, с помощью того "чудовища" увидел, что я порты полностью конфигурирую и тупо набил их константами. Если убрать из списка какой-нибудь пин, то в его порту компилятор сделает RMW. А ещё проконтролирует, чтобы я всё правильно задал, не задублировал ничего или не пропустил нужного.

Круче только в кубе, там можно просто галки потыкать и вообще код не писать. Но результат...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 22 авг 2019, 00:46 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
VladislavS писал(а):
Попробовал. На плате STM32F411E-DISCO при тактовой 8 МГц, основном цикле состоящем только из key_switch(0,key_func); и включенной оптимизацией дребезжать перестаёт при значении denois=500. Так что, как минимум, разрядность переменной denois выбрана неверно. На 168 МГц потребуется около 10000. Заметил сколько условий я перечислил? Это и есть слабое место.

Ну и так, по мелочам. Что делать, если у меня кнопка на PA8, например, висит? Как мне её через uint8_t pin протащить? Наверное (GPIOx->IDR & (1<<pin) ) подразумевалось? Почему pin передана параметром, а GPIOx нет? Какое-то половинчатое решение.

Ну а в целом - работает. Но с таймером надёжнее.

Вообще-то это был не код из проекта, а экспромт. Шел мимо - оставил надпись на стене. И целью сего опуса был алгоритм триггера - код реагирующий на изменение состояния (0 -> 1) и (1 -> 0). А кто как его использует - когда вызывает, как вызывает (из цыкла или таймером), какой длительности денойс, какая маска, в данном контексте не важно. ТС интересовался алгоритмом реакции на нажатие кнопки и переключением состояния светодиода, алгоритм триггера, мне кажется в данном случае актуален, а не как вызывать по таймеру или из цикла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 26 авг 2019, 14:13 
Старожил
Аватара пользователя

Зарегистрирован: 13 май 2010, 01:32
Сообщения: 1354
Откуда: Из сказки.
Где рабочий код ?

_________________
Береги планету.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 27 авг 2019, 01:20 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 677
Код:
void key_switch(uint8_t pin, void (*key_func)(uint8_t)) {
    static uint8_t denois = 0, sw = 0;
    if (!denois) {
        if (sw ^ (!!(GPIOx->IDR & (1 << (pin & 15))))) {
            sw ^= 1; denois = 50;
            key_func(sw);
        }
    } else denois--;
}
void key_func(uint8_t key) {
// эта функция будет вызываться только при переключении кнопки
// в переменной key (0,1) будет флаг нового состояния кнопки
// denois это пауза между изменениями состояния во избежания дребезга
// функция key_switch вызывается в теле цикла, отслеживает переключение, борится с дребезгом
// и вызывает функцию на которую указывает key_func
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB