Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab2 / Лабораторная работа №2

.docx
Скачиваний:
9
Добавлен:
27.03.2016
Размер:
110.15 Кб
Скачать

Лабораторная работа №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

;------------------------------------------------------------------

Индивидуальное задание

Раздается преподавателем в соответствии с номером варианта.

Список литературы

  1. ATmega8535 Data Sheet. Atmel Corporation, 2004.

  2. Евстифеев А. В., Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, 5-е изд., стер. — М.: Издательский дом «Додэка-XXI», 2008. — 560 с.

  3. Ревич Ю.В., Практическое программирование МК Atmel AVR на языке ассемблера – СПб.: БХВ-Петербург, 2008. – 384 с.: ил.

  4. Описание макета к лабораторной работе №2.

12