Разница между ПОРТОМ и ЗАДВИЖКОЙ на PIC 18F - PullRequest
23 голосов
/ 12 апреля 2010

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

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

TRISCbits.TRISC6 = 1;

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

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

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

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

Ответы [ 7 ]

31 голосов
/ 12 апреля 2010

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

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

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

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

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

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

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

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

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

15 голосов
/ 14 октября 2013

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

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

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 использует операции чтения-изменения-записи для записи, и это может быть проблемой , поэтому они используют этот теневой регистр, чтобы избежать его.

10 голосов
/ 14 апреля 2010

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

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

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

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

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

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

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

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

Разомкнутые цепи: прочитайте перед записью

3 голосов
/ 19 августа 2010

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

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

0 голосов
/ 09 июля 2018

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

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

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

0 голосов
/ 15 сентября 2016

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

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

...