Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Начальный запуск и обработка прерываний



Запуск и организация обслуживания прерываний в микроконтроллерах семейства 68HC08/908 выполняется с помощью модуля системной интеграции SIM08 (System Integration Module – 08), который работает совместно с другими служебными модулями: LVI08, IRQ08, BREAK08, COP08 (см. рис. 2). Запуск микроконтроллера выполняется модулем SIM08 в следующих случаях.

1. Включение напряжения питания Vп.

2. Поступление внешнего сигнала запуска RST# = 0.

3. Поступление сигнала запуска от сторожевого таймера COP08 (см. раздел 9).

4. Выборка неправильного кода команды.

5. Обращение к ячейке памяти, которая отсутствует в адресном пространстве данной модели микроконтроллера.

6. Поступление от модуля LVI08 сигнала о недопустимом снижении напряжения Vп.

Каждая из этих причин вызывает установку в 1 соответствующего бита в регистре состояния SRSR модуля SIM08 (рис.6,а),:

POR – запуск при включении питания,

PIN – запуск по сигналу RST#,

COP – запуск по сигналу сторожевого таймера COP08,

ILOP – запуск при выборке неправильной команды,

ILAD – запуск при обращении к несуществующему адресу,

LVI – запуск по сигналу модуля контроля питания LVI08.

Содержимое регистра SRSR доступно только для чтения, и после чтения все его биты устанавливаются состояние в 0. Программа инициализации микроконтроллера должна обеспечивать чтение содержимого этого регистра и анализ причины запуска или перезапуска. Регистры SBSR, SBFCR (рис.6,б,в) в модуле SIM08 обеспечивают работу модуля BREAK08, реализующего прерывание в контрольной точке программы.

               
POR PIN COP ILOP ILAD   LVI  
а). SRSR (адрес $FE01)
               
Резерв. Резерв. Резерв. Резерв. Резерв. Резерв. SBSW Резерв.
б). SBSR (адрес $FE00)
               
BCFE Резерв. Резерв. Резерв. Резерв. Резерв. Резерв. Резерв.
в). SBFCR (адрес $FE03)

Рис.6. Формат содержимого регистров модуля системной интеграции SIM08

Кроме того в состав модуля SIM08 входят три регистра состояния прерываний INT1-INT3 (см. рис.8), функции которых описаны далее.

В процессе запуска микроконтроллера выполняются следующие действия.

- В регистр PCTL (рис.4,а) заносится число $00 (бит BCS=0), обеспечивая формирование тактовых импульсов от генератора CG с частотой Ft=Fq, задаваемой кварцевым резонатором.

- В программный счетчик PC поступают два байта (старший байт PC h, младший байт PC l) из ячеек памяти с адресами $FFFE-FF (см. раздел 5), которые задают адрес первой команды, выполняемой микроконтроллером после запуска.

- В указатель стека SP заносится число $FF, адресующее начальную ячейку стека.

- В регистре признаков CCR устанавливается значение маски прерываний I=1, которое запрещает обслуживание любых аппаратных прерываний.

- Устанавливается необходимое начальное состояние регистров периферийных устройств.

При включении питания или запуске по сигналу модуля LVI08 требуется время Tr = 4096Tt (значение Tt = 1/Fq) для установки рабочего режима генератора CG. Затем в течении времени 64Tt выполняется начальная установка всех модулей, после чего производится загрузка в PC адреса первой команды программы. При этом на выводе RST# микроконтроллера устанавливается уровень 0 на время, равное (Tr + 32Tt). При всех других причинах для запуска микроконтроллера требуется время 64Tt. Чтобы произвести запуск внешним сигналом, необходимо подать на вывод RST# уровень 0 и поддерживать его в течении не менее 64 периодов Tt=1/Fq. Запуск производится при установке на этом выводе уровня 1. Если запуск вызывается одной из внутренних причин (установка в 1 бита COP, ILOP или ILAD в регистре SPSR), то на выводе RST# устанавливается уровень 0 на время 32Tt, а затем производится загрузка в PC начального адреса.

Модуль контроля напряжения питания LVI08 (Low-Voltage Inhibit – 08) вырабатывает сигнал повторного запуска при снижении этого напряжения ниже порогового уровня. Режим работы этого модуля определяется значением битов LVIPWRD, LVIRSTD, LVI5OR3 LVISTOP в регистре конфигурации CONFIG1 (см. раздел 8, рис.17,а).

