G

Советы для грамотной архитектуры прошивки.

32 сообщения в этой теме

Здравствуйте.

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

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

1. Выход на одно реле. Оно и будет управлять насосом (~240 Вт.)

2. Дисплей - 2 модуля, каждый из 3х 8ми сегментных цифр, внутри модуля соединены для динамической индикации, т.е. 11ти ногие. Показывать будет время в часах/мин/сек ну и закорючки для индикации режимов.

3. Клавиатура - матрица 3*4. Настройка таймера/запуск/остановка.

4. Пищалка - динамик 8 Ом. Для звуковых сигналов о состоянии и при настройке таймера.

5. [Датчик тока/напряжения] его может быть и не стану делать, назначение - косвенно определять количество перекачанной воды, определять отсутствие воды в скважине.

 

Плата готова уже, МК выбран 16LF1823 (на глазок, т.к. они уже есть и задача вроде как не сложная). Дисплей тоже готов и проверян средним пальцем левой ноги )) состоит из ключа подачи питания, 3х микросхем (8 D-триггеров каждая), из которых получился длинный сдвиговый регистр, ну и самих цифр, о которых уже написал. Получилось 3 входа: Power ON,  Clk,  Data, ну и питание +  - .

Планируется 4 программы работы: 1)-бесконечная работа с перерывами на восстановление скважины;   2)-30л;    3)-10л;     4)-по времени с клавиатуры.

2 и 3 можно настроить с клавиатуры, вход в режим настройки - долгим удержанием кнопки "OK", настройку можно проводить и в режиме, когда уже идёт перекачка. Запуск 2 коротким нажатием кнопки "отмена", 3 - кнопки "ОК". Запуск по времени просто вводом цифр, перед запуском анализ - если <10 сек, то это не секунды, а минуты. В процессе перекачки звуковые сигналы. После запуска перекачки дисплей гаснет по истечении некоторого времени, для включения - нажать любую кнопку из некоторой группы.

По истечении времени перекачки - пикалка звуковой сигнал в теч. некоторого времени, затем выключение в спящий режим.

Собираюсь задействовать DAC для пищалки (синусоиду слушать приятнее, чем меандр имхо), для дисплея - SPI, для задержек всяких разных - аппаратный таймер, если будет не лень, хватит ресурсов и вообще звёзды сойдутся, то может ещё ADC понадобится.

Получается будут параллельно выполняться функции:

1. опрос клавиатуры

2. индикация

3. звук

4. расчёт оставшегося времени, либо ожидание запуска

Делать собираюсь на С с компилятором XC8.

Вопрос  с чего нАчать. Ну решил начать с алгоритмма, понял что нужны будут отрезки времени со стабильной длительностью/периодичностью, и для отсчёта самих интервалов работы насоса и для опроса клавиатуры и для звука и для дисплея. Посоветуйте где что почитать, чтобы отстойный код не получился. Сейчас есть мысль что понадобится делать программные таймеры и возможно будет желательно конечные автоматы использовать, о которых почти ничего не знаю. По программным таймерам нашёл статью http://chipmk.ru/index.php/spisok-statej/24-uchimsya-programmirovat/120-programmnye-tajmery-na-assemblere,  но она на асме, зато показалась хорошей. Есть разные и статьи и литература для начинающих, но там обычно как диодиком помигать, что такое МК и т.п., как правильно делать с точки зрения ресурсов МК, возможности корректировки кода в будущем, добавлении нового функционала мало где встречается, поэтому и нужны советы. Сейчас вопросы - не маловато ли ресурсов у выбранного МК для моих хотелок, как делать программные таймеры и почему они работают с точной периодичностью независимо от основной программы, действительно ли мне нужны конечные автоматы. В общем то разбираться планирую как можно больше самостоятельно, но просьба указать направление, в котором надо самопнуться.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, GDK сказал:

Получается будут параллельно выполняться функции:

1. опрос клавиатуры

2. индикация

3. звук

4. расчёт оставшегося времени, либо ожидание запуска

В вашей концепции только индикация должна выполняться параллельно с остальными задачами, так как реализуется динамически и любая пауза в ее работе будет видна пользователю. Думаю, объяснить, по какой причине остальные "задачи" должны выполняться параллельно друг другу, вы не сумеете... Особенно смешно выглядит параллельное ожидание запуска :)

