
Лабораторные работы готовые / Лабораторная работа 1 Инструкции микроконтроллеров AVR. Подсистема ввода-вывода
.docxЗадание 1
Программа
;
; AssemblerApplication1.asm
;
; Created: 14.02.2024 12:07:28
; Author : RIIT_05_410
;
; Replace with your application code
.include "m32def.inc" ;подключение библиотеки для работы с ATmega32
.cseg ;выбор сегмента программного кода
.org 0 ;установка текущего адреса на ноль
;--------------------------------------------
;настройка порта D на ввод
ldi r16,0x00 ;записываем ноль в регистр r16
out DDRD,r16 ;записываем r16 в DDRD
;настройка порта B на вывод
ldi r16,0xFF ;записываем 0xff=0b11111111 в регистр r16
out DDRB,r16 ;записываем r16 в DDRB
out PORTB,r16 ;записываем r16 в PORTB(погасить светодиод)
out PORTD,r16 ;записываем r16 в PORTD(включаем внутренний резистор)
;---------------------------------------------
metka:
in r16,PIND ;читаем содержимое порта D
out PORTB,r16 ;пересылаем в порт B
rjmp metka ;переходим по метке к началу цикла
Результат Proteus
Ответы
Состояние портов изменяется в момент нажатия кнопки при нажатии кнопки информация записывается с порта Д в регистр, оттуда состояния передаются на порт Б.
Изменение состояния порта Д ведет к изменению работы светодиода.
Задание 2
Разработать программу на языках Assembler и C для устройства, выполняющего действия в соответствии с заданным алгоритмом:
Программа
.include "m32def.inc" ;подключение библиотеки ATmega32
.cseg ;выбор сегмента программного кода
.org 0 ;установка текущего адреса на ноль
reset: ;инициализация портов ввода/вывода
ldi r16,0xFF
out DDRA,r16 ;установка Pt2 на вывод информации
out DDRC,r16 ;установка Pt3 на вывод информации
out PORTB,r16 ;включение подтягивающих резисторов
clr r16
out DDRB,r16 ;установка Pt1 на ввод информации
in r16,PINB ;ввод значения Pt1 в Rd1
mov r18,r22 ;копирование Rd1 в Rd2
;3E
;0011 1110
cbi PORTA,8
cbi PORTA,7
sbi PORTA,6
sbi PORTA,5
sbi PORTA,4
sbi PORTA,3
sbi PORTA,2
sbi PORTA,1
cbi PORTA,0
out PORTA,r22 ;установка K2 на Pt3
Задание 3
Разработать программу на языке Assembler и C для устройства, позволяющего управлять состояниями светодиодов в зависимости от нажатой кнопки. Смоделировать схему в Proteus и проверить работоспособность программы.
К порту С подключено 8 светодиодов. Если нажата кнопка 1, то должны загораться светодиоды с нечетными номерами, а если кнопка 2, то с четными. Проверить работу.
Программа
;
; Practica2_2.asm
;
; Created: 28.02.2024 12:03:58
; Author : RIIT_05_410
;
.include "m32def.inc" ;подключение библиотеки ATmega32
.cseg ;выбор сегмента программного кода
.org 0 ;установка текущего адреса на ноль
.org 0x0000;
;ldi r16, 0xFF
;out SPH, r16
;ldi r16, 0x00
;out SPL, r16
ldi r16, 0b00000000
out DDRA,r16
out DDRB, r16
ldi r16, 0xFF
out DDRC, r16
; Replace with your application code
start:
in r17, PINA
in r18, PINB
andi r17, 0b00000001
andi r18, 0b00000001
cpi r17, 1
breq button1_pressed
rjmp button2_check
button1_pressed:
ldi r16, 0b01010101
out PORTC, r16
rjmp end
button2_check:
cpi r18,1
brne end
ldi r16, 0b10101010
out PORTC, r16
rjmp end
end:
rjmp start
Программа C
#include <avr/io.h>
int main(void) {
DDRD = 0x00;
DDRB = 0xFF;
PORTD = 0xFF;
PORTB = 0xFF;
unsigned char r17 = 0b01010101;
unsigned char r18 = 0b10101010;
while (1) {
if (PIND & (1 << PD0)) {
metkaA:
PORTB = r17;
} else if (PIND & (1 << PD1)) {
metkaB:
PORTB = r18;
}
}
return 0;
}
Результат Proteus
Задание 4
Разработать программу на языке Assembler и C для устройства, выполняющего решение логического уравнения. Минимизация выражения не требуется.
Программа
.include "m32def.inc" ;подключение библиотеки для работы с ATmega32
.def A=r20 ;объявление переменных и присвоение их имен
.def B=r21 ;регистрам общего назначения r20...r23
.def C=r22
.def D=r23
.def NA=r24
.cseg ;выбор сегмента программного кода
.org 0 ;установка текущего адреса на ноль
;--------------------------------------------
reset:
ldi r16,0x01
out DDRD,r16 ;записываем r16 в DDRB
ldi r16,0x0FF
out PORTA,r16 ;записываем r16 в PORTB(погасить светодиод)
clr r16
out DDRA,r16 ;записываем r16 в PORTD(включаем внутренний резистор)
main:
in r19,PINA ;ввод значения PINA в РОН r16
mov A,r19 ;копирование r16 в регистры A, B, C
mov B,r19
mov C,r19
andi A,0x01 ;выделение бита числа A
andi B,0x02 ;выделение бита числа B
andi C,0x04 ;выделение бита числа C
lsr B
lsr C
lsr C
; 1 часть вычисления
mov NA,A;присваиванм А
com NA;не а
andi NA,0x01
or NA,C ;не а или с
and A,B; а и б
com NA;не (а и б)
andi NA,0x01
and A,NA; итог
; вывод
out PORTD,A ;вывод результата на PORTD0
rjmp main ;возврат на main
Программа C
#include <avr/io.h>
int main(void)
{
DDRD=0x01;// настройка порта D на вывод
DDRA=0x00;// настройка порта A на ввод
PORTA=0xFF;// включение подтягивающих резисторов
// объявление переменных с указанием на выделение в файле регистров
register unsigned char x, A, NA, NB, NC, B, C;
while (1)
{
x=PINA;// опрос PINC с занесением результата в x
A=x;// копирование введенной информации в переменные
B=x;
C=x;
A &= 0x01;// выделение бита числа A
B &= 0x02;// выделение бита числа B
C &= 0x04;// выделение бита числа C
B>>=1;// сдвиг B на 1 позицию
C>>=2;
NA=(~A)&0x01;
NB=(~B)&0x01;
NC=(~C)&0x01; // формирование !А
x=NA | NB & (NA | C); // расчет логического выражения
// ne(A) | ne(B) & (ne(A) | C)
PORTD=x;// вывод результата на PORTD
}
}
Таблица истинности
A |
B |
C |
|
|
F |
A |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |