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

Лабы / 1 / Отчёт_ИДЗ1

.pdf
Скачиваний:
0
Добавлен:
12.02.2026
Размер:
270.56 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра биотехнических систем и технологий

ОТЧЁТ

по индивидуальному домашнему заданию №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 – Сообщение в консоли.

Регистры
R16

Это сообщение говорит о том, что код был успешно скомпилирован, а в ходе его работы не было вызвано ошибок. Если смотреть по значениям регистров, то получаем следующие данные:

Таблица 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);

}

}

}

Соседние файлы в папке 1