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

Микропроцессорные системы. Методическое пособие по выполнению лабораторных работ

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
880 Кб
Скачать

0x80 – установка курсора в начало первой строки

0x80 + pos – установка курсора в позицию pos (см. пункт 8 на рис. 2). Пример работы с дисплеем:

;аргументы: ;байт в r16

USART_Transmit: ; функция отправки байта через USART sbis UCSRA,UDRE ; ожидание возможности отправки rjmp USART_Transmit

out UDR,r16 nop

ret

;аргументы: ;байт в r16

LCD_Command: ; функция отправки команды LCD дисплею push r16

ldi r16,0xFE

rcall USART_Transmit pop r16

rcall USART_Transmit ret

;настройка LCD ldi r16,0x00

rcall LCD_Command ; инициализация ldi r16,0x01

rcall LCD_Command ; очистка ldi r16,0x80

rcall LCD_Command ; установка курсора в начало первой строки ldi r16,’!’

40

rcall LCD_Command ; на экран будет выведен восклицательный знак.

2. Оборудование рабочего места

Компьютер с установленным пакетом программ PROTEUS VSM.

3.Задание

Соберите схему, соответствующую варианту задания. Напишите программу для микроконтроллера ATmega8. В качестве LCD дисплея используйте MILFORD-2X16-BKP.

Вариант 1.Подключите к котроллеру ATmega8 три кнопки. По нажатию на соответствующие кнопки на LCD выводятся число, месяц, год вашего рождения.

Вариант 2. Подключите к котроллеру ATmega8 две кнопки. Первая кнопка увеличивает значение переменной на единицу, вторая кнопка уменьшает значение переменной на 2. По нажатию кнопки значение переменной выводится на LCD.

Вариант 3. Подключите к котроллеру ATmega8 одну кнопку. По нажатию кнопки последовательно выводятся на LCD числа 1,2,..,9.

Вариант 4. Подключите к котроллеру ATmega8 две кнопки. Первая кнопка выводит на экран Ваш номер телефона, вторая кнопка очищает экран

LCD.

4. Содержание и оформление отчета

Отчет по лабораторной работе оформляется на листах формата А4 и должен содержать:

1.Экранный снимок готовой схемы, собранной в окне программы ISIS.

2.Листинг программы.

3.Выводы по эксперименту.

5.Порядок выполнения работы

1.Соберите схему на основе ATmega8 в соответствии с заданием

(например, как показано на рисунке 3).

41

Рисунок 3 – Пример подключения LCD дисплея кATmega8

2.Напишите программу в соответствии с заданием запустите эмуляцию её выполнения контроллером ATmega8 (см. ниже пример выполнения задания).

3.Убедитесь в корректности работы программы.

Пример выполнения.

Задание: целочисленное деление. Целочисленное деление двух 4х битных чисел (задание в бинарном виде). Числа задаются двумя блоками переключателей. Операция выполняется при любом изменении входных значений. Вывод результата осуществляется в двоичном виде. Произведение вычислений по нажатию кнопки.

Выполнение.

Среди команд арифметических операций контроллера Atmega8 нет команды деления. Потому деление будет производиться циклическим вычитанием делителя из делимого.

Процедура нажатие_кнопки

А = PINB & 0x0F; //делимое B = PINB & 0xF0; //делитель Сдвиг_вправо(B, 4 бита);

C = 0; //счетчик

42

Метка1:

A = A - B;

Если A < 0

Переход Метка2

C = C + 1

Если A != 0

Переход Метка 1

Метка2:

PORTC = C & 0x0F

Определим набор необходимых инструкций (см. табл.1) Таблица 1– Возможные настройки условий для INT1

ANDI

Rd, K

Logical AND Register and Constant

 

 

 

LSR

Rd

Shift Right

 

Logical

 

 

 

 

LDI

Rd, K

Load Immediate

 

 

 

SUB

Rd, Rr

Subtract two Registers

 

 

 

CPI

Rd,K

Compare Register with Immediate

 

 

 

BRLT

k

Branch if Less Than Zero, Signed

 

 

 

Ниже приведена программа, реализующая данный пример.

.include "m8def.inc"

;аргументы:

.dseg ; сегмент данных

;байт в r16

resultStr: .byte 4

USART_Transmit:

.cseg ; сегмент кода

sbis UCSRA,UDRE; ожидание

.org 0

возможности отправки

rjmp init

rjmp USART_Transmit

 

out UDR,r16

.org INT0addr

nop

rjmp INT0_IRQ

ret

.org SPMRaddr+2

;аргументы:

 

