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

alex-day › Блог › Интерфейсы микроконтроллеров (Часть 1)

Итак что же такое интерфейс?
Вездесущая Википедия дает такой ответ: Физический (аппаратный) интерфейс — способ взаимодействия физических устройств. Чаще всего речь идёт о компьютерных портах.
Т.е. если мы попытаемся связать наш микроконтроллер с другими устройствами нам потребуется знать определенный набор правил, методов и характеристик оборудования, чтобы сделать это безболезненно. Давайте рассмотрим основные типы интерфейсов, которые мы можем встретить “на борту” микроконтроллера.

Последовательный интерфейс UART/USART

Универсальный асинхронный или универсальный синхронно/асинхронный приемопередатчик (Universal Synchronous/Asynchronous Receiver and Transmitter — UART или USART) — удобный и простой последовательный интерфейс для организации информационного канала обмена микроконтроллера с внешним миром. Способен работать в дуплексном режиме (одновременная передача и прием данных). Он поддерживает протокол стандарта RS-232, что обеспечивает возможность организации связи с персональным компьютером.
Изначально использовался в компьютерах для большинства периферийных устройств, таких как плоттер, удаленный принтер, мышь, внешний модем и т. д. До настоящего времени для последовательной связи IBM PC-совместимых компьютеров используются адаптеры с интерфейсом RS-232С (новое название EIA-232D). В современном IBM PC-совместимом компьютере может использоваться до четырех последовательных портов, имеющих логические имена соответственно COM1, COM2, COM3 и COM4. Основой последовательного адаптера является микросхема UART (Universal Asynchronous Receiver/Transmitter) — универсальный асинхронный приемопередатчик. Обычно используется микросхема UART 16550A. Она имеет 16-символьный буфер на прием и на передачу и, кроме того, может использовать несколько каналов прямого доступа в память DMA -habrahabr.ru/post/37455/ . При передаче микросхема UART преобразует параллельный код в последовательный и передает его побитно в линию, обрамляя исходную последовательность битами старта, останова и контроля. При приеме данных UART преобразует последовательный код в параллельный (разумеется, опуская служебные символы). Непременным условием правильной передачи (приема) является одинаковая скорость работы приемного и передающего UART, что обеспечивается стабильной частотой кварцевого резонатора. Основным преимуществом последовательной передачи является возможность пересылки данных на большие расстояния, как правило, не менее 30 метров. В IBM PC-совместимых персональных компьютерах из 25 сигналов, предусмотренных стандартом RS-232, используются в соответствии с EIA только 9; таким образом, в данном интерфейсе как правило применяются 9-контактные разъемы типа DB-Shell.
В современных компьютерах UART и СОМ порт уже не применяются напрямую, но они получили вторую жизнь для связи с различными нестандартными внешними устройствами в числе которых вошли и устройства на микроконтроллерах. Аппаратная часть при этом стала значительно проще для связи микроконтроллеров друг с другом подключение UART осуществляется по трём линиям: RXD – приём, TXD – передача и GND – общий (минус).

Подключать UART надо, так сказать “наоборот” RXD к TXD, а TXD к RXD как на картинке ниже:

Последовательный периферийный интерфейс SPI

Последовательный периферийный трехпроводный интерфейс SPI (Serial Peripheral Interface) предназначен для организации обмена данными между двумя устройствами. С его помощью может осуществляться обмен данными между микроконтроллером и различными устройствами, такими, как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др. С помощью этого интерфейса удобно производить обмен данными между несколькими микроконтроллерами AVR.
Кроме того, через интерфейс SPI может осуществляться программирование микроконтроллера.
Изначально он был придуман компанией Motorola, а в настоящее время используется в продукции многих производителей. Его наименование является аббревиатурой от ‘Serial Peripheral Bus’, что отражает его предназначение — шина для подключения внешних устройств. Шина SPI организована по принципу ‘ведущий-подчиненный’. В качестве ведущего шины обычно выступает микроконтроллер, но им также может быть программируемая логика, DSP-контроллер или специализированная ИС. Подключенные к ведущему шины внешние устройства образуют подчиненных шины. В их роли выступают различного рода микросхемы, в т.ч. запоминающие устройства (EEPROM, Flash-память, SRAM), часы реального времени (RTC), АЦП/ЦАП, цифровые потенциометры, специализированные контроллеры и др.

Главным составным блоком интерфейса SPI является обычный сдвиговый регистр, сигналы синхронизации и ввода/вывода битового потока которого и образуют интерфейсные сигналы. Таким образом, протокол SPI правильнее назвать не протоколом передачи данных, а протоколом обмена данными между двумя сдвиговыми регистрами, каждый из которых одновременно выполняет и функцию приемника, и функцию передатчика. Непременным условием передачи данных по шине SPI является генерация сигнала синхронизации шины. Этот сигнал имеет право генерировать только ведущий шины и от этого сигнала полностью зависит работа подчиненного шины.

