Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 15. Программирование UART и обмен данными с персональным компьютером 399 байт, а анализ его для выявления команды и собственно отправку строки произво дим не спеша в основном цикле. Пример использования подобного подхода - про грамма тестирования управления серводвигателем, рассмотренная в разд. « Управ ление серводвигателем» главы 16, только там принятый байт анализируется не в основном цикле, а в других прерываниях. К этому случаю относится замечание по поводу возможной порчи регистра temp в других прерываниях, потому в примере он для наглядности заменен на регистр command, который после распознавания команды мы больше не используем. Но не забывайте, что в этом случае вы все равно посланный байт не получите, если в это время обрабатывается другое постороннее прерывание, до тех пор, пока его обра ботка не закончится . И может быть надежнее зациклить контроллер в ожидании этого позарез необходимого байта, чем усложнять логику программы лишними прерываниями. По приведенным здесь соображениям в программах этой книги вы использования прерываний UART почти не встретите. Самая громоздкая здесь программа по передаче через UART - установка часов DS 1 3 07, когда туда-сюда передаются по 7-8 байтов (она рассмотрена далее) . И даже если эти процедуры использовать в другой программе как составную часть, то все равно обращаться к ним придется далеко не каждый месяц. И при надлежащей организации такого обращения основ ная функциональность программы не будет нарушаться . Рассмотрим подробнее фильтрацию произвольного значения в момент запуска на примере упомянутой программы тестирования управления серводвигателем (см. разд. « Управление серводвигателем» главы 16). Там используется прерывание RX на прием значения угла поворота. В прерывании просто принимается один байт: In Rx : ; прием окончен in degree_b , UDR ; принимаем байт угла поворота reti Предположим, что мы хотим установить какое-то отличное от нуля значение угла по умолчанию, загрузив его заранее в переменную degree_ь. В существующей про грамме ничего не выйдет, т. к. при включении контроллера (или при подключении отключении адаптера UART) через UART будет принят несанкционированный байт с нулевым значением, которое заменит в переменной degree_ь любое ранее существовавшее. Потому следует модифицировать программу так, чтобы заменять значение угла только в случае, если перед этим была легитимная команда. на такую замену. При приеме через прерывание RX это можно организовать, например, так (значение команды не должно пересекаться с множеством зн,ачений углов, иначе для хранения команды нужно отвести отдельный регистр) : In Rx : ; прием окончен reti cpi degree_b , $EE ; если ранее бьта команда со значением $ЕЕ brne in coппnand in degree_b , UDR ; то принимаем новый байт угла по в' орота
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==