МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра биотехнических систем и технологий
ОТЧЁТ
по индивидуальному домашнему заданию №1 по дисциплине «Медицинские микропроцессорные системы»
Студенты гр. 2503 |
|
Ковалёва Д.Д. |
|
|
|
|
Малышев К.А. |
|
|
|
|
|
|
|
Новикова С.Л. |
|
|
|
|
Преподаватель |
|
Корнеева И.П. |
|
|
|||
|
|
|
|
Санкт-Петербург
2024
ИНДИВИДУАЛЬНОЕ ДОМАШНЕЕ ЗАДАНИЕ №1.
Введение.
Цель работы: Исследование принципов работы микроконтроллера
ATtiny104 на базе отладочной платы “ATtiny104 - Xplained Nano”. Получение начальных навыков программирования МК на языке Assembler и C,
пользования средой разработки AVR Atmel Studio 7.
Используемые инструменты: Отладочная плата ATtiny104 - Xplained Nano; интегрированная среда разработки AVR Atmel Studio 7; методические указания к выполнению работы.
Atmel ATtiny104 - это CMOS-8-разрядный микроконтроллер с низким энергопотреблением, основанный на усовершенствованной RISC-архитектуре
AVR. Выполняя мощные инструкции за один такт, ATtiny104 достигают производительности, близкой к 1 миллисекунде на МГц. Это позволяет разработчику системы оптимизировать энергопотребление устройства в зависимости от скорости обработки.
Прошивку для микроконтроллера можно писать в различных средах разработки, одной из которых является AVR Atmel Studio 7. В этой среде разработки код для прошивки может быть скомпилирован из кода, написанного либо на языке Ассемблера, либо на языке С. В данной работе будут разобраны оба варианта как примеры работы с микроконтроллером.
Отчёт по практической работе.
1.Создать проект на языке Assembler, скопировать приведённый ниже код примера (приложение 1), проверить его работоспособность.
Входе работы программы в консоль была выдана следующая строка.
Рисунок 1 – Сообщение в консоли.
Это сообщение говорит о том, что код был успешно скомпилирован, а в ходе его работы не было вызвано ошибок. Если смотреть по значениям регистров, то получаем следующие данные:
Таблица 1. Регистры действующей программы.
После строки подачи 1 После строки подачи 0
Как видно из таблицы выше, на регистр действительно подаётся значения, соответствующие уровню HIGH на порте A5 и уровню LOW на всех портах, а значит программа работает правильно.
2.В коде на Assembler'e изменить основной цикл так, чтобы в нём не содержалось инструкций LDI. Для этого можно использовать инструкции SBI/CBI или SBR/CBR.
Полученный код представлен в приложении 2. Проведя аналогичные заданию 1 действия, можно убедиться, что код действительно работает, а
значит задание выполнено правильно.
3.В коде на Assembler'e изменить подпрограмму задержки так, чтобы для создания секундной задержки было достаточно использования только 2
РОН.
Полученный код представлен в приложении 3. Логика базируется на том,
что вместо добавления 3-го цикла, использующего 3-й регистр общего назначения, можно второй раз вызвать исходный цикл, таким образом количество операций составит 255 255 2 = 130 050 операций, как и до модифицирования кода, а значит задание выполнено правильно.
4.Создать проект на языке C, скопировать приведённый ниже код примера,
проверить его работоспособность.
Входе работы программы в консоль была выдана следующая строка.
Рисунок 2 – Сообщение в консоли.
Это сообщение говорит о том, что код был успешно скомпилирован, а в ходе его работы не было вызвано ошибок, а значит программа работает.
Код программы приведён в приложении 4.
5.В коде на С настроить ножку PB1 в режим работы input pull-up. В
бесконечном цикле, кроме мигания диодом, опрашивать состояние ножки. При нажатой кнопке светодиод должен всегда гореть, не мигая.
Время реакции на нажатие в пределах периода мигания допустимо. Для выполнения задания потребуется использовать регистры PUEB и PINB,
а также условный оператор if ().
Для выполнения этого задания, исходный код был переписан.
Полученный код приведён в приложении 5. Если следовать логике кода, то в начале цикла основной программы опрашивается кнопка на ножке PB1. Если кнопка не нажата, происходит один цикл мигания, иначе кнопка просто загорается и горит, пока кнопка нажата.
Приложение 1.
Исходный код на языке Assembler.
// Инициализация периферии
LDI |
r16, (1 << DDRA5) |
|
OUT |
DDRA, R16 |
|
// Основной цикл программы |
||
Main: |
|
|
|
LDI |
r16, (1 << PORTA5) |
|
OUT |
PORTA, r16 |
|
RCALL |
Delay |
|
LDI |
r16, 0 |
|
OUT |
PORTA, r16 |
|
RCALL |
Delay |
|
RJMP |
Main |
// Подпрограмма задержки
.equ LowByte = 255
.equ MedByte = 255
.equ HighByte = 2 Delay:
LDI |
R16, LowByte |
LDI |
R17, MedByte |
LDI |
R18, HighByte |
loop: |
|
DEC |
R16 |
BRNE |
loop |
DEC |
R17 |
BRNE |
loop |
DEC |
R18 |
BRNE |
loop |
RET |
|
Приложение 2.
Модифицированный код на языке Assembler.
// Инициализация периферии
SBR |
r16, (1 << ddra5) |
|
OUT |
DDRA, R16 |
|
EOR |
r16, r16 |
|
// Основной цикл программы |
||
Main: |
|
|
|
SBR |
r16, (1 << PORTA5) |
|
OUT |
PORTA, r16 |
|
RCALL |
Delay |
|
CBR |
r16, -1 |
|
OUT |
PORTA, r16 |
|
RCALL |
Delay |
|
RJMP |
Main |
// Подпрограмма задержки
.equ LowByte = 255
.equ MedByte = 255
.equ HighByte = 2 Delay:
LDI |
R16, LowByte |
LDI |
R17, MedByte |
LDI |
R18, HighByte |
loop: |
|
DEC |
R16 |
BRNE |
loop |
DEC |
R17 |
BRNE |
loop |
Dec |
R18 |
BRNE |
loop |
Приложение 3.
Модифицированный код на языке Assembler.
// Инициализация периферии
SBR r16, (1 << ddra5)
OUT |
|
DDRA, R16 |
|
EOR r16, r16 |
|
|
|
// Основной цикл программы |
|||
Main: |
|
|
|
|
SBR |
|
r16, (1 << PORTA5) |
|
OUT |
|
PORTA, r16 |
|
RCALL |
|
Delay |
|
RCALL |
|
Delay |
|
CBR r16, -1 |
||
|
OUT |
|
PORTA, r16 |
|
RCALL |
|
Delay |
|
RCALL |
|
Delay |
|
RJMP |
Main |
|
// Подпрограмма задержки |
|||
.equ |
LowByte |
= 255 |
|
.equ |
MedByte |
= 255 |
|
Delay: |
|
|
|
|
LDI |
|
R16, LowByte |
|
LDI |
|
R17, MedByte |
loop: |
|
|
|
|
DEC |
|
R16 |
|
BRNE |
loop |
|
|
DEC |
|
R17 |
|
BRNE |
loop |
|
|
RET |
|
|
Приложение 4.
Исходный код программы на языке C.
#include <avr/io.h> #include <util/delay.h>
int main(void)
{
DDRA |= (1 << DDRA5); while (1)
{
PORTA |= (1 << PORTA5);
_delay_ms(500);
PORTA &= ~(1 << PORTA5);
_delay_ms(500);
}
}
Приложение 5.
Модифицированная программа на языке С.
#include <avr/io.h> #include <util/delay.h>
int main(void)
{
DDRA |= (1 << DDRA5);
DDRB &= ~(1 << DDRB1);
PUEB |= (1 << PUEB1);
while (1)
{
if (PINB & (1 << PINB1)) { PORTA |= (1 << PORTA5);
_delay_ms(500);
PORTA &= ~(1 << PORTA5);
_delay_ms(500);
}
else {
PORTA &= ~(1 << PORTA5);
}
}
}
