Предыдущая статья [1] (назовём её «часть 1» цикла статей, так как надеюсь, что энтузиазма и сил хватит на несколько статей) была посвящена самой очевидной из частей Периферии Независимой от Ядра микроконтроллеров (МК) Microchip – конфигурируемым логическим ячейкам. UPD. тут часть 3. АЦП с вычислителем Сейчас же рассмотрим некоторые особенности портов ввода/вывода и в особенности те их них, которые могут помочь в реализации специфических функций и упростить построение схем с использованием PIC микроконтроллеров.  Порты ввода/вывода можно назвать Периферией Независимой от Ядра, так как входы портов являются асинхронными, состояние портов сохраняется в спящем состоянии ядра. Наверное уникальных возможностей у “портовой” периферии найти сложно, но некоторые “фишки” всё же заслуживают внимания. Порты современных микроконтроллеров PIC имеют набор стандартных функций: Из “не стандартных”, но весьма полезных особенностей следует отметить возможность переназначения функций портов (Peripheral Pin Select, PPS).
Переназначение функций портов интересно тем, что предоставляет следующие возможности:  Рис.1. Пример конфигурирования PPS в среде разработке MPLAB X IDE В некоторых новейших семействах, например PIC16F18855, появилась доселе невиданная в PIC функция — контроль тока выходного драйвера, т.е. контроль втекающего/вытекающего тока (Current-Control Drive Mode, CCDM). Теперь можно установить какой ток будет вытекать или втекать в порт. При включении данного режима для каждого вывода микроконтроллера можно включить контроль тока, причем имеется возможность индивидуального разрешения контроля втекающего и вытекающего тока.  Вариантов значений токов не так много — можно выбрать значения 1, 2, 5 и 10мА, к тому же выбранное значение будет единым для всех контролируемых выходов.
Но, контроль тока выходных драйверов портов дает массу возможностей: Лучше всего можно прочувствовать возможности новых функций портов на конкретных примерах Допустим, на плате произошло короткое замыкание между двумя портами, настроенными на выход. Если один порт будет в состоянии лог.1, а второй в лог.0, то через порт будет протекать ток. При нагрузочной способности до 25мА (реально до 50мА) через порты будет протекать большой ток, что может привести к выходу порта или контроллера из строя. Функция ограничения тока может предотвратить повреждение порта.
В дополнение можно организовать диагностирование портов, определение нагрузки. При необходимости тестирования порта используют подобные схемы (см. рис.2). В этом случае можно подать сигнал на один порт и считать состояние другим выводом порта. В принципе, за счет структуры портов МК Microchip, можно тестировать без внешнего резистора (подать в порт какой-либо лог. уровень и считать вход этого же порта), но при КЗ по выходу не будет ограничения тока.  Рис.2. Самотестирование порта МК. При наличии функции ограничения тока порта мы можем обеспечить безопасное тестирование порта, так как ток КЗ будет ограничен с помощью функции CCDM. Рис.3. Самотестирование с использованием ограничения тока порта. Например, в программе настраиваем порт (RC7) на выход с ограничением тока, подаем лог.1, далее считываем состояние этого же порта на входе.
Считывать можем как в цифровом виде, так и с помощью АЦП, причем во втором случае можем определять сопротивление нагрузки (так как известны напряжение питания и ток через порт). Рис.4. Вывод в терминал информации тестирования порта RC7. В предыдущей статье посвященной CLC мы уже рассматривали разного рода генераторы/мультивибраторы, рассмотрим как CCDM и PPS позволит упростить и до того простые схемы основанные на ПНЯ (CLC).  Рис 5. Мультивибратор на двух гейтах. На рис.5 изображен ранее рассмотренный генератор на D триггере, инверторе и RC цепочке (в данном случае схема чуть перерисована для отображения внешних по отношению к микроконтроллеру подключений). Частота генератора определяется параметрами R и C. Резистор R задает ток заряда/разряда конденсатора C. Теперь, при наличии встроенного контроллера тока драйвера порта, мы можем убрать резистор и чуть упростить схему. Прим. Далее на рисунках выход порта с функцией CCDM будет обозначаться в виде резистора с подписью CCDM Рис.6. Мультивибратор с ограничением выходного тока порта CLC2  Следует отметить, что совсем не обязательно для CLC1 использовать D триггер, пойдет любой вариант реализации неинвертирующего гейта.  Рис. 7. Другой вариант мультивибратора на двух логических гейтах.  Возможность избавиться от одного резистора это не та цель, ради которой стоило бы рассматривать данную тему, но в данном примере мы дополнительно имеем следующее: уменьшение используемого числа выводов МК (да, вы же помните что у нас есть часть ПНЯ в виде PPS), то есть для одного и того же корпуса можем иметь больше возможностей — впихнуть больше в меньшее. Рис. 8. Управление током позволяет программно менять частоту мультивибратора. В первоначальной схеме от микроконтроллера понадобилось бы 3 вывода, модифицированная схема с использованием PPS и CCDM требует только 2.  На самом деле мультивибратор можно сделать и на одном гейте (рис.9), тогда от микроконтроллера понадобится вообще один внешний выход. Выход CLC можно подключить внутри МК к другой периферии. На конденсаторе мы будем видеть треугольный сигнал, но мы можем убедиться в том, что на выходе CLC все же присутствует последовательность из “нулей” и “единиц”, если выход той же самой CLC вывести на другой “контрольный” вывод МК с помощью PPS. Рис.9. Мультивибратор на одном гейте Рис.10. Форма сигнала на конденсаторе мультивибратора и контрольный выход логического элемента. Для режима контроля тока драйвера порта мы можем задавать фиксацию втекающего и вытекающего тока. На схеме рис.9 контролируются оба тока. Если включить контроль только вытекающего тока, то получим следующую картину (рис.11). Рис. 11. Генератор пилообразного напряжения. То есть в данном случае конденсатор заряжается ограниченным током 1мА, а разряжается через порт без ограничения тока (следует учесть, что максимально допустимый ток для порта 50мА, поэтому может понадобиться последовательный резистор для ограничения тока).  Как вы видите из диаграмм (рис. 10 и 11) на конденсаторе получаем пилу, верхнее и нижнее значение напряжений которой лежит между уровнями лог 1 и 0 цифровых входов. Если хотим увеличить амплитуду, то можно дополнительно использовать два внутренних компаратора (в ч.1 уже рассматривали эту схему генератора). Теперь повторим эту схему, но уже с использованием функции контроля тока драйвера порта выхода (CCDM), т.е. без внешнего резистора и с уменьшенным числом задействованных портов В/В. Рис.12. Мультивибратор с компараторами.  За счет контроля тока получаем более линейный генератор пилообразного напряжения, чем в рассматриваемой ранее аналогичной схемы (см. [1]).
Так же как и для предыдущего варианта мультивибратора, частоту можем менять программно за счет изменения тока порта. Рис 13. Выход мультивибратора  Если изменять опорное напряжение на компараторе, то получим генератор управляемый напряжением. Опору компаратора можно менять как встроенным ЦАП, так и подавать с внешних цепей микроконтроллера. Рис. 14. Изменение частоты генератора за счет изменения опорного напряжения компаратора. Схему мультивибратора на двух компараторах и RS-триггере можно чуть оптимизировать. Нижний порог срабатывания схемы (вход R триггера) оставить с управлением от компаратора, а второй от порта (S вход триггера).  Рис. 15. Вариант мультивибратора с одним компаратором. Освободившийся компаратор, совместно с построенным генератором пилы можно использовать для построения ШИМ модулятора. Итак, теперь если на один вход компаратора подать пилообразно меняющееся напряжение, а на другой “опорное” напряжение, то получим ШИМ модулятор. Скважность ШИМ будет определяться уровнем порогового напряжения, а частота определяется частотой пилы.  Рис. 16. ШИМ модулятор из генератора пилы и компаратора. Рис. 17. Диаграмма на выходе ШИМ модулятора. Частота пилы рассматриваемых генераторов определяется емкостью C и током порта. Можем сформировать пилу с частотой сотни килогерц.
Опорный сигнал может быть как внешним, так и формироваться, например, встроенным ЦАП. Если опорный сигнал поступает с источника звука, то нам осталось совсем немного до построения усилителя класса D.  У микроконтроллеров серии PIC16F188xx есть модуль формирования комплементарных сигналов (Complementary Waveform Generator, CWG), который из входного сигнала может сформировать сигналы управления мостовой схемой. Рис. 18. Схема усилителя класса D на микроконтроллере с использованием CIP. Рис. 19. Диаграмма сигналов усилителя. Итак, из таких частей ПНЯ как порт с Контролем тока выхода CCDM, Конфигурируемые Логические Ячейки CLC, Компараторы, ЦАП, формирователь комплементарных сигналов CWG мы получили усилитель класса D. Мы рассмотрели еще одну часть Периферии Независимой от Ядра — порты ввода/вывода микроконтроллеров Microchip. Большинство возможностей, включая переназначение функций выводов, присутствуют во многих семействах PIC16F1xxx, но новая “фича” — CCDM (управление током выходного драйвера порта), появилась совсем недавно в семействе PIC16F188xx (PIC16F18855 и др.).  Независимость от ядра заключается в том, что нам необходимо только инициализировать необходимые возможности (PPS, CCDM и др), остальное функционирование не зависит от тактовой частоты и в каком состоянии находится ядро МК (Run, Sleep, Idle или Doze). Но в процессе работы мы, тем не менее, имеем возможность изменить функционирование такой периферии. Периферия независимая от ядра интересна сама по себе, но наибольшую пользу может принести возможность синтеза функциональных блоков, т.е. совместное использование нескольких периферийных модулей для решения конкретных задач. В этом случае тактовая частота, быстродействие и разрядность ядра уходят на второй план – аппаратная часть выполняет специализированные функции, а ядро занимается программной поддержкой изделия.