Внимание! Нижеизложенная статья является авторским переводом с немецкого языка и не может использоваться частично либо полностью без разрешения автора-переводчика. Противоправное копирование статьи будет рассмотрено как сознательное нарушение авторских прав!
Предисловие
Подключение дополнительной периферии в виде дополнительных кнопок, клавиатур, устройств вывода, экранов, светодиодов и.т.д. не всегда возможно из-за ограниченного количества портов ввода-вывода микроконтроллера. Вариантов расширения в таких случая достаточно много, но в современных микроконтроллерах существует возможность подключения через последовательные периферийные интерфейсы стандартов SPI и I²C. В нижеизложенной статье представлен вариант подключения периферии в режимах ввода-вывода по протоколу SPI.
Дешевизна и широкое распространения микросхем, поддерживающих этот протокол позволяет проектировать на их основе различных устройств: преобразователей последовательного кода- в параллельный и наоборот, модулей считывания с матричных клавиатур, часов и пр.
Данная статья может использована как пособие для изучения основ микропроцессорной техники в помощь школьникам и студентам.
Поставленная задача
В моем случае возникла необходимость подключения 12-клавишной клавиатуры к микроконтроллеру PIC18. Для этого я использовал модуль MSSP микроконтроллера настроив его предварительно программно в режим SPI. Передача данных должна осуществляться в режиме ввода и вывода. Информация о нажатой клавише выводится на экран 7 сегментного индикатора. Исключается ситуация нажатия нескольких клавиш одновременно и их неправильная интерпретация микроконтроллером. Используется минимальное количество портов самого микроконтроллера. Вопрос стоимости — использованы массовые ИС фирмы Microchip.
Железо
Практическая простейшая реализация примера представлена на рисунке 1.
Как видно на рисунке, используются всего 4 вывода микроконтроллера, которые при этом расширяются в 16 портов ввода-вывода.
Для управления использован микроконтроллер PIC18F4520 и микросхема MCP23S17 фирмы Microchip, Микроконтроллер тактируется частотой кварцевого резонатора 20Мгц через порты RA6,RA7. Рекомендуется для запуска кварца подключить два конденсатора емкостью 15-25 пФ между портами RA6,RA7 и GND, желательно разной емкости. По опыту знаю, что некоторые кварцы склонны к незапусканию из-за своих внутренних особенностей и особенностей печатной платы. В любом случае, в документации к конкретным кварцам присутствуют рекомендованные параметры обвязки. Порты MCLR и SDI, работающие как входы, необходимо подключить через резистор к +5В для обеспечения на них логической 1. Порты RC3 , RC5 работают как выходы и должны быть соответственно программно настроены. Микросхема U3 предназначена для преобразования бинарного кода в децимальный для корректного отображения на экране индикатора. GPA0-GPA3, GPB0-GPB3 используются как выходы, GPB4-GPB7- как входы с исходным состоянием логической единицы.
Стоит сказать, что данная комбинация достаточна для симуляции, на реальной плате необходимо установить дополнительно токоограничивающие резисторы между индикатором и U3, обеспечить фильтрацию по питанию.
Принцип работы
Опрос состояния клавиш происходит динамически, это значит, на нашем примере, на верхнюю строку программно подается логическая «1». После этого идет опрос столбцов на наличие на их выводах лог.»1″. Далее «1» сдвигается на вторую строку и опрос повторяется. Таким же образом опрашиваются клавиши спаренные с рядами 3 и 4 и цикл повторяется. К примеру, если нажата клавиша 8, то при подаче на ряд 2 «1» окажется что во втором столбце обнаружена лог «1» и это будет признаком нажатия кнопки.
Нажатие каждой из клавиш формирует 8 битный код на выводах GPB микросхемы U2. Для дальнейшей работы необходима правильная интерпретация этого кода и вывод на индикатор.
Программа
Исходный код был написан на Си в MPLAB IDE и симулирован в Proteus. Исходник содержит файл Main.c где производится настройка микроконтроллера в режиме СПИ устанавливается скорость передачи данных, настройка портов на вход-выход, установка первоначальных значений портов MCP23S17. Вызов функций „Keyboard()“ и „SPI_Transmition“ производит опрос состояния клавиатуры и вывод информации на индикатор соответственно.
Функция initISPI() настраивает порты ввода вывода, режим SPI, частоту передачи (fOSZ/4)и собственно разрешает работу модуля MSSP(SSPCON1bits.SSPEN).
Передача данных между микроконтроллером и MCP23S17 состоит из 24 бит(3 Байт). Первый байт содержит информацию об аппаратном адресе и бит приема-передачи информации. Во втором байте находится информация о регистре MCP23S17 для которого предназначена информация(регистр ввода, вывода,или регистр специфических настроек). Третий байт содержит собственно данные (Рисунок 2).
Функция Keyboard() выводит последовательно +5В на строки A,B,C,D и опрашивает при этом столбцы 1,2 и 3. Определенные битовые значения порта интерпретируются и возвращаются значениями 0-9,10 и 11 и выводятся через порты GPA0-GPA3 на индикатор в децимальной форме.
Подключение нескольких устройств SPI
Нижеизложенный вариант усовершенствования схемы представляет собой подключение 2-х микросхем MCP23S17 подключенных через интерфейс SPI(Рисунок 3). Как видно из схемы, дополнительное расширение портов не требует дополнительных портов микроконтроллера. Более того, аппаратная адресация(А0-А2) микросхем позволяет подключать до 8 микросхем MCP23S17, 128 дополнительных портов ввода-вывода соответственно. На схеме и в видео-примере(смотри ссылку) представлен вариант подключения дополнительного ЖКИ индикатора и драйвера шагового двигателя в полушаговом режиме дополнительно к клавиатуре и 7-сегментному индикатору.
Ссылки
PIC18 Datasheet
MCP23S17_Datasheet
Рекомендации
Вышеизложенная статья является симуляцией. В реальном устройстве рекомендуется внедрить программное исключение дребезжания контактов, например:
char i,j;
if(кнопка_нажата==true)
{
for (i=0;i<256;i++)
{
for (j=0;j<256;j++)
}
}
if(кнопка_нажата==true)
выполнить_действие();
Пример по сути является повторным опросом состояния кнопки после задержки в виде удвоенного цикла и затухания дребезжания контактов.
Прикрепленные файлы:
- mc192.rar (2 Кб)