43

;байт в r16 LCD_Command:

push r16 ldi r16,0xFE

rcall USART_Transmit pop r16

rcall USART_Transmit ret

;аргументы:

;байт в r16 LCD_Print_Int:

push r16 push r17

ldi XH,high(resultStr) ldi XL,low(resultStr)

adiw XH:XL,4 ; последний символ строки

ldi r17, 0x00 st X,r17

LCD_Print_Int_ToStrLoop:

ldi r17, 0x0A ;

основание системы счисления = 10 rcall IntDiv

;r18 = r16 div 10 ;r19 = r16 mod 10 mov r16, r18

ldi r20, 0x30 ; код нуля add r19, r20

st -X,r19 ;ST X, Rr Store

Indirect

cpi r18, 0x00 brne

LCD_Print_Int_ToStrLoop ldi r16,0x01

rcall LCD_Command ldi r16,0x80

rcall LCD_Command cpi r23,0x01 ; проверка

флага ошибок brne

LCD_Print_Int_PrintLoop

ldi r16,'E' ; если ошибка вычислений

ldi r23, 0x00

rcall USART_Transmit; rjmp LCD_Print_Int_Exit

LCD_Print_Int_PrintLoop: ld r16,X+

cpi r16,0x00

breq LCD_Print_Int_Exit rcall USART_Transmit; rjmp

LCD_Print_Int_PrintLoop LCD_Print_Int_Exit:

pop r17 pop r16 ret

;аргументы: ;байт а в r16

44

;байт b в r17

add r19,r17

;результат:

IntDiv_Error:

;байт div в r18

pop r17

;байт mod в r19

pop r16

IntDiv:

ret

push r16

;Interrupts

push r17

INT0_IRQ: ; нажатие на кнопку

cpi r17,0

push r16

brne IntDiv_Ok ; деление на

push r17

ноль

push r18

ldi r18,0x00

nop

ldi r19,0x00

in r16,PINB ; загрузить PINB

ldi r23,0x01 ; код ошибки

andi r16,0x0F ; младшую

rjmp IntDiv_Error

часть (A)

IntDiv_Ok:

nop

ldi r18,0 ; счетчик (C)

in r17,PINB ; загрузить PINB

IntDiv_LOOP: ; метка 1

andi r17,0xF0 ; старшую часть

sub r16,r17 ; вычитание A = A

(B)

- B

lsr r17 ; сдвиг на 4 вправо

cpi r16,0 ; сравнить с

lsr r17

константой

lsr r17

brlt IntDiv_OUT ; если

lsr r17

меньше нуля - Метка 2

rcall IntDiv

inc r18 ; увеличить счетчик на

andi r18,0x0F

1

mov r16,r18

cpi r16,0 ; сравнить с нулем

rcall LCD_Print_Int ; вывод на

brne IntDiv_LOOP ; если не

LCD

ноль - Метка 1

pop r18

IntDiv_OUT: ; Метка 2

pop r17

mov r19,r16

pop r16

 

45

reti

 

out MCUCR,r16

 

;Initialization

ldi r16,0x40

 

init:

 

out GICR,r16

 

cli ;прерывания выключены

out GIFR,r16

 

;настройка указателя стека

;настройка USART

 

ldi

r16,0x5F

ldi r16,51

 

out

SPL, r16

ldi r17,0x00

 

ldi

r16, 0x04

;

настройка

скорости

out

SPH, r16

передачи данных

 

 

; настройка PORTB

out UBRRH, r17

 

ldi r16,0x00

out UBRRL, r16

 

out DDRB,r16

;

 

включение

ldi r16,0xFF ;

приемопередатчика

 

out PORTB,r16

ldi

 

r16,

nop

 

(1<<RXEN)|(1<<TXEN)

 

;настройка PORTC

out UCSRB,r16

 

ldi r16,0x0F

; установка формата кадра:

out DDRC,r16

8data, 2stop bit

 

ldi r16,0x00

ldi

 

r16,

out PORTC,r16

(1<<URSEL)|(3<<UCSZ0)

nop

 

out UCSRC,r16

 

;настройка PORTD

;настройка LCD

 

ldi r16,0x02

ldi r16,0x01

 

out DDRD,r16

rcall LCD_Command

ldi r16,0x04

ldi r16,0x80

 

out PORTD,r16

rcall LCD_Command

nop

 

sei ;прерывания включены

;настройка INT0

loop: ;основной цикл

 

ldi r16,0x02

rjmp loop

 

 

 

 

46

 

 

6.Контрольные вопросы

7.Назначение, принцип работы UART.