Электрическое подключение
Существует три типа подключения к шине SPI, в каждом из которых участвуют четыре сигнала.

CPOL — исходный уровень сигнала синхронизации (если CPOL=0, то линия синхронизации до начала цикла передачи и после его окончания имеет низкий уровень (т.е. первый фронт нарастающий, а последний — падающий), иначе, если CPOL=1, — высокий (т.е. первый фронт падающий, а последний — нарастающий));
CPHA — фаза синхронизации; от этого параметра зависит, в какой последовательности выполняется установка и выборка данных (если CPHA=0, то по переднему фронту в цикле синхронизации будет выполняться выборка данных, а затем, по заднему фронту, — установка данных; если же CPHA=1, то установка данных будет выполняться по переднему фронту в цикле синхронизации, а выборка — по заднему). Информация по режимам SPI обобщена в таблице.

PIC. Урок 15. Модуль MSSP. Режим SPI. Часть 1

Переходим к следующему модулю – MSSP.

Модуль MSSP (Master Synchronous Serial Port) – синхронная последовательная шина, которая обеспечивает аппаратную поддержку шин SPI и I2C, соответственно, именно в таких режимах она и может работать. Правда данные режимы могут ещё делиться на ведущий и ведомый, также SPI-режим может быть ещё четырёх видов, в зависимости от синхронизации по определённым фронтам тактирования, а также по фазам начала приёма и передачи битов.

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

У модуля MSSP есть три основных управляющих регистра – это SSPSTAT, SSPCON и SSPCON2.

Регистр SSPSTAT, являясь в основном регистром состояний модуля, содержит два бита, которые служат для определённых настроек, поэтому его мы также можем отнести к регистрам управления.

Управляющий регистр SSPCON – управляющий регистр, который актуален для обоих режимов работы, а вот дополнительный управляющий регистр SSPCON2 актуален только для режима I2C, поэтому в данном уроке мы его не будем затрагивать, дабы не забивать свои головы лишней информацией, которую мы, когда дойдём до шины I2C, все равно забудем.

Также для общих регистров, которые используются в обоих режимах, мы будем рассматривать их работу именно в режиме SPI.

Но, прежде чем мы начнём изучать регистры, а также блок-схемы и всё прочее модуля MSSP в региме SPI, давайте немного познакомимся вообще с шиной SPI.

Шина SPI (Serial Peripheral Interface) очень широко используется в электронике. Она очень удобна, являясь синхронной и полнодуплексной, поэтому, применяется во многих схемах для общения между различными цифровыми устройствами — датчиками, контроллерами, драйверами и прочими устройствами.

Передача данных как правило происходит по двум проводам, которые обычно называются MOSI и MISO. Также существует ножка для синхронизации SCK, а также ножка выбора устройства SS.

Немного подробнее выводах интерфейса SPI:

SS (chip select) — это ножка выбора устройства. Если на ведомом устройстве на данной ножке установится низкий уровень, то данное устройство будет откликаться и обмениваться информацией по шине SPI, если высокий, то не будет.

MOSI (master output slave input) — это ножка выхода ведущего устройства и входа ведомого устройства.

MISO (master input slave output) — наоборот, выход ведомого, вход ведущего.

SCK — ножка синхронизации. Ко всем устройствам, участвующим в обмене информации по данной шине, подаются синхроимпульсы с определённой частотой.

В обмене информацией по данной шине и по данным двум проводам могут участвовать два или более устройств. Одно из всех устройств обязательно должно быть ведущим (MASTER). Данное устройство является инициатором передачи данных, также оно выбирает с помощью низкого уровня на определённой ножке SS, которых может быть несколько в зависимости от количества устройств, то устройство, с которым ведущее устройство будет обмениваться информацией. Также ведущее устройство передаёт синхронизирующие импульсы на ножке SCK, а остальные устройства, являющиеся ведомыми, импульсов данных не генерируют, а пользуются теми, которые генерирует ведущее устройство.

Также важно отметить, что обмен идет побитно, но, как правило, у обменивающихся ведущего и ведомого устройств существуют 16-ти или 8-битные буферы, которые и накапливают в себя, а также отдают побитно информацию. Обмен происходит кольцевым способом

Эта картинка была взята по-моему из даташита контроллера AVR, но она имеет актуальность и для сегодняшнего занятия. Здесь используются буферы 8-битной ширины.

Как только на ножке синхронизации будет определённый фронт, или нисходящий или восходящий, в зависимости от настройки, данные регистры у ведомого и ведущего устройства обменяются информацией, причем не всей информацией, а только одним битом. Данные регистры сдвинутся влево и старшие биты из каждого регистра уйдут в младшие биты такого же регистра сопряженного устройства. То есть ведомый передаст свой старший бит через ножку MOSI ведущему, который его запишет в освободившийся за счет сдвига влево младший бит, а ведомый свой вытесненный за счет сдвига передаст старший бит через ножку MISO в младший бит ведущего. Вот так и идёт обмен, то есть за 8 полных циклов тактирования они полностью обменяются байтами.

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