0

Поделиться сообщением


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

Хоть попробую.

Работа с клавиатурой должна быть доступна когда угодно, во время перекачки можно например настраивать параметры "избранных"  действий. Это 30л и 10л. Например чтобы перенастроить 10л на 15л. Или, например, чтобы немедленно отменить текущую перекачку без выдёргивания вилки из розетки.

Ожидание может и смешно, но с точки зрения насоса - либо перекачка, либо ожидание запуска, либо сдох нафих ^_^. Ну а в процессе перекачки может быть буду считать скока литров, аднака. Может через 30 сек. какой-нибудь дятел включит козла и напряжение станет вместо 220 - 170? Значит придётся увеличить время на какое-то значение. Т.е. прилепить ещё датчик тока и "интегрировать" ток, пока не накопится заданное значение. И это не должно мешать опросу клавиатуры.

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

Не убедил?

 

0

Поделиться сообщением


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

Для начала лучше светодиодиком помигать, а потом 2 диодиками, потом кнопку подключить и потом возможно придет понимание как МК работает.

 

0

Поделиться сообщением


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

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

Как ходят ладьи с конями знаю, но как из этого получить выигранные партии  - представления пока что совсем смутные, отсюда и тема.

0

Поделиться сообщением


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

Дак Вы начните, а там по-ходу всё решится... :)


 

0

Поделиться сообщением


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

Уже начал. Ну с прерываниями вроде бы уже проясняется, с автоматами пока туговато. Инфы слишком много знает гугл, а это, при определённых условиях, - то же самое что её отсутствие.

0

Поделиться сообщением


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

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

Вообще, на сколько мне известно, инфа есть в интернете по этой теме.
 

0

Поделиться сообщением


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

Да, и немало, вот и пытаюсь разобраться в этои инфе.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, GDK сказал:

Не убедил?

НЕ убедил. 

Обычно все рассуждают так, как вы. Однако, если динамическую индикацию задержать на 0,1 секунды, вы увидите, как индикатор мигнет. А если кнопку нажать на 0,1 сеунды позже, или там реле у вас сработает на 0,1 секунды позже, или датчик - никто вообще не заметит. Именно поэтому индикация должна работать ПАРАЛЛЕЛЬНО с остальными задачами, а остальные задачи МОГУТ работать ПОСЛЕДОВАТЕЛЬНО, только быстро-быстро :) Быстренько опросили кнопки, быстренько отреагировали на датчики, быстренько обновили дисплей и снова быстренько опрашиваем кнопки. За 0,1 секунды эта последовательность у вас раз 10 отработает запросто.

В этом случае все выглядит ГОРАЗДО проще, чем когда все процессы работают одновременно.

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

Поделиться сообщением


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

Я делаю так: прерывание по аппаратному таймеру каждые 20 миллисекунд (частота получается 50 Гц), загружаем очередную цифру в 74HC595 и переключаем аноды (или катоды) индикатора. К общим анодам (или катодам) подключены и кнопки (по количеству цифр, у меня их 4), подающие при нажатии сигнал на вход МК. Не забывайте подтянуть вход (к минусу при общих анодах или к плюсу при общих катодах). Этот вход проверяется в этом же прерывании. Состояние кнопок сохраняем в глобальной переменной, из глобальных же переменных берётся и значение для индикации (готовый байт для засылки в 74HC595). Ничего больше в прерывании не делаем, поэтому оно выполняется быстро. А дальше уже в основном цикле сначала обрабатываем состояние кнопок, затем формируем индикацию, опрашиваем датчики (если есть) и всё прочее. По такому принципу у меня работают часы-будильник-таймер с термометром. При тактовой 8 МГц у меня процессор в основном простаивал, ожидая прерывания. Снизил тактовую до 1 МГц для уменьшения энергопотребления.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 20.04.2017 в 00:31, GDK сказал:

Я начал делать таймер для водяного насоса...

Ну не знаю зачем такой "огород" городить, я поступил намного проще: Двухрежимная автоматическая водокачка

0

Поделиться сообщением


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

@Вуйко  Ага, эти материалы и начал читать вчера.

