Разница между PORT и LATCH на PIC 18F

Я уже прочитал даташит и погуглил, но все равно чего-то не понимаю.

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

TRISCbits.TRISC6 = 1;

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

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

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

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


person acemtp    schedule 12.04.2010    source источник
comment
Я считаю, что в основном LAT предназначены для записи на них, а PORT — для чтения с них. Вы также можете читать из LAT, но применяются определенные условия. См. техническое описание.   -  person Bernie Loom    schedule 18.04.2018


Ответы (8)


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

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

Другая ситуация, приводящая к тому, что вы описали, — это неправильная настройка пин-кода порта. Я (и все, с кем я работаю) потратили много часов, пытаясь понять, почему наш PIC не работает так, как ожидалось, чтобы в конце концов выяснить, что мы, например, умалчивали об отключении аналоговых модулей. Обязательно просмотрите раздел Порты ввода-вывода -> ПОРТ?, ТРИС? и LAT? регистрируется в техпаспорте. Дополнительную информацию можно получить на вики-странице Microchip, где объясняется, как читать неправильное значение сразу после записи вывода на контакт, подключенный к емкостной нагрузке.

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

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

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

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

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

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

person Mark Rushakoff    schedule 12.04.2010
comment
Итак, если PIN-код находится в режиме ВВОДА, что мне использовать? ЗАЩЕЛКА или ПОРТ? И если PIN в режиме OUTUT, что мне использовать? ЗАЩЕЛКА или ПОРТ? - person acemtp; 13.04.2010

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

Используем картинку из мануала:

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

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

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

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

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

Операция общего порта ввода-вывода Чтение LATx

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

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

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

person Daniel Grillo    schedule 14.10.2013

Вот полезная сводка из таблицы данных.

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

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

  • Запись в регистр PORTx записывает значение данных в защелку порта.
  • Запись в регистр LATx записывает значение данных в защелку порта.
  • Чтение регистра PORTx считывает значение данных на контакте ввода-вывода.
  • Чтение регистра LATx считывает значение данных, хранящееся в защелке порта.
person blak3r    schedule 14.04.2010
comment
Спасибо за ответ. Я прочитал таблицу данных и эту часть, но она не отвечает на вопрос: когда мне нужно прочитать вывод (режим ввода), следует ли использовать защелку или порт, и когда мне нужно записать вывод (режим вывода), должен ли я использовать защелку или порт. - person acemtp; 17.04.2010

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

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

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

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

Открытые цепи: чтение перед записью

person Community    schedule 23.05.2010

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

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

person supercat    schedule 18.08.2010

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

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

Используйте PORTx: для чтения входного контакта

Для всех PIC с LATx регистрами все INPUT должны быть из PORTx, а все OUTPUT должны быть из LATx, что полностью устраняет проблему переключения битов при записи в один бит порта.

person Mike    schedule 09.07.2018

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

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

person frva    schedule 15.09.2016

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

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

Поэтому всегда пишите в LAT и читайте в PORT (входные контакты).

person Raj    schedule 08.10.2019