Easyelectronics.ru

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

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



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

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

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
Необходимо создать программу на STM32F103C8T6, такого алгоритма, по первому нажатию кнопки - включается светодиод и выключаться он не должен до тех пор, пока не будет нажата та-же кнопка второй раз, при нажатии второй раз кнопки светодиод выключается. Вот написал такую прогу на Атолике, вроде бы всё правильно, а прошиваю не работает, может кто подскажет ошибку, заранее благодарю.


Вложения:
Screenshot_1.jpg
Screenshot_1.jpg [ 242.85 Кб | Просмотров: 674 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 19 авг 2019, 14:15 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2360
Изображение


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

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
Show Сообщение ТС

исходники есть? Выложи хотябы на github.


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

Зарегистрирован: 12 июн 2018, 15:04
Сообщения: 492
alek4322 писал(а):
Необходимо создать программу на STM32F103C8T6, такого алгоритма, по первому нажатию кнопки - включается светодиод и выключаться он не должен до тех пор, пока не будет нажата та-же кнопка второй раз, при нажатии второй раз кнопки светодиод выключается. Вот написал такую прогу на Атолике, вроде бы всё правильно, а прошиваю не работает, может кто подскажет ошибку, заранее благодарю.


Много надо учесть.

Во-1: почему выбрали такую сложную логику с уловиями?

Проще так (псевдокод):

Код:
while(1)
{
static u32 n=0;

if(Keypressed())n^=1;

if(n)Led_On();
else Led_Off();
}


Во-2: нужно учитывать дребезг контактов. А вдруг при нажатии-отжатии кнопки замыкание-размыкание делается много раз и не факт что будет всегда нечётное число раз на 1 нажатие? В самом простом случае - задержки по 10-50 мс (тормозит всё и вся, но для старта пойдет)

В-3: лучше задействовать внешнее прерывание по фронту или спаду нажатия кнопки (упростится алгоритм: детектить единичное нажатие-отпускание будет проще и не будет залипания на время нажатия)

В-4: Тема похожа на провокационную, ибо слишком примитивно. А вдруг троллинг? :)


Последний раз редактировалось RepStosw 19 авг 2019, 14:55, всего редактировалось 1 раз.

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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3751
Попкорн а нет, есть только мороженка, но она быстро растает.
Зачем исходники выкладывать - тут все и без них ясно, как день.
Ждём предложений, в том числе и на С++.


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6284
Делается это на двух инверторах и RC цепочке.


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

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
RepStosw писал(а):
alek4322 писал(а):
Необходимо создать программу на STM32F103C8T6, такого алгоритма, по первому нажатию кнопки - включается светодиод и выключаться он не должен до тех пор, пока не будет нажата та-же кнопка второй раз, при нажатии второй раз кнопки светодиод выключается. Вот написал такую прогу на Атолике, вроде бы всё правильно, а прошиваю не работает, может кто подскажет ошибку, заранее благодарю.


Много надо учесть.

Во-1: почему выбрали такую сложную логику с уловиями?

Проще так (псевдокод):

Код:
while(1)
{
static u32 n=0;

if(Keypressed())n^=1;

if(n)Led_On();
else Led_Off();
}


Во-2: нужно учитывать дребезг контактов. А вдруг при нажатии-отжатии кнопки замыкание-размыкание делается много раз и не факт что будет всегда нечётное число раз на 1 нажатие? В самом простом случае - задержки по 10-50 мс (тормозит всё и вся, но для старта пойдет)

В-3: лучше задействовать внешнее прерывание по фронту или спаду нажатия кнопки (упростится алгоритм: детектить единичное нажатие-отпускание будет проще и не будет залипания на время нажатия)

В-4: Тема похожа на провокационную, ибо слишком примитивно. А вдруг троллинг? :)


