Разница между портом и защелкой на PIC 18F

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

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

TRISCbits.TRISC6 = 1;

затем я прочитал значение с портом и защелкой, и у меня другое значение!

v1 = LATCbits.LATC6;

v2 = PORTCbits.ЛС6;

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

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

7 ответов


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

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

другая ситуация, приводящая к то, что вы описали, - это когда pin-код порта настроен неправильно. Я (и все, с кем я работаю) потратил много часов, пытаясь понять, почему наш рис не работает в соответствии с ожиданиями, чтобы в конечном итоге узнать, что мы замазали выключение аналоговых модулей, например. Убедитесь, что вы переходите через раздел порты ввода/вывода -> порт? Трис? а лат? регистры в таблице данных. Вы можете получить больше информации в страница wiki микрочипа что объясняет о чтении неправильного значения сразу после того, как вы напишете выход на штырь, подключенный к емкостной нагрузке.

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

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

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

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

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

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


Я буду приспосабливаться мой ответ: из электротехники.

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

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, Вы читаете фактическое значение pin-кода ввода-вывода. Смотрите ниже в синем:

Generic I/O Port Operation Read PORTx

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


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

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

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

  • A запись в регистр PORTx записывает значение данных в порт защелка.
  • a написать в LATx регистра записывает значение данных левая защелка.
  • чтение PORTx регистр считывает значение данных на Штырь ввода-вывода.
  • чтение LATx регистр считывает значение данных, содержащихся в левая защелка.

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

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

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

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

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


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

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


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

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


использовать LATx: для записи на выходной pin-код

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

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