Для включения модуля LVI08 следует установить в регистре CONFIG1 значение бита LVIPWRD=0. Перезапуск микроконтроллера при снижении напряжения питания ниже порогового уровня осуществляется, если в регистре CONFIG1 установлено значение бита LVIRSTD=0.Величина порогового уровня зависит от используемого напряжения питания и определяется значением бита LVI5OR в этом регистре: при значении бита LVI5OR3=0 устанавливается пороговое напряжение 2,7 В (соответствует Vп=3,0 В), при значении LVI5OR3=1 – пороговое напряжение 4,3 В (соответствует Vп=5,0 В).

При работе микроконтроллера в режиме ожидания (см. раздел 7) модуль LVI08 продолжает контролировать напряжение питания. Если микроконтроллер находится в режиме останова, функционирование модуля LVI08 опеределяется значением бита LVISTOP в регистре CONFIG1: если LVISTOP=1, то модуль LVI08 продолжает функционировать, при LVISTOP=0 этот модуль выключается.

               
LVIOUT              

Рис.7. Формат содержимого регистра состояния LVISR модуля LVI08 (адрес$FF0C)

В составе модуля LVI08 имеется регистр состояния LVISR (рис.7), который содержит бит контроля LVIOUT. Этот бит принимает значение 1, когда напряжение питания ниже порогового уровня. Регистр LVISR доступен только для чтения.

Реализация прерываний. Процессоры семейства 68HC08/908 выполняют прерывание текущей программы по одной из следующих причин:

· поступление команды прерывания SWI;

· внешний запрос прерывания на входе IRQ#, обслуживание которого реализуется с помощью модуля IRQ08;

· запрос прерывания в контрольной точке, который формируется модулем BREAK08;

· внутренние запросы прерывания, поступающие от периферийных устройств, расположенных на кристалле микроконтроллера.

Эти события вызывают прерывание выполнения текущей программы и переход к подпрограмме - обработчику прерывания., которая обеспечивает необходимую реакцию микроконтроллера. При поступлении команды SWI или соответствующего запроса процессор завершает выполнение текущей команды и выполняет цикл перехода к обработке прерывания, в процессе которого реализуются следующие операции:

- загрузка в стек содержимого регистров процессора в следующей последовательности: CCR - A – X - PCh - PCl, где PCh, PCl - старший и младший байты содержимого PC, X – значение младшего байта индексного регистра H:X;

- загрузка в PC 16-разрядного вектора прерывания Ve - адреса первой команды обработчика прерываний, соответствующего наступившему событию.

Значение вектора Ve выбирается из таблицы векторов прерываний, размещенной в конце адресуемого объема памяти (см. табл. 10).

Обработчик прерывания заканчивается командой возврата из прерывания RTI, которая выбирает из стека и восстанавливает содержимое регистров PC, X, A, CCR, обеспечивая продолжение выполнения прерванной программы.

Необходимо иметь в виду, что в цикле перехода к обработке прерываний в стеке автоматически сохраняется только младший байт индексного регистра X. Чтобы обеспечить сохранение старшего байта индексного регистра H следует в начале обработчика прерываний ввести команду PSHH (загрузка в стек содержимого байта H, а перед командой RTI выполнить команду PULH, которая извлекает из стека и восстанавливает содержимое старшего байта H индексного регистра.

Для размещения таблицы векторов запуска и прерываний в микроконтроллерах семейства 68HC08/908 зарезервировано 64 байт адресного пространства (адреса $FFD0-FF), из которых в микроконтроллере MC68HC908GP32 используется 36 байт. В табл.10 показано размещение векторов для этого микроконтроллера.

Таблица.10. Размещение векторов запуска и прерывания для

микроконтроллера MC68HC908GP32

Запрос базового таймера TBM08 $FFDC-DD
Запрос модуля ADC08 $FFDE-DF
Запрос модуля KBI08 $FFE0-E1
  Запросы модуля SCI08 $FFE2-E3
$FFE4-E5
$FFE6-E7
Запросы модуля SPI08 $FFE8-E9
$FFEA-EB
Переполнение таймера TIM08-2 $FFEC-ED
Запрос канала 1 таймера TIM08-2 $FFEE-EF
Запрос канала 0 таймера TIM08-2 $FFF0-F1
Переполнение таймера TIM08-1 $FFF2-F3
Запрос канала 1 таймера TIM08-1 $FFF4-F5
Запрос канала 0 таймера TIM08-1 $FFF6-F7
Запрос модуля CGM08 $FFF8-F9
Прерывание по внешнему запросу IRQ# $FFFA-FB
Команда SWI (программное прерывание) $FFFC-FD
Вектор начального запуска (Reset) $FFFE-FF

Нижнюю позицию в таблице векторов занимает вектор начального запуска (Reset), а перед ним располагается вектор программного прерывания по команде SWI, выполнение которой описано в разделе 2. Выше размещаются вектора аппаратных прерываний, которые вызываются поступлением запроса от внешних устройств на вход IRQ#, запросов прерывания от таймера и других модулей, входящих в состав микроконтроллера.

Поступление запросов прерывания проверяется микроконтроллером после выполнения каждой команды программы. Если поступило нескольких запросов, то в первую очередь обслуживается запрос с более высоким приоритетом. Запросы имеют фиксированные приоритеты в соответствии с порядком их расположения в таблице векторов прерываний (табл.10) – чем больше адрес, тем выше приоритет. Таким образом из аппаратных прерываний наивысший приоритет имеет внешний запрос IRQ#, затем запрос генератора тактирующих импульсов CGM08 и сигналы таймера. Минимальный приоритет имеют запросы, вектора которых размещены в верхней части таблицы 10 – запросы ADC08 или некоторых других модулей.

               
IF6 IF5 IF4 IF3 IF2 IF1    
а). INT1 (адрес $FE04)
               
