Перейти к содержанию

Преобразование массива в код (Си)


-=FISHER=-

Рекомендуемые сообщения

Только что, -=FISHER=- сказал:

А за десять секунд соответсвенно 1220

Моё замечание касалось того, что 1220 - это число в коде, никак не объясненное. Такие числа называются "магическими". Приличные люди делают так

#define TIMER_10_SEC_VALUE		1220

И потом пишут 

if(prog_available_count > TIMER_10_SEC_VALUE)

Согласитесь, понятнее намного? Особенно если porog_available_count превратить в prog_enable_time :) Тогда текст программы будет читаться почти как текст на английском - понятно без комментариев.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Только что, ARV сказал:

Моё замечание касалось того, что 1220 - это число в коде, никак не объясненное. Такие числа называются "магическими". Приличные люди делать так

Полностью с Вами согласен. Подправлю.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Что скажете на счет асинхронного мигания?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

14 минуты назад, ARV сказал:

Что скажете на счет асинхронного мигания?

Давайте сначала условимся, что значит мигнуть например правым поворотником n раз. Это значит включить PB4  в единицу и держать её, пока команда Light_On_Right не придет n-1 раз.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Alex сказал:

Подобные алгоритмы хорошо RTOS'ью разруливать.

А Вы можете подробнее объяснить что это?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

13 минуты назад, Alex сказал:

Не подойдет. Где я столько памяти возьму))

Цитата

Наличие ОСРВ freeRTOS в проекте съедает у вас около 9.8 Кб памяти программ и 1.8 Кб ОЗУ.

 

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Уточнение требуется: сигнал COM - как он работает? Я верно понимаю, что на нем постоянно 1, когда рычаг в нейтральном положении, или присутствуют импульсы, когда рычаг переведен в одно из положений? 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, ARV сказал:

Уточнение требуется: сигнал COM - как он работает?

Когда рычаг выключен - нам нём всегда 1. (Это и есть код 010 как бы режим ожидания)

В момент когда рычаг включен и горит какой-либо поворот, на нем тоже 1. (И на нем и на повороте 110 либо 011, либо 111 если аварийка)

В момент когда рычаг включен и реле прервало импульс, соответственно но нём 0. (Лампочка поворота тоже погашена соответственно в этот момент 000).

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Ага, значит, я верно понял. Т.е. надо ловить момент, когда сначала пришла "команда", а потом она ушла, а на COM все еще 1 - это и будет короткое нажатие, которое надо удлиннять. Так?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, ARV сказал:

Ага, значит, я верно понял. Т.е. надо ловить момент, когда сначала пришла "команда", а потом она ушла, а на COM все еще 1 - это и будет короткое нажатие, которое надо удлиннять. Так?

Ну похоже что да. В режиме ожидания имеем 010, затем ждем пока например будет 110, это означает что произошло нажатие на подрулевой. Чтобы не дать поворотнику погаснуть, если это было короткое нажатие, то сразу же нужно включить соответствующий порт в 1 (например PB4), тем самым открыв транзистор, который дублирует нажатие подрулевого.

Ждём Следующую команду которая придёт, а ей может быть ТОЛЬКО команда паузы 000 (режим паузы, то время когда реле поворотов прервало импульс т.е. опустило COM в 0 и тот поворотник который горел тоже станет 0). Здесь мы должны опустить PB4 в 0, выключить дублирующий транзистор.

Далее ждём следующую команду, она может быть либо 010, либо опять 110.

В первом  случае 010 это будет означать что было короткое нажатие, (короткое нажатие это последовательность команд 010 - 110 - 010 ЛИБО 010 - 110 - 000 - 010), а моргание до режима ожидания (010) было только одно, значит снова включаем PB4 в 1 и считаем моргания после n-го моргания когда наступит режим паузы (000) выключаем PB4 в 0.

Во втором же случае 110 это будет означать что подрулевой у нас включен с фиксацией, т. е. последовательность команд такая 010-110-000-110- и т д, в этом случае не делаем ничего.

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

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

