- •2. Основи програмування і налагодження контролерів avr
- •2.1. Програми avr Assembler V.1.0
- •2.1.1. Відкриття асемблерних файлів
- •2.1.2. Інтегрований редактор
- •2.1.3. Написання програми
- •2.1.4. Асемблування програми
- •2.2. Вивчення пакету avr Studio
- •2.2.2. Вікно процесора
- •2.2.4. Вікно порту
- •2.2.5. Вікно 8-бітного таймера-лічильника
- •2.2.6. Регістри енергонезалежної пам’яті eeprom
- •2.2.7. Команди точок останова (Breakpoint commands)
- •2.2.8. Команди керування виконанням програми
- •2.2.10. Вибір контролера
- •2.2. Система команд та їх характеристика
- •2.2.1. Арифметичні і логічні команди
- •Команда add - Скласти без переносу
- •Команда adc - Скласти з переносом
- •Команда sub - відняти без переносу
- •Команда subi - Відняти константу
- •Команда sbc - Відняти з переносом
- •Команда sbci – Відняти константу з переносом
- •Команда and - Виконати логічне “і”
- •Команда andi - Виконати логічне “і” з константою
- •Команда or - Виконати логічне “або”
- •Команда ori - виконати логічне “або” з константою
- •Команда eor - Виконати виключаюче “або”
- •Команда com - Виконати доповнення до одиниці
- •Команда neg - Виконати доповнення до двох
- •Команда sbr - Встановити біти в регістрі
- •Команда cbr - Очистити біти в регістрі
- •Команда inc - Інкрементувати
- •Команда dec - декрементувати
- •Команда tst - Перевірити на нуль або мінус
- •Команда clr - очистити регістр
- •Команда ser - Встановити всі біти регістра
- •Операція
- •2.2.2. Команди розгалуження Команда rjmp – Відносний перехід
- •Операція:
- •Команда rcall – Відносний виклик підпрограми
- •Операція
- •Команда ret - Повернення із підпрограми
- •Операція
- •Команда reti – Повернення із переривання
- •Операція
- •Команда cpse - Порівняти і пропустити, якщо рівні
- •Команда cp - Порівняти
- •Команда cpc – Порівняти з урахуванням переносу
- •Команда cpi – Порівняти з константою
- •Команда sbrc – Пропустити, якщо біт в регістрі очищений
- •Команда sbrs – Пропустити, якщо біт в регістрі встановлений
- •Команда sbic – Пропустити, якщо біт в регістрі вводу-виводу очищений
- •Команда sbis – Пропустити, якщо біт в регістрі вводу-виводу встановлений
- •Команда brbs – Перейти, якщо біт в регістрі статусу встановлений
- •Команда brbc – Перейти, якщо біт в регістрі статусу очищений
- •Команда breq – Перейти, якщо рівно
- •Команда brne – Перейти, якщо не рівно
- •Команда brcs – Перейти, якщо прапорець переносу встановлений
- •Команда brcc – Перейти, якщо прапорець переносу очищений
- •Команда brsh – Перейти, якщо рівно або більше (без знаку)
- •Команда brlo – Перейти, якщо менше (без знаку)
- •Команда brmi – Перейти, якщо мінус
- •Команда brpl – Перейти, якщо плюс
- •Команда brge – Перейти, якщо більше або дорівнює (з урахуванням знаку)
- •Команда brlt – Перейти, якщо менше чим (зі знаком)
- •Команда brhs – Перейти, якщо прапорець половинного переносу встановлений
- •Команда brhc – Перейти, якщо прапорець половинного переносу очищений
- •Команда brts – Перейти, якщо прапорець t встановлений
- •Команда brtc – Перейти, якщо прапорець t очищений
- •Команда brvs – Перейти, якщо переповнення встановлено
- •Команда brvc – Перейти, якщо переповнення очищене
- •Команда brie – Перейти, якщо глобальне переривання дозволене
- •Команда brid – Перейти, якщо глобальне переривання заборонено
- •2.2.3. Команди пересилки Команда ld - Загрузити непрямо з созп в регістр з використанням індексу z
- •Команда st - записати непрямо з регістру в созп з використанням індексу z
- •Команда mov - копіювати регістр
- •Команда ldi - загрузити константу
- •Команда in - Загрузити дані з порту вводу-виводу в регістр
- •Команда out - Записати дані з регістра в порт вводу-виводу
- •Операція:
- •2.2.4. Команди роботи з бітами Команда sbi - Встановити біт в регістр вводу-виводу
- •Команда cbi - Очистити біт в регістрі вводу-виводу
- •Команда lsl - Логічний зсув вліво
- •Команда lsr - Логічний зсув вправо
- •Команда rol - Зсунути вліво через перенос
- •Команда ror - Зсунути вправо через перенос
- •Команда asr - Арифметичний зсув вправо
- •Команда swap - Обмін нібблів місцями
- •Команда bset - Встановити біт в регістрі статусу (sreg)
- •Команда bclr - Очистити біт в регістрі статусу (sreg)
- •Команда bst - Переписати біт із регістра в прапорець t регістра статусу
- •Команда bld - Загрузити вміст t прапорця регістра статусу (sreg) в біт регістра
- •Команда sec - Встановити прапорець переносу
- •Операція
- •Команда clc - Очистити прапорець переносу в регістрі статусу (sreg)
- •Команда sen - Встановити прапорець від’ємного значення
- •Команда cln - Очистити прапорець від’ємного значення в регістрі статусу (sreg)
- •Команда sez - Встановити прапорець нульового значення
- •Операція
- •Команда clz - Очистити прапорець нульового значення
- •Команда sei - Встановити прапорець глобального переривання
- •Операція
- •Команда cli - Очистити прапорець глобального переривання в регістрі статусу (sreg)
- •Команда ses - Встановити прапорець знаку
- •Команда cls - Очистити прапорець знаку
- •Команда sev - Встановити прапорець переповнення
- •Команда clv - Очистити прапорець переповнення
- •Команда set - Встановити прапорець t
- •Команда clt - Очистити t прапорець
- •Команда seh - Встановити прапорець половинного переносу
- •Операція
- •Команда clh - Очистити прапорець половинного переносу в регістрі статусу (sreg)
- •Команда nop - Виконати холосту команду
- •Команда sleep - Встановити режим sleep
- •Команда wdr - Збросити сторожовий таймер
- •2.2.5. Приклади написання програм
- •2.3. Програмні і апартні засоби підтримки розробок для мікроконтролерів avr
- •2.3.1. Стартові набори розроблювача
- •2.3.2. Стартовий набір stk500
- •2.3.3. Плата розширення stk501
- •2.3.4. Плата розширення stk502
- •2.3.5. Плата розширення stk503
- •2.3.6. Плата розширення stk504
- •2.3.7. Внутрісхемний програматор atavrisp
- •2.3.8. Внутрісхемні емуляторы
- •2.3.9. Внутрісхемний емулятор atjtagice mkIi (atjtagice2)
2.2.5. Приклади написання програм
В даному розділі приведено приклади програм для мікроконтролера AT90S1200. Оскільки він являється наймолодшим із серїї AVR, то програми будуть працювати й на інших серіях AVR-контролерів. Слід зазначити, що у AT90S1200 всього 2 порти вводу-виводу (порт В і порт D), один з яких – порт D – неповний. В нього немає старшого (7-го) розряду.
Приклад1. Розробити програму, котра виводить 1-цю на b0 порту В при натисканні кнопки і тримає її значення на протязі 10 секунд.
.device at90s1200
.include "1200def.inc"
ser r16 ; всі біти регістра R16 встановлюються в одиницю
out ddrb,r16 ; налаштовування порту В на вивід
loop: clr r18 ; очистка регістра R18
out portb,r18 ; вивід значення регістра R18 на порт В
sbic pind,0 ; якщо нульовий біт порту D дорівнює 0, то програма пропускає ;наступну команду
rjmp loop ; перехід на початок програми (мітку loop)
ldi r18,1 ; присвоїти регістру R18 константу 1
out portb,r18 ; вивід значення регістра R18 на порт В
rcall Delay ; виклик підпрограми
rjmp loop ; перехід на початок програми (метку loop)
Delay: ; підпрограма затримки на 10 секунд
clr r19 ; очистка регістра R19
clr r21 ; очистка регістра R21
clr r20 ; очистка регістра R20
n1: inc r19 ; інкремент (+1) регістра R19
cpi r19,255 ; порівняння регістра R19 з 255
brne n1 ; якщо R19¹255, то програма переходить на мітку n1
inc r20 ; інкремент (+1) регістра R20
cpi r20,255 ; порівняння регістра R20 з 255
brne n1 ; якщо R20¹255, то програма переходить на мітку n1
inc r21 ; інкремент (+1) регістра R21
cpi r21,160 ; порівняння регістра R21 з 160
brne n1 ; якщо R21¹160, то програма переходить на мітку n1
ret ; повернення із підпрограми в те місце, звідки дана підпрограма ;викликалась
Приклад 2. Зчитати з порту В (біти b0b3) одне двійкове слово, а з порту В (біти b4b7) друге. Виконати операцію логічного “І” над ними і інверсію над результатом. Отриманий результат вивести на біти d3d6 порту D.
.device at90s1200 ;
.include "1200def.inc" ;
ser r16 ; всі біти регістра R16 встановлюються в одиницю
out ddrd,r16 ;налаштування порту D на вивід
loop: in r17,pinb ;ввод даних з порту В в регістр R17
bst r17,0 ; копіювання нульового біта регістра R17 в біт-акумулятор Т регістра ;статусу
bld r18,0 ; загрузка в нульовий біт регістра R18 значення біт-акумулятора
bst r17,1 ; копіювання першого біта регістра R17 в біт-акумулятор
bld r18,1 ; загрузка в перший біт регістра R18 значення біт-акумулятора
bst r17,2 ; копіювання другого біта регістра R17 в біт-акумулятор
bld r18,2 ; загрузка в другий біт регістра R18 значення біт-акумулятора
bst r17,3 ; копіювання третього біта регістра R17 в біт-акумулятор
bld r18,3 ; загрузка в третій біт регістра R18 значення біт-акумулятора
bst r17,4 ; копіювання четвертого біта регістра R17 в біт-акумулятор
bld r19,0 ; загрузка в нульовий біт регістра R19 значення біт-акумулятора
bst r17,5 ; копіювання п’ятого біта регістра R17 в біт-акумулятор
bld r19,1 ; загрузка в перший біт регістра R19 значення біт-акумулятора
bst r17,6 ; копіювання шостого біта регістра R17 в біт-акумулятор
bld r19,2 ; загрузка в другий біт регістра R19 значення біт-акумулятора
bst r17,7 ; копіювання сьомого біта регістра R17 в біт-акумулятор
bld r19,3 ; загрузка в третій біт регістра R19 значення біт-акумулятора
and r18,r19 ;побітова операція логічного “І” над регістрами R18 и R19 (результат ;операції записується в регістр R18)
com r18 ;інвертування регістра R18
bst r18,0 ; копіювання нульового біта регістра R18 в біт-акумулятор
bld r20,3 ; загрузка в третій біт регістра R20 значення біт-акумулятора
bst r18,1 ; копіювання першого біта регістра R18 в біт-акумулятор
bld r20,4 ; загрузка в четвертий біт регістра R20 значення біт-акумулятора
bst r18,2 ; копіювання другого біта регістра R18 в біт-акумулятор
bld r20,5 ; загрузка в п’ятий біт регістра R20 значення біт-акумулятора
bst r18,3 ; копіювання третього біта регістра R18 в біт-акумулятор
bld r20,6 ; загрузка в шостий біт регістра R20 значення біт-акумулятора
out portd,r20 ; вивід значення регістра R20 в порт D
rjmp loop ;перехід на мітку loop (начало програми)
Приклад 3. Розробити програму дешифратора двійкового коду, який подається на біти d0d2 порту D. Вихід дешифратора – біти порту В. Дозволяючим входом буде біт d6 порту D.
.device at90s1200
.include "1200def.inc"
ser r20 ; всі біти регістра R20 встановлюються в одиницю
out ddrb,r20 ;налаштовування порту B на вивід
main:
ldi r21,254 ;присвоїти регістру R21 число 254
out portb,r21 ; вивід значення регістра R21 в порт В
loop:
set ;встановити в одиницю біт-акумулятор Т статус регістра
clr r21 ;очистка регістра R21
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма пропускає
;наступну команду
bld r21,0 ; загрузка в нульовий біт регістра R21 значення біт-акумулятора
sbic pind,1 ;якщо перший біт порту D дорівнює 0, то програма пропускає ;наступну команду
bld r21,1 ; загрузка в перший біт регістра R21 значення біт-акумулятора
sbic pind,2 ;якщо другий біт порту D дорівнює 0, то програма пропускає ;наступну команду
bld r21,2 ; загрузка в другий біт регістра R22 значення біт-акумулятора
sbis pind,6 ;якщо шостий біт порту D дорівнює 1, то програма пропускає ;наступну команду
rjmp m2 ;перехід на мітку m2
out portb,r20 ; вивід значення регістра R20 в порт В
rjmp loop ;перехід на мітку loop
m2:
cpi r21,0 ;порівняння регістра R21 з 0
breq main ;якщо R21=0, то програма переходить на мітку main
cpi r21,1 ; порівняння регістра R21 з 1
breq n1 ; якщо R21=1, то програма переходить на мітку n1
cpi r21,2 ; порівняння регістра R21 з 2
breq n2 ; якщо R21=1, то програма переходить на мітку n2
cpi r21,3 ; порівняння регістра R21 з 3
breq n3 ; якщо R21=1, то програма переходить на мітку n3
cpi r21,4 ; порівняння регістра R21 з 4
breq n4 ; якщо R21=1, то програма переходить на мітку n4
cpi r21,5 ; порівняння регістра R21 з 5
breq n5 ; якщо R21=1, то програма переходить на мітку n5
cpi r21,6 ; порівняння регістра R21 з 6
breq n6 ; якщо R21=1, то програма переходить на мітку n6
cpi r21,7 ; порівняння регістра R21зс 7
breq n7 ; якщо R21=1, то програма переходить на мітку n7
rjmp main ; перехід на мітку main (начало програми)
n1:
ldi r22,253 ; присвоїти регістру R22 число 253
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n2:
ldi r22,251 ; присвоїти регістру R22 число 251
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n3:
ldi r22,247 ; присвоїти регістру R22 число 247
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n4:
ldi r22,239 ; присвоїти регістру R22 число 239
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n5: ldi r22,223 ; присвоїти регістру R22 число 223
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n6: ldi r22,191 ; присвоїти регістру R22 число 191
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop
n7: ldi r22,127 ; присвоїти регістру R22 число 127
out portb,r22 ; вивід значення регістра R22 в порт В
rjmp loop ; перехід на мітку loop