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

2341

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
1.43 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]