В чем смысл. У вас есть состояния, характеризуемые тем или иным состоянием ВЫХОДОВ. Чтобы поменялось состояние выходов, надо изменить общее состояние, а это происходит по тем или иным сигналам извне. Вот то, что вы мне описали, как нельзя лучше этому соответствует: у вас есть состояние ожидания команды, при поступлении команды происходит переход в состояние ожидания паузы этой команды, из которого может быть переход в следующее состояние и т.д.

В каждом состоянии вы анализируете условия выхода из него и в зависимости того, какие условия совпали, задаете новое состояние. Очень абстрактно-укрупненно (и с магическими числами) это выглядит так: 

// перечень возможных состояний
typedef enum{
  STATE_1,
  STATE_2,
  STATE_3,
  ...
  STATE_N
} state_t;

// переменная текущего состояния
state_t state = STATE_1; // исходное состояние

// главный цикл
while(1){
  switch(state){
    case STATE_1:
      if(get_command() == CMD_1) // проверяем условия перехода
        state = STATE_2; // если пришла нужная команда, то новое состояние
      // а иначе торчим в этом состоянии
      // и можем делать что-то полезное для этого состояния
      break;
    case STATE_2:
      // делаем что-то полезное для этого состояния и
      // проверяем условия перехода из этого состояния в другие
      break;
    ...
    // и так далее для всех состояний  
  }
}

Т.е. в каждом состоянии 2 варианта поведения: либо остаться в этом состоянии и делать то, что надо, либо перейти в другое (любое) состояние.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, ARV сказал:

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


typedef enum{
  STATE_1,
  STATE_2,
  STATE_3,
  ...
  STATE_N
} state_t;

 

Если Вас сильно не затруднит, по каким ключевым словам я могу загуглить и осознать что значат эти "руны" typedef enum? Просто раньше не сталкивался....

5 минут назад, ARV сказал:

В каждом состоянии вы анализируете условия выхода из него и в зависимости того, какие условия совпали,

Мне кажется я этот смысл и пытался изобразить анализируя текущее состояние и исходя из предыдущего состояния выбирал вариант развития событий. Но использовал только if-else в силу бедности знаний возможностей Си...

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Только что, -=FISHER=- сказал:

что значат эти "руны" typedef enum

typedef - определение пользовательского типа, т.е. вы вводите новый тип на основе "стандартных" сишных. 

enum - особый "стандартный" тип ПЕРЕЧИСЛЕНИЕ, т.е. просто набор констант. переменная этого типа должна принимать только одно из перечисленных значений (хотя Си, конечно, никак это не контролирует).

Только что, -=FISHER=- сказал:

Мне кажется я этот смысл и пытался изобразить анализируя текущее состояние и исходя из предыдущего состояния выбирал вариант развития событий.

Очевидно так. Из-за некоторого сумбура в коде и многоэтажности if-ов четкое деление на отдельные состояния не прослеживается, вот я и предложил более "традиционный" вариант. Вплоть до выделения каждого состояния в отдельную функцию, возвращающую новое значение состояния. 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, ARV сказал:

enum - особый "стандартный" тип ПЕРЕЧИСЛЕНИЕ, т.е. просто набор констант.

Константами в моём случае будут состояния ножек МК? типа 000, 010, 110, 011 и т д?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, -=FISHER=- сказал:

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

Ждём Следующую команду которая придёт

А если мы уже продублировали сигнал транзистором, то мы же можем следующего сигнала и не дождаться. Мы, как бы, автоблокировались. Или я что-то не допонимаю ?

И второе. Не наступит ли такой ситуации, что когда мы дёрнули рычаг (чтобы сделать короткий щелчок), реле прерывателя уже посалило "0" на COM ? Или реле тоже синхронизируется с этими сигналами и включается только по истечении некоторого времени ?

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Alex сказал:

А если мы уже продублировали сигнал транзистором, то мы следующего можем не дождаться. Мы, как бы, автоблокировались.