Читайте также:  Розетка открытой проводки с заземлением технические характеристики

Существует несколько способов обена информацией между несколькими устройствами, то есть когда на одно ведущее устройство приходится несколько ведомых. Мы рассмотрим два самых распространённых из них.

Первый способ — радиальный (нажмите на картинку для увеличения изображения)

Здесь мастер направляет данные к определённому устройству, включая на ножке SS логический 0. При данном способе возможно выбрать только одно устройство, также потребуются несколько свободных ножек портов контроллера.

Есть ещё один интересный способ — кольцевой или каскадный (нажмите на картинку для увеличения изображения)

А с четырьмя видами, или режимами передачи данных по интерфейсу SPI мы познакомимся в процессе изучения организации передачи по SPI в нашем контроллере.

Собственно, пора уже переходить к контроллеру.

Начнём с регистров модуля MSSP, которые так или иначе участвуют в организации передачи по шине SPI.

Начнём с регистра SSPSTAT и рассмотрим назначение его отдельных битов

бит 7: SMP (Sample bit) – фаза выборки бита

Режим ведущего SPI:

1 – входные данные опрашиваются в конце периода вывода данных

– входные данные опрашиваются в середине периода вывода данных

Режим ведомого SPI:

Бит SMP всегда должен быть равен 0

бит 6: CKE (SPI Clock Select bit) – Выбор фронта передачи сигнала

Если бит SKP равен :

1 – Передача происходит по переднему фронту сигнала на ножке SCK

– Передача происходит по заднему фронту сигнала на ножке SCK

Если бит SKP равен 1:

1 – Передача происходит по заднему фронту сигнала на ножке SCK

– Передача происходит по переднему фронту сигнала на ножке SCK

бит 5D/A (Data/Address bit) – бит данных/адреса

Используется только в режиме I2C.

бит 4P (Stop bit) – бит Stop

Используется только в режиме I2C. Сбрасывается в , когда модуль MSSP выключен (SSPEN=0)

бит 3S (Start bit) – бит Start

Используется только в режиме I2C. Сбрасывается в , когда модуль MSSP выключен (SSPEN=0)

бит 2R/W (Read/Write bit information) –

Используется только в режиме I2C.

бит 1UA (Update Address bit) – флаг обновления адреса устройства

Используется только в режиме I2C.

бит BF (Buffer Full Status bit) – флаг заполнения буфера

Для режима SPI (только в режиме приёма)

1 – Приём завершен, SSPBUF полон

– Приём не завершен, SSPBUF пуст

Для режима I2C используется в режиме приёма и передачи.

Следующий регистр управления – SSPCON1

бит 7WCOL (Write Collision Detect bit) – флаг обнаружения коллизии (в режиме SPI только при передаче)

1 – Попытка записи в регистр SSPBUF в то время, когда он передаёт предыдущее значение (должен быть очищен программно).

– Нет коллизии.

бит 6SSPOV (Receive Overflow Indicator bit) – флаг переполнения

1 – Получение нового байта в то время, когда регистр SSPBUF всё ещё содержит предыдущие данные. В случае переполнения данные в SSPSR теряются. Переполнение может происходить только в ведомом режиме. Во избежание переполнения нужно прочитать SSPBUF (бит быть очищен программно)

– Нет переполнения

В ведущем режиме бит переполнения не устанавливается, так как каждый новый приём (передача) инициируется путём записи значения в регистр SSPBUF.

бит 5SSPEN (Synchronous Serial Port Enable bit) – включение модуля MSSP

1 – MSSP включен и ножки SCK, SDO, SDI, и SS сконфигурированы как ножки SSP.

– MSSP отключен и ножки сконфигурированы как ножки I/O

При включении ножки должны быть настроены для работы в правильном направлении при помощи регистра TRISxx.

бит 4CKP (Clock Polarity Select bit) – бит полярности тактового сигнала

1 – пассивный уровень сигнала высокий

– пассивный уровень сигнала низкий

биты 3-0SSPM3:SSPM0 (Synchronous Serial Port Mode Select bits) – биты выбора режима работы модуля MSSP

0101 – Ведомый режим SPI, тактирование с ножки SCK. Управление ножкой SS отключено. SS может быть использована как ножка I/O.

0100 – Ведомый режим SPI, тактирование с ножки SCK. Управление ножкой SS включено.

0011 – Ведущий режим SPI, тактирование – выход TMR2 / 2

0010 – Ведущий режим SPI, тактирование – FOSC/64

0001 – Ведущий режим SPI, тактирование – FOSC/16

0000 – Ведущий режим SPI, тактирование – FOSC/4

Для режима I2C комбинации битов здесь не указаны.

Есть ещё один управляющий регистр – SSPCON2. Так как данный регистр актуален только для режима I2C, то в данном уроке он рассматриваться не будет.

