Програма за якою працює мікропроцесор мовою асемблера АТ90S8515 має наступний вигляд:
bigpause equ 100 ; задаемо значення стартової паузи
pause1 egu 15 ; значення паузи перед зміною напрямку руху
pause2 equ 50 ; задаємо час, на протязі якого планетохід буде відїжджати назад
pause2 equ 50 ; задаємо час, на протязі якого планетохід буде розвертатися
portA equ 05h ; адрес порта А
portB equ 06h ; адрес порта В
org 0h ; резервування 100 байт починаючи з адресу 0h
reset:
mov r31, 1Fh ; задаємо направлення роботи портів
out portB, r31 ; PB0, PB1, PB2, PB3, PB4 - виходи, PB5, PB6 - входи
mov r31, 61h ; виводимо в порт В код зупинки двигунів,
out portB, r31 ; і вмикаємо резистори на входах РВ5, РВ6
mov r31, bigpause ; записуэмо в регістр r31 значення великої паузи
call pause ; викликаємо підпрограму паузи
jmp start ; переходимо на мітку старт
start:
mov r31, 00000011b ; установлюємо на виході РВ1 лог. 1,
out portB, r31 ; що зумовлює ввімкнення лівого двигуна
mov r31, 00001011b ; установлюємо на виході РВ3 лог. 1,
out portB, r31 ; що зумовлює ввімкнення правого двигуна
mov r31, 00001010b ; установлюэмо на виходіРВ0 лог. 0,
out portb, r31 ; що і гасить світлодіод
scan:
in r31, portB ; читаємо стан порту В
test r31, 01000000b ; перевіряємо чи натиснута права кнопка
jz left ; якщо натиснута, переходимо на мітку left
test r31, 00100000b ; перевіряємо чи натиснута ліва кнопка
jz right ; якщо натиснута, переходимо на мітку right
jmp scan ; якщо ні одна кнопка не натиснена, повторяємо цикл перевірки стану кнопок
left:
mov r30, 63h ; записуємо в регістр r30 код повороту наліво, який буде виводиться в порт в
call stop ; визиваємо підпрограму stop
jmp start ; повертаємся на мітку start
right:
mov r30, 69h ; записуємо в регістр r30 код повороту направо, який буде виводиться в порт в
call stop ; визиваємо підпрограму stop
jmp start ; повертаємся на мітку start
; --------------------------------------------------------------------------------------------------
; підпрограма stop, задача якої - ввімкнення потрібного маневру (відїзд, повороти направо та наліво)
; --------------------------------------------------------------------------------------------------
stop proc
mov r31, 00001000b ; установлюємо на виході РВ1 лог. 0,
out portB, r31 ; що зумовлює вимкнення лівого двигуна
mov r31, 00000000b ; установлюємо на виході РВ3 лог. 0,
out portB, r31 ; що зумовлює вимкнення правого двигуна
mov r31, pause1 ; записати в регістр r31 значення паузи перед зміною направлення руху
call pause ; викликаємо підпрограму pause
mov r31, 00000100b ; встановлюємо на виході РВ2 лог. 1,
out portB, r31 ; що заставляє лівий двигун крутитися в іншу сторону
mov r31, 00010100b встановлюэмо на виході РВ4 лог. 1,
out portB, r31 ; що заставляє правий двигун крутитися в іншу сторону
mov r31, 00010101b ; встановлюэмо на виході РВ0 лог. 1,
out portB, r31 ; що запалює світлодіод
mov r31, pause2 ; записати врегістр r31 значення часу, на протязі якого планетохід буде відїжджати назад
call pause ; викликаємо підпрограму pause
mov r31, 00010101b ; встановлюємо на виході РВ2 лог. 0,
out portB, r31 ; що вимикає лівий двигун
mov r31, 00010001b встановлюэмо на виході РВ4 лог. 0,
out portB, r31 ; що вимикає правий двигун
mov r31, 00000000b встановлюэмо на виході РВ0 лог. 0,
out portB, r31 ; чим гасим світлодіод
mov r31, pause1 ; записати врегістр r31 значення часу, перед зміною напрямку руху
call pause ; викликаємо підпрограму pause
out portB, r30 ; виводим в порт В код повороту наліво чи направо
mov r31, pause3 ; записати врегістр r31 значення часу, на протязі якого планетохід буде виконувати поворот
call pause ; викликаємо підпрограму pause
out portB, r30 ; записуэмо в порт В код відповідаючий повороту направо чи наліво
mov r31, pause3 ; записати врегістр r31 значення часу, на протязі якого планетохід буде виконувати поворот
call pause ; викликаємо підпрограму pause
mov r31, 61h ; записуэмо в регістр r31 код, відповідний відключенню двигунів
out portB, r31 ; та виводимо його на порт В
mov r31, pause1 ; записати врегістр r31 значення часу, перед зміною напрямку руху
call pause ; викликаємо підпрограму pause
stop endp ; вихід із підпрограми
; ----------------------------------------------------------------
; підпрограма витримки пауз, інтервал яких задається регістром r31
; ----------------------------------------------------------------
pause proc
d3:
mov r29, FFh ; встановлюэмо регістр r29 в FFh
d2:
mov r28, FFh ; встановлюэмо регістр r28 в FFh
d1:
sub r28, 1 ; віднімаємо від регістру r28 оденицю
test r28, 2
jz d1
sub r29, 1 ; віднімаємо від регістру r29 оденицю
test r29, 3
jz d2
sub r31, 1 ; віднімаємо від регістру r31 оденицю
test r31, 4
jz d3
pause endp ; вихід із підпрограми
end ; завершення програми
Алгоритм роботи пристрою, користуючись яким доволі просто розібратися з основними принципами покладеними в основу роботи програми зображено на рисунку 3.2.1.
Рисунок 3.2.1 – Алгоритм роботи пристрою
Дата: 2019-07-30, просмотров: 208.