Подтвердить что ты не робот

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

Я уже читал данные и google, но я все еще ничего не понимаю.

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

TRISCbits.TRISC6 = 1;

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

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Generic I/O Port Operation

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

Generic I/O Port Operation Write

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

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

Generic I/O Port Operation Read LATx

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

Generic I/O Port Operation Read PORTx

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Открытые схемы: прочитайте перед записью

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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