Е.А. Вахтина, А.В. Вострухин
ОПЫТ ИЗУЧЕНИЯ МИКРОКОНТРОЛЛЕРОВ СРЕДСТВАМИ АССЕМБЛЕРА В ИНЖЕНЕРНОМ ОБРАЗОВАНИИ
Ключевые слова: встраиваемые системы управления, кибер-физический подход, аппаратно-программная система поддержки учебных действий, Arduino, интегрированная среда разработки, алгоритм, программа, когнитивные принципы.
Аннотация: В статье раскрываются дидактические возможности аппаратно-программной (инструментальной) системы поддержки учебных действий студентов технических факультетов при изучении микроконтроллеров - платформы проектирования встраиваемых систем управления. Приведен классический пример программирования генератора прямоугольных импульсов на контроллере Arduino в интегрированной среде разработки AVR Studio на языке Ассемблера. Проанализированы возникающие в процессе выполнения задания связи между теоретическими знаниями и практическими навыками, дающие синергетический эффект развитию практико-ориентированной когнитивной технологии в инженерном образовании.
Совершенствование вычислительных систем реального времени (встраиваемых систем управления Embedded Systems) является приоритетным направлением развития мировой науки, техники и технологий. Для того чтобы выпускники инженерных факультетов смогли быть причастными к этой тенденции на конкретных производствах, им необходимо в процессе обучения в вузе овладеть программированием систем реального времени. Специалисты выделяет 8 проектных платформ встраиваемых систем, которые «определяют практически весь маршрут проектирования и разработки» [1]. Для электронных изделий малой и средней серийности проектной платформой служат микроконтроллеры (MCU). Микроконтроллеры - это миниатюрные компьютеры, реализующие основные функции классических вычислительных систем: сбор, обработку, хранение и передачу данных, а также формирование управляющих сигналов. Область применения микроконтроллеров шире, чем микропроцессоров. Они используются в системах управления, начиная от бытовой техники и заканчивая летательными аппаратами. Микроконтроллер содержит на одном полупроводниковом кристалле почти все устройства цифровой электроники, начиная от логических элементов и заканчивая процессором.
Актуальность совершенствования методических и инструментальных средств поддержки когнитивной деятельности студентов (Learning Tools) при освоении микроконтроллеров вызвана, во-первых, «тенденцией сближения интеллектуального уровня образовательного процесса в профессиональном образовании с интеллектуальным уровнем работ в науке и современном производстве» [2]; во-вторых, необходимостью дидактико-инструментальной поддержки:
а) учебных действий студентов при изучении микроконтроллеров на уровне междисциплинарной интеграции (электроника, микропроцессорная техника, информатика, вычислительная техника, автоматические системы управления технологическими процессами и др.);
б) развития системного и алгоритмического мышления, творческого подхода в решении научно-исследовательских и прикладных задач при выполнении обучающимися бакалаврских и магистерских работ, а также конкурсных работ в области встраиваемых систем управления.
86
e^sSass профессиональное осрпзовпние: проалемы, нпинп, прпнтинп
Теоретической базой создания инструментальной системы для изучения микроконтроллеров является кибер-физический подход, обозначающий «взгляд на системы с позиций интегрирования вычислений и физических процессов» [1]. В основе такого подхода лежит «моделирование системы целиком и технологии совместного проектирования аппаратно-программного обеспечения, сетей и физических процессов» [3].
Мы предлагаем аппаратно-программную реализацию инструментальной системы, предназначенной для изучения микроконтроллеров на базе аппаратной платформы Arduino с использованием интегрированной среды разработки (integrated development environment, IDE) AVR Studio и ассемблера в качестве языка программирования.
Почему именно ассемблер? «Существует мнение, что к изучению микроконтроллеров можно подходить с позиций рассмотрения «черного ящика». Я категорически против такой модели! Можно успешно заниматься программированием компьютерной техники и не знать ни одной команды процессора, но нельзя вести разработку на основе восьмиразрядных микроконтроллеров досконально, не зная их внутреннюю структуру. Именно поэтому в самом начале необходимо создать как минимум пару-тройку проектов на ассемблере и только потом уже переходить на "Си"» [4]. На основе обобщения собственного опыта [5, 6] и опыта специалистов по программированию микроконтроллеров [1, 4, 7, 8] мы выделяем такие дидактические возможности ассемблера (по сравнению с языками высокого уровня Си и Си++):
- доступность всех элементов архитектуры микроконтроллера, что позволяет студенту, разрабатывающему программу, реализовывать наиболее эффективные алгоритмы;
- возможность генерации машинных команд и управление этим процессом со стороны разработчика;
- наглядность работы микроконтроллера, что повышает уровень понимания процессов происходящих в системе, а, следовательно, и эффективность обучения.
Таким образом, язык ассемблера предпочтителен на начальной стадии изучения микроконтроллеров.
Из предлагаемого на рынке ряда стартовых наборов для изучения микроконтроллеров мы выбрали платформу Arduino в качестве прототипа аппаратной части инструментальной системы. Ее основные достоинства по сравнению с другими стартовыми наборами кратко можно сформулировать так: простота, многофункциональность и низкая стоимость. Платформа Arduino предназначена для реализации алгоритмов реального времени, содержит обширный ассортимент модульных прошивок с открытой лицензией. Она динамически развивается, имеет собственную среду разработки и поддерживается такими системами, как Matlab, AVRStudio и Windows 10. Arduino -это самое доступное бюджетное решение, реализованное на популярных микроконтроллерах семейства AVR, которые по соотношению «цена -производительность - энергопотребление» занимают лидирующие позиции и признаны индустриальным стандартом [9].
пеппгогичесннй журнпл спшкортосгпнп м i(ao). aoi9 §®gs§jas
Рассмотрим пример задачи, которая в наибольшей степени подходит для начального этапа изучения микроконтроллеров: на базе аппаратной платформы Arduino реализовать программным способом генератор прямоугольных импульсов (в дальнейшем, просто генератор) [10]. Для разработки программы на языке Ассемблера воспользуемся профессиональной средой AVR Studio, которая распространяется свободно и всегда доступна на сайте фирмы Atmel.
На рисунке 1 представлена временная диаграмма сигнала, формируемого генератором. Период сигнала определяется выражением: TG = ti + tp, где ti и tp, соответственно, длительности импульса и паузы. Для упрощения задачи принимаем f, = tp.
Рис. 1. Временная диаграмма сигнала, формируемого генератором
микроконтроллера высокий уровень
DELAY
Алгоритм программы GENERATOR: Шаг 1: Старт.
Шаг 2: Вывести на вывод PD0 напряжения, т.е. логическую единицу (1).
Шаг 3: Сформировать временную задержку DELAY длительностью t.
Шаг 4: Вывести на вывод PD0 микроконтроллера низкий уровень напряжения, то есть логический ноль (0).
Шаг 5: Сформировать временную задержку DELAY длительностью tp и перейти к шагу 2.
Шаг 6: Стоп Правильно разработанная программа должна состоять из отдельных функционально законченных отлаженных модулей -подпрограмм. Рассмотрим подпрограмму DELAY, которая входит в состав программы GENERATOR. Алгоритм подпрограммы DELAY представлен на рисунке 2.
Возврат из DELAY
Рис. 2. Алгоритм подпрограммы DELAY
Подпрограмма, реализующая алгоритм DELAY, представлена на рисунке 3.
□ppappfi профессиональное осрпзоппние: прослемы, нпыкп, прпнтинп
DELAY: ; The time delay subroutine
LDI R16,5 ; Step 1. Load into the register R16 the constant 5 (X = 5)
m1: DEC R16 ; Step 2. Decrement the contents of register R16
BRNE m1 ; Step 3. If not zero go to m1
RET ; Exit the DELAY subroutine
Рис. 3. Подпрограмма, реализующая алгоритм DELAY.
Для отладки подпрограммы DELAY предлагаем использовать фрагмент программы, представленный на рисунке 4, имитирующий основную программу.
m2: RCALL DELAY ; Call subroutine DELAY
RJMP m2 ; Go to m2
Рис.4. Фрагмент программы, имитирующий основную программу
Подпрограмма DELAY вызывается из основной программы командой RCALL DELAY (первая строка с меткой m2). После исполнения подпрограммы DELAY управление передается в основную программу командой RET, (см. подпрограмму DELAY). Затем выполняется команда RJMP m2 - безусловный переход на метку m2 (вторая строка фрагмента отладки подпрограммы DELAY).
Для отладки подпрограммы DELAY можно выбрать значение константы Х из диапазона: 1 ... 255, где 255 десятичный эквивалент максимального двоичного кода, который можно загрузить в восьмибитный регистр микроконтроллера. В рассматриваемом случае Х=5. В среде AVR Studio, в режиме пошаговой отладки проверяем работоспособность подпрограммы DELAY. Если подпрограмма работает, то переходим к расчету временной задержки заданной длительности, то есть к расчету константы X (см. алгоритм, представленный на рис. 2).
Например, требуется разработать генератор, формирующий прямоугольный сигнал с частотой fG = 20 кГц. Для решения данной задачи необходимо рассчитать время задержки TD, которое определяется из условия TD = ti = tp. Период генератора определяется выражением: TG = 1/fG= 1/20000 = 50 мкс. Так как TG = ti + tp = 2Td, то TD = TG /2= 25 мкс.
Длительность временной задержки определяется, в основном, количеством циклов, которые должен выполнить микроконтроллер при исполнении подпрограммы DELAY. Цикл состоит из двух команд с мнемоникой DEC и BRNE (см. подпрограмму DELAY). Остальные команды с мнемоникой LDI, RET и RCALL исполняются микроконтроллером только один раз.
Микроконтроллер работает под действием генератора тактовых импульсов. Количество тактов, необходимое микроконтроллеру на выполнение различных команд можно определить из руководства по набору команд AVR [11]. Количество тактов, необходимое микроконтроллеру на выполнение команд с мнемоникой RCALL, LDI и RET определяется выражением:
Nrlr = Nrcall + Nldi +Nret (1)
где Nrcall, Nldi и Nret - количество тактов необходимое микроконтроллеру на выполнение команд с мнемоникой RCALL, LDI и RET, соответственно.
Тогда согласно выражению (1): NRLR = 3 + 1 + 4 = 8 тактов.
пеппгогичесннй журнал спшкортосгпнп м i(ao). aoi9 ssssssë
Количество циклов, необходимое микроконтроллеру на реализацию временной задержки заданной длительности определяется выражением:
X = (TD - TRLP)/rdb, (2)
где TRLR - время, необходимое микроконтроллеру на выполнение команд с мнемоникой RCALL, LDI и RET, мкс;
rDB - время, необходимое микроконтроллеру на выполнение команд с мнемоникой DEC и BRNE, т.е. одного цикла, мкс.
Время TRLR определяется из выражения:
Trlr = Te • Nrlr , (3)
где Te - период тактового генератора микроконтроллера, определяется из выражения ТС = 1/fe; fe - частота тактового генератора микроконтроллера, fe = 16 МГц согласно технического описания аппаратной части Arduino Uno (https://www .arduino.cc).
Тогда ТС = 1/1610-6 = 0,0625 мкс.
В соответствии с выражением (3) TRLR = 0,0625 8 = 0,5 мкс. Время rDB определяется выражением:
Tdb = Te •Ndb, (4)
где Ndb - количество тактов, необходимых микроконтроллеру на выполнение одного цикла, т.е. команд с мнемоникой DEC и BRNE.
В соответствие с системой команд [11] определяем NDB = 1 + 2 = 3 такта. Тогда rDB = 0,0625 3 = 0,1875мкс. Из выражения (2) определяем:
Х=(25 - 0,5)/0,1875 = 130,66 = 131 цикл Изменяем в подпрограмме DELAY первоначальное значение константы Х на полученное, т.е. Х=131 и проверяем значение времени, формируемое подпрограммой DELAY в среде AVR Studio в режиме отладки (рис. 5).
ml: RCALL DELAY ;Вызвать подпрограмму DELAY ■=£> RJMP ml ; Перейти к метке ml
DELAY: /Подпрограмма временной задержки
LDI R16,131;Загрузить в регистр R16 константу 131 m2: DEC Rib ;Декрементировать содержимое регистра R16 В1ШЕ т2 ;Если не ноль перейти к метке т2 RET ;Выйти из подпрограммы DELAY
Register
R00 = 000
R03 = 000
R06 = 000
R09 = 000
R12= 000
R15 = 000
R18= 000
R21= 000
R24= 000
R27 = 000
R30= 000
R01= 000 R04= 000 R07= 000 R10= 000 R13= 000 R16= 000 R19= 000 R22= 000 R25= 000 R28= 000 R31= 000
R02= 000 R05= 000 R08 = 000 Rll= 000 R14= 000 R17= 000 R20= 000 R23= 000 R26= 000 R29 = 000
¡Processor *
Name Value
Program Coir.. 0*000001
Slack Pointer OxOSFF
X pointer 0*0000
V pointer 0x0000
Z pointer 0*0000
Cycle Counter 400
Frequency 16 0000 MHz
Stop Watch 25.00 us
SREG ШШЕННННО
+J Registers
1
В Project Processor
Рис. 5. Окно IDE AVR Studio в режиме отладки подпрограммы DELAY
9SQ5SSS профессиональное оерпзоппние: проалемы, нпинп, прпнтинп
Если подпрограмма DELAY формирует временную задержку заданной длительности, что видно в окне Processor, строка Stop Watch 25.00 us, то переходим к разработке программы, реализующей функцию генератора в соответствие с алгоритмом, представленным выше. Отлаженная в среде AVR Studio программа GENERATOR представлена на рисунке 6.
•include"m32 8Pdef.inc";Include the name mapping files of I / O registers ;for ATmega328 microcontroller addresses ;Initialize the stack
;Write to the stack pointer register high byte of the RAMEND constant Write to the stack pointer register low byte of the RAMEND constant
LDI R16, high (RAMEND) OUT SPH, R16 LDI R16, low (RAMEND) OUT SPL, R16 ;
/Initialize the HD Port
LDI R16, 0b00000001
OUT DDRD,R16
GENERATOR:
ml: SBI PORTD,
RCALL DELAY
CBI PORTD, 0
RCALL DELAY
RJMP ml
DELAY:
LDI R16, 131 m2: DEC R16 BRNE m2 RET
;Configure the PDO line to the output
;The program "Generator of rectangular impulses (GRI)' 0 ;Output logical '1' to PD0 pin ;Call DELAY subroutine ;Output logical '0' to PD0 pin
;Repeat the period output
;The time delay subroutine of 25 ys, with fc = 16MHz ;Load number 131 in the R16 register ;Decrement of register R16 content ;If register R16 content is not zero, go to m2 ;Return from DELAY
Рис. 6. Фрагмент режима отладки программы GENERATOR в среде AVR Studio
На рисунке показан фрагмент режима отладки программы GENERATOR в среде AVR Studio. После отладки записываем программу GENERATOR в память микроконтроллера с помощью программатора Atmel AVRISP mkII [12]. Он подключается к Arduino Uno через специальный разъем. Файл GENERATOR.hex, содержащий программу на языке машинных кодов, находится в папке проекта.
.include"m328Pdef.inc" /Подключить файл соответствия имен /регистров ввода-вывода их адресам /Инициализировать стек
ателя стека старший
¡LDI R16, high (RAMEND) OUT SPH, R16 ; i
¡ILDI R16, low (RAMEND) OUT SPL, Rl6 / ij
f: / Иници а ли з а ци я порта PI {.LDI Rl6, ObOOOOOOOl /Нг ¡OUT ddrd, r16 : GENERATOR: /Прогрг
ml: SBI PORTD, 0 /Вь ■=>RCALL DELAY ¡CBI PORTD, 0 /Вывеет
RCALL DELAY
[RJMP ml /Повторить
DELAY: /Подпрс
LDI R16, 131 /Зс
:m2: DEC Rl6 /Декреь
BRNE m2 /Если содер
¡RET /Возврат из
rl¡Q
Add re
±j Oad_conve ±1 danalog _c л i) cpu
(DEEPROM ±1 ^EXTERNAL ilSPORTB il S PORTO -I áPORTD
DDRD OxOA (0x2... =|PIND 0x09 (0x29) S PORTD OxOB (0x2... ¿liaSPI ±1 ©TIMER_COi ♦I ©TIMER_COI ±1 ©TIMER_COi iiaTwi
illpUSARTO ±| ¿ÍWATCHDO
ателя стека младшии
ых импульсов (ГПИ)'
Processor X
Program Сои... 0x000007
Stack Pointer OxOSFF
Xpointer 0x0000
Y pointer 0x0000
Cycle Counter 0x0000 814
Frequency 16.0000 MHz
Stop Watch 50.88 us
SREG ШШ0Е1ЕНВО
±1 Registers
Е Project I Processor
Рис. 4. Окно IDE AVR Studio в режиме отладки программы GENERATOR
91
пеппгогичесний ЖУРНПЛ ЕПШНОРТОСТПНП N I (во), 2019 SSSSSSS
На рисунке 7 показана осциллограмма сигнала, формируемого генератором, построенным на микроконтроллерной платформе ЛМиюо. Из осциллограммы видно, что временные параметры сигнала практически соответствуют заданным значениям. При заданной частоте ^ = 20 кГц частота сигнала составляет 19,9 кГц. При заданном ti = 25 мкс длительность импульса составляет 25,1 мкс.
'1 1
I':-';-- «
! СН1 :*Width ■ 25.1 US
■Í-2 00V ]
Рис. 7. Осциллограмма сигнала формируемого генератором на выходе линии PD0 микроконтроллера ATmega328 платформы Arduino Uno
Незначительные расхождения между экспериментальными параметрами сигнала и заданными могут быть объяснены тем, что в расчетах не учитывалось время, необходимое для выполнения микроконтроллером команд (рис. 8.):
SBI PORTD, 0 ;Вывести логическую 1 на выход PD0
CBI PORTD,0 ;Вывести логический 0 на выход PD0
RJMP mi ;Повторить вывод периода
Рис. 8. Фрагмент вычисления расчета.
Для учебного процесса данный факт очень важен, он связывает теорию с практикой, учит студента объяснять результаты исследований. В качестве самостоятельного задания, мы рекомендуем скорректировать параметры сигнала генератора с учетом выше изложенного заключения о расхождении расчетных данных с экспериментальными. Следует обратить внимание, что источником расхождений расчетных и экспериментальных данных может быть погрешность измерительного прибора, в данном случае осциллографа. Поэтому перед проведением эксперимента необходимо убедиться, что измерительный прибор соответствует допустимым значениям погрешности. В качестве измерительного прибора можно использовать, например, цифровой частотомер, но в этом случае наглядность эксперимента будет ниже, чем при использовании осциллографа.
В экспериментальных исследованиях были задействованы: микроконтроллерная платформа Arduino Uno (аппаратная часть), программатор A VRISPmklI, USB-осциллограф DSO-2090 и компьютер.
gssisss профессиональное оерпзоапние: проблемы, нпинп, прпнтинп
Рефлексия формирования начальных навыков по программированию микроконтроллеров средствами ассемблера проводилась путем тестирования студентов второго курса по направлениям подготовки бакалавров 13.03.02 «Электроэнергетика и электротехника» и 35.03.06 «Агроинженерия» в 2017 и 2018 годах. Вопросы ранжировались по уровням: высокий, средний и низкий; участвовали 175 студентов, из них 88 человек в 2017 г. и 87 человек в 2018 г.
Результаты тестирования обрабатывались методами математической статистики как выборочные моменты распределения ответов студентов каждой из групп по соответствующим уровням вопросов (рис. 9)._
Экспериментальная группа — - Контрольная группа
Рис.9. Плотность распределения ответов студентов по уровням вопросов
Мы получили увеличение плотности распределения ответов студентов на вопросы высокого уровня. Кроме того, в 2017 г. было проведено анкетирование студентов с целью выявления оценки студентами методики преподавания программирования микроконтроллеров на базе ассемблера. 84 % опрошенных дали положительную оценку по доступности и наглядности, а также утвердительно ответили на вопрос: «Можете ли вы самостоятельно составить алгоритм и программу на ассемблере для следующей прикладной задачи_?».
Изложенное в статье позволяет сделать следующие выводы. На базе аппаратно-программной (инструментальной) системы «Arduino - AVR Studio -Ассемблер» возможна организация эффективных связей между теоретическими знаниями и практическими навыками, формируемыми в процессе изучения микроконтроллеров бакалаврами инженерных факультетов. Эффективность связей обеспечивается использованием таких когнитивных принципов, как включение нового материала в когнитивную структуру личности студента (связь нового материала со знаниями и навыками, уже доступными студенту), алгоритмизацию, визуализацию и практическую направленность учебных действий. Теоретические знания в рассмотренном примере - это знание архитектуры микроконтроллера, алгоритмов реализации определенных действий и методов разработки программного обеспечения. Практические навыки формируются в процессе выполнения расчета продолжительности работы программы микроконтроллера и проверки полученных результатов в режиме
пеппгогичесннй журнпл спшкортосгпнп м i(ao). aoi9 §®§°®аб
отладки в IDE AVR Studio. Экспериментальные навыки вырабатываются путем проведения исследований реального сигнала разработанного генератора, параметры которого были заданы в начале проектирования. Освоенные знания и навыки составляют основу формируемой компетенции, дальнейшее развитие которой предполагает совершенствование знаний и умений в процессе выполнения бакалаврских (магистерских) и конкурсных работ в области встраиваемых систем управления.
1. Платунов, А. Встраиваемые системы управления [Текст] // Control Engineering Россия. 2013. №1 (43). С. 16-24.
2. Штейнберг, В.Э. Теория и практика дидактической многомерной технологии (монография) [Текст]. - Москва : Народное образование, 2015. - 350 с.
3. Lee, E.A., Seshia, S.A. Introduction to Embedded Systems - A Cyber-Physical Systems Approach. - 2011. [Электронный ресурс]. - URL : http://LeeSeshia.org (дата обращения: 26.01.2019).
4. Котов, И.Ю. Книга по программированию микроконтроллеров AVR [Электронный ресурс]. - URL : http://cxem.net/mc/book.php (дата обращения: 15.01.2019).
5. Vostrukhin, A., Vakhtina, E., Bondar, S. Using Assembler for microcontrollers' study on Arduino-based platform [Текст] // 16th International Scientific Conference "Engineering for Rural Development" : Proceedings, vol.16 (Latvia, Jelgava, 24-26.05.2017) [Электронный ресурс] - URL : http://www.tf.llu.lv/conference/proceedings2017/Papers/N115.pdf (дата обращения: 10.12.2018).
6. Vostrukhin, A., Vakhtina, E, Bondar, S, Tomashik, L. Microcontroller metering converter of capacitance with voltage-controlled RC-generator // 17th International Scientific Conference "Engineering for Rural Development" : Proceedings, vol.16 (Latvia, Jelgava, 23.-25.05.2018.) [Электронный ресурс] - URL : http://www.tf.llu.lv/conference/proceedings2018/Papers/N055.pdf (дата обращения: 12.12.2018).
7. Зубков, С.В. Assembler для DOS, Windows и UNIX. - Москва : ДМК Пресс ; Санкт-Петербург : Питер, 2004. - 608 с.
8. Белов, А.В. Программирование микроконтроллеров для начинающих и не только. -Москва : Наука и техника, 2016. - 352 с.
9. Vostrukhin, A., Vakhtina, E. Studying Digital Signal Processing on Arduino based platform // 15th International Scientific Conference "Engineering for Rural Development" : Proceedings, vol. 15 (Latvia, Jelgava, 25-27.05.2016) [Электронный ресурс] - URL : http://www.tf.llu.lv/conference/proceedings2016/Papers /N043.pdf (дата обращения: 25.12.2018).
10. Вострухин, А.В., Вахтина, Е.А. Введение в программирование микроконтроллера AVR на языке Ассемблера: учебное пособие - 2-е изд., перераб. и доп. - Москва : Илекса, 2010. - 184 с.
11. Complete Instruction Set Summary. [Электронный ресурс] - URL : http://www.avr-tutorials.com/sites/default/files/Instruction%20Set%20Summary.pdf (дата обращения: 29.01.2019).
12. AVRISP MkII. [Электронный ресурс] - URL: http://www.atmel.com/webdoc/avrispmkii/index.html (дата обращения: 28.01.2019).