Нет не троллинг, понимаю что простая тема, но не для начинающего. Сам пишу программы в FBD Овен Лоджик на ПР 200 Овен, решил попробовать на STM, а здесь всё по-другому, спасибо за ответ попробую устранить дребезг кнопки.


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

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 88
Откуда: Омск
Дребезг кнопки устраняется последовательным чтением.
Рекомендую вызывать функцию чтения из основной части программы через равные промежутки времени (поллинг от англ. "poll").
В глобальной переменной хранить счётчики считываний кнопки.

У меня отлично работает подобный код:

Код:
main:

void  _button_on_press (void) {
GPIOA->ODR ^= 0x10; // Меняем, например, состояние пина GPIOA.4
};

int Filter;
void Buttons (void) {
if (KeyPressed == 1) {
   Filter++;
   if (Filter >= 50) {
      if (Filter == 50) {
         _button_on_press();
      };
      Filter = 50; // Дабы исключить повторное срабатывание при переполнении
   } else {
      Filter = 0;
   };
};
};


while(1) {
sleep(1); // Пауза 1мс
Buttons();
};




Последний раз редактировалось -Alan- 19 авг 2019, 16:15, всего редактировалось 2 раз(а).

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

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
BusMaster писал(а):
Попкорн а нет, есть только мороженка, но она быстро растает.
Зачем исходники выкладывать - тут все и без них ясно, как день.
Ждём предложений, в том числе и на С++.

Учитывая использование HAL, мало ли что у ТС там нагенерированно. Ясен пень, что задача простая. Поэтому в разы быстрее взять его проэкт, настроить/дописать как надо и обратно скинуть. Думаю матерые STM-щики закрытыми глазами такой код напишут)))


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

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
Show -Alan- писал(а):

Все конечно работает... Но у Вас МК будет тупо ничего не делать 50мс
А вот это условие, откровенно глупость:
Код:
if (Filter == 50) {
  _button_on_press();
  Filter = 50; // Дабы исключить повторное срабатывание при переполнении
   //########################################################
   //besiteruf: переменная "Filter" внутри блока с вероятностью 100500% будет равна 50
   //########################################################
};


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

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 88
Откуда: Омск
besitzeruf писал(а):
Show -Alan- писал(а):

Все конечно работает... Но у Вас МК будет тупо ничего не делать 50мс
А вот это условие, откровенно глупость:
Код:
if (Filter == 50) {
  _button_on_press();
  Filter = 50; // Дабы исключить повторное срабатывание при переполнении
   //########################################################
   //besiteruf: переменная "Filter" внутри блока с вероятностью 100500% будет равна 50
   //########################################################
};


Возможно я пропустил закрывающую скобку где-то, посколку редактор в ответе не позволяет расставлять отступы внятным образом.
Суть в том, что при входе в блок переменная УВЕЛИЧИВАЕТСЯ, и фактически проверка на равность 50 сработает только один раз. Затем переменная будет устанавливаться в 50 перед ВЫХОДОМ из функции, а при входе - увеличиваться до 51.
Это защита от переполнения для малых типов данных типа char / uint8_t / byte - в зависимости от компилятора.

И, да. Пауза в 50мс как раз для антидребезга.

Плюс, предыдущие 50 милисекунд контроллер может быть успешно занят другими задачами.
А если не нравится мой код - предложите лучше. Тоже атомарный и логичный, но без бесконечных циклов ожидания, с возможностью хотя бы псевдомногозадачности.

UPD:
Да. Действительно, пропустил закрывающую скобку.
Код должен работать следующим образом:
-----------------
Увеличить Ф.
Если Ф = 50 - выполнить код
Есди Ф > 50, то Ф = 50.
-----------------


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2360
Вы так сейчас воды на дипломную работу настрочите очевидных вещей. Елки, ну обычный программный Т-триггер. Азы азов. Ладно, это хер с ним, вы на скриншот ТС гляньте. Ну это же полная херь. Явный троллинг. На овен он пишет якобы, а логики в куске кода на скрине нет совсем. Какие нахер "матерые STMщики" тут нужны, чтобы увидеть, что x всегда будет равен нулю? Тут даже C знать не надо, только 2 английских слова перевести достаточно, чтобы понять.


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

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1793
http://codius.ru/articles/Arduino_%D0%9 ... 0%B8%D0%B5


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

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
Давайте дальше покопаемся:

-Alan- писал(а):
Код:

int Filter;

void Buttons (void) {
if (KeyPressed == 1) {
   Filter++;

        // besitzeruf: предполагаю, что ведем отсчет с 0
        // besitzeruf: если в Filter было 0, теперь Filter == 1

        // besitzeruf: и тут проверям, Filter больше ли 50?
        // besitzeruf: (еще нет, оно равно 1)
   if (Filter >= 50) {
      if (Filter == 50) {
         _button_on_press();
      };
      Filter = 50; // Дабы исключить повторное срабатывание при переполнении
   } else {
                // besitzeruf: Попадаем сюда, и Filter == 0... Получаем вечный цикл...
      Filter = 0;
   };
};
};



Не понимаю, как такой код работал???

Как по мне, Ваш код стоит переписать хотя бы на это:
Код:

uint32_t Filter = 0;

void Buttons (void)
{
  if (IsKeyPressing == true)
  {
     if (Filter < 50)
    {
       Filter++;
    }
    else
    {       
        if (Filter == 50)
        {
           // besitzeruf: Все, сюда мы попадем при Filter == 50. Вызываем нужную функцию
           _button_on_press();
   
           // besitzeruf: И по факту Увеличиваем значение переменной, чтобы больше сюда не попадать
           Filter++;
        }
    }
  }
  else
  {
    Filter  = 0;
  }
}


Последний раз редактировалось besitzeruf 19 авг 2019, 17:21, всего редактировалось 1 раз.

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

Зарегистрирован: 12 июн 2018, 15:04
Сообщения: 492
аппаратная мера борьбы с дребезгом -использовать "резинки" как в пультах ДУ ТВ или в джойстиках )


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3751
...или керам. конденсатор на 0,01 мкФ паралл. кнопке, плюс резистор на 10 кОм подтяжки. А если программно - то просто реже опрашивайте, с периодом 20 - 40 мс. В случае исходного года там надо вставить задержку в цикле на 40 мс. Это работает вполне, и очень даже неплохо.


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

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
NStorm писал(а):
Вы так сейчас воды на дипломную работу настрочите очевидных вещей. Елки, ну обычный программный Т-триггер. Азы азов. Ладно, это хер с ним, вы на скриншот ТС гляньте. Ну это же полная херь. Явный троллинг. На овен он пишет якобы, а логики в куске кода на скрине нет совсем. Какие нахер "матерые STMщики" тут нужны, чтобы увидеть, что x всегда будет равен нулю? Тут даже C знать не надо, только 2 английских слова перевести достаточно, чтобы понять.


Извените, если россердил, может и правда написана глупость, но я не пойму почему x всегда будет равен 0, пробовать писать на С начал недавно, могут быть глупые ошибки, по поводу Овна правда писал проекты и сам их реализовывал, от начала до конца вот например программа мойки самообслуживания, полностью рабочий проект, который у человека уже год работает, и по электрике ни разу ничего на глюкнуло, там монетоприёмник, купюроприёмник, вывод по Модбасу информации о денежном кредите на индикатор СМИ 2 Щ8, вывод шим сигнала на управление дозирующими насосами, изменение уставок скорости отсчёта денежного кредита в зависимости от режима (пена, воск, или вода) и т.д.
А по поводу Т-тригера, да правильно я на Овне тоже их ставил, правда это не нужно, так как ПР - 200 аппаратно настраивается на фильтрацию дребезга контактов, скриншоты приложу. Просто хочу попробовать написать программу мойки на STM, заранее извините за троллинг если я его допустил, благодарю за ответы.


Вложения:
Screenshot_5.jpg
Screenshot_5.jpg [ 92.3 Кб | Просмотров: 565 ]
Screenshot_4.jpg
Screenshot_4.jpg [ 170.01 Кб | Просмотров: 565 ]
Screenshot_3.jpg
Screenshot_3.jpg [ 173.07 Кб | Просмотров: 565 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Включение - выключение светодиода по нажатию кнопки помогите
СообщениеДобавлено: 19 авг 2019, 18:22 
Старожил
Аватара пользователя

Зарегистрирован: 12 июн 2018, 15:04
Сообщения: 492
Простите, Овен - это такой язык программирования? :) Я кроме как то что "Овен" - знак зодиака, более не знаю ничего... :)

