Jump to content
brusel

Помощь с кодом

Recommended Posts

Posted (edited)
4 hours ago, Yurkin2015 said:

Никуда не потерялось - просто система не чувствует короткие нажатия

Совершенно верно! Любая борьба с дребезгом основана на том факте, что система попросту не замечает пропуски "опросов", потому как делает их с достаточно высокой (для человека) скоростью. Разницу между 100-й и 200-й миллисекундой практически никто не заметит. И это верно независимо от того, при помощи какого алгоритма ведется борьба с дребезгом. Даже в алгоритме @IMXO , столь навороченном, что не всякая программа основной цикл имеет подобной сложности, все равно принцип действия остается прежний - если что-то пошло не так, событие не генерируется, т.е. пропускается, игнорируется.

Edited by ARV

Share this post


Link to post
Share on other sites
8 hours ago, IMXO said:

куда потерялось нажатие

а вот скажи, ты сам реально в состоянии своим пальчиком нажать кнопку и отпустить ее ровно через 121 мс? и при этом точно попасть, чтобы обе проверки пина дали отрицательный результат?

Share this post


Link to post
Share on other sites

Итак. Начнем. 

  1. Импульсная помеха. Во-первых, импульсные помехи довольно короткие. А читаем мы раз в 100 мс. Один раз, каждые 100 мс. И вероятность того, что МК зафиксирует ее ничтожно мала. Особенно если учесть, что линия имеет подтяжку (лично я всегда подтягиваю линию к + питания). И подтяжку можно сделать довольно жесткую.
  2. Звон контактов. При опросе раз в 100 мс вообще не является проблемой. При опросе будет детектирован только первый фронт. Все последующие изменения фронта будут оказывать влияние на работу программы только через 100 мс, не раньше. Т.е. звон никак не может повлиять на работу программы.

У меня спокойно работают кнопки в блоках, где куча импульсных помех. И ложных срабатываний нет. А если я знаю, что кнопки будут вынесены на проводах и жгут будет проходить рядом с силовой частью блока, то ставлю оптопары. Во-первых, они срабатывают довольно медленно и не пропускают импульсные помехи, во-вторых, защищают МК от этих самых помех. Так что @IMXO, ваш способ подавления дребезга избыточен и ничего по сути не дает.

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

@Starichok  я на эту шнягу натыкаюсь постоянно при оперативных настройках таймеров и весопроцесоров от витчизняных виробников, то цифры не переключаются , то двойное нажатие фиксируется. 

и картинко приведена только для показать, что глюк возможен, речь не шла  о вылавливании его специально.

Quote

С идеальной кнопкой без дребезга тоже будут пропуски нажатий, если время нажатия меньше периода опроса кнопки.

Чтобы гарантировано не было пропусков нужно обеспечить время удержания кнопки дольше, чем период опроса плюс длительность "дребезга".

вот  об этом и речь , один ставит задержку 50мс , второй 100 , третий 300, только забывают описать в особенностях работы, что кнопки быстро нажимать низя... 

19 minutes ago, BARS_ said:

ваш способ подавления дребезга избыточен и ничего по сути не дает.

 честно, мне абсолютно все равно, кто какой алгоритм подавления использует в своем коде, это его право,  я лишь привел один из вариантов реализации который пользуюсь сам. подобный алгоритм используется в RTOS возможно разрабы не знают, что он избыточен...

 

Share this post


Link to post
Share on other sites
36 minutes ago, IMXO said:

одобный алгоритм используется в RTOS

В RTOS вообще отдельная тема. Там в принципе проблематично сделать опрос кнопок раз в 100 мс. Достаточно понимать физику процессов и работу МК, дабы не усложнять код

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

On 25.07.2019 at 08:04, BARS_ said:

Значит неправильно настройки заданы. Пауза должна быть 45 секунд. И вообще, на кой для такой простейшей задачи целый МК?

проверял в протеусе пауза работает 7-8 секунд, как раз то что надо.

Задача простая - управлять реле которое включится на 7-10 сек и отключится.

Идеальный вариант  добавить потенциометр для регулировки таймера. Может поможете с кодом, а то я пока не шарю. Данный пример где-то нашел и пробую.

Share this post


Link to post
Share on other sites
17 minutes ago, brusel said:

проверял в протеусе пауза работает 7-8 секунд, как раз то что надо.

Вот только в железе она будет 45 секунд.

Share this post


Link to post
Share on other sites
Just now, BARS_ said:

Вот только в железе она будет 45 секунд

Не факт :) При таком-то уровне понимания, как она формируется...

Share this post


Link to post
Share on other sites

aStudio 6 ругается на code уважаемого IMXO

Error    1    stray '\357'            lesson_button_type_0719.c 