17 часов назад, ARV сказал:

Быстренько опросили кнопки, быстренько отреагировали на датчики, быстренько обновили дисплей и снова быстренько опрашиваем кнопки. За 0,1 секунды эта последовательность у вас раз 10 отработает запросто.

1. А звук? Если, допустим, мне хочется иметь возможность пищать синусоиду до 10кГц, или произвольной формы сигнал выдавать с помощью DAC (он 5 разрядный).

2. Я почему то изначально не был уверен в том, что всё будет успеваться, да и сейчас тоже. Для комфортной работы с клавиатурой 4х3 какой период опроса надо будет сделать, может придётся 1мс?

9 часов назад, oldmao сказал:

К общим анодам (или катодам) подключены и кнопки (по количеству цифр, у меня их 4),

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

А как у Вас устроен интидребезг?

 

9 часов назад, oldmao сказал:

При тактовой 8 МГц у меня процессор в основном простаивал, ожидая прерывания. Снизил тактовую до 1 МГц для уменьшения энергопотребления.

У меня другой подход - всё быстро сделал, и спать. Проснулся по прерыванию от таймера, разобрался с делами, и опять баиньки.  Вот и думаю встроенный RC генератор попробовать на 16 МГц запустить или на 8...

8 часов назад, Vovka сказал:

Ну не знаю зачем такой "огород" городить

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

 

И вот тут я кажется понял, что тупанул - 6 цифр на дисплее сделал для настройки в чч.мм.сс, а можно было тупо 3 цыфры и настройку в литрах...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 минуты назад, GDK сказал:

А как у Вас устроен интидребезг?

Три переменных в прерывании: текущее значение кнопок, счётчик и глобальная переменная состояния кнопок. Если текущее состояние кнопок не совпадает с глобальной переменной, то инкременируем счётчик. Если совпадает - счётчик обнуляем. Если счётчик равен 10, то переписываем текущее значение в глобальную переменную, счётчик обнуляем. Таким образом реакция на нажатие кнопки 200 мс. Длинное-короткое нажатие определяет логика в основном цикле.

0

Поделиться сообщением


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

@IMXO , там 3 октавы, я не разбираюсь в этом, это до 2 кГц? Ну и МК там... напр.   14кбайт - память программ, 368 байт - опер. память, а у меня 4к и 168 байт соответственно. Там ОСРВ, в мой МК наверное не влезет.

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

Таким образом реакция на нажатие кнопки 200 мс.

200мс. Довольно таки долго. Ну и как получается по ощущениям, комфортно? Нет ощущения, что клавиатура не успевает обрабатывать короткие нажатия и надо давить "как следует" ?

0

Поделиться сообщением


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

Удобно, задержка в 0,2 секунды не ощущается совсем. Это же не клавиатура компьютера, скоростной набор не требуется. Длительное нажатие у меня 2 секунды, это вход в режим установки часов. 

PS В одном проекте у меня опрос кнопок вообще 0,5 сек (правда антидребезг аппаратный), с такой же скоростью автоповтор. Привыкаешь быстро, даже удобно, на случайные нажатия не реагирует.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, GDK сказал:
12 часа назад, oldmao сказал:

К общим анодам (или катодам) подключены и кнопки (по количеству цифр, у меня их 4),

Я тоже так хотел сначала, но у меня предусмотрено гашение дисплея снятием питания с него, а при этом клавиатуру опрашивать надо

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, GDK сказал:

Если, допустим, мне хочется иметь возможность пищать синусоиду до 10кГц

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

Но если и в самом деле нужен звук, он делается так же, как динамическая индикация - фоновым процессом. Просто лично я не понимаю стремления все делать "незаметно", т.е. параллельно с чем-то. С чем параллельно, если все прячется? Кнопки, датчики и многое другое вовсе не обязательно должно делаться в фоне.

Я вот сейчас увлекся цветомузыкой, (см. видео первой пробы, сейчас все гораздо лучше), так вот, вы не поверите, там нет ни одной параллельной задачи, все делается последовательно! Причем, хоть на видео этого не видно, есть энкодер и ЖКИ: энкодер обрабатывается "одновременно" (внешне, а по факту - по опросу "последовательно") с индикацией на ЖКИ спектра сигнала, и 32 штуки WS2812 при этом мерцают вовсю... И, хотя задержек в коде много, ни одного таймера для этого напрямую не задействовано (ну, почти...).

