1. Реализовать последовательное формирование свечения цифры 3 на индикаторе HG1. При подаче питания и нажатии на кнопку SB6 «Сброс» все светодиоды и индикаторы погашены. При включении тумблера SA1 включаются сегменты индикатора HG1 в последовательности a, b, c, d, g. После чего раздается щелчок звукогенератора HA1. На индикаторе горит цифра 3. При отключении тумблера SA1 гаснут сегменты индикатора HG1 в последовательности g, d, c, b, a. Включение тумблера SA2 изменяет темп формирования цифры 3.
2. Организовать счет числа нажатий кнопки SB4. При подаче питания и нажатии кнопки SB6 «Сброс» все светодиоды и индикаторы погашены. При каждом очередном нажатии кнопки SB4 число увеличивается. После 10 нажатий кнопки загорается светодиод VD4, на индикаторе HG1 загорается цифра 1 и раздается щелчок звукогенератора HA1. После второго десятка нажатий кнопки дополнительно загорается светодиод VD5, на индикаторе загорается цифра 2 и раздается щелчок звукогенератора. Дальнейшие нажатия кнопки SB4 не меняют состояния схемы. Нажатие кнопки SB5 гасит все светодиоды и индикатор и схема приходят в исходное состояние.
3. Организовать счет числа нажатий кнопок SB4 и SB5. При подаче питания и нажатии кнопки SB6 «Сброс» на индикаторах HG2 и HG1 горит число 00. При каждом очередном нажатии на кнопку SB4 число на индикаторах увеличивается на единицу. Счет возможен до 20. Если счет достиг числа 20, то дальнейшие нажатия кнопки SB4 число не меняют. При каждом очередном нажатии на кнопку SB5 число на индикаторах уменьшается на единицу. При достижении числа 00 дальнейшие нажатия кнопки SB5 не влияют на схему. Нажатие кнопки SB1 обнуляет индикаторы.
4. Организовать «бегущий» огонь по сегментам семисегментных индикаторов HG1 и HG2. При «беге» по часовой стрелке чередование сегментов следующее: a, b, c, d, e, f, a, b…и так далее. При включенном тумблере SA1 реализуется «бегущий» огонь по часовой стрелке, при отключенном – против часовой стрелки. При включенном тумблере SA2 «бегущий» огонь реализуется по сегментам индикатора HG1, при отключенном – по сегментам индикатора HG2.
5. Реализовать на микроконтроллере схему управления светофором. При включении тумблера SA1 светофор работает в дневном режиме, то есть чередование сигналов следующее: зеленый (VD4), желтый (VD5), красный (VD6), желтый, зеленый, желтый и так далее. При отключении тумблера SA1 светофор работает в ночном режиме, то есть мигает желтый светодиод VD5. В дневном режиме работы на индикаторе HG1 горит буква «d», в ночном режиме – буква «H».
6. При подаче питания и нажатии на кнопку SB6 «Сброс» загорается светодиод VD4, а на индикаторах HG1 и HG2 горит число 04, то есть номер светодиода. При нажатии и отпускании кнопки SB2 светодиод VD4 гаснет, а VD5 загорается, то есть происходит сдвиг свечения вправо. На индикаторах загорается число 05. При каждом очередном нажатии на кнопку SB2 свечение сдвигается вправо, то есть наблюдается свечение VD4, VD5,VD6, VD4,VD5… и так далее. При этом на индикаторах высвечиваются соответственно числа 04, 05, 06, 04, 05… и так далее. При нажатии и отпускании кнопки SB3 схема работает аналогично, но сдвиг свечения происходит влево.
7. При подаче питания и нажатии кнопки SB6 «Сброс» загораются светодиоды VD4 и VD6 и на индикаторах HG1 и HG2 соответственно горят цифры 4 и 6. При нажатии и удержании кнопки SB2 светодиоды VD4 и VD6 гаснут, загорается светодиод VD5, и на индикаторах HG1 и HG2 соответственно загораются цифры 0 и 5. При отпускании кнопки SB2 схема приходит в исходное состояние.
8. При подаче питания и нажатии кнопки SB6 «Сброс» на индикаторах HG1 и HG2 загораются соответственно цифры 7 и 5. При нажатии и отпускании кнопки SB2 на индикаторах загораются цифры 5 и 7 и включаются светодиоды VD4 и VD6. При нажатии и удержании кнопки SB3 все индикаторы и светодиоды гаснут, при отпускании возобновляется горение, как после нажатия кнопки SB6 «Сброс».
ЛАБОРАТОРНАЯ РАБОТА № 4. СИСТЕМА ВНЕШНИХ ПРЕРЫВАНИЙ МИКРОКОНТРОЛЛЕРА
Цель работы
Изучить организацию прерываний в микроконтроллере AT90S8535 и обслуживание подсистемы внешних прерываний
Пояснения к работе
Микроконтроллер AT90S8535 использует 17 источников прерывания. Эти прерывания располагают отдельными векторами в пространстве памяти программ. Каждому прерыванию присвоен свой бит разрешения, который должен быть установлен совместно с битом I регистра статуса SREG.
Младшие адреса пространства памяти автоматически определяются как векторы сброса и прерываний.
Полный перечень векторов прерывания представлен в таблице 11.1.
Таблица 11.1. Векторы прерывания
№ вектора
Адрес вектора
Причина
Формулировка прерываний
$000
RESET
Сброс по выводу RESET и сторожевому таймеру
(Hardware Pin, Power-On Reset и Watchdog Reset)
Прерывания с младшими адресами имеют больший уровень приоритета. RESET имеет наивысший уровень приоритета, следующим являются запрос внешнего прерывания INT0 и т. д.
Микроконтроллеры AT90S8535 содержат специальный восьмиразрядный регистр масок внешних прерываний.
Биты 7 и 6―INT1, INT0:Разрешение внешних прерываний соответственно INT1 и INT0. При установленных битах INT1, INT0 и установленном бите I регистра статуса (SREG) разрешаются прерывания по соответствующим выводам внешних прерываний.
Биты 5―0: Зарезервированные биты. Эти при считывании всегда покажут состояние 0.
Активизация выводов INT1 и INT0 вызывает запрос прерывания, если даже эти выводы будут разрешены как выход.
Условия возникновения запроса (по нарастающему/спадающему фронту сигнала или по логическому уровню) задаются с помощью битов управления опознанием прерывания регистра MCUCR.
Регистр контроля (управления)– MCUCR.Адрес – $35 ($55).
Этот регистр содержит служебные биты для общих функций MCU.
Бит
$35 ($55)
―
SE
SM1
SM0
ISC11
ISC10
ISC01
ISC00
Чтение/Запись
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Исходное значение
Бит 7 –этот бит зарезервирован в AT90S8535 и при считывании всегда показывает состояние ноль.
Биты 6–4 –управляют режимами энергосбережения.
Биты 3, 2 – ISC11, ISC10:Биты управления идентификацией внешнего прерывания 1. Внешнее прерывание 1 активизируется внешним выводом INT1, если установлен флаг I в регистре статуса SREG и установлена соответствующая маска прерывания в регистре масок внешнего прерывания GIMSK (INTF1=1).
Запрос прерывания по логическому уровню или фронтам определяется в таблице 11.2.
Таблица 11.2. Задание характера сигнала прерывания 1
ISC11
ISC10
Описание
Запрос прерывания идентифицируется по низкому уровню на INT1
Зарезервирован
Запрос прерывания идентифицируется по спадающему фронту на INT1
Запрос прерывания идентифицируется по нарастающему фронту на INT1
Примечание: При программном изменении битов ISC11/ISC10 прерывание INT1 должно быть запрещено путем очистки бита разрешения прерывания в регистре GIMSK. В ином случае может произойти прерывание.
Биты 1, 0 – ISC01, ISC00:Биты управления идентификацией внешнего прерывания 0.Внешнее прерывание 0 активизируется внешним выводом INT0, если установлен флаг I в регистре статуса SREG и установлена соответствующая маска прерывания. Запрос прерывания по логическому уровню или фронтам определяется в таблице 11.3.
Таблица 11.3. Задание характера сигнала прерывания 0
ISC01
ISC00
Описание
Запрос прерывания идентифицируется по низкому уровню на INT0
Зарезервирован
Запрос прерывания идентифицируется по спадающему фронту на INT0
Запрос прерывания идентифицируется по нарастающему фронту на INT0
Примечание: При программном изменении битов ISC01/ISC00 прерывание INT0 должно быть запрещено путем очистки бита разрешения прерывания в регистре GIMSK. В ином случае может произойти прерывание.
Прерывания по уровню сигнала флага не имеют и условия прерывания имеют место, пока активен внешний сигнал.
Регистр флагов внешних прерываний– GIFR.Адрес – $3A ($5A)
Бит
Имя бита
INTF1
INTF0
―
―
―
―
―
―
Чтение/Запись
R/W
R/W
R
R
R
R
R
R
Исходное значение
Биты 7 и 6- INTF1, INTF0:Флаги внешних прерыванийINTF1и INTF0.В случае поступления запроса на прерывание на какой-либо из указанных выводов устанавливается (=1) соответствующий флаг прерывания. Если бит I регистра SREGи соответствующий бит разрешения регистра GIMSK установлены, то выполняется переход по вектору прерывания. При возврате из процедуры прерывания флаг очищается. Кроме того, флаг можно очистить, записав в него логическую 1.
Биты 5–0 — Эти биты зарезервированы в AT90S8535 и при считывании всегда покажут состояние 0.
При возникновении прерывания бит I разрешения глобального прерывания (Global Interrupt Enable) очищается, и все прочие прерывания запрещаются.
Для разрешения вложенных прерываний необходимо установить бит I внутри подпрограммы обработки прерывания. Выход из подпрограммы обработки прерывания происходит по команде RETI, при этом бит I устанавливается в состояние 1. Когда счетчик команд указывает вектор подпрограммы обработки прерывания, соответствующий флаг, вызвавший прерывание, аппаратно очищается. Некоторые флаги прерываний можно очистить, записав в соответствующий бит(ы) очищаемого флага логическую единицу.
Если условия прерываний возникли, когда очищен бит разрешения всех прерываний, поступающие прерывания устанавливают свои флаги и они будут сохранены в таком состоянии, пока не возникает разрешение глобального прерывания и будут обработаны в порядке приоритетов.
Обратите внимание! Регистр состояния автоматически не сохраняется при закрытии программы, т.е. при открытии прерывающей подпрограммы он должен быть сохранён и должен быть восстановлен при возвращении из прерывающей подпрограммы. Выполнение этого условия должно осуществляться за счет учета в программе.
При проведении лабораторной работы записывается фоновая программа, которая будет прерываться внешними источниками INT0 и INT1. Разрешение на прерывание, его приоритет и активный характер сигнала запроса прерывания задаются с тумблеров блока управления по усмотрению разработчиков программы.
В каждом варианте указано, какие внешние визуальные проявления должны происходить при прерывании. Каждый обучающийся при выполнении работы должен посмотреть реакцию системы при следующих ситуациях:
а) запретить все прерывания и убедиться, что включения и отключения тумблеров INT0 и INT1 не оказывают влияния на работу фоновой программы;
б) разрешить прерывания по перепаду для INT0 и INT1 и посмотреть реакцию микроконтроллера на эти прерывания;
в) убедиться, что прерывание по INT0 прерывает выполнение программы по INT1;
г) проделать пункты б) и в) при задании прерывания по уровню и проанализировать, какие отличия имеют место при отработке прерываний по уровню от отработки прерываний по перепаду.
Ниже приведена структура одного из вариантов программы при выполнении лабораторной работы.
; Примерная структура программы процедуры обслуживания прерываний
.include "8535def.inc"
; ***Формирование таблицы переходов***
.org $000
rjmp start
.org $001
; вектор int0
rjmp pr0
.org $002
; вектор int1
rjmp pr1
.org $003
; вектор Timer2 Compare
reti
.org $004
; вектор Timer2 Overflow
reti
.org $005
; вектор Timer1 Capture
reti
.org $006
; вектор Timer1 CompareA
reti
.org $007
; вектор Timer1 CompareB
reti
.org $008
; вектор Timer1 Overflow
reti
.org $009
; вектор Timer0 Overflow
reti
.org $00A
; вектор SPI
reti
.org $00B
; вектор приемника UART
reti
.org $00C
; вектор "буфер передатчика пуст" UART
reti
.org $00D
; вектор передатчика UART
reti
.org $00E
; вектор ADC преобразователя
reti
.org $00F
; вектор EEPROM
reti
.org $010
; вектор аналогового компаратора
reti
; ***Фоновая программа***
.cseg
.org $030
start:
ldi
r16,$00
; загрузка указателя стека через регистр r16
out
sph,r16
ldi
r16,$0ff
out
spl,r16
m1:
sbis
PINA,1
; опросить кнопку SB1. От её состояния зависит
rjmp
m1
sei
; разрешение глобального прерывания
ldi
r16,$c0
out
GIMSK,r16
; разрешение прерываний INT0 и INT1
ldi
r16,$f0
; выводы PD0, PD1,PD2 и PD3 конфигурировать как
out
DDRD,r16
; входы, а остальные выводы порта D как выходы
ldi
r16,$0ff
; выводы порта С конфигурировать как выходы
out
DDRC,r16
sbi
PORTB,3
; загрузить 1 в бит portB,3 для включения
; транзистора VT2
***
;команды фоновой программы по индивидуальному
; заданию
rcall
wait
in
r16,PINA
; опросить кнопки и тумблеры порта А
lsr
r16
; сдвинуть разряды регистра r16 три раза вправо
lsr
r16
lsr
r16
ldi
r17,$0f
and
r16,r17
; биты ISC01, ISC00, ISC11, ISC10 принимают
out
MCUCR,r16
; соответственно состояние SB1, SA1, SA2, SA3
pr0:
; Подпрограмма отработки прерывания INT0
in
r16,SREG
; сохранение SREG
push
r16
***
; команды, реализующие индивидуальное задание
cbi
GIFR,6
; сброс флага прерывания по INT0
pop
r16
; восстановление SREG
out
SREG,r16
reti
pr1:
; Подпрограмма отработки прерывания INT1
in
r16,SREG
; сохранение SREG
push
r16
***
; команды, реализующие индивидуальное задание
cbi
GIFR,7
; сброс флага прерывания по INT1
pop
r16
; восстановление SREG
out
SREG,r16
reti
wait:
; подпрограмма задержки
ldi
r20,$0ff
loop1:
ldi
r21,$0ff
loop:
dec
r21
brne
loop
dec
r20
brne
loop1
ret
Представленная программа дает пример формирования таблицы переходов и определения начального адреса стека. Кнопки и тумблеры блока управления рабочего места используются для вмешательства в программу микроконтроллера:
– кнопка SB3 и тумблер SA1 обеспечивают задание характера сигнала прерывания INT0 (по фронтам или по уровню сигнала);
– тумблеры SA2 и SA3 аналогично обеспечивают задание характера сигнала прерывания INT1.
В представленной программе подпрограмма wait реализует задержку времени. Максимальная длительность задержки будет при записи в регистры r20 и r21 десятичных чисел 255. При необходимости увеличения длительности задержки можно реализовать несколько команд типа wait (можно с разными уставками времени) или выполнять последовательно несколько раз одну и ту же подпрограмму задержки времени. Можно записать свою подпрограмму wait, используя большее число регистров.
В индивидуальных заданиях есть необходимость изменения скорости «бегущих» огней. Это можно обеспечить инкрементом-декрементом или сложением-вычитанием чисел в каких-либо ячейках или регистрах, которые могут передаваться в регистры r20 и r21 подпрограммы wait.
Варианты индивидуальных заданий
1. При подаче питания и нажатии на кнопку SB6 «Сброс» загорается светодиод VD4. По прерыванию INT0 светодиод VD4 гаснет, загорается светодиод VD5 (идет сдвиг вправо). То есть, по прерыванию INT0 последовательно загораются и гаснут светодиоды VD4, VD5, VD6, VD4, VD5 и т.д. По прерыванию INT1 сдвиг осуществляется влево.
2. Фоновая программа реализует «бегущий» огонь на светодиодах VD4, VD5, VD6 слева направо, то есть поочередно загораются светодиоды VD4, VD5, VD6, VD4, VD5 и т.д.
По прерыванию INT0 скорость «бега» увеличивается,
а по прерыванию INT1 – уменьшается.
3. Фоновая программа реализует «бегущий» огонь на сегментах индикатора HG2, то есть, последовательно загораются и гаснут сегменты a, b, c, d, e, f, a, b, c и т.д. Прерывание по INT0 изменяет направление бега на противоположное. Прерывание по INT1 восстанавливает исходное направление «бега».
4. При подаче питания и нажатии кнопки SB6 «Сброс» на индикаторе HG2 загорается цифра 0. По прерыванию INT0 высвечиваемая цифра увеличивается на единицу, по прерыванию iNT1 – уменьшается на единицу. Диапазон изменения цифры – от 0 до 9. Если цифра достигла значения 9, то дальнейшие прерывания INT0 не меняют ее. Если же высвечивается цифра 0, то прерывания INT1 не должны изменять эту цифру.
5. Фоновая программа реализует работу светофора, то есть чередование сигналов следующее: зеленый (VD4), желтый (VD5), красный (VD6), желтый, зеленый и т.д. По прерыванию INT0 время горения каждой из ламп увеличивается, а по прерыванию INT1 – уменьшается.
6. При подаче питания и нажатии кнопки SB6 «Сброс» на индикаторе HG2 горит цифра 8. По прерыванию INT0 число на индикаторе увеличивается на две единицы, по прерыванию INT1 – уменьшается на две единицы. При достижении цифр 0 и E прерывания соответственно INT0 и INT1 не влияют на работу.
7. При включении микроконтроллера фоновая программа обеспечивает вывод на порт C комбинации сигналов, соответствующей индикации на индикаторе HG2 цифры 5. По прерыванию INT0 – состояние линии PortC,1 инвертируется. По прерыванию INT1 – содержимое порта C инкрементируется. В отчете отразить получившиеся изображения на индикаторе.
8. При включении микроконтроллера и нажатии на кнопку SB6 «Сброс» на порт D выдается число 20h, на порт C – число 66h. По прерыванию INT0 – производить циклический сдвиг регистра PortD вправо, по прерыванию INT1 – влево.