PORTA (и порт E) в PIC'е с АЦП как-то странно работает ?
Ответ:
[Вернуться в категорию "Микроконтроллеры семейства PIC"] В документации на PIC описано, что выводы, сконфигурированные как аналоговые (регистр ADCON1), перестают работать как цифровые входы. Это связано с тем, что при конфигурировании вывода как аналогового запрещается работа его [цифрового] входного буфера, чтобы подача промежуточных значений напряжения не приводила к протеканию сквозных токов в этом буфере. Такие входы читаются как '0'. Однако работа выходного буфера не запрещается и он по-прежнему управляется соответствующими битами регистров TRISA (TRISE) и PORTA (PORTE). Поэтому естественно, что для реального использования вывода как аналогового следует перевести его выходной буфер в hi-Z. Если же это не так, и выходной буфер активизирован (TRIS=0, предполагается отсутствие конфликта с внешними цепями, подключенными к этому выводу), то это никак не повлияет на работу модуля АЦП, и при выборе этого канала он будет добросовестно преобразовывать напряжение на этом выводе (а уж осмысленность этого останется на совести разработчика).
Из вышеизложенного следует, что выводы, сконфигурированные как аналоговые, при необходимости (а выводы, как и любые другие ресурсы, чаще в дефиците, чем в избытке) вполне можно задействовать как цифровые выходы. Однако работать с ними (и другими цифровыми выходами портов A и E, если таковые имеются) придется аккуратнее, чем обычно. "Опасность" представляют циклы "чтение-модификация-запись", то есть арифметические и логические операции с портом, а также установка и сброс битов. В отличие от этого, команды "movwf" или "clrf" никак не используют старое значение и не могут иметь побочного эффекта. Hо команда "tstf" - имеет (см.вопрос о внутренней работе с данными).
Пусть, например, в ADCON1 часть выводов (или все) включены как аналоговые, но 0-й бит регистра TRISA сброøен (то есть RA0 - выход) и RA0=1 (на RA0 высокий уровень). Тогда ничем не примечательная команда "bsf PORTA,4" приведет (помимо желаемого результата) также и к сбросу RA0, так как в этот разряд регистра данных порта запишется '0', прочитанный из-за того, что цифровой входной буфер на RA0 при этом выключен.
Другой пример. Пусть в системе на pic16c74 (77, etc.) требуются 6 аналоговых входов и 2 цифровых выхода. Очевидно, что придется выбрать как аналоговые все 8 входов (регистр ADCON1), но 2 из них использовать как цифровые выходы. Если это будут 2 вывода _одного_ порта (A или E), то _независимо_ манипулировать ими при помощи команд bsf и bcf не удастся.
Следует также помнить, что после сброса ADCON1=0, то есть все аналоговые входы включены именно как аналоговые. И это вполне логично, так как уровни на них могут оказаться отнюдь не цифровые. Так что даже если в конкретной системе АЦП вообще не используется, то все равно придется "работать с АЦП": модифицировать регистр ADCON1, чтобы переключить выводы в цифровой режим.
Автор: Владимир Клочко [Микроконтроллеры семейства PIC]
|