Микропроцессорные системы. Методическое пособие по выполнению лабораторных работ
.pdf
прерывания необходимо установить условия срабатывания прерывания, для этого предназначен регистр 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
