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

Шаг 5. Переходим непосредственно к разработке устройств и программ 235 свелась к созданию новой функции задержки. Новая функция понадо ­ билась нам потому, что использованная ранее библиотечная функция delay_ms в данном случае нам не подходит. Для формирования задержки программа использует вложенные циклы. Готовой функции, удовлетворяющей нашим новым условиям, ни в одной из стандартных библиотек не существует. Поэтому нам при ­ шлось создать ее самостоятельно. Текст новой функции задержки при ­ водится в строках 2 — 4. Наша новая функция задержки получила имя waitl. Обратите внимание, что описание функции waitl расположено в нашей программе раньше, чем описание функции main. Такой порядок отнюдь не случаен. Правило. В языке СИ действует правило: любая функция должна быть прежде описана и лишь затем в первый раз применена. Вывод. Так как функция main использует функцию wai1 1 в качестве про ­ цедуры задержки, то описание waitl должно располагаться перед описанием main. В связи с вводом новой функции нам пришлось немного доработать и основную программу. Во-первых, в модуль инициализации добав ­ лены команды инициализации таймера (строки 11,12). Причем команда в строке 11 является избыточной. Нулевое значение в регистр TCCR1A можно и не записывать, так как там и так ноль по умолчанию. Листинг 5.12 Project : Ргодб Пример 6 Бегущие огни (задержка с использованием таймера без использования прерываний) Chip type : ATtiny2313 Clock frequency : 4,000000 MHz Data Stack size : 32 1 #include <tiny2313.h> 2 void waitl (void) // ----------------------------- Функция задержки 3 { TCNT1=0, 4 while (tCNT1<780) {}; 5 void main(void) // --------------------------------- Главная функция программы 6 unsigned char rab; // Вводим переменную rab 7 PORTB=OxFF; // Инициализация порта В 8 DDRB=OxFF; 9 P0RTD=0x7F; // Инициализация порта D 10 DDRD=0x00, 11 TCCR1A=0x00; // Инициализация таймера/счетчика 1

RkJQdWJsaXNoZXIy MTExODQxMg==