Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микроконтроллеры в системах управления. Лабораторный практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
В результате получим число 0b0000 0100.
В языке Си все числа, которые НЕ равны "нулю" (-100, -5, 1, 500), являются логической истиной (True), и только 0 – ло­гической ложью (False).
Результат нашей операции – число, которое не равно нулю. Оно является логической истиной (True), а это значит, что те­стируемый разряд PORTD содержит единицу.
Вот как будет выглядеть данное выражение из двух логи­ческих операций на языке Си:
PORTD & (1 << PD2)
None
Такое выражение можно использовать в условных опера­торах (if) и операторах циклов (while), например:
while (PORTD & (1 << PD 2) ) { ... }
if (PORTD & (1 << PD2) ) { ... }
Для проверки состояния бита в регистре на ноль (0) ис­пользуют такую же конструкцию, только к результату выраже­ния следует применить логическую операцию инверсии "!" (логическое НЕ).
Логическая операция "!" переворачивает логическое зна­чение с истины (True) на ложь (False), и наоборот, в отличие от битовой операции инверсии, которая переворачивает биты.
Пример выражения на языке Си для проверки на ноль (0) разряда PD2 в регистре порта PORTD:
while ( !(PORTD & (1 << 2)) ) { ... }
if ( !(PORTD & (1 << PD2)) ) { ... }
Здесь выражение "PORTD & (1 << 2)" берется в круглые скобки, что позволяет сначала получить результат этого выра­жения, к которому потом и будет применен оператор логиче­ской инверсии.
Инверсия состояния бита в регистре
Для подобной операции подходит битовый оператор "^" (исключающее ИЛИ, XOR). Чтобы выполнить инверсию опре­деленного бита в регистре, нужно создать маску, в которой этот бит установлен, а потом применить к содержимому реги-
61
стра и полученной маске бинарный оператор "^", а потом запи­сать полученный результат в регистр.
Возьмем, к примеру, задачу погасить светодиод, который
подключен к разряду PD5 порта PORTD
Применим маску 1 << 5 к содержимому порта PORTD:
1011 1010 ^ 0010 0000
------------­1001 1010 в байте регистра, который раньше был 1, сейчас установ-
лен в 0 (1001 1010). Теперь следует записать число в регистр порта и задачу можно считать выполненной. Примеры исполь­зования такой конструкции на языке Си:
• PORTD = PORTD ^ (1<< 5);
• PORTD = PORTD ^ (1<< PD5);
• PORTD ^=(1<< PD5); Как и в предыдущих примерах по установке и сбросу би-
тов, последняя краткая конструкция является наиболее простой и понятной для использования.
Работа с масками особенно удобна, если знать имена битов
в регистрах управления периферией и пользоваться ими, не прибегая к сведениям о номере нужного разряда в этом реги­стре. Например, TIMSK = 1 << OCIE1A, либо TIMSK |= 1 << OCIE1A, или же TIMSK &= ~( 1 << OCIE1A).
Предварительное задание
1. Повторите сведения об интегрированной среде разра-
ботки AVR Studio по разделу «Среда разработки и отладки управляющих программ» данного пособия.
2. Найдите в Интернете или других источниках сведения о
программных средствах языка Си (например, в [15]), восстано-
62
вите свои знания по программированию, полученными в предыдущих курсах.
3. Проанализируйте текст программы, приведенной ниже,
соотнесите его содержание с алгоритмами, построенными в предыдущих работах.
/* * LR4.c - цикл ШД при прерывании по сравне- нию А таймера1 * * Created: 19.02.2019 22:01:03 * Author: migeras */
#include <avr/io.h> // |директивы компилятора – #include <avr/interrupt.h> // |подключ-е биб-к и #define Freq 4000000L // |определ-е пе­ременной - тактовая частота #define OCR1A_my Freq/1024 // порог сравне­ния
//описание функций void Port_ini(void); void Port_io(void); //------------------------------------­// Глобальные переменные //------------------------------------­uint8_t wrk = 0x02; //source value for step motor = shift register //-------------------------------------
// Вектор прерывания по сравнению кодов в таймере 1
//------------------------------------­ISR (TIMER1_COMPA_vect) { TCCR1B &= ~((1<<1)|(1<<0)); //останов таймера = скорость 0
63
Port_io (); TCCR1B |= (1<<3)|(1<<1)|(1<<0); // запуск таймера - эквив. (1<<CTC1)|(1<<CS11)|(1<<CS10)
// сброс при сравнении + скорость 3, т.е. СК/64 } //------------------------------------­// Функции программы //------------------------------------­void Port_ini() { DDRA |= (1<<1)|(1<<2)|(1<<3)|(1<<4); //установка разрядов на вывод // DDRA &=~ (1<6); //освобождение пина для ввода аналог. сигнала } //------------------------------------­void Port_io() { wrk <<= 1; PORTA = wrk; if (wrk == 0x20) wrk = 0x02; } //------------------------------------­void Timer_ini() { OCR1A = OCR1A_my; //пока это константа TCCR1A = 0; //регистр управления А - не
используем TCCR1B |= (1<<3)|(1<<1)|(1<<0); //| эквив.
(1<<CTC1)|(1<<CS11)|(1<<CS10) -
//| сброс при сравнении + скорость 3, т.е. СК/64
64
TIFR = 0; //регистр флагов - инициал-я TIMSK = 1<< OCIE1A; //регистр маски - резрещ-е прерыв. при сравнении А
sei(); // ... }
int main(void) { Port_ini(); Timer_ini();
while(1) { //TODO:: Please write your applica­tion code } }
4. Сравните программу LR3_2 из лабораторной работы
№ 3 (бегущая единица по разрядам порта B) с программой, приведенной выше, определите их соответствия.
5. Изучите рабочее задание и подготовьтесь к его выпол-
нению.
Рабочее задание
1. Соберите схему в соответствии с рис. 5.
2. Запустите AVR Studio, создайте в нем новый проект под
именем LR4_1 в своем каталоге в папке Users (Напоминание: имя каталога и весь путь к нему НЕ должны содержать знаков КИРИЛЛИЦЫ и пробелов!), перенесите в него текст програм­мы приведенный выше.
3. Выберите в главном меню программы Debug → Select
Platform and Device…, из появившегося списка отметьте JTAG ICE (Debug Platform) и ATmega 16 (Device).
65
4. Теперь нажмите клавишу F7 или выберите пункт Build
в меню Build, в результате чего начнется трансляция програм­мы. Затем выберите пункт меню Debug → Start Debugging или соответствующую пиктограмму для запуска отладки. В резуль­тате программа из вашего проекта загрузится в память про­грамм МК ATMega 16 и вы получите доступ к ресурсам этого МК для пошаговой отладки.
Напоминание: при отладке программы следует умень-
шать интервалы таймеров и коэффициент предделителя отно­сительно расчетных, если они слишком велики, поскольку в процессе отладки в AVR Studio программа выполняется в тысячи раз медленнее, чем внутри МК и вы не дождетесь срабатывания таймера (см. работу № 3).
5. Откройте окна Register и I/O View/PortA. Перемещаясь
по листингу с помощью клавиш F11, F10, отследите выполне­ние команд модуля *Основная программа*. Для анализа моду­ля *Обработчик прерывания по таймеру* установите курсор на его начало и дайте команду Run to cursor (Ctrl+F10). Опробуйте управление ШД, если есть ошибки, измените программу, зано­во постройте проект, вновь запустите Start Debugging и снова проверьте работу программы.
6. Проделайте процедуры, перечисленные в пп. 8-10 раз-
дела «Рабочее задание» предыдущей работы.
7. Составьте отчет по перечисленным выше пунктам,
включая скриншоты программ и экранов эмуляции. Выделите в пунктах отчета полученные навыки составления программ и навыки пользования интегрированной средой разработки AVR Studio, запишите отчет в файл под именем LR4 в той же папке, что и программные модули.
8. Покажите результаты преподавателю, ответьте на его
вопросы.
66
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Евстифеев А.В. Микроконтроллеры AVR семейства
Mega. Руководство пользователя. – М.: Издательский дом «Додэка-ХХI», 2007.
2. ATmega16, ATmega16V, ATmega16U, ATmega16L. 8-раз-
рядный микроконтроллер с внутрисхемно программируе­мой флэш-памятью емкостью 16 кбайт. – Режим доступа:
http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/atmega16.h tm
3. Установка AVR Studio 5.1 – Режим доступа: http://radio-
hobby.org/modules/video/installing-avr-studio-5-1
4. Гребнев В.В. Микроконтроллеры семейства AVR фирмы
«ATMEL». / В.В. Гребнев. М.: ИП РадиоСофт, 2002.
5. Голубцов М.С. Микроконтроллеры AVR: от простого
к сложному. / М.С. Голубцов. Изд. 2-е, испр. и доп. М.: СОЛОН-Пресс, 2005.
6. Баранов В.Н. Применение микроконтроллеров AVR: схе-
мы, алгоритмы, программы. / В.Н. Баранов. М.: Издатель­ский дом «Додэка-ХХI», 2004.
7. Трамперт В. Измерение, управление и регулирование с по-
мощью AVR-микроконтроллеров: пер. с нем. / В. Трамперт. Киев: «МК-Пресс», 2006.
8. Микропроцессорные системы: учеб. пособие для вузов /
под общ. ред. Д.В. Пузанкова. СПб.: Политехника, 2002
9. JTAG. – Режим доступа: http://ru.wikipedia.org/wiki/JTAG
10. Milan Kostomlatsky. AVR miniICE. – Режим доступа:
http://pol-sem.narod.ru/AVRminiICE/jtag.htm
11. MAX232 – Режим доступа:
http://ru.wikipedia.org/wiki/Max232
12. Чертежи схем: учеб. пособие / М.И. Герасимов,
Д.А. Ефремов, Е.К. Лахина, C.C. Ревнев, В.Н. Семыкин, И.В. Ткачев. Воронеж: ВГТУ, 2007.
13. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, программ,
данных и систем. Обозначения условные и правила выпол-
67
нения. [Текст]. – Введ. 01.01.1992 – М.: ИПК Издательство стандартов, 2001.
14. Рюмик, С.М. 1000 и одна микроконтроллерная схема.
[Текст] / С.М. Рюмик. – М.: Додэка-ХХI, 2010. Вып. 1.
15. Язык программирования С. – Режим доступа:
http://easyelectronics.ru/file/yazyk-programmirovaniya-s­spravochnik/129
16. Программирование микроконтроллеров на языке СИ в сре-
де разработки «AVRStudio 5.1» – Режим доступа:
http://radio-hobby.org/modules/instruction/winavr-i-avr-studio
17. WinAVR. Бесплатная IDE для микроконтроллеров AVR на
основе Си-компилятора GCC. – Режим доступа:
http://www.gaw.ru/html.cgi/txt/soft/avr/WinAVR.htm
18. JTAG на службе специалиста по безопасности. – Режим
доступа: https://www.securitylab.ru/analytics/485268.php
19. Ключевое слово «volatile» C/C++.
https://habr.com/ru/sandbox/114114/
68
Учебное издание
Болдырев Игорь Александрович
Герасимов Михаил Инович
Кожин Алексей Сергеевич
ИССЛЕДОВАНИЕ УЗЛОВ СИСТЕМ
УПРАВЛЕНИЯ
Лабораторный практикум
В авторской редакции
Компьютерный набор М.И. Герасимова
Редактор Кулакова Н.В.
Подписано к изданию 01.10.2019.
Уч.Объем данных 1,3 Мб
ФГБОУ ВО «Воронежский государственный
технический университет»
394026 Воронеж, Московский проспект, 14
69
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]