на строчку:

 if( (PINB & (1<<BUTTON1)) == 0 ){
       m_Batton.new1=1;

не подскажете причину

Share this post


Link to post
Share on other sites

Отсутствие знаний языка Си. Других причин нет.

Share this post


Link to post
Share on other sites
3 часа назад, Wawchuk сказал:

не подскажете причину

Введите вручную эту строчку, а не копипастингом.

Share this post


Link to post
Share on other sites

 всю прогу перенабрать вручную?

функцию со всем содержимым перенабрал ,результат тот же

Share this post


Link to post
Share on other sites
5 часов назад, Wawchuk сказал:

aStudio 6 ругается на code уважаемого IMXO

Error    1    stray '\357'            lesson_button_type_0719.c 

на строчку:

в приведенном коде ваапче нет такой строки. и тем более в коде не было битового поля new1 , не говоря уже об элементарных синтаксических ошибках .

вы вообще че из кода сделать хотите?

Share this post


Link to post
Share on other sites

количество ошибок (error после компиляции) было еще больше

после изменения на m_Batton.new1=1; во всем листинге уменьшилось

И я извиняюсь если своим невежеством в знаниях обидел кого то.

Просто интересный вопрос дребезга ....Всего лишь скопировал ваши вложения и скомпилировал

и все , не получилось без ошибок.

 

 

Share this post


Link to post
Share on other sites

может написал что-то не так , у меня этот код компилируется.

Share this post


Link to post
Share on other sites

А у меня щас ссылается на строки:

1.struct button_type {.....

2. if( (PINB & (1<<BUTTON1)) == 0 ){
       m_Batton.new=1;

и выдает error

Error    1    stray '\357' in program    lesson_button_type_0719.c    22    8    lesson_button_type_0719
 

вот и весь вопрос.

 

Share this post


Link to post
Share on other sites

чел, в этой строчке нет фигурной скобки, откуда ты ее взял?

Share this post


Link to post
Share on other sites
2 часа назад, IMXO сказал:

может написал что-то не так , у меня этот код компилируется.

1. переустановил aStudio6

впустую

2.заменил  на  if(! (PINB & (1<<BUTTON1)))

все сшилось без error

еще на макетке попробую как в жизни))

спс

Share this post


Link to post
Share on other sites

Учебник по Си скачать не забудь...

Share this post


Link to post
Share on other sites

Пришлось добавить еще одну кнопку "СТОП". Код ниже. Прошил тиньку, на макетке вроде работает, пауза 8 сек.

#define F_CPU 1200000UL
#define OUT PB2
#define OUT10 PB0
#define BUT_Start PB4 
#define BUT_Stop PB3 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
{
   _delay_ms (60); // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
  if  ((PINB & (1<<BUT_Stop)) == 0) // если нажата кнопка
  {
    PORTB &= ~((1<<OUT)|(1<<OUT10)); //выкл.
  }
}

int main(void)
{
  // Пины кнопок
  DDRB &= ~((1<<BUT_Start)|(1<<BUT_Stop)); // входы
  PORTB |= (1<<BUT_Start)|(1<<BUT_Stop); // подтянуты
  // Пин светодиода
  DDRB |= (1<<OUT)|(1<<OUT10); // выход
  PORTB &= ~((1<<OUT)|(1<<OUT10)); // выключен
  
  GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
  PCMSK |= (1<<BUT_Stop); // Разрешаем по маске прерывания на ногах кнопки 
  sei(); // Разрешаем прерывания глобально
  
    while (1) 
    {
        _delay_ms (60); // антидребезг
        if ( (PINB & (1<<BUT_Start)) == 0 )    // если нажата кнопка
          {
          PORTB |= ((1<<OUT)|(1<<OUT10));           //вкл
          _delay_ms (8000);                       // пауза 
          }
          PORTB &= ~(1<<OUT10);          //выкл         
    }
}

Что нужно: кнопка "Стар"т сразу включает 2 реле, одно из которых отключается через 8-10 сек. Второе остается включено пока не нажата кнопка "Стоп".

Если кто-то подскажет  как улучшить код, чтобы не было сбоев, буду очень благодарен.

Share this post


Link to post
Share on other sites

Выкинуть нафиг прерывание INT0, включить таймер с в временем тика 100 мс (да в принципе с любым временем, не важно особо). В таймере реализовать опрос кнопок каждые 100 мс и там же считать время до отключения реле. Все delay_ms() из кода убрать.

Share this post


Link to post
Share on other sites
4 часа назад, brusel сказал:

Что нужно: кнопка "Стар"т сразу включает 2 реле, одно из которых отключается через 8-10 сек. Второе остается включено пока не нажата кнопка "Стоп".

а что нужно когда одновременно нажаты "Старт" и "Стоп" ? а что делает твой код в этой ситуяйции?

ЗЫ не уж то элементарная логика работы эмулятора реле"звезда-треугольник" вызывает такие сложности.... может это не ваше?

Share this post


Link to post
Share on other sites
12 часов назад, IMXO сказал:

.. может это не ваше?

может и не мое... и нахера такое советовать. Я и без вас знаю что мое, что не мое. Мне этот  проект нада на один раз. Не хочешь помогать - лучше промолчи.

12 часов назад, IMXO сказал:

а что нужно когда одновременно нажаты "Старт" и "Стоп" ? а что делает твой код в этой ситуяйции?

одновременно нажмают "Старт" и "Стоп"  только дебилы, я для их обработчик этого события писать не буду?

Вопрос к BARS. Помоги с таймером. мне некогда сейчас читать книжки, нада запускать станок.

 

 

Share this post


Link to post
Share on other sites
1 час назад, brusel сказал:

одновременно нажмают "Старт" и "Стоп"  только дебилы, я для их обработчик этого события писать не буду?

1. первое чему учат при программировании человека-интерфейса любой программы это "зашита  от дурака"

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

и 3. кнопка "стоп" в реальных условиях может элементарно "залипнуть"

вот и подумай кто в действительности дебил...

1 час назад, brusel сказал:

Не хочешь помогать - лучше промолчи.

даун я тебе код еще на прошлой станице привел , судя по отсутствию реакции твой моск его неасилил

Share this post


Link to post
Share on other sites
2 часа назад, brusel сказал:

нада запускать станок.

Идите запускайте в другом месте...

Тему закрываю. Буду надеятся, что у этого "специалиста" всё обломится и он не сделает опасную для жизни людей ху..ю ....

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Сообщения

    • Потому что они там не зомбированы нашими СМИ,  и прекрасно видят оккупантов.
    • Дело было так. Понадобился ещё один отличный усилитель, купил полуфабрикат у человека которому не удалось его запустить, несчастный усилитель  видимо долго мучили, даже клеммы подключения питания пришлось менять, и транзисторы УНа и пред выхода отошли вместе с дорожками, но сейчас не об этом. Комплектующие он покупал у Лучезара, на выходных транзисторах был подписан КУ, подбирались, конденсаторы электролиты  все разные, один 1000 мкф на 50 вольт потек , подделка, заменил все. Запустил, правда перевел в без оптронный режим, ток УНа установил 25 мА, ток потребляемый усилителем в режиме покоя 140 мА, стабилен. Но есть одна бяка, всплеск на меандре, похож на звон. На обоих каналах абсолютно идентично.  Мощность около 50 ватт на нагрузку 7.7 Ома  Проверил покаскадно, на всех транзисторах оное есть, а начинается все с ОУ. Осциллограммы под спойлером. Получается виновник ОУ. Можно что то с этим сделать, или только замена ? Что то мне он не нравится, подделка ? Собственно схема и платы усилителей.  
    • Не только "идея", но я так когда-то реализовывал: Математика простая. Если в контроллере ADC 10-битовый - принимаем что с питания Vcc (и с "+" аккумуляторов) получаем код 1023. Один бит соответствует напряжению ~0,00489 Вольт. С "-" аккумуляторов подаём напряжение на входы аналого-цифрового преобразователя. Я условно обозначил аккумуляторы 1 и 2. Так-же условно обозначил входы ADC 1 и 2. Далее всё очень просто: пусть, к примеру, с аккумулятора 1 получаем код 158, с аккумулятора 2 - 205. Для аккумулятора 1: 1023-158=865, напряжение аккумулятора 865*0,00489= 4,23 Вольт Для аккумулятора 2: 1023-205=818, напряжение аккумулятора 818*0,00489= 4,00 Вольт Это один из вариантов подсчёта напряжения.   Другой вариант - схема та-же, только ADC должен выдавать не код, а считывать напряжение. 0 Вольт на входе - "0,00" на выходе ADC, 5 вольт на входе - "5,00" на выходе ADC. Дальше простое вычитание: напряжение ADC1 "0,77" вольт, напряжение Akk1 "5,00"-"0,77"="4,23" Вольт напряжение ADC2 "1,00" вольт, напряжение Akk1 "5,00"-"1,00"="4,00" Вольт Ну, в принципе, метод простой: из "опорного" питания нужно вычесть принятое с "-" аккумулятора. Резисторы параллельно аккумулятору нужны чтобы при отсутствии аккумулятора "-" аккумулятора подтягивался к "+" аккумулятора и контроллер "видел" что аккумулятора нет или он просто полностью "сдох". Мосфеты должны, естественно, не иметь утечек в закрытом состоянии. В таком случае сопротивление резисторов можно увеличить в несколько раз.
    • Куда это совсем здристнул наш бравый защитничек @Сомнамбула ?  Хотелось бы услышать его комментарий, почему наших освободителей встречают булыжниками и проклятиями?  
×
×
  • Create New...