Розробка схеми електричної принципової музичного дзвоника

курсовая работа

3.2 Тест перевірки окремих вузлів або пристроїв

Програма за якою працює мікропроцесор мовою асемблера АТ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 - Алгоритм роботи пристрою

Делись добром ;)