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
KBIMODKBIEDGi
00Спадающий фронт
01Нарастающий фронт
10Спадающий фронт или НИЗКИЙ уровень
11Нарастающий фронт или ВЫСОКИЙ уровень

Линии, сконфигурированные на выполнение функции KBI, автоматически переходят в режим ввода, несмотря на состояние регистра направления передачи соответствующего порта PTxDD. Наличие внутренних подтягивающих резисторов определяется состоянием регистра порта PTxPE. Если линия настроена на срабатывание по спадающему фронту и/или по НИЗКОМУ уровню сигнала и установлен соответствующий бит регистра PTxPE, то подключается верхний подтягивающий резистор. Иначе — нижний (Табл.6.4).

Таблица6.4. Режимы детектирования сигнала внешнего запроса

БитыПодключение подтягивающего резистора
PTxPEiKBIEDGi
00Резистор не подключен
01Резистор не подключен
10Подключен верхний подтягивающий резистор
11Подключен нижний подтягивающий резистор

Флаг KBF будет генерировать запрос на прерывание в ЦП, если установить бит KBIE в регистре управления KBIxSC. Флаг KBF сбрасывается посредством записи 1 в бит подтверждения KBACK регистра KBIxSC.

6.2.2.1. Примеры использования KBI

Входы модуля KBI подключены внутри кристалла МК к выводам портов в соответствие с Табл.6.5.

Таблица6.5. Входы модуля KBI

Модель МКМодули KBIВходы модуля KBI
KBIP7KBIP6KBIP5KBIP4KBIP3KBIP2KBIP1KBIP0
AC, AWKBIPTD7PTD3PTD2PTG4PTG3*PTG2*PTG1*PTGO*
GB, GTKBIPTA7PTA6PTA5PTA4PTA3*PTA2*PTA1*PTAO*
LCKBI1PTA7PTA6PTA5PTA4PTA3PTA2PTA1PTAO
KBI2PTC7PTC5PTC4PTB7PTB6PTB 3PTB1PTBO
JMKBIPTG3PTG2PTB 5PTB4PTD3PTD2PTG1PTGO
QA, QDKBIPTA3PTA2PTA1PTAO
QEKBI1PTB 3PTB2PTB1PTBOPTA3PTA2PTA1PTAO
KBI2PTD7PTD6PTD5PTD4PTD3PTD2PTD1PTDO
QGKBIPTB 3PTB 2PTB1PTBOPTA3PTA2PTA1PTAO
RxKBI1PTA7PTA6PTA5PTA4PTA3*PTA2*PTA1*PTAO*
KBI2PTC3*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

//ДемонстрационнаяплатаDEMO9S08QG8,мигающийсветодиодсуправлениемотKBI
//КатодLED1соединенсPTB6,катодLED2соединенсPTB7
//КнопкаSW1подсоединенакPTA2,кнопкаSW2—кPTA3
#include/*forEnableInterruptsmacro*/
#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 светодиодов

//ДемонстрационнаяплатаDEMO9S08AW60E,линейкасветодиодовсуправлениемотKBI
//КнопкаSW1соединенасPTC2
//КнопкаSW2соединенасPTC6
//КнопкаSW3соединенасPTD3
//КнопкаSW4соединенасPTD2
//СветодиодыподсоединеныкпортуPTF
#include/*forEnableInterruptsmacro*/
#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

РегистрРежимD7D6D5D4D3D2D1D0
KBI1ISC* для AC, AW, GB, GTЧтениеKBFDG7KBEDG6KBEDG5KBFDG4KBF0KBIEKBMOD
ЗаписьKBACK
Сброс00000000
KBISC KBI1SC KBI2SC для JM, LC, QA, QD, QG, QEЧтение0000KBF0KBIEKBMOD
ЗаписьKBACK
Сброс00000000
KBI ISC для RC, RD, RE, RGЧтениеKBEDG7KBEDG6KBEDG5KBEDG4KBF0KBIEKBMOD
ЗаписьKBACK
Сброс00000000
KBI2SC для RC, RD, RE, RGЧтение0000KBF0KBIEKBMOD
ЗаписьKBACK
Сброс00000000

* В МК серии 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.

РегистрРежимD7D6D5D4D3D2D1D0
KBIPEЧтениеKBIPE7KBIPE6KBIPE5KBIPE4KBIPE3KBIPE2KBIPE1KB1PE0
Запись
Сброс00000600

Описание битов:
Имя битаОписаниеСимвол в языке С
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.

РегистрРежимD7D6D5D4D3D2D1D0
KBIESЧтениеKBIEDG7KBIEDG6KBIEDG5KBIEDG4KBIEDG3KBIEDG2KBIEDG1KBIEDG0
Запись
Сброс00000600

Описание битов:
Имя битаОписаниеСимвол в языке С
KBIEDG7
KBIEDG6
KBIEDG5
KBIEDG4
KBIEDG3
KBIEDG2
KBIEDG1
KBIEDG0
Выбор активного уровня/фронта сигнала запроса по входу KBIP7:
0 — спадающий фронт и НИЗКИЙ уровень сигнала;
1 — нарастающий фронт и ВЫСОКИЙ уровень сигнала.
bKBIEDG7
bKBIEDG6
bKBIEDG5
bKBIEDG4
bKBIEDG3
bKBIEDG2
bKBIEDG1
bKBIEDG0

6.3. Согласование сигналов и нагрузки

Рассмотрим возможные способы согласования внешних сигналов с сигналами микроконтроллера, а также способы управления внешней нагрузкой.

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>