Скачать видео

Вот то самое видео...

0

Поделиться сообщением


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

На самом деле любая многозадачность на AVR - это в первую очередь грамотное планирование последовательности задач. Почитайте про ОС реального времени для AVR (это одна из многих существующих, но принцип работы расписан хорошо). Для 95% задач такая сложность ни к чему, критичные к времени части программы (динамическая индикация, опрос кнопок, звук) реализуем в прерываниях по таймеру. Отдельно делаем опрос датчиков, например 1-Wire, где критичны временные интервалы, с запретом остальных прерываний на время работы с датчиком. Это миллисекунды, пропуск даже пары тактов динамической индикации глазом будет не заметен. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, ARV сказал:

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

Мне показалось, что 16LF1823 справится. Считаете что вряд ли получится на нём?  Я всё таки попробую, но по остаточному принципу, если будет хватать ресурсов, если не будет хватать, тогда уже урезать хотелки, да. Но дело в том, что не хочется делать задачу невыполнимой, которая в общем то выполнима.  А ещё я стараюсь выключать свет, когда он мне не нужен...

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

 

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

так вот, вы не поверите,...

У меня практически нет опыта работы с МК, поэтому могу поверить во что угодно.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, oldmao сказал:

На самом деле любая многозадачность на AVR МК- это в первую очередь грамотное планирование последовательности задач...

Раньше читал про ОСРВ. И это понятно.

Получается как бы 3 крайности при выборе архитектуры:

  • Просто последовательное выполнение задач
  • Прерывания и конечные автоматы
  • ОСРВ
0

Поделиться сообщением


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

Верно, укрупненно так и есть. Я бы добавил примечания:

  • Последовательное выполнение - простое для понимания и реализации, самое то для начинающих
  • Прерывания - простое для понимания, но требующее внимательности к "нюансам" при реализации (например, атомарность доступа к многобайтным переменным и т.п.)
  • Конечные автоматы - сложнее в понимании и реализиации, как по мне, так я бы сказал, что если состояний в автомате больше трех, понять чужую писанину практически невозможно, а в свей перестаешь разбираться при числе состояний больше 6 :)))
  • ОСРВ (вообще "многозадачная" ОС, не обязательно РВ) - это весьма сложная в реализации вещь (если не сторонняя), требующая заметных усилий по привыканию к парадигме многопоточности, расходующая большое количество ресурсов на собственные цели, но после преодоления всех препон, дающая максимальную свободу в программировании.