В следующей части урока мы рассмотрим блок-схему работы модуля MSSP в режиме SPI, а также с применением нескольких основных режимов шины SPI.

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Логический анализатор 16 каналов можно приобрести здесь

Смотреть ВИДЕОУРОК (нажмите на картинку)

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

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

Предисловие

Подключение дополнительной периферии в виде дополнительных кнопок, клавиатур, устройств вывода, экранов, светодиодов и.т.д. не всегда возможно из-за ограниченного количества портов ввода-вывода микроконтроллера. Вариантов расширения в таких случая достаточно много, но в современных микроконтроллерах существует возможность подключения через последовательные периферийные интерфейсы стандартов 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

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

Ссылки

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

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

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

Читайте также:  Трехместные розетки для скрытой проводки

Порты ввода/вывода МК PIC18XXXX.

  • TRIS – регистр выбора направления данных в каналах порта ввода/вывода, если соответствующий бит регистра “0”, то линия вывода работает на выход, если “1” то на вход. По умалчиванию порт настроен на вход.
  • PORT – регистр порта , считывает логическую информацию с выводов порта.
  • LAT – защелка порта ввода/вывода. (Очень полезный регистр. Подробнейв статье. )

Порты ввода/вывода имеет буквенное обозначение. A, B, C ..и т.д., в зависимости от количества портов в микроконтроллере. Каждый порт имеет свои регистры управления, порт “A” к примеру: TRISA, PORTA, LATA, порт”B” TRISB, PORTB, LATB и т.д..

Рассмотрим настройку порта:

Допустим необходимо настроить порт “С”, линии вывода С0-С3 на выход, а остальные на вход, для этого настраиваем регистр TRIS. Очень удобно записывать в двоичной системе .

Если необходимо весь порт настроить на выход, то достаточно очистить регистр TRIS.

На вход настраивать не нужно (по умалчиванию).

То же самое и с другими регистрами.

При применении встроенных модулей микроконтроллера в своих приложениях необходимо помнить, что приоритет мультиплексированных выводов порта отдается в пользу периферийных модулей. Т.е. не зависимо от того как были настроены выводы (на вход или на выход) при включении определенного модуля направление данных изменяется.

Хотя типов микроконтроллеров достаточно много, тем не менее практически все они “построены на базовом варианте” и рассматривая МК PIC18252 многое относится и к другим микроконтроллерам 18 серии.

  • аналоговые линии располагаются в порту “А”, (если аналоговых входов больше, то дополнительно в порту “В”).
  • подключение основного генератора.
  • линии порта”В” можно аппаратно подтянуть к шине питания +5В.
  • и т.д..

7-разрядный или 8-разрядный (в зависимости от типа МК) порт ввода/вывода. Линия RA4/T0CKI имеет триггер Шмитта на входе и открытый сток на выходе, мультиплексирован с тактовым входом таймера TMR0. Для формирования на его выходе “1” необходимо подтянуть вывод внешним резистором к шине питания +5В.

Каналы PORTA мультиплексированы с аналоговыми входами АЦП и аналоговым входом источника опорного напряжения VREF+ и VREF-. Если модуль АЦП не задействуется, то при конфигурации нужно настроить линии порта как цифровые каналы, т.к. при сбросе или включении питания микроконтроллера часть линий ввода/вывода устанавливается как аналоговые входы.

Для настройки каналов, мультиплексированных с АЦП вместо регистра ADCON1 (в зависимости от типа МК может применятся другой регистр “ANSEL”) . Настройка порта для работы с АЦП рассмотрена в соответствующей теме.

Восьмиразрядный порт ввода/вывода. К каждому выводу аппаратно можно подключить внутренний подтягивающий резистор. При сбросе микроконтроллера или переключении линии порта на выход, подтягивающие резисторы отключаются.

Для настройки каналов, мультиплексированных с АЦП применяется регистр управления “ANSELH” ( в зависимости от типа МК, к примеру в PIC18FXX2 его нет, как нет и каналов АЦП на этом порту) . По этому, если АЦП на порту не задействовано, то с помощью этого регистра необходимо настроить каналы как цифровые линии ввода/вывода. В некоторых типов МК 18 серии для настройки отдельных цифровых каналов ввода/вывода порта”В”, при конфигурации микроконтроллера необходимо прописать PBADEN=ON.

Инициализация порта “B” PIC18FXX2. (пример)

Инициализация порта “B” PIC18FXXK20. (пример)

Каналы порта часто применяют как источник прерываний . К примеру, изменение логического состояния на входе каналов RB4-7 часто применяют для опроса кнопок. (более подробно можно почитать в статье. ) .

Восьмиразрядный порт ввода/вывода. На этом порту сосредоточены в основном модули “связи”, SPI, I 2 C, USART. Кроме этого различные модули таймеров и ШИМ. Обычно если модули не задействованы, то линии работают как цифровые каналы вводы/вывода. Настройка порта производится с помощью специальных регистров TRISC, LATC, PORTC.

