Lab2 / Лабораторная работа №2
.docxЛабораторная работа №2
Введение
ATmega8535 – 8‑битный микроконтроллер архитектуры AVR с RISC системой команд, обладающий 8К слов флэш-памяти программ, 512 байт EEPROM и 512 байт SRAM. Встроенная периферия включает 4 8-разрядных порта ввода/вывода, 3 таймера-счетчика с режимами сравнения, захвата и широтно-импульсной модуляции, 8-канальный 10-разрядный АЦП, блоки приемопередатчиков USART и SPI, компаратор напряжений, сторожевой таймер и т.д. Полное описание архитектуры и принципов работы МК дано в [1, 2, 3].
Схема лабораторного макета приведена на рис.1. Макет состоит из микроконтроллера AVR ATmega8535 и подключенных к нему устройств ввода/вывода, датчиков и портов для связи с ПК. Подробное описание макета и датчиков см. [4].
Макет питается от источника стабилизированного напряжения +5 В. Тактовая частота МК задается встроенным тактовым генератором с регулируемой частотой, по умолчанию равной 1 МГц. Также возможно тактирование от внешнего кварцевого резонатора, подключенного к выводам XTAL1 и XTAL2. Программирование МК осуществляется программатором AVRISP mkll по интерфейсу USB.
Рисунок 1. Схема лабораторного макета
Задание 1
Пример программы управления светодиодом от кнопки клавиатуры «1».
Файл diode.asm:
.include "m8535def.inc"
;------------------------------------------------------------------
.def Acc0 = r20
.def Acc1 = r21
;------------------------------------------------------------------
.org 0
rjmp RESET ; Reset Handler
reti ;EXT_INT0 ; IRQ0 Handler
reti ;EXT_INT1 ; IRQ1 Handler
reti ;TIM2_COMP ; Timer2 Compare Handler
reti ;TIM2_OVF ; Timer2 Overflow Handler
reti ;TIM1_CAPT ; Timer1 Capture Handler
reti ;TIM1_COMPA ; Timer1 Compare A Handler
reti ;TIM1_COMPB ; Timer1 Compare B Handler
reti ;TIM1_OVF ; Timer1 Overflow Handler
reti ;TIM0_OVF ; Timer0 Overflow Handler
reti ;SPI_STC ; SPI Transfer Complete Handler
reti ;USART_RXC ; USART RX Complete Handler
reti ;USART_UDRE ; UDR Empty Handler
reti ;USART_TXC ; USART TX Complete Handler
reti ;ADC ; ADC Conversion Complete Handler
reti ;EE_RDY ; EEPROM Ready Handler
reti ;ANA_COMP ; Analog Comparator Handler
reti ;TWSI ; Two-wire Serial Interface Handler
reti ;EXT_INT2 ; IRQ2 Handler
reti ;TIM0_COMP ; Timer0 Compare Handler
reti ;SPM_RDY ; Store Program Memory Ready Handler
;------------------------------------------------------------------
RESET:
ldi r16,high(RAMEND) ; Main program start
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
cli ; Disable interrupts
rcall Init_Ports
Main_Loop:
cbi PORTB,4
nop
sbic PIND,5
rjmp KEY1_NOT_PRESSED
rjmp KEY1_PRESSED
KEY1_NOT_PRESSED:
sbi PORTB,3
rjmp Main_Loop
KEY1_PRESSED:
cbi PORTB,3
rjmp Main_Loop
;------------------------------------------------------------------
Init_Ports:
ldi Acc0, 0xF8
out DDRB, Acc0
ldi Acc0, 0x00
out DDRD, Acc0
ldi Acc0, 0x03
out DDRC, Acc0
sbi PORTB,3
sbi PORTB,4
sbi PORTB,5
sbi PORTB,6
sbi PORTB,7
ret
;------------------------------------------------------------------
Задание 2
Пример программы опроса клавиатуры и управления светодиодом.
Файл klava.asm:
.include "m8535def.inc"
;------------------------------------------------------------------
.def Acc0 = r20
.def Acc1 = r21
.def clava_state = r22
;------------------------------------------------------------------
.org 0
rjmp RESET
;------------------------------------------------------------------
.org 20
RESET:
ldi Acc0, LOW(RAMEND) ;init stack
out SPL, Acc0
ldi Acc0, HIGH(RAMEND)
out SPH, Acc0
cli
rcall Init_Ports
Main_Loop:
rcall Read_Keyboard
ldi Acc0, 5
cp clava_state, Acc0
brne DIOD_OFF
cbi PORTB,3
rjmp Main_Loop
DIOD_OFF:
sbi PORTB,3
rjmp Main_Loop
;------------------------------------------------------------------
Read_Keyboard:
sbi PORTB,3
sbi PORTB,4
sbi PORTB,5
sbi PORTB,6
sbi PORTB,7
cbi PORTB, 4
nop
sbis PIND, 5
rjmp KEY_PRESSED_1
sbis PIND, 6
rjmp KEY_PRESSED_2
sbis PIND, 7
rjmp KEY_PRESSED_3
sbi PORTB, 4
cbi PORTB, 5
nop
sbis PIND, 5
rjmp KEY_PRESSED_4
sbis PIND, 6
rjmp KEY_PRESSED_5
sbis PIND, 7
rjmp KEY_PRESSED_6
sbi PORTB, 5
cbi PORTB, 6
nop
sbis PIND, 5
rjmp KEY_PRESSED_7
sbis PIND, 6
rjmp KEY_PRESSED_8
sbis PIND, 7
rjmp KEY_PRESSED_9
sbi PORTB, 6
cbi PORTB, 7
nop
sbis PIND, 5
rjmp KEY_PRESSED_STAR
sbis PIND, 6
rjmp KEY_PRESSED_0
sbis PIND, 7
rjmp KEY_PRESSED_SHARP
sbi PORTB, 7
ldi clava_state, 255 ;no key pressed
ret
KEY_PRESSED_1:
ldi clava_state, 1
ret
KEY_PRESSED_2:
ldi clava_state, 2
ret
KEY_PRESSED_3:
ldi clava_state, 3
ret
KEY_PRESSED_4:
ldi clava_state, 4
ret
KEY_PRESSED_5:
ldi clava_state, 5
ret
KEY_PRESSED_6:
ldi clava_state, 6
ret
KEY_PRESSED_7:
ldi clava_state, 7
ret
KEY_PRESSED_8:
ldi clava_state, 8
ret
KEY_PRESSED_9:
ldi clava_state, 9
ret
KEY_PRESSED_STAR:
ldi clava_state, 10
ret
KEY_PRESSED_0:
ldi clava_state, 0
ret
KEY_PRESSED_SHARP:
ldi clava_state, 11
ret
;------------------------------------------------------------------
Init_Ports:
ldi Acc0, 0xF8
out DDRB, Acc0
ldi Acc0, 0x00
out DDRD, Acc0
ldi Acc0, 0x03
out DDRC, Acc0
sbi PORTB,3
sbi PORTB,4
sbi PORTB,5
sbi PORTB,6
sbi PORTB,7
ret
;------------------------------------------------------------------
Задание 3
Пример программы опроса клавиатуры и вывода кода на индикатор.
Файл indicator.asm:
.include "m8535def.inc"
;------------------------------------------------------------------
.def Acc0 = r20
.def Acc1 = r21
.def clava_state = r22
.def old_clava_state = r23
.def indicator_byte = r24
;------------------------------------------------------------------
.org 0
rjmp RESET
;------------------------------------------------------------------
.org 20
RESET:
ldi Acc0, LOW(RAMEND) ;init stack
out SPL, Acc0
ldi Acc0, HIGH(RAMEND)
out SPH, Acc0
cli
rcall Init_Ports
ldi old_clava_state, 255
rcall Init_Indicator
Main_Loop:
rcall Read_Keyboard
cp clava_state, old_clava_state
breq Main_Loop
ldi Acc0, 255 ;if new state
mov old_clava_state, clava_state
cp clava_state, Acc0
breq Main_Loop
mov indicator_byte, clava_state ;if key pressed
rcall Indicator
rjmp Main_Loop
;------------------------------------------------------------------
Indicator:
ldi Acc0, 8
ldi Acc1, 0
Indicator_loop:
inc Acc1
lsl indicator_byte
brcs SetOne
SetZero:
cbi PORTC,1
nop
rjmp Strobe
SetOne:
sbi PORTC,1
nop
Strobe:
sbi PORTC,0
nop
cbi PORTC,0
nop
cp Acc1, Acc0
brne Indicator_loop
ret
;------------------------------------------------------------------
Read_Keyboard:
sbi PORTB,3
sbi PORTB,4
sbi PORTB,5
sbi PORTB,6
sbi PORTB,7
cbi PORTB, 4
nop
sbis PIND, 5
rjmp KEY_PRESSED_1
sbis PIND, 6
rjmp KEY_PRESSED_2
sbis PIND, 7
rjmp KEY_PRESSED_3
sbi PORTB, 4
cbi PORTB, 5
nop
sbis PIND, 5
rjmp KEY_PRESSED_4
sbis PIND, 6
rjmp KEY_PRESSED_5
sbis PIND, 7
rjmp KEY_PRESSED_6
sbi PORTB, 5
cbi PORTB, 6
nop
sbis PIND, 5
rjmp KEY_PRESSED_7
sbis PIND, 6
rjmp KEY_PRESSED_8
sbis PIND, 7
rjmp KEY_PRESSED_9
sbi PORTB, 6
cbi PORTB, 7
nop
sbis PIND, 5
rjmp KEY_PRESSED_STAR
sbis PIND, 6
rjmp KEY_PRESSED_0
sbis PIND, 7
rjmp KEY_PRESSED_SHARP
sbi PORTB, 7
ldi clava_state, 255 ;no key pressed
ret
KEY_PRESSED_1:
ldi clava_state, 0xF9
ret
KEY_PRESSED_2:
ldi clava_state, 0xA4
ret
KEY_PRESSED_3:
ldi clava_state, 0xB0
ret
KEY_PRESSED_4:
ldi clava_state, 0x99
ret
KEY_PRESSED_5:
ldi clava_state, 0x92
ret
KEY_PRESSED_6:
ldi clava_state, 0x82
ret
KEY_PRESSED_7:
ldi clava_state, 0xF8
ret
KEY_PRESSED_8:
ldi clava_state, 0x80
ret
KEY_PRESSED_9:
ldi clava_state, 0x90
ret
KEY_PRESSED_STAR:
ldi clava_state, 0x7F
ret
KEY_PRESSED_0:
ldi clava_state, 0xC0
ret
KEY_PRESSED_SHARP:
ldi clava_state, 0xBF
ret
;------------------------------------------------------------------
Init_Ports:
ldi Acc0, 0xF8
out DDRB, Acc0
ldi Acc0, 0x00
out DDRD, Acc0
ldi Acc0, 0x03
out DDRC, Acc0
sbi PORTB,3
sbi PORTB,4
sbi PORTB,5
sbi PORTB,6
sbi PORTB,7
ret
;------------------------------------------------------------------
Init_Indicator:
ldi indicator_byte, 255
rcall Indicator
ldi indicator_byte, 255
rcall Indicator
ldi indicator_byte, 255
rcall Indicator
ldi indicator_byte, 255
rcall Indicator
ret
;------------------------------------------------------------------
Индивидуальное задание
Раздается преподавателем в соответствии с номером варианта.
Список литературы
-
ATmega8535 Data Sheet. Atmel Corporation, 2004.
-
Евстифеев А. В., Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, 5-е изд., стер. — М.: Издательский дом «Додэка-XXI», 2008. — 560 с.
-
Ревич Ю.В., Практическое программирование МК Atmel AVR на языке ассемблера – СПб.: БХВ-Петербург, 2008. – 384 с.: ил.
-
Описание макета к лабораторной работе №2.