317

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы

Всем привет! Рад, что понравился мой предыдущий пост. В этой части будет, собственно говоря, то что хотел также поместить туда, но не стал раздувать пост. Она не такая интересная ибо, в основном, работаем с программой. Писал я её 2-3 часа в день в свободное время, так что на текущий момент сделано не много (относительно). Многое ещё нужно доработать или исправить.


Продолжим с того, что мы практически подключили железо. Далее заходим в WinAVR Atmel Studio и пишем. Начнём с создания конфигурационного файла, в котором сразу же укажем назначенные порты и пины микроконтроллера для того, чтобы в будущем была возможность расширить/заменить/переназначить выводы под разные платы без значительных изменений в самой прошивке. Выглядит это на начальном этапе примерно так:

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Далее очередь макроподстановок (substitutions) под эти порты для удобной работы. Можно тупо оперировать регистрами, сразу по ходу дела устанавливая на выходной порт значения типа 0x62, 0xCC и т.д., но мы будем всё расписывать для того, чтобы было понятно и самим не запутаться.

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Для проверки правильности работы этих макроподстановок пишем каличную мини "программку" на задержках. В нашем случае она включит залив примерно на 12,7 с, далее насос на 25,5с и опять слив на 12,7с. (значения выбраны произвольно).

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Для проверки на железе заменил свой переключатель на DuPont пины, попутно выведя на них все датчики в т.ч. DOOR и ISB, которые пока не задействую. Также питание +5V от платы. В готовом виде выглядит это так. Релюшки успешно щелкают:

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Далее создадим некое подобие структуры приложения. Учитывая, что программирование под AVR чисто процедурное, никаких классов и экземпляров создавать не надо, поэтому особого труда это не составит.

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Попутно также прикручена каличная библиотека для LCD1602, написанная по памяти. Пока что не умеет в русский язык, работает медленно, возможно, подлежит дальнейшей замене, но для отладки её хватает на все 100. Вынес в отдельную функцию нашу "программу" самым очевидным образом:

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Далее, возможно, будет несколько разных программ. Как уже смеялись в комментах к предыдущему посту, ошибка пока что будет на уровне "ЕГГОГ", но это не страшно, это всё поправимо.

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Далее прикрутил таймер. Т.к. моя микро библиотека 1602 на текущий момент имеет лишь одну функцию - последовательный вывод массива Char'ов (да и те только латиницей),  пришлось городить данные костыли для вывода текущего времени таймера (что помогло мне его отладить), со временем это будет исправлено, если будет в этом потребность. Далее занялся вводом с кнопок и датчиков. Для тестирования вывел все выводы подряд на дисплей. Сделано это было не зря - как выяснилось, некоторые порты были замкнуты между собой соплями из припоя на переходнике, возникшими вследствие многократной перепайки контроллера. Эту проблему устранили, после чего всё стало определяться нормально.

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Сама процедура программы к этому моменту стала выглядеть так, и уже можно начать установку каких-то условий её работы:

Пишем свой софт для посудомоечной машины ч. 2. Пишем костяк программы Электроника, Техника, Avr, Автоматика, Длиннопост, Посудомоечная машина, Самоделки

Собственно говоря, реализована она самым очевидным образом, т.к. я никогда не учился на программирование, сделал так, как пришло мне в голову. Программа разбивается на этапы (0-99), на каждом этапе производится какое-то действие (или несколько), после чего заводится на определенное время "будильник" (а как лечить будильники мы уже знаем). Этому же будильнику в память передаётся номер следующей стадии, на которую он должен будет перейти по завершении отсчета (если всё пройдёт нормально). Когда ему приходит 100 стадия, он сам себе запрещает прерывание и останавливается. Т.е., грубо говоря, в процессе работы он отнимает только незначительное количество тактов на проверку того, закончилось ли время. В остальное время программа возвращается в главный цикл, и всецело может следить за показаниями датчиков, аварийными показателями, обрабатывать нажатия кнопкок, менять по мере необходимости состояние портов и т.д. Что самое интересное, программа заработала у меня практически сразу, однако, я долго не мог понять, почему она пропускает одну стадию. Через час отладки и копания кода выяснил, что забыл там оператор break. Что ж, бывает..

В конечном итоге программа научилась:

- Выводить данные о состоянии и ошибках на LCD-модуль
- Принимать (но пока не обрабатывать) значения со внешних датчиков
- Выполнять заданную программу по циклу (пока ещё без поправки на показания датчиков)

Далее, в первую очередь, необходимо:

- Реализовать ветвление программы с поправкой на показания датчиков (для этого нужно определить режимы работы этих датчиков при помощи различных опытных испытаний, об этом в следующем посте)
- Доделать реализацию паузы программы с возможностью продолжения с остановленного места
- Подключить АЦП и реализовать снятие данных с термометра, для возможности безопасного включения ТЭНа
- Расписать одну более-менее качественную циклограмму, которая позволит запустить машинку и в тестовом виде что-то в ней помыть.

В комментариях меня просили:

- Реализовать лог машинки и запись последнего состояния её регистров в EEPROM, для продолжения мойки с остановленного места при отключении питания.

Ребят, возможно, это и будет сделано, но на текущий момент абсолютно не вижу в этом необходимости. Это желательно для машинок, которые будут проданы покупателям, но в моём случае гораздо быстрее просто включить слив на 1-2 минуты в начале программы, который удалит оставшуюся воду и начнёт процесс заново. Насчет того, что ТЭН включится насухую - это теоретически возможно, но если всё грамотно расписать, то это произойдет только в случае аварийного замыкания AVR или ULN'ки. Тут уже никак не отследишь.

Всем спасибо, с вами был Kekovsky. До новых встреч.