Вот тут про "Оберон" узнал, на говнофоруме шаман Оберона агитирует спектрумистам сойти с рельс ассемблера и сделать везде Оберон... Только кто компилятор с транслятором напишет? ;)

https://zx-pk.ru/threads/18418-oberon-% ... chego.html

P.S. пока я спал с 2011 по 2016 гг, многое пропустил!


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

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
RepStosw писал(а):
Простите, Овен - это такой язык программирования? :) Я кроме как то что "Овен" - знак зодиака, более не знаю ничего... :)

Вот тут про "Оберон" узнал, на говнофоруме шаман Оберона агитирует спектрумистам сойти с рельс ассемблера и сделать везде Оберон... Только кто компилятор с транслятором напишет? ;)

https://zx-pk.ru/threads/18418-oberon-% ... chego.html

P.S. пока я спал с 2011 по 2016 гг, многое пропустил!


Овен - это название фирмы, выпускающая программируемые реле ПР 200, так же ПЛК, среда разработки для ПР200 называется Овен-Лоджик, язык графический ФБД - Функциональные блоки, стандарта МЭК 61131-3


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

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5731
Угу, а исчо пр200 само собрано на стм32.
А на хрена вы калокуб выбрали? Вам после фбд усиленно С как таковой изучать надо.
ЗЫ - пр200 - глюк на глюке , из недавнего- самопроизвольный сбой энергонезависимых переменных и это в свежекупленных...


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

Зарегистрирован: 19 авг 2019, 13:25
Сообщения: 11
dosikus_2 писал(а):
Угу, а исчо пр200 само собрано на стм32.
А на хрена вы калокуб выбрали? Вам после фбд усиленно С как таковой изучать надо.
ЗЫ - пр200 - глюк на глюке , из недавнего- самопроизвольный сбой энергонезависимых переменных и это в свежекупленных...



Да знаю, на STM32F103C8xx, то что учить С надо понимаю, збой энергонезависимых переменных был и у меня, на первой мойке, когда создал в проекте журнал учёта денег на месяц, и ещё много чего на подобии кодов доступа к уставкам, подсчёт моточасов и т. д. количество энергонезависимых переменных перевалило за 100, позвонил в овен, ответили что нужно перепрошить и всё пройдёт, я решил по другому, отказался от журнала и т.д количество энергонезависимых переменных сократилось до примерно десяти, и сбои правда прошли, сейчас установлена и успешно работает не одна многопостовая мойка.


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

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 633
Откуда: Санкт-Петербург
alek4322, еще бы овен свои косяки в сенсорных панелях устранили. RTC там просто ужасный.
я овен программирую иногда, но на ST в кодесисе


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

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3751
Вот тут тема как раз для Петюни с его любовью к ПЛК. Правда, он все больше Сименсы облизывает :)))
Овен - это ПЛК, ентой фирмы. Там ни в чем разбираться не надо, надо только знать, какие картинки куда и в каком порядке составлять. Петюня вообще обожает втуда пихать всяких человечиков. Прям как ребенок :)))

А тут, с МК - дело даже не в языке Си. Дело просто в алгоритмах, нужно всего лишь правильно составить алгоритм. Странно, вроде прогание ПЛК должно было научить составлять алгоритмы.


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

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 633
Откуда: Санкт-Петербург
BusMaster писал(а):
Вот тут тема как раз для Петюни с его любовью к ПЛК

смотри аккуратнее..... ведь придет на зов :)))


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

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1079
Смотрю веселуха у вас тут. Показать на С++?
Show Файл key.h

Show Файл main.cpp

Это собственно всё, не считая стандартного стартапа и отсутствующего полностью SystemInit().


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

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


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

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


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

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

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