Разница между ПОРТОМ и ЗАДВИЖКОЙ на PIC 18F

Я уже прочитал таблицу данных и Google, но я все еще не понимаю что-то.

В моем случае я установил PIN RC6 PIC18F26K20 в режиме INPUT:

TRISCbits.TRISC6 = 1;

Затем я читаю значение с помощью PORT и LATCH, и у меня другое значение!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1 дает мне 0, где v2 дает 1.

Это нормально? В каком случае мы должны использовать PORT, а в каком случае LATCH?

7 ответов

Решение

Защелка - это выходная защелка, в которую записываются значения. Порт - это напряжение на фактическом выводе.

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

Другая ситуация, приводящая к тому, что вы описали, - это когда порт порта не был правильно настроен. Я (и все, с кем я работаю) потратил много часов, пытаясь выяснить, почему наш PIC не работает, как ожидалось, чтобы в конечном итоге выяснить, что, к примеру, мы замолчали, отключив аналоговые модули. Убедитесь, что вы перешли через раздел I/O Ports -> PORT?, TRIS? И LAT? регистрируется в техническом описании. Вы можете получить больше информации на вики-странице Microchip, где объясняется, что вы читаете неправильное значение сразу после того, как вы записали вывод на вывод, подключенный к емкостной нагрузке.

Эта вики-страница также объясняет:

Чтение регистра защелки порта возвращает настройки выходных драйверов, в то время как чтение регистра порта возвращает логические уровни, видимые на выводах.

Кроме того, вот фрагмент из раздела Порты ввода / вывода на 18F14K50 (который должен быть таким же, как и остальные серии 18F):

Каждый порт имеет три регистра для своей работы. Эти регистры:

  • Регистр TRIS (регистр направления данных)
  • Порт PORT (считывает уровни на выводах устройства)
  • LAT регистр (выходной фиксатор)

Так что в большинстве ситуаций вы будете писать в защелку и читать из порта.

Я адаптирую свой ответ от электротехники.

Давайте использовать картинку из руководства:

Общая операция порта ввода / вывода

Когда вы записываете бит в вывод ввода-вывода, вы сохраняете этот бит из шины данных в регистр данных ( D-FlipFlop). Если TRISx этого бита равен 0, то данные из Q регистра данных будут на выводе ввода / вывода. Пишите в LATx или PORTx то же самое. Смотрите ниже в красном:

Операция записи общего порта ввода / вывода

С другой стороны, чтение из LATx отличается от чтения из PORTx.

Когда вы читаете из LATx, вы читаете, что находится в регистре данных ( D-FlipFlop). Смотрите картинку ниже в зеленом:

Операция с общим портом ввода / вывода с чтением LATx

А когда вы читаете из PORTx, вы читаете фактическое значение вывода ввода / вывода. Смотрите ниже синим цветом:

Операция с общим портом ввода / вывода Читать PORTx

PIC использует операции чтения-изменения-записи для операций записи, и это может быть проблемой, поэтому они используют этот теневой регистр, чтобы избежать этого.

Вот полезное резюме из таблицы.

11.2.3 LAT регистры
Регистр LATx, связанный с выводом ввода / вывода, устраняет проблемы, которые могут возникнуть с инструкциями чтения-изменения-записи. Чтение регистра LATx возвращает значения, хранящиеся в выходных защелках порта, вместо значений на выводах ввода / вывода. Операция чтения-изменения-записи в регистре LAT, связанная с портом ввода-вывода, исключает возможность записи значений входных выводов в защелки порта. Запись в регистр LATx имеет тот же эффект, что и запись в регистр PORTx.

Различия между регистрами PORT и LAT можно суммировать следующим образом:

  • Запись в регистр PORTx записывает значение данных в защелку порта.
  • Запись в регистр LATx записывает значение данных в защелку порта.
  • Чтение регистра PORTx считывает значение данных на выводе ввода / вывода.
  • Чтение регистра LATx считывает значение данных, хранящихся в защелке порта.

Да, нормально читать PORTx и LATx и иногда обнаруживать, что они имеют разные значения.

Если вы хотите узнать, работает ли какое-либо внешнее оборудование с высоким или низким значением для вывода, вы должны установить этот вывод в режим ввода (с помощью TRIS или регистра DIR) и прочитать PORTx. Это чтение говорит вам, является ли фактическое напряжение на выводе высоким или низким.

Если вы хотите получить высокий или низкий уровень на выводе, вы должны установить вывод на вывод (с помощью TRIS или регистра DIR); Вы должны записать бит в регистр LATx.

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

Открытые цепи: читать, прежде чем писать

Моя рекомендация - считать значения PORT доступными только для чтения. Значения LAT могут быть прочитаны или записаны, но считанное значение будет последним записанным значением, а не входным значением вывода.

На старых PIC значения LATx не существовали; единственный способ записи в порт был через регистры PORTx. Любопытно, что некоторые из действительно старых PIC, еще со времен General Instruments (до микрочипа), поддерживали LATx, но Microchip не добавлял эту функцию до линии PIC18x.

Использование LATx: записать на выходной контакт

использование PORTx: прочитать входной контакт

Для всех фото с LATx регистры, все входные данные должны быть из PORTx и все ВЫХОДЫ должны быть LATx, что полностью исключает проблему переворачивания битов при записи в один бит порта.

Недавно я испытал, что запись на PORTx Ri (например, PORTC RC1) PIC18F14K50 неэффективна, когда другой PORTx Rj (например, PORTC RC0) уже был установлен. Я наблюдал взгляд в осциллографе на PORTx Ri, но я не смог выдержать выходной сигнал. Эта проблема исчезла, как только я писал на LATx.

Написание на LATx выглядит обязательным, на PIC18 и написание PORTx запрещено.

Всегда рекомендуется писать в LAT, читать из PORT, причина в том, что когда порт используется как выход, битовая операция PORT будет выполнять инструкцию чтения и изменения записи.

Команда чтения, изменения и записи имеет некоторые подводные камни, основанные на выходной емкости (времени нарастания выводов порта), которая может установить для выводов порта неправильное значение, когда выполняются две последовательные инструкции READ modify WRITE.

Поэтому всегда пишите в LAT и читайте из ПОРТА (входные контакты)

Другие вопросы по тегам