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

310 Микроконтроллеры AVR от азов программирования... В данном случае разработан еще один вариант, который представ ­ ляет собой нечто среднее между двумя предыдущими. В этом варианте будут использоваться и прерывание, и цикл ожидания. Новый алго ­ ритм реализует подпрограмма wait, которая занимает строки 141 — 157. Подпрограмма имеет три режима работы. Номер режима передается в подпрограмму при ее вызове. Для этого он записывается в регистр data. В режиме номер 1 под ­ программа формирует задержку 48 мс. В режиме номер 3 формируется задержка в 1 с. В режиме номер 2 задержка не формируется. Подпрограмма просто настраивает таймер точно так же, как в режиме номер 3, разре ­ шает прерывания и заканчивает свою работу. Контрольный интервал времени длительностью 1 с формируется уже вне подпрограммы wait (в основном тексте программы). Основной принцип формирования задержки строится на использо ­ вании флага задержки. В качестве флага задержки применяется регистр f lz. Описание этого регистра вы можете видеть в строке 7 программы. Перед началом цикла задержки в регистр f 1 z записывается ноль. Затем запускается таймер и разрешается работа одного из видов прерываний (прерывание по совпадению или прерывание по переполнению). В определенный момент времени будет вызвана процедура обработки прерывания. Эта процедура (строки 156,176) запишет в регистр флага (f lz) единицу. Единица в регистре flz послужит индикатором того факта, что заданный промежуток времени закончился. Для обнаружения момента окончания задержки используется цикл ожидания. В цикле ожидания программа постоянно проверяет содержимое реги ­ стра flz. Пока flz равно нулю, цикл продолжается. Заканчивается цикл в тот момент, когда flz будет равен единице. Для формирования разных значений длительности задержки исполь ­ зуются разные виды прерываний. Прерывание по совпадению использу ­ ется для формирования задержки в 48 мс. Для этого значение регистра совпадения выбрано таким образом, чтобы содержимое счетного реги ­ стра достигло этого значения именно через 48 мс. Прерывание по пере ­ полнению таймера используется для формирования интервала времени, равного одной секунде. Благо, что при коэффициенте пересчета предва ­ рительного делителя 1/64 и тактовой частоте в 4 МГц переполнение тай ­ мера произойдет именно через 1 с. Рассмотрим текст подпрограммы wait подробнее. Начинается под ­ программа с проверки значение регистра data (строка 141). Как уже говорилось ранее, при помощи этого регистра в подпрограмму переда ­ ется код номера режима. В данном случае нужно определить длитель ­ ность формируемой задержки.

RkJQdWJsaXNoZXIy MTExODQxMg==