В зависимости от типа микроконтроллера порт”Е” бывает трех или восьмиразрядным портом ввода/вывода, Порт”D” восьмиразрядный.

Настройка порта “D” производится с помощью специальных регистров TRISD, LATD, PORTD. Порта “E” соответственно регистры TRISЕ, LATЕ, PORTЕ.

В некоторых типах микроконтроллеров могут быть специальные порты для управления LCD индикатором. А так же различные модули (специализированные МК) для управления нагрузкой и т.д..

Микроконтроллеры Microchip PIC18F1xK50 с модулем USB

Компания Microchip Technology Inc. выпускает широкую номенклатуру PIC контроллеров с интегрированным модулем USB, поддерживающим спецификацию 2.0. В настоящее время выпускаются 8-и, 16-и и 32-х битные полноскоростные (Full Speed – FS) USB микроконтроллеры в корпусах с числом выводов от 28 до 100, с поддержкой функций устройство, хост и OTG. Компания Microchip расширила семейство USB контроллеров, выпустив на рынок 20-и выводные микроконтроллеры PIC18F1xK50 (PIC18F13K50 и PIC18F14K50), отличающихся размером памяти программ. Характеристики семейства микроконтроллеров PIC18F1xK50 представлены в Табл. 1.

Таблица 1. Семейство микроконтроллеров PIC18F1xK50

КонтроллерПамятьАЦПЗахват/ Сравнение/ ШИМ (ECCP)MSSPEUARTКомпараторТаймер 8/16 битUSB
программОЗУEEPROM10рSPII 2 C
PIC18F13K50
PIC18LF13K50
8K51225611111121/31
PIC18F14K50
PIC18LF14K50
16K76825611111121/31

Контроллеры семейства K50 имеют расширенную систему команд. Дополнительно к стандартным 75-ти инструкциям ядра PIC18 новые микроконтроллеры поддерживают команды расширяющие функциональность ядра. Дополнительные восемь инструкций пополняют операции с косвенной и индексной адресацией, в новом ядре также реализована индексная адресация со смещением для многих стандартных инструкций ядра PIC18. Расширение системы команд по умолчанию запрещено. Для разрешения работы расширенных команд служит специальный бит XINST в битах конфигурации микроконтроллера. Таким образом, реализуется полная программная совместимость со стандартным ядром, если пользователь использует новые микроконтроллеры со старым программным обеспечением.

Расширенные инструкции предназначены для улучшения оптимизации и возможности создания реентерабельного кода на языках высокого уровня, например на Си. Наряду с прочим, расширенные системы команд позволяют компиляторам языков высокого уровня эффективно выполнять такие операции над данными как:

  • автоматическое размещение и освобождение области программного стека при входе и выходе из подпрограмм;
  • вызов функции по указателю;
  • манипулирование с указателями на программный стек;
  • работа с переменными расположенными в программном стеке.

Контроллеры серии K50 могут работать с максимальной тактовой частотой 48МГц в диапазоне напряжений от 2.7 до 5.5В, и на частоте 20МГц в диапазоне от 1.8 до 2.7В.

Модуль USB контроллеров PIC18F1xK50 поддерживает LS (Low Speed – 1.5Мб/с) и FS (Full Sped – 15МБ/с) спецификации USB 2.0. Контроллеры имеют по 256 байт выделенной для работы с USB двухпортовой ОЗУ, поддерживают 16 конечных точек (по 8 на вход и на выход). Для определения физического подключения микроконтроллера к шине USB контроллеры имеют возможность формирования прерывания по изменению состояния на выводах D+ и D-. Так же как и старшие контроллеры семейства PIC18, новые 20-и выводные контроллеры содержат все необходимое для прямого подключения к USB хосту (встроенный USB модуль с трансивером, подтягивающие резисторы на линии D+ и D- для задания скорости шины), но не могут работать с внешним USB трансивером.

Устройства на базе контроллеров семейства PIC18F1xK50 могут работать с питанием от шины USB, от собственного источника питания или иметь комбинированное питание. При наличии в устройстве собственного источника питания может пригодиться возможность PIC контроллера определять подключение USB кабеля с помощью возможности формирования прерывания по изменению состояния на линиях D+ и D-. Хост или хаб USB имеет подтягивающие к “земле” резисторы порядка 15КОм. При подключении микроконтроллера к шине USB и наличии внешних подтягивающих резисторов к напряжению питания, микроконтроллер может определить изменение состояния на выводах D+ и D-, выставить флаг прерывания и включить модуль USB.

Помимо модуля USB контроллеры имеют модуль последовательного интерфейса EUSART и модуль синхронного последовательного интерфейса MSSP.