Дублируем его только на время первой вспышки повортников, когда приходит команда паузы (000) транзистор обязательно нужно отключить, о чем я и написал чтобы не автоблокирнуться:) и ждём придет ли 1 только на COM что будет говорить об отпускании рычага, тогда нужно сразу же включить транзистор снова и после считанного кол-ва импульсов выключить. Либо 1 придет и на COM и на right что будет говорить о том что подрулевой всё ещё включен и удлиняться нам не нужно.

4 минуты назад, Alex сказал:

И второе. Не наступит ли такой ситуации, что когда мы дёрнули рычаг (чтобы сделать короткий щелчок), реле прерывателя уже посалило "0" на COM ? Или реле тоже синхронизируется с этими сигналами и включается только по истечении некоторого времени ?

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

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Только что, -=FISHER=- сказал:

Константами в моём случае будут состояния ножек МК? типа 000, 010, 110, 011 и т д?

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

Если начнете присваивать константам в enum конкретные значения, делать это надо так:

enum {
  CONST_0, // если принудительно не задано, то первая константа всегда равна 0
  CONST_1 = 2,
  CONST_2 = 5,
  CONST_3, // если принудительно не задано, то будет на 1 больше предыдущего, т.е. 6
  ...
}

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, -=FISHER=- сказал:

когда приходит команда паузы (000) транзистор обязательно нужно отключить, о чем я и написал чтобы не автоблокирнуться:)

Ну, о чём я и толкую. Если мы открыли транзистор, то мы автоматом перевели состояние из 100 в 1xx. И хоть подавай на COM нолик, хоть снимай слева единичку - она там и останется. 000 уже не будет.

PS: Всё, я окончтельно запутался с этими ноликами и единичками :D

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, -=FISHER=- сказал:

затем ждем пока например будет 110, это означает что произошло нажатие на подрулевой. Чтобы не дать поворотнику погаснуть, если это было короткое нажатие, то сразу же нужно включить соответствующий порт в 1 (например PB4), тем самым открыв транзистор, который дублирует нажатие подрулевого.

Вот мы открыли транзистор, тем самым зафиксировали состояние 110.
Далее :

2 часа назад, -=FISHER=- сказал:

Ждём Следующую команду которая придёт, а ей может быть ТОЛЬКО команда паузы 000

Но 000 не будет. Будет 100. Соответственно, мы ничего не дождёмся.
А 100 мы уже расцениваем как другое состояние - включен поворотник и мигает. Итог - короткое нажатие пропустили :)

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Alex сказал:

Но 000 не будет. Будет 100. Соответственно, мы ничего не дождёмся.

Будет именно 000. Потому что в последовательности 

2 минуты назад, Alex сказал:

110

единичка выделенная красным цветом это так же самая единичка что и средняя, а получилось из 010 =>110 потому что мы замкнули подрулевой. 110, и когда реле прервет импульс для паузы, 1 пропадёт и на COM и соответственно на right, потому что больше 1 неоткуда взяться 000

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

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Красным цветом я выделил то, что мы продублировали транзистором.
Т.е. , если мы дождались 110, левую 1-чку мы фиксируем, получаем 110 (красный цвет - автофиксация транзистором).
Я правильно понимаю ?

Ссылка на комментарий
Поделиться на другие сайты

Только что, -=FISHER=- сказал:

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

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, ARV сказал:

Если честно, я как-то до сих пор окончательно не врубился в алгоритм вашего устройства... туплю сильно.

Я вот тоже никак не могу врубиться <_<

@-=FISHER=- , распишите все состояния в виде 000, 101, ... , каждый шаг после каких то событий. А фиксирование сигналы транзисторами выделяйте другим цветом.
Примера, соответственно, достаточно только для одного поворотника.

3 часа назад, -=FISHER=- сказал:

Наличие ОСРВ freeRTOS в проекте съедает у вас около 9.8 Кб памяти программ и 1.8 Кб ОЗУ.

Это Вы freeRTOS посмотрели. Она достаточно мощная и вытесняющая. Её актуально применять только в жирных камушках.
Существуют менее прожорливей ОСи, например - OSA. Я ознакомление с ОСями начинал именно с неё. До сих пор использую, вещь незаменимая...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...