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

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

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

прерывания необходимо установить условия срабатывания прерывания, для этого предназначен регистр MCUCR (MCU Control Register).

 

 

Рисунок 3 - Структура регистра MCUCR

Таблица 2 – Возможные настройки условий для INT0

 

 

 

 

ISC01

ISC00

 

Комментарий

 

 

 

 

0

0

 

Низкий уровень на INT0

 

 

 

 

0

1

 

Любое изменение логического уровня на INT0

 

 

 

 

1

0

 

Падение уровня на INT0

 

 

 

 

1

1

 

Рост уровня на INT0

 

 

 

Таблица 3 – Возможные настройки условий для INT1

 

 

 

 

ISC11

ISC10

 

Комментарий

 

 

 

 

0

0

 

Низкий уровень на INT1

 

 

 

 

0

1

 

Любое изменение логического уровня на INT1

 

 

 

 

1

0

 

Падение уровня на INT1

 

 

 

 

1

1

 

Рост уровня на INT1

 

 

 

 

Следующим шагом необходимо установить биты требуемых внешних прерываний в регистре GICR. После этого, прерывание будет срабатывать при указанных в регистре MCUCR условиях.

Рисунок 4 - Структура регистра GICR

30

При срабатывании прерывания в регистре GIFR будет устанавливаться соответствующий бит.

Пример настройки прерывания для обработки нажатия двух кнопок:

; настройка INT0, INT1 ldi r16,0x0A

out MCUCR,r16 ldi r16,0xC0 out GICR,r16

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

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

3. Задание

Соберите схему, соответствующую заданию. Напишите программу для микроконтроллера ATmega8.

Вариант 1. Светофор. Проект должен симулировать работу светофора (Последовательное включение светодиодов разных цветов).

Вариант 2. Бинарный счетчик по таймеру. Разработать простой таймер. Текущее число выводится в двоичном виде (0001, 0010, 0011 …). По достижению максимума таймер должен обнулиться.

Вариант 3. Бинарный счетчик по нажатию. Разработать счетчик нажатий. Текущее число выводится в двоичном виде (0001, 0010, 0011 …) и увеличивается на 1 с каждым нажатием. По достижению максимума счетчик должен остановиться. Для реакции на нажатие использовать внешние прерывания.

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

Вариант 5. Вычитание. Вычитание двух 4х битных чисел (задание в бинарном виде). Числа задаются двумя блоками переключателей.

31

Операция выполняется при нажатии на кнопку. Для реакции на нажатие использовать внешние прерывания.

Вариант 6. Умножение. Умножение двух 4х битных чисел (задание в бинарном виде). Числа задаются двумя блоками переключателей. Операция выполняется при нажатии на кнопку. Для реакции на нажатие использовать внешние прерывания.

Вариант 7. Бегущие огни. Светодиоды (8 шт.) загораются последовательно. По достижении последнего, цикл повторяется с первого светодиода. Для реакции на нажатие использовать внешние прерывания.

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

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

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

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

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

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

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

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

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

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

Выполнение.

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

32

вычитанием делителя из делимого. Все материалы можно найти в приложении.

Начнем с написания псевдокода.

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

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

C = 0; //счетчик Метка1:

A = A - B;

Если A < 0

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

C = C + 1

Если A != 0

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

Метка2:

PORTC = C & 0x0F

Теперь определимся с набором необходимых инструкций. Для этого откроем страницу 289 документации к ATmega8.

Таблица 4– Возможные настройки условий для 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

 

 

 

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

33

.include "m8def.inc"

INT0_IRQ_EXIT:

 

reti

 

.dseg

 

 

 

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

.cseg

включения/выключения таймера

.org 0

push r16

rjmp init

in r16,TIMSK

 

sbrc r16,0

; таблица векторов прерываний

rjmp INT1_IRQ_RESET

.org INT0addr

sbr r16,0x01

rjmp INT0_IRQ

rjmp INT1_IRQ_EXIT

 

INT1_IRQ_RESET:

.org INT1addr

andi r16,0xFE

rjmp INT1_IRQ

INT1_IRQ_EXIT:

 

out TIMSK,r16

.org OVF0addr

pop r16

rjmp TIM0_OVF

reti

 

.org SPMRaddr+2

TIM0_OVF: ; прерывание по

 

