Практически ни один проект с МК не обходится без операций ввода/вывода через параллельные порты. МК семейства dsPIC33F предоставляют разработчику широкие возможности по работе с дискретными сигналами благодаря наличию достаточного количества портов ввода/вывода и некоторым функциям, расширяющим функциональность самих портов.
Порты ввода/вывода общего назначения — это простейшие периферийные устройства, с помощью которых МК может получать цифровые данные и управлять другими устройствами (рисунок 19.16).
Рисунок 19.16 – Структура линии порта, объединенной с выводами периферийных функций
Дополнительную гибкость при работе с портами ввода/вывода обеспечивает и то, что их можно настроить для выполнения альтернативных функций.
Все выводы МК (кроме выводов питания Vdd, Vss, AVdd, AVss, VCap и вывода сброса MCLR) могут использоваться как периферийными модулями, так и параллельными портами ввода/вывода. Все вводные линии портов имеют триггер Шмидта по входу для исключения влияния электромагнитных помех и шумов.
Линии ввода/вывода МК разделены на три порта: RA, RB, RC. Подавляющее большинство линий ввода/вывода всех портов имеют дополнительные функции и могут использоваться различными периферийными модулями МК.
Мультиплексор Output Multiplexer (рисунок 19.16) выбирает, каким образом функционирует линия порта (в качестве части периферийного модуля, либо в качестве линии параллельного порта ввода/вывода). Таким образом, перед использованием таких линии в качестве линий порта ввода/вывода необходимо предварительно отключить соответствующие периферийные устройства. Например, при использовании порта RA2 как линии ввода, необходимо отключить дополнительную функцию порта RA2 (выход тактирующего сигнала внутреннего генератора) следующей директивой:
_FOSC(OSCIOFNC_ON & POSCMD_NONE)
Для работы с портами каждый из них имеет 3 специальных регистра:
- TRISx – регистр направления данных – задает каким образом используется линия порта (как вход либо как выход). При установке соответствующего бита в 1 линия порта будет сконфигурирована как вход;
- LATx – регистр выводов порта – установка соответствующего бита данного регистра в 1 позволяет установить высокий уровень сигнала на выходе линии порта, при установке соответствующего бита в 0 – низкий уровень сигнала;
- PORTx – регистр состояния порта – чтение соответствующего бита из данного регистра позволяет получить состояние сигнала (высокий либо низкий уровень) на входе линии порта.
Примечание – действительные названия регистров получаются подстановкой названия порта вместо символа х. Соответственно, регистры порта А называются TRISA, LATA, PORTA, порта В - TRISB, LATB, PORTB, порта C - TRISC, LATC, PORTC.
Для того, чтобы установка бита регистра LATx приводила к соответствующему изменению состояния линии вывода порта, необходимо чтобы эта линия была предварительно сконфигурирована как выход установкой требуемого бита в регистре TRISx. Аналогично, чтобы чтение бита регистра PORTx отображало действительное состояние линии ввода порта, необходимо чтобы эта линия была предварительно сконфигурирована как вход установкой требуемого бита в регистре TRISx.
Таким образом, настройка линии 2 порта RA на вход, а линии 15 порта RB на вывод осуществляется следующим образом:
TRISAbits.TRISA2 = 1;
TRISBbits.TRISB15 = 0;