Модуль EUSART поддерживает работу с интерфейсами RS-485, RS-232 и LIN 2.0. Наличие внутреннего точного стабилизированного RC генератора и возможности автоматического определения скорости принимаемых данных позволяет работать без внешнего кварцевого генератора.

Модуль синхронного последовательного интерфейса MSSP позволяет работать в режимах Master и Slave с интерфейсами SPI и I 2 C.

Микроконтроллеры серии PIC18F1xK50 содержат всю, ставшую стандартной аналоговую периферию – 10-и разрядный АЦП, два аналоговых компаратора и программируемый источник опорного напряжения. Из нововведений следует отметить наличие встроенного прецизионного источника фиксированного опорного напряжения. Для фиксированного источника опорного напряжения выбираются три значения напряжения 1.024В, 2.048 и 4.096В. Источник опорного напряжения может использоваться как база для программируемого источника опорного напряжения (ЦАП), может подключаться на вход АЦП и компараторов.

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

Микроконтроллеры PIC18F1xK50 имеют два аналоговых компаратора. Компараторы часто интегрируются в микроконтроллеры, так как они предоставляют некоторые полезные функции, независимые от исполняемого программного кода. Встроенные компараторы имеют входной мультиплексор, позволяющий подключать входы компараторов к тому или иному выводу микроконтроллера и источникам опорного напряжения. Выход компаратора может подключаться на выходной порт микроконтроллера, может быть источником прерывания, выводить микроконтроллер из режима энергосбережения Sleep, а так же выключать ШИМ модуль микроконтроллера.

Модуль компараторов может работать совместно с интегрированным RS-триггером. Данная связка позволяет реализовывать сенсорные клавиатуры, импульсные преобразователи энергии, управление мощными светодиодами и многое другое.

Микроконтроллеры семейства PIC18F1xK50, как и все контроллеры К-серии, выполнены по технологии 0.35 микрон и имеют максимальное напряжение питания 3.6В. Однако версии контроллеров PIC18F1xK50 имеют встроенный регулятор напряжения 3.2В, что позволяет работать от питающих напряжений в диапазоне от 1.8 до 5.5В, при этом вся периферия так же работает во всем диапазоне питающих напряжений, за исключением выводов RA1 и RA2 (D+ и D-), которые могут работать как входы с уровнями напряжений до 3.6В или как линии интерфейса USB. В версиях контроллера PIC18LF1xK50 нет встроенного регулятора напряжения питания, поэтому LF-контроллеры имеют ограниченный диапазон питания от 1.8 до 3.6В.

Таблица 2. Электрические параметры контроллеров серии K50

Тип контроллераВстроенный стабилизатор питанияДиапазон питающих напряженийТок портов ввода/вывода
PIC18F13K50
PIC18F14K50
3.2В1.8 – 5.5В± 25мА
PIC18LF13K50
PIC18LF14K50
нет1.8 – 3.6В± 25мА

Новые микроконтроллеры совместимы по выводам со всеми 20-и выводными контроллерами Microchip, однако один вывод выделен для подключения конденсатора для стабилизации внутреннего регулятора напряжения. Совместимость по выводам как с предыдущими контроллерами, так и с будущим семейством PIC18F1xK22 (аналогичные контроллеры, но без модуля USB), позволит унифицировать печатную плату под различные задачи или с минимальными доработками интегрировать USB интерфейс в существующую разработку.

Читайте также:  Как сделать электропроводку в стиле «ретро»?

Микроконтроллеры PIC18F1xK50 выпускаются в корпусах DIP-20, SOIC-20 и миниатюрном корпусе SSOP-20 и имеют индустриальный температурный диапазон -40…+125°С.

Новые контроллеры поддерживаются всеми средствами отладки компании Microchip (программаторами-отладчиками PICkit2, PICkit3, ICD-2, ICD-3 и внутрисхемным эмулятором REAL ICE). Однако, как и для всех маловыводных контроллеров, для внутрисхемной отладки необходим специальный отладочный модуль. На плате отладочного модуля установлен специальный микроконтроллер PIC18F14K50-ICD, который содержит модуль теневой отладки и имеет дополнительные выводы, выделенные для внутрисхемной отладки.

В помощь разработчику компания Microchip выпускает демонстрационный комплект Low Pin Count USB Development Kit (номер для заказа DM164127). Демонстрационный комплект Low Pin Count USB Development Kit (рис.2) содержит все необходимое для начала работы и освоения маловыводных микроконтроллеров с USB:

  • Демонстрационную плату с микроконтроллером PIC18F14K50 и одну плату без установленных компонентов для самостоятельной сборки.
  • Отладочный модуль для внутрисхемной отладки контроллеров семейства PIC18F1xK50.
  • Внутрисхемный отладчик-программатор PICkit2.
  • Компакт-диск с необходимым программным обеспечением, примерами программ и лабораторными работами для освоения USB-микроконтроллеров.


Рис. 2. Демонстрационный комплект Low Pin Count USB Development Kit

