Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Расширение количества портов микроконтролера PIC18 через SPI-интерфейс

Внимание! Нижеизложенная статья является авторским переводом с немецкого языка и не может использоваться частично либо полностью без разрешения автора-переводчика. Противоправное копирование статьи будет рассмотрено как сознательное нарушение авторских прав!

Предисловие

Подключение дополнительной периферии в виде дополнительных кнопок, клавиатур, устройств вывода, экранов, светодиодов и.т.д. не всегда возможно из-за ограниченного количества портов ввода-вывода микроконтроллера. Вариантов расширения в таких случая достаточно много, но в современных микроконтроллерах существует возможность подключения через последовательные периферийные интерфейсы стандартов SPI и I²C. В нижеизложенной статье представлен вариант подключения периферии в режимах ввода-вывода по протоколу SPI.

Дешевизна и широкое распространения микросхем, поддерживающих этот протокол позволяет проектировать на их основе различных устройств: преобразователей последовательного кода- в параллельный и наоборот, модулей считывания с матричных клавиатур, часов и пр.

Данная статья может использована как пособие для изучения основ микропроцессорной техники в помощь школьникам и студентам.

Поставленная задача

В моем случае возникла необходимость подключения 12-клавишной клавиатуры к микроконтроллеру PIC18. Для этого я использовал модуль MSSP микроконтроллера настроив его предварительно программно в режим SPI. Передача данных должна осуществляться в режиме ввода и вывода. Информация о нажатой клавише выводится на экран 7 сегментного индикатора. Исключается ситуация нажатия нескольких клавиш одновременно и их неправильная интерпретация микроконтроллером. Используется минимальное количество портов самого микроконтроллера. Вопрос стоимости - использованы массовые ИС фирмы Microchip.

Железо

Практическая простейшая реализация примера представлена на рисунке 1.

Hardware.jpg

Как видно на рисунке, используются всего 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).

mc192-2.png

Функция Keyboard() выводит последовательно +5В на строки A,B,C,D и опрашивает при этом столбцы 1,2 и 3. Определенные битовые значения порта интерпретируются и возвращаются значениями 0-9,10 и 11 и выводятся через порты GPA0-GPA3 на индикатор в децимальной форме.

Подключение нескольких устройств SPI

Нижеизложенный вариант усовершенствования схемы представляет собой подключение двух микросхем MCP23S17 подключенных через интерфейс SPI(Рисунок 3). Как видно из схемы, дополнительное расширение портов не требует дополнительных портов микроконтроллера. Более того, аппаратная адресация(А0-А2) микросхем позволяет подключать до 8 микросхем MCP23S17, 128 дополнительных портов ввода-вывода соответственно. На схеме и в видео-примере(смотри ссылку) представлен вариант подключения дополнительного ЖКИ индикатора и драйвера шагового двигателя в полушаговом режиме дополнительно к клавиатуре и 7-сегментному индикатору.

mc192-3.png

Ссылки

PIC18 Datasheet
MCP23S17_Datasheet

Рекомендации

Вышеизложенная статья является симуляцией. В реальном устройстве рекомендуется внедрить программное исключение дребезжания контактов, например:

char i,j;

if(кнопка_нажата==true)
{
  for (i=0;i<256;i++)
  {
    for (j=0;j<256;j++)
  }
}

if(кнопка_нажата==true)
выполнить_действие();

Пример по сути является повторным опросом состояния кнопки после задержки в виде удвоенного цикла и затухания дребезжания контактов.

Прикрепленные файлы:

Теги:

Опубликована: 13.03.2013 0 1
Я собрал 0 3
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 3 чел.

Комментарии (4) | Я собрал (0) | Подписаться

-1
Кирилл #
Что это за программа на видео?
Ответить
+2
MC_RRR #
Proteus
Ответить
0

[Автор]
Den Maier #
Первоисточник на немецком выложен тут: http://www.mikrocontroller.net/articles/16-bit_I/O_SPI_Porterweiterung_mit_Microchip_PIC18
Ответить
0
Виталий #
Передача понятно, а как принимать? Какую последовательность команд и сигналов CS нужно осуществлять?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Металлоискатель MD3010II Паяльная станция Hakko 936
вверх