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

Шаг 5. Переходим непосредственно к разработке устройств и программ 237 В строке 4 расположен цикл проверки. Это пустой цикл, в качестве условия которого выступает выражение TCNTl<780. Обратите внима ­ ние, что в этом выражении мы тоже используем имя TCNT1. То есть про ­ веряем значение всего шестнадцатиразрядного счетного регистра. Цикл проверки будет выполняться до тех пор, пока значение счетного регистра не будет превышать 780. Как только окажется, что это не так, цикл завер ­ шается, а с завершением цикла завершается и вся функция waitl. 5.8. Использование прерываний по таймеру Постановка задачи В предыдущем примере мы использовали таймер для формирования задержки, но не использовали его главного преимущества: способности вызывать прерывания. На практике подобным образом почти никогда не поступают. Чаще всего в подобных случаях применяют прерывания по таймеру. Это позволяет более точно формировать интервалы времени, но главное — позволяет разгрузить центральный процессор. Пока таймер формирует задержку, программа может выполнять любые другие действия. В результате программу бегущих огней можно легко совместить, например, с программой генерации звуков. Но не будем усложнять нашу задачу и сформулируем ее следующим образом: «Создать новую программу «бегущих огней» с использованием преры ­ ваний по таймеру.» Схема Схему оставим без изменений (см. рис. 5.11). Алгоритм Поставленная выше задача потребует полной переделки всей нашей программы. Ведь изменится режим работы таймера. В данном конкрет ­ ном случае удобнее всего использовать режим совпадения. Точнее, его подрежим «сброс при совпадении». В этом режиме таймер сам периоди ­ чески вырабатывает запросы на прерывание с заранее заданным перио ­ дом. Все функции управления «движением огней» выполняет процедура обработки прерывания. При каждом вызове прерывания процедура про ­ изводит сдвиг «огней» на один шаг в нужном направлении. Для того, чтобы обеспечить такую же скорость движения «огней», как в предыдущем примере, мы должны использовать те же самые коэф ­

RkJQdWJsaXNoZXIy MTExODQxMg==