Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Урок 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

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2026 год. (0.217 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал