Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
236 Микроконтроллеры AVR от азов программирования... 12 TCCR1B=0x05; 13 ACSR=0x80, // Инициализация аналогового компаратора 14 while (1) :а состояния переключателя // Сдвиг вправо // Запись начального значения 15 if (PIND.0==1) //Провер 16 rab = 0Ы0000000; 17 while (rab ’ =0) 18 PORTB=rab"OxFF 19 rab = rab » 1; 20 waitl (), 21 else > г 22 rab = ObOOOOOOOl ; 23 while (rab! =0) 24 PORTB=rab~OxFF 25 rab = rab « 1: 26 waitl (), // Запись в порт с инверсией // Сдвиг разрядов // Задержка в 200 мсек // Сдвиг влево // Запись начального значения // Запись в порт с инверсией // Сдвиг разрядов // Задержка в 200 мсек Второе изменение внесено в основной цикл программы. Оно оче видно. Вместо функции задержки delay_ms мы применим нашу новую функцию waitl (см. строки 20 и 26). Функция waitl не имеет параме тров, так как предназначена для формирования фиксированного значе ния задержки. С этим связана и последняя доработка. Так как библиотечная функ ция задержки нам больше не нужна, мы можем исключить из программы команду, присоединяющую библиотеку delay . Һ. Других Доработок основная программа не потребовала. Теперь разберем подробнее саму функцию waitl. Она формирует задержку с использованием таймера/счетчика. Подобный алгоритм мы уже реализовывали в подпрограмме waitl на Ассемблере (см. листинг 5.11). Однако язык СИ значительно упрощает задачу. Во-первых, нам не обязательно работать с отдельными байтами. Теперь мы без труда можем оперировать шестнадцатиразрядными числами. В результате функ ция задержки предельно упрощается. Она занимает всего три строки (строки 2 — 4). Первая строка — это заголовок описания функции. Из него видно, что функция waitl не использует параметров и не возвра щает никаких величин. Тело функции составляют строки 3 и 4. В строке 3 счетному регистру таймера Т1 присваивается нулевое значение. Значение присваивается сразу всему шестнадцатиразрядному регистру TCNT1. И неважно, что на самом деле микроконтроллер не имеет прямого доступа к этому регистру. После трансляции будет создана программа в машинных кодах, которая запишет сначала старшую часть (TCNT1H), а затем младшую часть (TCNT1L) регистра, строго соблюдая правила работы с регистрами, имеющими двойную буферизацию.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==