Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Урок 1. Управление портами микроконтроллера (МК) Аtmega16.
Цель урока: Научится управлять портами микроконтроллера (МК). 1) Перед тем, как писать код, нужно подключить необходимые для программирования библиотеки (или убедиться, что они подключены автоматически). В данном уроке следует убедиться в подключении библиотеки < mega16.h> (позиция 1, рис.6), которая содержит глобальные переменные, имена и адреса функций, необходимые для управления регистрами МК Atmega16. #include < mega16.h>
2) Необходимо сделать порт А выходным, т.е. присвоить 8-ми разрядам порта А значения «1»: DDRA = 0xFF; // либо DDRA = 0b11111111;
Рис.6 Код программы микроконтроллера ATmega16.
3) Необходимо настроить временную задержку в соответствии, с которой будет изменяться сигнал на выходе порта А. На рис. 6, поз.4 записана функция инициализации МК initialization (void), в которой установлен коэффициент деления частоты (1024) для кварца. Для этого используется регистр управления таймером/счетчиком: TCCR0 = 0x03 (либо TCCR0 = 0b00000011 либо TCCR0 = (1< < CS00) | (1< < CS01), тактирующий 8-ми разрядный таймер/счетчик TCNT0, который в свою очередь, через каждые 256 тактов (28) обнуляется и ставит флаг прерывания (переполнения, TOV0, 0-ой разряд регистра TIFR) в регистр TIFR, т.е. «1» записывается в бит_0. Частота работы таймера TCNT0 рассчитывается как: 1000000/64/1024 = 15, 26 Гц, что соответствует временной задержке 65, 5 мс. TCCR0 = 0x03; //либо TCCR0 = 0b00000011; либо TCCR0 = (1< < SC00) | (1< < SC01);Здесь предделение тактовой частоты 1МГц на 64 задаётся битами 0 и 1 регистра TCCR0. Дополнительная задержка частоты на 1024 такта происходит за счёт переполнения таймер/счетчика TCNT0. После его переполнения, флаг переполнения TOV0 устанавливается (" 1") в 0-ой разряд регистра TIFR.
4) Функциюинициализации МК initialization (void) можно не создавать, а её тело разместить в теле основной функции main. Любая программа, написанная на Си, начинает работать с функции main (см. рис.6, поз 14). Эта функция содержит, собственно, код программы. Часто в коде программы используется цикл while (см. рис.6, поз 18 ). Условие while(1) означает: пока «1» (равнозначно true), цикл будет повторяться снова и снова, т.е. имеем «вечный» цикл повторений. Следует знать, что любая цифра, кроме «0», компилятором воспринимается как true. Сигнал на выходах порта А должен изменяться в цикле. Для этого в цикл необходимо поместить команду(см. рис.6, поз 20): PORTA++; // увеличение выходного разряда порта А на единицу// PORTA.7=! PORTA.7; либо изменяется один выход порта А// delay_ms(500); задержку можно делать с помощью функции delay_ms, которая в библиотеке < delay.h>
5) Необходимо контролировать появление флага переполнения TOV0 в 0-ом разряде регистра TIFR. Это достигается следующим условием: while(! (TIFR& 0x01));Запись означает: пока таймер/счетчик TCNT0 не переполнен и флаг TOV0 регистра TIFR отсутствует (равен «0»), программа ничего не делает. Обратите внимание, между while и «;» нет операторов. Дословно запись (см. рис.6, поз 22) означает: пока true (что равнозначно: пока не «0» в нулевом разряде регистра TIFR) программа ничего не делает, а ждёт появление «1». При появлении флага переполнения TOV0 в 0-ом разряде регистра TIFR условие while не выполняется и программа переходит к выполнению следующего оператора (см. рис.6, поз 26).
6) Флаг переполнения TOV0 сбрасывается аппаратно при выполнении соответствующего вектора прерывания, но в данной программе нет обработчика прерывания, поэтому, чтобы продолжить работу таймера/счетчика TCNT0 нужно вручную очистить бит записью в 0-ой разряд регистра TIFR логической единицы. Это достигается следующим действием (см. рис.6, поз 26): TIFR = (1< < TOV0); // либо TIFR = (TIFR | 0x01); либо TIFR | = 0x01;Таким образом, в цикле изменяются выходы порта А. Полный текст программ на рис. 6.
Чтобы проверить работает ли код указанный на рис.6, нам необходимо собрать схему в программе Proteus (рис.7).
Рис.7 - Схема разработанная в Proteus.
Приложение к уроку 1
|