8.Структура информационного потока UART.

9.Структура и назначение регистра MCUCR.

10.Система команд дисплея MILFORD-2X16-BKP.

11.Возможные настройки условий для INT1.

47

Список используемой литературы

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

2.Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega

фирмы «Atmel». М.: Додэка-XXI, 2008, 558 с.

3.Дхананья Гадре, Нигул Мэлхотра. Занимательные проекты на базе микроконтроллеров tinyAVR. СПб.: БХВ – Санкт-Петербург, 2012, 338 с.

4.Прокопенко В. С. Программирование микроконтроллеров ATMEL на языке С М: МК-Пресс 2012, с. 394.

5.Компания ATMEL: [Электронный ресурс]. URL: http://www.atmel.com/ru/ru/. (Дата обращения: 18.05.2014).

48

Приложение 1 – Система команд процессоров AVR

Mnemonics

Operands

Description

Operation

Flags

#Clock

 

 

 

 

 

Note

 

 

Arithmetic and Logic Instructions

 

 

ADD

Rd, Rr

сложить без переноса

Rd <r- Rd + Rr

Z,C,N,V,S

1

 

 

 

 

,H

 

ADC

Rd, Rr

сложить с переносом

Rd <r- Rd + Rr + С

Z,C,N,V,S

1

 

 

 

 

,H

 

ADIW

Rd, К

сложить

Rd+1:Rd<-Rd+1:Rd + K

Z,C,N,V,S

2 0)

 

 

непосредственное

 

 

 

 

 

значение со словом

 

 

 

SUB

Rd, Rr

вычесть без переноса

Rd <- Rd - Rr

Z,C,N,V,S

1

 

 

 

 

,H

 

SUBI

Rd, К

вычесть непосредственное

Rd <- Rd - К

Z,C,N,V,S

1

 

 

значение

 

,H

 

SBC

Rd, Rr

вычесть с переносом

Rd <- Rd - Rr - С

Z,C,N,V,S

1

 

 

 

 

,H

 

SBCI

Rd, К

вычесть непосредственное

Rd <- Rd - К - С

Z,C,N,V,S

1

 

 

значение с переносом

 

,H

 

SBIW

Rd, К

вычесть непосредственное

Rd+1:Rd<-Rd+1:Rd-K

Z,C,N,V,S

2 0)

 

 

значение из слова

 

 

 

AND

Rd, Rr

выполнить логическое

Rd <r- Rd • Rr

Z,N,V,S

1

 

 

AND

 

 

 

ANDI

Rd, К

выполнить логическое

Rd <- Rd•К

Z,N,V,S

1

 

 

AND c непосредственным

 

 

 

 

 

значением

 

 

 

OR

Rd, Rr

выполнить логическое OR

Rd <r- Rd v Rr

Z,N,V,S

1

ORI

Rd, К

логическое OR с

Rd <- Rd v К

Z,N,V,S

1

 

 

константой

 

 

 

EOR

Rd, Rr

выполнить исключающее

Rd <r- Rd Ф Rr

Z,N,V,S

1

 

 

OR

 

 

 

COM

Rd

выполнить дополнение до

Rd <- $FF - Rd

Z,C,N,V,S

1

 

 

единицы

 

 

 

NEG

Rd

выполнить дополнение до

Rd <- $00 - Rd

Z,C,N,V,S

1

 

 

двух

 

,H

 

SBR

Rd,K

установить биты в

Rd <- Rd v К

Z,N,V,S

1

 

 

регистре

 

 

 

CBR

Rd,K

oчистить биты в регистре

Rd <- Rd • ($FFh - K)

Z,N,V,S

1

INC

Rd

инкрементировать

Rd <- Rd + 1

Z,N,V,S

1

DEC

Rd

декрементировать

Rd <- Rd-1

Z,N,V,S

1

TST

Rd

проверить на ноль или

Rd <- Rd • Rd

Z,N,V,S

1

 

 

минус

 

 

 

CLR

Rd

oчистить регистр

Rd <- Rd Ф Rd

Z,N,V,S

1

SER

Rd

установить все биты

Rd <- $FF

None

1

 

 

регистра

 

 

 

MUL

Rd,Rr

перемножить

R1:R0<-RdxRr(UU)

z,c

2 0)

MULS

Rd,Rr

умножение со знаком

R1:R0<-RdxRr(SS)

z,c

2 0)

MULSU

Rd,Rr

умножение знакового с

R1:R0<-RdxRr(SU)

z,c

20)

 

 

незнаковым

 

 

 

 

 

49

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]