Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 1 1 . Аналоговый компаратор и АЦП clr count64 ; очистили счетчик чтений clr countCyk ; очистили счетчик прерЫБаний clr AregL ; очистили младший резуль тата clr AregH ; очистили старший резуль тата sei ; разрешили прерЫБания Gcykle : rjmp Gcykle 315 Вся кажущаяся сложность этой программы обусловлена осреднением и наличием процедуры вывода результата через UART для контроля. К собственно работе с АЦП относится лишь десяток строк программы. Однако без усреднения результа­ тов применять АЦП для измерений чаще всего бессмысленно - необязательно брать для этого так много значений, но пяток-десяток с последующим вычислением среднего лучше накопить. Причем в Arduino это едва ли не более актуально, чем в ассемблерном исполнении, - там мы не властны над схемотехническими мето­ дами подавления помех. Исключением могут являться з�ачи вроде описанного ранее регулятора освещения, аналогичного по построению регулятора температуры и других схем регулирования - в таких решениях всегда должен присутствовать гистерезис, который сам по себе является наилучшим методом подавления дре­ безга. Наблюдать за результатом работы программы можно, если подключить внешний монитор последовательного порта. 1 О-разрядное число передается каждые три се­ кунды побайтно, причем сначала младший, потом старший байт (последний может иметь значения только от о до з ). Монитор порта Arduino в этом случае не подой­ дет, т. к. он воспримет принятые значения, как символы, а символов со значением е м м ен ее 32 не существует (кроме служебных) . В Arduino это преодолевается наличи­ форматного вывода в функции print, нет особых проблем наладить символьный вывод и с помощью ассемблера, если это зачем-то потребуется . Все эти вопросы, в том числе и подбор удобного для наших целей монитора порта, обсуждаются в главе 15. Программа не очень нагружает прерывание TimerO, даже если оно параллельно ис­ пользуется для динамической индикации или еще для каких-нибудь целей. Данные АЦП читаются лишь каждое 1 2-е прерывание и добавляют к его длительности с десяток тактов . Дольше длится расчет среднего (около 40 тактов), но он происхо­ дит еще намного реже (каждые три секунды) и все равно не вызовет заметных глазу нарушений в индикации, т. к. 50 тактов - это при 4 МГц всего-навсего 1 2,5 микро­ секунд. Даже процедуры посылки значений через UART, которые занимают при­ мерно миллисекунду каждая, вряд ли скажутся на динамической индикации, если зачем-то их нужно будет выполнять параллельно. Причем на посылку через UART можно затрачивать меньше процессорного времени, если привлечь прерывание (см. главу 15), но мы сейчас не об этом. Все равно хочется для таких случаев до­ полнительно разгрузить таймер, и это можно сделать, если работать через прерыва­ ние готовности АЦП. Я не буду приводить тут всю программу (она.- по листингу 1 1 . 5 и по листин­ гам 1 1 .6-1 1 . 8 - доступна целиком в архиве по адресу, указанному во введении:

RkJQdWJsaXNoZXIy MTExODQxMg==