6.2.2. Модуль сканирования клавиатуры KBI
(Руководство разработчика по микроконтроллерам семейства HCS08)Еще один встроенный модуль МК может использоваться для приема сигналов внешних запросов на прерывание. Это модуль сканирования клавиатуры KBI. Такое название данный модуль получил, потому что его 8 входов наиболее часто используются для подключения клавиатуры. Однако входы модуля KBI могут быть использованы и для приема сигналов от других источников запросов на прерывание. Аналогично модулю IRQ сигналы на входах модуля KBI могут использоваться для вывода МК из режимов низкого энергопотребления.
Каждый модуль KBI может обрабатывать до 8 входных сигналов, но, в отличие от модуля IRQ, он имеет только один триггер флага запроса KBF и один общий для всех запросов вектор прерывания.
Рис.6.3. Функциональная схема модуля KBI.
Функциональная схема модуля KBI представлена на Рис.6.3. При детектировании активного уровня сигнала на любом из входов KBIxPi модуля устанавливается флаг запроса на прерывание KBF. Каждая линия ввода/вывода настраивается на исполнение альтернативной функции входа модуля KBI установкой в 1 соответствующего бита регистра KBIPE. Если альтернативная функция не разрешена (она отключена по умолчанию), то изменение сигнала на линии не вызывает генерацию запроса на прерывание.
Чтобы сигнал прерывания по одному из входов KBIxPi был обработан, необходимо, чтобы длительность импульса на входе KBIxPi была не менее 100нс при отключенной системе тактирования МК и не менее полутора периодов частоты BUSCLK во время работы системы тактирования.
Режимы детектирования сигнала на входах модуля KBIxPi точно такие же, как и для модуля IRQ: статический (по нарастающему или спадающему фронту) и динамический (по фронту и значению). Полярность сигнала, вызывающего прерывание, устанавливается битами KBIMOD и KBIEDGi регистра KBIxES. В некоторых МК модуль KBI может работать только в режиме детектирования спадающего фронта и/или НИЗКОГО уровня сигнала запроса (см. Табл.6.3).
Таблица6.3. Режимы детектирования сигналов на входах модуля KBI
Биты регистра KBIxES | Сигнал на входе KBIxPi, при котором устанавливается флаг KBF | |
---|---|---|
KBIMOD | KBIEDGi | |
0 | 0 | Спадающий фронт |
0 | 1 | Нарастающий фронт |
1 | 0 | Спадающий фронт или НИЗКИЙ уровень |
1 | 1 | Нарастающий фронт или ВЫСОКИЙ уровень |
Линии, сконфигурированные на выполнение функции KBI, автоматически переходят в режим ввода, несмотря на состояние регистра направления передачи соответствующего порта PTxDD. Наличие внутренних подтягивающих резисторов определяется состоянием регистра порта PTxPE. Если линия настроена на срабатывание по спадающему фронту и/или по НИЗКОМУ уровню сигнала и установлен соответствующий бит регистра PTxPE, то подключается верхний подтягивающий резистор. Иначе — нижний (Табл.6.4).
Таблица6.4. Режимы детектирования сигнала внешнего запроса
Биты | Подключение подтягивающего резистора | |
---|---|---|
PTxPEi | KBIEDGi | |
0 | 0 | Резистор не подключен |
0 | 1 | Резистор не подключен |
1 | 0 | Подключен верхний подтягивающий резистор |
1 | 1 | Подключен нижний подтягивающий резистор |
Флаг KBF будет генерировать запрос на прерывание в ЦП, если установить бит KBIE в регистре управления KBIxSC. Флаг KBF сбрасывается посредством записи 1 в бит подтверждения KBACK регистра KBIxSC.
6.2.2.1. Примеры использования KBI
Входы модуля KBI подключены внутри кристалла МК к выводам портов в соответствие с Табл.6.5.
Таблица6.5. Входы модуля KBI
Модель МК | Модули KBI | Входы модуля KBI | |||||||
---|---|---|---|---|---|---|---|---|---|
KBIP7 | KBIP6 | KBIP5 | KBIP4 | KBIP3 | KBIP2 | KBIP1 | KBIP0 | ||
AC, AW | KBI | PTD7 | PTD3 | PTD2 | PTG4 | PTG3* | PTG2* | PTG1* | PTGO* |
GB, GT | KBI | PTA7 | PTA6 | PTA5 | PTA4 | PTA3* | PTA2* | PTA1* | PTAO* |
LC | KBI1 | PTA7 | PTA6 | PTA5 | PTA4 | PTA3 | PTA2 | PTA1 | PTAO |
KBI2 | PTC7 | PTC5 | PTC4 | PTB7 | PTB6 | PTB 3 | PTB1 | PTBO | |
JM | KBI | PTG3 | PTG2 | PTB 5 | PTB4 | PTD3 | PTD2 | PTG1 | PTGO |
QA, QD | KBI | — | — | — | — | PTA3 | PTA2 | PTA1 | PTAO |
QE | KBI1 | PTB 3 | PTB2 | PTB1 | PTBO | PTA3 | PTA2 | PTA1 | PTAO |
KBI2 | PTD7 | PTD6 | PTD5 | PTD4 | PTD3 | PTD2 | PTD1 | PTDO | |
QG | KBI | PTB 3 | PTB 2 | PTB1 | PTBO | PTA3 | PTA2 | PTA1 | PTAO |
Rx | KBI1 | PTA7 | PTA6 | PTA5 | PTA4 | PTA3* | PTA2* | PTA1* | PTAO* |
KBI2 | — | — | — | — | PTC3* | PTC2* | PTC1* | PTCO* |
* Имеют только один режим работы — спадающий фронт и/или НИЗКИЙ уровень.
Обратите внимание, что в МК серий AC, AW, GB, GT, RC, RD, RE и RG отсутствует возможность выбора активного уровня сигнала запроса. У этих устройств можно настроить режим работы только для четырех старших входов модуля. Кроме того, МК в 8-выводных корпусах, например QA, QD и некоторые из серии QG, имеют только 4 входа модуля KBI.
МК серий RC, RD, RE и RG имеют в своем составе 2 модуля KBI: модуль KBI1 обладает 8 входами, а модуль KBI2 — 4 входами. Причем у обоих модулей входы KBIP0...KBPL3 детектируют только спадающий фронт и/или НИЗКИЙ уровень сигнала. В состав МК серий LC и QE включены 2 полноценных 8-битных модуля KBI.
Пример 6.5 демонстрирует использование прерываний от модуля KBI. Светодиоды LED1 и LED2 на демонстрационной плате DEMO9S08QG8 мигают попеременно. Если кнопка SW1 нажата, то скорость мигания выше, чем когда нажата кнопка SW2.
Пример 6.5. Мигающий светодиод с управлением от модуля KBI
//КатодLED1соединенсPTB6,катодLED2соединенсPTB7
//КнопкаSW1подсоединенакPTA2,кнопкаSW2—кPTA3
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedintblinking_rate=15000;
#defineLED1PTBD_PTBD6
#defineLED2PTBD_PTBD7
#defineSW1PTAD_PTAD2
#defineSW2PTAD_PTAD3
/*
ФункцияобработкипрерыванияпоKBI
Прерываниевызывается,когдаSW1илиSW2нажаты,т.е.используетсяопциянастройки
фиксациизапросапоспадающемуфронту
*/
voidinterruptVectorNumber_VkeyboardKBI_isr()
{
KBISC_KBACK=1;//СброситьбитKBF
if(!SW1)blinking_rate=15000;/*ЕслинажатакнопкаSW1,тоустановитьчастоту
миганиявыше*/
if(!SW2)blinking_rate=30000;/*ЕслинажатакнопкаSW2,тоустановитьчастоту
миганияниже*/
}
voidmain(void)
{
unsignedinttemp;
SOPT1=bBKGDPE;//РазрешитьработувыводаотладкиBKGD
PTADD=0;//ВселинииPTA—наввод
PTBDD=0xFE;//PTB0—наввод,линиисPTB1поPTB7—навывод
PTBD=0xC0;//ВыключитьLED1иLED2,остальныелинииPTB—в0
PTAPE=BIT_5|BIT_3|BIT_2;/*РазрешитьподтягивающиерезисторыдляPTA5,PTA3
иPTA2*/
KBIPE=BIT_3|BIT_2;//РазрешитьфункциюKBIдляPTA3(KBIP3)иPTA2(KBIP2)
KBISC=bKBIE;//РазрешитьпрерыванияпоKBI
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
LED1=0;LED2=1;//ВключитьLED1,выключитьLED2
for(temp=blinking_rate;temp;temp--);//Программнаязадержка
LED1=1;LED2=0;//ВыключитьLED1,включитьLED2
for(temp=blinking_rate;temp;temp--);//Программнаязадержка
}
}
Ниже приведен еще один пример использования модуля KBI.
Пример 6.6. Бегущий огонь на линейке из 8 светодиодов
//КнопкаSW1соединенасPTC2
//КнопкаSW2соединенасPTC6
//КнопкаSW3соединенасPTD3
//КнопкаSW4соединенасPTD2
//СветодиодыподсоединеныкпортуPTF
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedintblinking_rate=15000;
unsignedcharshift_dir=0;
#defineSW4PTDD_PTDD2
#defineSW3PTDD_PTDD3
//ФункцияобработкипрерыванияпоKBI
voidinterruptVectorNumber_Vkeyboard1KBI_isr()
{
KBI1SC_KBACK=1;//ПодтверждениепрерыванияпоKBI—сбросфлагаKBF
if(!SW3)//еслиPTD3=0
{
//ЕслиSW3нажата,тоизменитьчастотумигания
if(blinking_rate==30000)blinking_rate=15000;
elseblinking_rate=30000;
}
if(!SW4)//еслиPTD2=0
{
//ЕслиSW4нажата,тоизменитьнаправлениебегущегоогня
shift_dir=!shift_dir;
}
}
voidmain(void)
{
unsignedinttemp;
unsignedcharshift_register=1;
SOPT=0;/*ИнициализациярегистраSOPT1,запреткомандыSTOPи
сторожевоготаймераCOP*/
PTCDD=~(BIT_2|BIT_6);//PTC2иPTC6—наввод,остальныелинииPTC—навывод
PTCPE=BIT_2|BIT_6;//ВключитьподтягивающиерезисторыдляPTC2иPTC6
PTDDD=~(BIT_2|BIT_3);//PTD2иPTD3—наввод,остальныелинииPTD—навывод
PTDPE=BIT_2|BIT_3;//ВключитьподтягивающиерезисторыдляPTD2иPTD3
PTFDD=0xFF;//ВселинииPTF—навывод
KBI1PE=BIT_5|BIT_6;//РазрешитьфункцииKBIP5(PTD2)иKBIP6(PTD3)
KBI1SC=bKBIE;//РазрешитьпрерыванияпоKBI
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
PTFD=shift_register;//Выдатьновоесостояниесветодиодов
for(temp=blinking_rate;temp;temp--);//Программнаязадержка
if(shift_dir)
{
shift_register<≤1;//Сдвигвправо
//Произошелсдвигзапределыразряднойсетки?
if(!shift_register)shift_register=1;
}
else
{
shift_register>≥1;//Сдвигвлево
//Произошелсдвигзапределыразряднойсетки?
if(!shift_register)shift_register=128;
}
}
}
6.2.2.2. Версии модуля KBI
В составе библиотеки периферийных модулей семейства HCS08 — две модификации модуля сканирования клавиатуры KBI. Первая версия модуля характерна для МК серий AC, AW, GB, GT, RC, RD, RE и RG, вторая версия — для серий JM, LC, QA, QD, QE, QG. Модуль KBI первой версии не предусматривает возможности программного выбора активного уровня сигналов внешних запросов. Для этого модуля активный уровень сигналов — только НИЗКИЙ. Режим детектирования может быть выбран как статическим, так и динамическим. Вторая версия модуля KBI позволяет выбрать между НИЗКИМ и ВЫСОКИМ уровнями активного сигнала внешних запросов.
6.2.2.3. Регистр управления KBIxSC
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
KBI1ISC* для AC, AW, GB, GT | Чтение | KBFDG7 | KBEDG6 | KBEDG5 | KBFDG4 | KBF | 0 | KBIE | KBMOD |
Запись | — | — | — | — | — | KBACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
KBISC KBI1SC KBI2SC для JM, LC, QA, QD, QG, QE | Чтение | 0 | 0 | 0 | 0 | KBF | 0 | KBIE | KBMOD |
Запись | — | — | — | — | — | KBACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
KBI ISC для RC, RD, RE, RG | Чтение | KBEDG7 | KBEDG6 | KBEDG5 | KBEDG4 | KBF | 0 | KBIE | KBMOD |
Запись | — | — | — | — | — | KBACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
KBI2SC для RC, RD, RE, RG | Чтение | 0 | 0 | 0 | 0 | KBF | 0 | KBIE | KBMOD |
Запись | — | — | — | — | — | KBACK | |||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
* В МК серии AC, регистр называется KBISC.
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
KBEDG7 | Выбор активного уровня/фронта сигнала запроса по входу KBIP7: 0 — спадающий фронт и НИЗКИЙ уровень сигнала; 1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала. | bKBEDG7 |
KBEDG6 | Выбор активного уровня/фронта сигнала запроса по входу KBIP6: 0 — спадающий фронт и НИЗКИЙ уровень сигнала; 1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала. | bKBEDG6 |
KBEDG5 | Выбор активного уровня/фронта сигнала запроса по входу KBIP5: 0 — спадающий фронт и НИЗКИЙ уровень сигнала; 1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала. | bKBEDG5 |
KBEDG4 | Выбор активного уровня/фронта сигнала запроса по входу KBIP4: 0 — спадающий фронт и НИЗКИЙ уровень сигнала; 1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала. | bKBEDG4 |
KBF | Флаг запроса на прерывание: 0 — запрос на прерывание отсутствует; 1 — запрос на прерывание поступил. | bKBF |
KBACK | Установка этого бита в 1 под управлением программы вызывает сброс флага запроса на прерывание KBF. Данный бит доступен только для записи. Операция чтения этого бита возвращает 0. | bKBACK |
KBIE | Разрешение прерывания по модулю сканирования клавиатуры: 1 — прерывания от модуля разрешены; 0 — прерывания от модуля запрещены. | bKBIE |
KBMOD | Бит выбора режима обработки сигнала запроса на прерывание от модуля сканирования клавиатуры: 0 — работа в динамическом режиме; 1 — работа в статическом режиме. | bKBMOD |
6.2.2.4. Регистр разрешения функции KBI для линий ввода/вывода KBIxPE
Этот регистр имеет место в МК серий AC, AW, GB, GT, LC, OA, QD, QE, QG, Rx. Но в МК серий AW, GB и GT этот регистр называется KBI1PE, а в МК с двумя модулями KBI имеется два подобных регистра — KBI1PE и KBI2PE. Для уточнения см. Табл.6.5.
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
KBIPE | Чтение | KBIPE7 | KBIPE6 | KBIPE5 | KBIPE4 | KBIPE3 | KBIPE2 | KBIPE1 | KB1PE0 |
Запись | |||||||||
Сброс | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0 |
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
KBIPE7 KBIPE6 KBIPE5 KBIPE4 KBIPE3 KBIPE2 KBIPE1 KBIPE0 | Выбор режима входа внешнего запроса на прерывание в качестве альтернативной функции линии KBIPi: 0 — линия работает в другом режиме; 1 — линия работает в режиме входа внешнего запроса на прерывание. | bKBIPE7 bKBIPE6 bKBIPE5 bKBIPE4 bKBIPE3 bKBIPE2 bKBIPE1 bKBIPE0 |
6.2.2.5. Регистр выбора активного уровня/фронта сигнала KBIxES
Этот регистр присутствует в МК, принадлежащих сериям JM, LC, QA, QD, QE, QG.
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
KBIES | Чтение | KBIEDG7 | KBIEDG6 | KBIEDG5 | KBIEDG4 | KBIEDG3 | KBIEDG2 | KBIEDG1 | KBIEDG0 |
Запись | |||||||||
Сброс | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0 |
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
KBIEDG7 KBIEDG6 KBIEDG5 KBIEDG4 KBIEDG3 KBIEDG2 KBIEDG1 KBIEDG0 | Выбор активного уровня/фронта сигнала запроса по входу KBIP7: 0 — спадающий фронт и НИЗКИЙ уровень сигнала; 1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала. | bKBIEDG7 bKBIEDG6 bKBIEDG5 bKBIEDG4 bKBIEDG3 bKBIEDG2 bKBIEDG1 bKBIEDG0 |
6.3. Согласование сигналов и нагрузки
Рассмотрим возможные способы согласования внешних сигналов с сигналами микроконтроллера, а также способы управления внешней нагрузкой.
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>