Микропроцессорные системы. Методическое пособие по выполнению лабораторных работ
.pdf0x80 – установка курсора в начало первой строки
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 |
|
|
|