IF14 IF13 IF12 IF11 IF10 IF9 IF8 IF7
б). INT2 (адрес $FE05)
               
            IF16 IF15
в). INT3 (адрес $FE06)

Рис.8. Формат содержимого регистров состояния прерываний INT1-INT3 модуля системной интеграции SIM08

Модуль системной интеграции SIM08 имеет специальные регистры INT1-INT3 (рис.8), которые содержат биты признаков поступивших запросов прерывания IF1-IF16. Эти признаки соответствуют возможным запросам прерывания (табл.11) и принимают значение IFx=1 при поступлении соответствующего запроса. Регистры INT1-INT3 доступны только для чтения и могут использоваться для анализа состояния системы и принятия решения о маскировании или разрешении обслуживания определенных запросов.

Таблица 11. Соответствие битов IFx в регистрах INT1-3

поступившим запросам прерывания

Бит IFx Причина прерывания Адрес вектора
IF16 Запрос базового таймера TBM08 $ FFDC-DD
IF15 Запрос модуля АЦП ADC08 $ FFDE-DF
IF14 Запрос модуля контроля клавиатуры KBI08 $ FFE0-E1
IF13 Запрос передатчика данных модуля SCI08 $ FFE2-E3
IF12 Запрос приемника данных модуля SCI08 $ FFE4-E5
IF11 Ошибка обмена при использовании SCI08 $ FFE6-E7
IF10 Запрос передатчика данных модуля SPI08 $ FFE8-E9
IF9 Запрос приемника данных модуля SPI08 $ FFEA-EB
IF8 Переполнение таймера TIM08-B $ FFEC-ED
IF7 Запрос канала 1 таймера TIM08-B $ FFEE-EF
IF6 Запрос канала 0 таймера TIM08-B $ FFF0-F
IF5 Переполнение таймера TIM08-A $ FFF2-F3
IF4 Запрос канала 1 таймера TIM08-A $ FFF4-F5
IF3 Запрос канала 0 таймера TIM08-A $ FFF6-F7
IF2 Запрос модуля CGM08 $FFF8-F9
IF1 Прерывание по внешнему запросу IRQ# $FFFA-FB

Модуль управления внешним прерыванием IRQ08 принимает внешний запрос прерывания, поступающий на вход IRQ#, и обеспечивает различные варианты его обслуживания. Этот модуль содержит регистр управления INTSCR, отдельные биты которого имеют следующее назначение (рис.9):

IRQF – признак внешнего запроса прерывания (доступен только для чтения), принимает значение 1 при поступлении соответствующего сигнала на вход IRQ#;

ACK – бит подтверждения приема запроса прерывания, который доступен только для записи (при чтении содержимого регистра INTSCR значение этого бита равно 0), при записи 1 в этот бит производится сброс признака запроса в состояние IRQF=0;

IMASK – бит маски внешнего прерывания, при установке значения IMASK=1 поступление запроса на вход IRQ# не вызывает прерывания текущей программы;

MODE – бит, определяющий вид сигнала прерывания: при установке значения MODE=0 прерывание вызывается отрицательным перепадом потенциала на входе IRQ#, при значении MODE=1 – подачей низкого уровня потенциала (логический 0).

               
        IRQF ACK IMASK MODE

Рис.9. Формат содержимого регистра управления внешним прерыванием INTSCR

(адрес $001D)

