2341
.pdfВрезультате получим число 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 application 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