Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 317 Теперь разберемся, зачем после записи кода вызывается процедура открывания замка. Это сделано для удобства. После ввода кодовой ком ­ бинации необходимо выдержать паузу в 1 с для того, чтобы введенная комбинация записалась в EEPROM. Для того, чтобы точно знать, когда заканчивается эта пауза, используется срабатывание замка. Как только щелкнет соленоид, можно считать, что ввод закончен. Процедура проверки кода Эта процедура занимает строки 102 — 114. Процедура проверки во мно ­ гом похожа на процедуру записи. Для чтения байта из EEPROM использу ­ ется подпрограмма eerd. Перед вызовом этой подпрограммы адрес ячейки, откуда будет прочитана информация, записывается в регистр addre. Прочитанное из EEPROM значение возвращается в регистре data. В строках 102 — 105 происходит считывание длины последователь ­ ности из EEPROM и сравнение ее с длиной новой последовательности. Сначала в строке 102 адрес ячейки, где хранится длина кода, записыва ­ ется в addre. Затем вызывается подпрограмма eerd (строка 103). В строке 104 сравнивается полученное из EEPROM значение (регистр data) и новое значение длины кода (регистр count). В случае неравен ­ ства этих двух величин оператор условного перехода в строке 105 пере ­ дает управление в начало программы. В этом случае дальнейшая про ­ верка больше не производится. Дверь остается закрытой. Если длина кода оказалась правильной, начинается цикл побайтной проверки кодов. Сначала в регистр addre записывается начальный адрес буфера в EEPROM (строка 106). В регистровую napy.Z записывается начальный адрес буфера в ОЗУ (строки 107, 108). Сам цикл сравнения занимает строки 109 — 114. В строке 109 вызывается подпрограмма, которая читает очередной байт из EEPROM. Байт помещается в регистр data. В строке 110 чита ­ ется байт из ОЗУ. Этот байт помещается в регистр temp. В строке 111 эти два байта сравниваются. Если байты не равны, оператор условного пере ­ хода в строке 112 прерывает процесс сравнения и передает управление на начало программы. То есть дверь и в этом случае остается закрытой. Если байты равны, выполняется уменьшение содержимого счетчика count (строка 113). Если после уменьшения содержимое count еще не достигло нуля, управление передается по метке ml 0 (оператор brne в строке 114), и цикл сравнения продолжается. Когда содержимое count окажется равным нулю, процесс сравнения заканчивается. Это означает, что все байты обеих версий ключевой комбинации оказались равны. Поэтому программа плавно переходит к процедуре открывания замка (к строке 115).

RkJQdWJsaXNoZXIy MTExODQxMg==