таймеру

 

;прерывания

rcall INT0_IRQ

 

reti

 

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

 

 

переключения диодов

;инициализация

lsl r17 ; сдвинуть влево

 

 

cpi r17,0x10 ; если вышли за

init:

 

границу первой тетрады

cli

 

brlt INT0_IRQ_EXIT

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

ldi r17,0x01 ; вернуть бит в

ldi

r16,0x5F

первую тетраду

out

SPL, r16

 

34

 

ldi

r16, 0x04

;настройка INT0, INT1

out

SPH, r16

ldi r16,0x0A

 

 

out MCUCR,r16

; настройка PORTB

ldi r16,0xC0

ldi r16,0x00

out GICR,r16

out DDRB,r16

 

 

ldi r16,0xFF

;TIM0 настройка на 1MHz

out PORTB,r16

ldi

r16,0x00

nop

 

out

TCNT0,r16

 

 

ldi r16,0x05

;настройка PORTC

out TCCR0,r16

ldi r16,0x0F

ldi

r16,0x01

out DDRC,r16

out

TIMSK,r16

ldi r16,0x00

 

 

out PORTC,r16

;переменные

nop

 

ldi r17,0x01

;настройка PORTD

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

ldi r16,0x00

 

 

out DDRD,r16

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

ldi r16,0x0C

out PORTC,r17 ; вывод бита

out PORTD,r16

rjmp loop

 

nop

 

 

 

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

1.Структура и назначение регистра TIMSK.

2.Структура и назначение регистра GICR.

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

4.Структура и назначение регистра TCCR0.

35

5. Возможные настройки таймера.

36

Лабораторная работа №5

Исследование работы порта UART микроконтроллера ATmega8 Цель работы: изучение приемов программирования микроконтроллера ATmega8 при взаимодействии с внешними

устройствами через порт UART. 1. Краткие сведения из теории

Универсальный

асинхронный

приёмопередатчик (УАПП, англ.

Universal

Asynchronous

Receiver-Transmitter (UART)) —

узел

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

UART представляет собой логическую схему, с одной стороны подключённую к шине вычислительного устройства, а с другой имеющую два или более выводов для внешнего соединения.

UART может представлять собой отдельную микросхему или являться частью большой интегральной схемы. Используется для передачи данных через последовательный порт компьютера, часто встраивается в микроконтроллеры.

Передача данных в UART осуществляется по одному биту в равные промежутки времени. Этот временной промежуток определяется заданной скоростью UART и для конкретного соединения указывается в бодах (что в данном случае соответствует битам в секунду). Существует общепринятый ряд стандартных скоростей: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод.

Помимо собственно информационного потока UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты, а также биты проверки на четность/нечетность. При приёме

37

эти лишние биты удаляются из потока. Обычно полезная информация передается байтами (8 бит), однако встречаются реализации UART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Могут вставляться два стоповых бита вместо одного, что делается для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии (рис.1).

Рисунок 1- Структура информационного потока UART

Рассмотрим настройку контроллера Atmega8 для работы по USART на примере управления LCD дисплеем:

1.Настройка ldi r16,51 ldi r17,0x00

;настройка скорости передачи данных out UBRRH, r17

out UBRRL, r16

;включение приемопередатчика

ldi r16, (1<<RXEN)|(1<<TXEN) out UCSRB,r16

; установка формата кадра: 8 data, 2 stop bit ldi r16, (1<<URSEL)|(3<<UCSZ0)

out UCSRC,r16

2.Передача

USART_Transmit:

38

sbis UCSRA,UDRE rjmp USART_Transmit out UDR,r16

ret

В лабораторной работе будем использовать текстовые дисплеи, управляемыми по UART, например, дисплей MILFORD-2X16-BKP. Он прост в управлении и имеется в библиотеке компонентов среды Proteus. Дисплей управляется командами. Для того, что бы отличить команду от текста перед командой отправляется байт со значением 0xFE (11111110). После получения этого байта, дисплей ожидает команду в следующем байте. Система команд дисплея приведена на рисунке 2.

Рисунок 2 – Система команд дисплея MILFORD-2X16-BKP

В рамках лабораторной работы потребуются только команды инициализации, очистки и установки курсора:

0x00 – инициализация дисплея.

0x01 – очистка дисплея.

39

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