Рисунок 2.1.1 – Архітектура мікроконтролера AT 90S8515
В курсовій роботі обрано контролер з сімейства Classic, яке характеризується продуктивністю до 16 мільйонів операцій в секунду, наявністю пам’яті програм FlashROM 2-8 кбайт, пам’яті даних EEPROM 64-512 байт, пам’яті даних SRAM 128-512 байт. Контролери даної сім’ї мають дещо нижчі можливості ніж інші сім’ї з точки зору периферії і обчислювальних можливостей.
Широка номенклатура AVR-мікроконтролерів дозволила обрати такий, який задовольнив всі наші потреби (див пункт 1.2 Технічні характеристики).
Високу продуктивність забезпечують:
- виконанням великої кількості команд за один тактовий цикл;
- конвеєром команд, що забезпечують одночасно з виконанням поточної команди вибірку наступної;
- потужною системою команд єдиного 16-розрядного формату;
- вбудованими апаратними пристроями.
Мале енергоспоживання забезпечують:
- СМОS-технологія;
- цілком статична роботою - від покрокового режиму до максимальної тактової частоти.
Малу вартість як на рівні вартості апаратного обладнання, так і на рівні вартості розробки і налагодження прикладних програм, забезпечують:
- Flash-пам'яттю програм, яку програмують на цільовій платі;
- можливістю вибору мікроконтролера з достатньою і відповідною кількістю функцій і вбудованої периферії.
2.2 Принцип роботи окремих ВІС з використанням часових діаграмта алгоритмів роботи
- Конвеєрна вибірка команд мікроконтролером і виконання команд
- Вхідний тактовий сигнал (вхід OSC1) внутрішньою схемою мікро контролера ділиться на чотири неперекриваючихся такти Q1, Q2, Q3,Q4. Внутрішній лічильник команд збільшується на одиницю при кожному такті Q1, а вибірка команд із пам’яті програм на кожному такті Q4. Декодування і виконання команди виконується з такту Q1 до Q4. Цей процес показаний на рисунку 2.2.1.
Рисунок 2.2.1 - Діаграма циклів виконання команд
Цикл виконання команди складається із чотирьох тактів Q1, Q2, Q3 і Q4. Вибірка наступної команди і виконання поточної зміщені по часу таким чином виконання команди виконується за один цикл. Якщо команда змінює лічильник команд PC (наприклад команда GOTO) то необхідно два машинних цикла для виконання команди.
Цикл вибірки команди починається із збільшення лічильника команд PC в такті Q1. В циклі виконання команди, код завантаженої команди, поміщається в регістр команд IR на такті Q1. Декодування і виконання команди виконується в тактах Q1, Q2 і Q4. Операнд із пам’яті даних читається в такті Q2, а результат виконання командизаписується в такті Q4.
2.3 Принцип роботи пристрою згідно схеми електричної принципової
Принципова схема пристрою зображена на рисунку 2.3.1.
Рисунок 2.3.1 – Схема електрична принципова
При натисненні на кнопку дзвоника SB1 вмикається живлення пристрою, починає роботу програма, що записана в пам’ять мікроконтролера, на виводі 39 (PA0) з’являється напруга логічної 1. Результатом цього є відкриття транзистора VT1, спрацьовує реле К1, і К1.1 блокує кнопку звоника.
Для формування коливань використовується таймер мікроконтролера і режим його роботи на переключення зовнішнього виводу PD5 (для отримання потрібної звукової частоти частоту роботи таймера потрібно збільшити у 2 рази). Сигнал, що знімають з цього виводу підсилюється транзисторомVT2VT3, в колекторну мережу якого підключено динамічну головку ВА1. Для регулювання гучності послідовно з нею модна підключити змінний резистор R5, після програвання мелодії програма записує в енергонезалежну пам’ять мікроконтролера вказівник на наступну мелодію. Високий рівень напруги на виході 39 зміняється на низький і реле розриває коло живлення до наступного натиснення на кнопку SB1.
3 Експлуатаційний розділ
3.1 Ініціалізація програмованих ВІС
Програма ініціалізації мікросхем виконує налагодження портів вводу-виводу мікросхем та встановлює параметри дільника та входів мікросхеми по яким буде виконуватися переривання. Також налагоджуються переривання по таймеру. Всі інші переривання забороняються.
Програма ініціалізації і програма тестування пристрою наведена в пункті 3.2.
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 код повороту наліво, який буде виводиться в порт в
callstop ; визиваємо підпрограму stop
jmp start ; повертаємся на мітку start
right:
mov r30, 69h ; записуємо в регістр r30 код повороту направо, який буде виводиться в порт в
callstop ; визиваємо підпрограму 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 значення часу, на протязі якого планетохід буде виконувати поворот