Новые USB контроллеры поддерживаются готовыми USB библиотеками Microchip. Пакет программ MCHPFS USB Framework содержит реализации различных классов USB устройств. Для контроллеров PIC18F14K50 вы найдете примеры реализации коммуникационного CDC класса (виртуальный COM порт через USB), различных HID устройств (манипулятор мышь, джойстик, пользовательское устройство), устройство хранения данных – MSD, составное устройство (реализация HID и MSD через одно USB соединение).

Благодаря низкой цене, малому размеру корпусов, обширной коммуникационной и аналоговой периферии новые USB контроллеры семейства PIC18F1xK50 найдут широкое применение в преобразователях интерфейсов, датчиках, периферийных USB контроллерах. Совместимость кода со старшими семействами и готовые примеры реализации различных классов USB устройств помогут программистам легко и быстро освоить новое семейство маловыводных USB контроллеров производства Microchip.

Статья была опубликована в журнале “КиТ” №4 2009 год

Программная реализация ведущего шины SPI (подробный разбор и некоторые процедуры на асме для PIC и AVR)

В этой статье рассматривается пример программной реализации на микроконтроллерах PIC и AVR функций ведущего шины SPI для разных режимов (mode0, mode1, mode2, mode3). Чтобы понимать что происходит — для начала, как всегда, читаем теорию (что такое SPI и как он работает). Если с теорией разобрались, тогда можно приступать к практической реализации.

Итак, что должен уметь делать SPI-мастер? Собственно говоря, всего четыре вещи:

  1. читать с шины MISO нужное количество бит;
  2. передавать по шине MOSI нужное количество бит;
  3. формировать на шине SCLK нужное количество импульсов, соблюдая правильную полярность;
  4. управлять шиной SS.

Как вы знаете (вы же с теорией знакомы?) — чтение и установку данных и «Мастер», и «Слэйв» производят по противоположным фронтам сигнала тактирования, причём для приёма и передачи может использоваться один и тот же сдвиговый регистр. Для наглядности давайте нарисуем для всех четырёх режимов диаграммы сигналов, соответствующие передаче по SPI двух бит, а уже по ним распишем действия контроллера:

Диаграммы нарисованы для случая, когда передача осуществляется младшим битом вперёд.

Биты, не выделенные жирным, — не имеют для нас значения и могут быть на следующем этапе перезаписаны (это, например, те биты, которые мы уже установили на шину данных, или, наоборот, — уже считали с шины данных).

По диаграммам видно, что в результате обмена данными сдвиговые регистры «Мастера» и «Слэйва» поменялись содержимым (помните, в теоретической части я писал, что у SPI есть такая особенность, — для приёма и передачи можно использовать один и тот же регистр).

Прежде чем переходить к написанию кода, — давайте ещё подумаем вот о чём. Архитектура контроллеров у нас 8-ми битная, а для SPI часто может потребоваться бОльшая размерность сдвигового регистра.

Пусть в нашем примере размер сдвигового регистра можно будет выбрать от 1-го до 32-х бит. То есть максимально под сдвиговый регистр мы будем выделять 4 байта (4 восьмибитных регистра, расположенных в памяти так, как на рисунке справа). Для случаев, когда размер регистра превышает 1 байт (то есть равен 2, 3 или 4 байта) мы будем программно имитировать работу с несколькими 8-ми битными регистрами как с одним большим. Используемые для организации сдвигового регистра восьмибитные регистры в дальнейшем будем называть просто байтами, чтобы не путаться.

Что представляет собой чтение с точки зрения «Мастера»? Да ничего особенного, — нужно просто прочитать сигнал на входе (MISO) и записать его в младший или старший бит сдвигового регистра (в зависимости от того — младшим или старшим битом вперёд передаются данные и от значения CPHA). Вот так это выглядит в коде:

1) Для передачи младшим битом вперёд при CPHA=0 и старшим битом вперёд при CPHA=1

Read_MISO: bcf INDF, 0 btfsc PORT_SPI, MISO_Line bsf INDF, 0 return

2) Для передачи старшим битом вперёд при CPHA=0 и младшим битом вперёд при CPHA=1

Read_MISO: bcf INDF, 7 btfsc PORT_SPI, MISO_Line bsf INDF, 7 return

Для случая 1 в регистр FSR должен быть предварительно загружен адрес младшего используемого байта нашего сдвигового регистра, а для случая 2 — адрес старшего используемого байта этого регистра.

PORT_SPI — адрес порта ввода /вывода, к которому подключена линия MISO,

MISO_Line — номер канала порта.

1) Для передачи младшим битом вперёд при CPHA=0 и старшим битом вперёд при CPHA=1

Read_MISO: ld temp, X cbr temp, 0b00000001 sbic PIN_SPI, MISO_Line sbr temp, 0b00000001 st X, temp ret

2) Для передачи старшим битом вперёд при CPHA=0 и младшим битом вперёд при CPHA=1

