Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
398 Часть 111. Практическое программирование микроконтроллеров АVR чением. Команда служит для распознавания того, что следующим придет байт, с которым нужно производить конкретную операцию. Теперь о том, когда и какие прерывания UART применять целесообразно. Вариан тов постановки задачи тут тьма-тьмущая, все случаи, когда именно вот такой вари ант выгоден и необходим, мы перебрать все равно не в состоянии, потому опишем только пару-тройку самых распространенных. Канонический вариант, при котором применяются прерывания и на прием, и на передачу, максимально разгружает про грамму, основной цикл при этом можно оставить пустым (см. файл UART_test_ RX_TX_int.asm в архиве по адресу, указанному во введении) . Здесь мы ждем от ком пьютера байта конкретной команды - в нашем случае символа Q (question), что равносильно десятичному числу 8 1 (разыщите в Интернете таблицу символов ACSII, чтобы узнать соответствие символов и их кодов) . Если такая команда при шла, мы выдаем наружу строку «Hello all ! » («Привет всем ! »), которую заранее за гружаем в SRAM. На прием задействовано прерывание RX Complete («прием окон чен»), а на передачу- прерывание ТХ UDR Empty («регистр данных передатчика пуст») . Этот пример описывает ситуацию, когда байт команды может прийти «сверху» в любое время, и мы должны тут же отослать обратно целую строку, причем не затормаживая остальные функции программы (типичный случай - значения теку щего времени и даты из часов в то время, когда программа продолжает их перио дическое чтение и вывод на индикацию) . Если два байта подряд отправятся без за держки в любом случае, то третий и последующий байты при скорости 9600 будут передаваться уже с задержкой примерно в 1 миллисекунду перед отсылкой каж дого, и не тормозить программу можно только с использованием прерывания пере дачи. В реальности могут быть промежуточные случаи - так, в длинной и громоздкой программе часов с красивым форматированным выводом на строчный дисплей (она рассмотрена в главе 16) основной цикл у нас, тем не менее, · остался совершенно пустым. И мы вполне можем вставить в него простую процедуру in_com из первого примера для приема внешних команд по ходу дела - т. к. больше байта за один раз мы не ждем, то и потерять ничего не рискуем. А отправлять значения часов в про грамму можно уже с помощью прерывания освобождения регистра данных, как во втором примере. Эта ситуация моделируется в файле UART_test_ТX_int.asm из архива, расположенного по адресу, указанному во введении. И еще два случая, когда целесообразно применять прерывание только на прием. Первый случай - обратный предыдущему примеру (файл UART_test_RX_int_v1 .asm из архива, расположенного по адресу, указанному во введении) . Тут команда прини мается своевременно и без задержек, а время отправки нас не лимитирует (напри мер, потому что происходит крайне редко). Основной цикл мы тут не трогаем, а все выполняем в прерывании приема. И последний случай представляет файл UART_test_RX_int_v2.asm из архива, располо женного по адресу, указанному во введении. Он порадует сторонников концепции, что в прерываниях нужно делать минимум необходимого, а потом как можно быст рее сбежать в основной цикл. Здесь мы по прерыванию приема только принимаем
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==