В этом посте я постараюсь описать структуру программы работы электронного блока. Программа работы электронного блока построена по принципу обработки различных событий и флагов. Весь код программы состоит из обработчиков различных событий. Индикаторами тех или иных событий являются флаги и прерывания от периферийных модулей. Основной цикл программы на блок-схеме обозначен как основной цикл ожидания событий.
После включения питания (или после сброса по сторожевому таймеру) происходит инициализация всех портов микроконтроллера и периферийного модуля для связи с ПК. После этого делается запрос в ПК для проверки наличия подключенного программатора. Если в установленное время ответа не последовало, значит программатор ключа шифрования системы не подключен и продолжается инициализация обработчиков прерываний, системного таймера, происходит считывание состояния DIP-переключателя (с помощью него можно управлять некоторыми дополнительными функциями системы), после чего управление передается в основной цикл ожидания событий. Если программатор подключен, то программа переходит в режим записи нового ключа шифрования. Новый ключ шифрования можно только записать, прочитать значение старого ключа шифрования невозможно.
Обработчик прерывания приема команд от ПК занимается поддержкой протокола обмена между электронным блоком и ПК, контролирует длину принятой команды и значение контрольной суммы. После успешного приема очередной команды выставляет соответствующий флаг, который будет обработан в основном цикле. Если при приеме команды возникли ошибки переполнения входного буфера или ошибка контрольной суммы, то формируется сообщение об ошибке и инициируется его передача в ПК.
Обработчик прерывания передачи данных в ПК организует передачу данных из передающего буфера в ПК.
Обработчик прерывания от системного таймера реализует работу системного таймера. На его плечах лежит управление светодиодной индикацией, организация таймаута ожидания очередного байта по СОМ-порту, поддержка таймера режима программирования, подсчет времени до автоматического закрытия двери (если такая функция включена), управление модулем контроля за напряжением аккумулятора (сначала идет накопление мгновенных отсчетов значений напряжения на аккумуляторе, потом усреднение и вызов модуля контроля).
Модуль контроля за напряжением аккумулятора. На вход этого модуля поступает текущее усредненное значение напряжения на аккумуляторе. Значение напряжения условно разделено на несколько градаций: полностью заряжен, заряжен на 50%, заряжен на 25%, полностью разряжен. В зависимости от напряжения на аккумуляторе меняется индикация и отключаются/включаются некоторые функции замка. Передача информации о заряде аккумулятора другим модулям программы осуществляется с помощью флагов.
Обработчик прерывания от кнопки входа в режим программирования. Этот обработчик вызывается при нажатии кнопки входа в режим программирования. Вход в режим программирования возможен только, если аккумулятор разряжен не полностью. В режиме программирования постоянно горит красный светодиод, а зеленый светодиод перестает непрерывно мигать (подробнее об индикации в различных режимах работы будет описано в последующих постах). Результатом работы обработчика является установка флага режима программирования и таймера автоматического выхода из этого режима.
Обработчик прерывания алгоритма приема очередной посылки от брелка. Этот обработчик пытается из всего шума, который поступает с выхода приемника выделить команду от брелка. При успешном приеме такой команды выставляется соответствующий флаг, который обрабатывается в основном цикле.
Блок исполнения команд управления от ПК выполняет допустимые и разрешенные к исполнению команды, переданные электронному блоку по СОМ-порту. В списке допустимых команд есть команды конфигурирования, получения информации и управления.
Алгоритм работы в режиме программирования брелков реализует поведение электронного блока в процессе программирования новых брелков. Если в в режиме программирования не было запрограммировано ни одного брелка, то информация о ранее запрограммированных брелках не теряется. Если был запрограммирован хотя бы один брелок, то информация о всех ранее запрограммированных брелках теряется. Это сделано из соображений безопасности (что бы нельзя было скрытно запрограммировать в систему еще один или несколько брелков).
Алгоритм обработки команд от брелка описывает этапы проверок принятой посылки перед и ее исполнением или не исполнением. Кроме этого, при выполнении команд на открытие или закрытие замка, происходит считывание состояния DIP-переключателя.
Все использованные алгоритмы работы я последовательно буду описывать в следующих постах.