0

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сообщения

  • Похожие публикации

    • Автор: KushlaVR
      Здраствуйте. Возникла необходимовсть управления несколькими устройствами разных производителей с помощю одного елемента управления.
      В качестве управлялки нужно использовать Sony RM-X6. и сенсорний монитор с виходом формата NEC (на дисплее есть кнопки и когда в их нажымать - транслирується команда)
      Управление осуществляєтся с помощю устройства (которое мне нежно разработать). С протоколом NEC - разобратся получилось (есть куча примеров).
      А вот протокол Sony rm-X6 темный ящик. Такое ощущение что ето обичний UART...
      Значит вопрос собственно такой:
      1) Помогите распознать что за протокол?
      2) Помогите составить алгоритм по распознанию (контроллер Atmega8 тактовая частота внутреннего генератора 8МГц)
      3)Возможнор ктото уже работал с ним, и готов поделится примерами...
      П.С.
      Усилографа нет... Снял сигнал с помощю звуковой карточки (в формате waw). Результат можна посмотреть вот тут:
      drive.google.com/folderview?id=0B-SmX6iwS8HeT3NYSXlYQzJMY2M&usp=sharing
      (извините, waw не могу прикрепить к теме, потому разшарил папку. Если у модераторов есть возможность, то прикрепите, буду благодарен)
      Спасибо всем за внимание и помощь....
    • Автор: Grandfiesto
      Поступило задание разработать цифровой тахометр с такими параметрами:
      1. Диапазон измерений - 0-12000 об.мин.
      2. Тип датчика - Герконовый.
      3. Разрядность АЦП - 12 разрядов.
      4. Напряжение АЦП и микроконтроллера - 5 В.
      5. Скорость серийного порта 9600 бит/с.
      6. Кол-во импульсов датчика за один оборот - 3.
      Разработка программы в среде IDE, желательно на C.
      Разработать алгоритм.
      Задание завело в тупик. Очень нужна помощь!
    • Автор: Arthur
      Короче посетила меня идея (с таблеткой эспумезана), имеется дисплей MT-12864A-2FLA по сути он ничем наверное не отличается от LGM12641BS1R у них такие же контроллеры стоят. Рисовать растр, согласитесь это занимает очень много места в памяти микроконтроллера. И задумался я написать драйвер для него (аля векторная графика), задаю точку 1 и точку 2 а он чертит сам мне линию. Алгоритмы уже есть, написаны за долго до меня, за основу взял алгоритм Брезенхема. Написать программу это пол беды, столкнулся я с такой проблемой, ведь дисплей по сути разбит на два сектора (кристалла) по 64 столбца. и если допусти мне надо поставить одну точку в одном кристалле а другую в другом, программа то расчитает мне точки линии, но как мне сделать перенос с одного кристалла на другой?
      Дальше еще думаю, как быстро он будет делать расчёты. всех точек. и на сколько быстро он прочертит одну линию.
      Конечно я лезу в дебри если честно и наверника уже есть такие дисплеи со встроенным контроллером, которому эту программу не надо писать, и дисплею нужно лишь подать координаты двух точек (графический контроллер) но я пока такие дисплеи не нашёл, может не там искал.
    • Автор: Pragmatik91
      Здравствуйте! Ситуация такая: нужно разработать микропроцессорную систему измерения температуры с цифрового датчика tmp03 и передать результаты через UART. Подключил датчик, написал программу считывания:

      0016 14 RDTMP: ;Подпрограмма чтения датчика
      00B0 15 TMPIN bit P3.0;Порт связи с датчиком TMP03
      0040 16 T1H data 40H;Определение места хранения старшего байта T1
      0041 17 T1L data 41H;Определение места хранения младшего байта T1
      0042 18 T2H data 42H;Определение места хранения старшего байта T2
      0043 19 T2L data 43H;Определение места хранения младшего байта T2
      0016 758911 20 mov TMOD,#11H;Задание 16-разрядного режима работы таймеров
      0019 758C00 21 mov TH0,#0;Обнуление таймера 0
      001C 758A00 22 mov TL0,#0;Обнуление таймера 0
      001F 758D00 23 mov TH1,#0;Обнуление таймера 1
      0022 758B00 24 mov TL1,#0;Обнуление таймера 1
      0025 30B0FD 25 WT1: jnb TMPIN,WT1;Ожидание перехода входной величины
      в высокое состояние (начала T1)
      0028 D28C 26 setb tr0 ;Запуск таймера (для замера T1)
      002A 20B0FD 27 WT2: jb TMPIN,WT2;Ожидание перехода входной величины в
      низкое состояние (конец T1, начало T2)
      002D C28C 28 clr tr0 ;Остановка таймера
      002F D28E 29 setb tr1 ;Запуск таймера (для замера T2)
      0031 30B0FD 30 WT2E:jnb TMPIN,WT2E;Ожидание перехода входной величины
      в высокое состояние (конец T2)
      0034 C28E 31 clr tr1 ;Остановка таймера
      0036 22 32 ret ;Возврат из подпрограммы Теперь мне нужно преобразовать считанные данные с датчика. Преподаватель сказал взять температуру 23 градуса для примера. Формула для рассчета температуры исходя из количества считываемых импульсов такая: T©=235-((400*T1)/T2). Нужно написать алгоритм и подпрограмму.
    • Автор: Dan_Rudenko
      Доброго времени суток, поставлена задача написать программу для рассчета конструкции СВЧ-фильтра (регулярный волновод-запредельный волновод - резонатор - запредельный волновод - регулярный волновод), читал несколько книг, например - Капилевич Б.Ю. - волноводные диэлектрические фильтры, все равно не могу понять в чем методика, входные данные у меня - значения полей в областях, как составить матрицу, а затем как получить из нее АЧХ