Длительность сигнала прерывания для микроконтроллеров серии GP должна составлять не менее 50нс при напряжении питания Vп=5,0 В и не менее 125 нс при Vп=3,0 В.

Если прерывание вызывается перепадом потенциала, то после его обслуживания следующее прерывание происходит только при поступлении нового перепада. Если прерывание вызывается уровнем потенциала, то при сохранении уровня 0 на входе IRQ# микроконтроллер повторяет выполнение подпрограммы обслуживания, пока не установится значение сигнала IRQ# =1.

Если внешнее прерывание замаскировано (установлено значение бита IMASK=1), то можно реализовать обслуживание запроса IRQ# программно, путем периодического считывания содержимого регистра INTSCR, анализа значения признака IRQF и вызова обработчика прерываний при значении IRQF=1. При этом обработчик прерываний должен произвести установку бита ACK=1, чтобы сбросить в 0 признак IRQF и обеспечить возможность приема следующего запроса прерывания.

Модуль прерывания в контрольной точке BREAK08 обеспечивает останов выполнения программы в заданной контрольной точке и используется в процессе отладки программного обеспечения. Данное прерывание реализуется, когда сформированный процессором адрес очередной команды совпадает с 16-разрядным адресом контрольной точки, который содержится в регистрах BRKH (старший байт) и BRKL ( младший байт) модуля BREAK08. В этом случае вместо следующей команды в процессор поступает команда программного прерывания SWI, и в программный счетчик PC загружается вектор прерывания из ячеек памяти с адресами $FFFC-FD (см. табл. 10). Выполнение команды SWI не маскируется битом I в регистре признаков CCR, поэтому прерывание в контрольной точке выполняется при любом значении этого бита. При переходе к обслуживанию данного прерывания останавливается работа таймерных модулей TIM08, TBM08 и сторожевого таймера COP08.

Регистры BRKH-BRKL в микроконтроллерах серии GP имеют адреса $FE09-0A. Кроме этих регистров в состав модуля BREAK08 входит региcтр управления BRKSCR, в котором содержатся следующие биты (рис.10):

BRKE – при установке значения BRKE=1 разрешает прерывание в контрольной точке, при значении BRKE=0 запрещает прерывание (отключает модуль BREAK08);

BRKA – при значении BRKA=1 указывает на совпадение адреса текущей команды с адресом контрольной точки (содержимое регистров BRKH-L).

               
BRKE BRKA            

Рис.10. Формат содержимого регистра управления BRKSCR модуля BREAK08

(адрес $FE0B)

При запуске микроконтроллера все биты регистра BRKSR принимают значение 0. Если при записи в этот регистр будет установлено значение бита BRKA=1, то реализуется прерывание в контрольной точке.

Работа модуля BREAK08 контролируется также с помощью битов BCFE, SBSW в регистрах SBFCR и SBSR модуля системной интеграции SIM08. Остальные биты в этих регистрах зарезервированы и служат для тестирования микроконтроллера при заводских испытаниях.

Регистр SBFCR (рис.6,в) содержит бит BCFE, который при установке значения BCFE=1 разрешает при обработке прерывания в контрольной точке менять содержимое регистров состояния периферийных модулей. При значении BCFE=0 состояние этих регистров при останове в контрольной точке нельзя программно изменить, то-есть состояние периферийных модулей в процессе отладки программы будет сохраняться.

В регистре SBSR (рис.6,б)бит SBSW принимает значение 1, если прерывание в контрольной точке происходит при выполнении команд WAIT или STOP. В данном случае процессор выходит из режима ожидания или останова, и выполняет соответствующую программу обработки прерывания. При этом в стек заносится адрес команды, следующей за WAIT или STOP. При возврате из программы обработки по команде RTI из стека в программный счетчик PC будет загружен адрес этой следующей команды, то-есть процессор не вернется в режим ожидания или останова. Чтобы предотвратить нарушение режима функционирования микроконтроллера, программа-обработчик перед выполнением команды RTI должна проверить значение бита SBSW. Если он равен1, то необходимо скорректировать (уменьшить на 1) адрес, загружаемый из стека в PC. В этом случае процессор после обработки прерывания в контрольной точке вернется к выполнению команды WAIT или STOP. Для сброса бита SBSW в нулевое состояние надо записать 0 в соответствующий разряд регистра SBSR.

Формирование запросов прерывания от периферийных модулей микроконтроллера – таймера TIM08, последовательных портов SPI08, SCI08, аналого-цифрового преобразователя ADC08, модуля обслуживания клавиатуры KBI08 рассмотрены в разделах 11 - 15.





Дата публикования: 2014-11-02; Прочитано: 907 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...