Read_MISO: ld temp, X cbr temp, 0b10000000 sbic PIN_SPI, MISO_Line sbr temp, 0b10000000 st X, temp ret

Для случая 1 в регистр X должен быть предварительно загружен адрес младшего используемого байта нашего сдвигового регистра, а для случая 2 — адрес старшего используемого байта этого регистра.

PIN_SPI — адрес регистра, отображающего состояния входов порта ввода/вывода, к которому подключена линия MISO,

MISO_Line — номер канала порта.

Здесь и далее, temp — просто некий вспомогательный регистр.

Кроме того, перед началом передачи, предназначенные для передачи биты, должны быть выровнены по старшему биту старшего используемого нами для организации сдвигового регистра байта при передаче старшим битом вперёд, и по младшему биту младшего используемого байта при передаче младшим битом вперёд. Картинка внизу иллюстрирует, что имеется ввиду на примере 12-ти битного пакета SPI (то есть, когда мы реализуем 12-ти битный сдвиговый регистр; при этом из наших зарезервированных четырёх байт используются только два).

Идём дальше. «Сдвиг», как видно по диаграммам, состоит для «Мастера» (впрочем как и для «Слэйва», но мы в этой статье занимаемся только «Мастером») из двух действий: это,
во-первых, собственно сдвиг регистра и, во-вторых, установка очередного бита на шину MOSI.

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

Для контроллеров PICДля контроллеров AVR

Shift_Right: movf Hi_byte_Address,0 movlw FSR movf Byte_Number,0 movlw Byte_Counter bcf STATUS,C Next_Shift_Right: rrf INDF,1 incf FSR decfsz Byte_Counter goto Next_Shift_Right movf Hi_byte_Address,0 movlw FSR btfsc STATUS,C bsf INDF,7 return

Shift_Left: movf Low_byte_Address,0 movlw FSR movf Byte_Number,0 movlw Byte_Counter bcf STATUS,C Next_Shift_Left: rlf INDF,1 decf FSR,1 decfsz Byte_Counter goto Next_Shift_Left movf Low_byte_Address,0 movlw FSR btfsc STATUS,C bsf INDF,0 return

Shift_Right: mov XL, Hi_byte_Address mov Byte_Counter, Byte_Number clc Next_Shift_Right: ld temp, X ror temp st X, temp inc XL dec Byte_Counter brne Next_Shift_Right brcc Shift_Right_Exit mov XL, Hi_byte_Address ld temp, X sbr temp, 0b10000000 st X, temp Shift_Right_Exit: ret

Shift_Left: mov XL, Low_byte_Address mov Byte_Counter, Byte_Number clc Next_Shift_Left: ld temp, X rol temp st X, temp dec XL dec Byte_Counter brne Next_Shift_Left brcc Shift_Left_Exit mov XL, Low_byte_Address ld temp, X sbr temp, 0b00000001 st X, temp Shift_Left_Exit: ret

Для контроллеров PICДля контроллеров AVR
  1. Low_byte_Address — адрес младшего байта нашего сдвигового регистра,
  2. Hi_byte_Address — адрес его старшего байта,
  3. Byte_Counter — счётчик обработанных байт,
  4. Byte_Number — количество байт, используемых для организации сдвигового регистра.

Ну вот, со сдвигом регистра разобрались, теперь можно приступать и к этапу передачи, именуемому «Сдвиг». Как я ранее уже писал, — этот этап передачи состоит из двух действий: сдвиг регистра и установка очередного бита на шину MOSI. В коде это будет выглядеть так:

1) Для передачи младшим битом вперёд при CPHA=0

Shift_&_Set_MOSI: call Shift_Right movf Low_byte_Address,0 movwf FSR bcf PORT_SPI, MOSI_Line btfsc INDF, 0 bsf PORT_SPI, MOSI_Line return

2) Для передачи старшим битом вперёд при CPHA=0

Shift_&_Set_MOSI: call Shift_Left movf Hi_byte_Address,0 movwf FSR bcf PORT_SPI, MOSI_Line btfsc INDF, 7 bsf PORT_SPI, MOSI_Line return

3) Для передачи младшим битом вперёд при CPHA=1

Shift_&_Set_MOSI: movf Low_byte_Address,0 movwf FSR bcf PORT_SPI, MOSI_Line btfsc INDF, 0 bsf PORT_SPI, MOSI_Line call Shift_Right return

4) Для передачи старшим битом вперёд при CPHA=1

Shift_&_Set_MOSI: movf Hi_byte_Address,0 movwf FSR bcf PORT_SPI, MOSI_Line btfsc INDF, 7 bsf PORT_SPI, MOSI_Line call Shift_Left return

1) Для передачи младшим битом вперёд при CPHA=0

Shift_&_Set_MOSI: rcall Shift_Right in temp1, PORT_SPI cbr temp1, (1

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector
Для контроллеров PICДля контроллеров AVR