2010-04-12 6 views
21

Я уже прочитал техническое описание и google, но я до сих пор ничего не понимаю.Разница между PORT и LATCH на PIC 18F

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

TRISCbits.TRISC6 = 1;

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

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

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

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

ответ

29

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

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

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

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

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

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

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

  • ТРИСЫ регистр (данные направления регистр)
  • ПОРТА регистра (считывает уровни на контактах устройства)
  • LAT регистр (выход защелка)

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

+0

Итак, если PIN-код находится в режиме INPUT, что я должен использовать? LATCH или PORT? И если PIN-код находится в режиме OUPUT, что я должен использовать? LATCH или PORT? – acemtp

+0

@acemtp: ответ обновлен. –

10

Вот полезное резюме из технического описания.

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

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

  • записываемый в регистре PORTx записывает значение данных в порт защелки.
  • A запись в регистр LATx записывает значение данных в защелку порта .
  • Чтение регистра PORTx считывает значение данных на выводе ввода-вывода .
  • Чтение регистра LATx считывает значение данных, хранящееся в защелкой порта.
+0

Спасибо за ответ. Я прочитал техническое описание и эту часть, но он не отвечает на вопрос: когда мне нужно прочитать штырь (режим ввода), следует ли использовать защелку или порт, и когда мне нужно написать вывод (режим вывода), я должен защелкнуть пользователь или порт. – acemtp

3

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

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

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

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

Open Circuits: read before write

3

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

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

10

Я адаптирую my answer от электротехники.

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

Generic I/O Port Operation

Когда вы пишете немного в булавку I/O, вы храните этот бит из шины данных в регистр данных (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, вы читаете фактическое значение штыря I/O. Смотрите ниже синим цветом:

Generic I/O Port Operation Read PORTx

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

0

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

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