Что происходит, когда данные записываются в LATCH?

9

Вот что я нашел в паспорте PIC16F1947:

Чтение регистра PORTB считывает состояние контактов, тогда как запись в него записывает в защелку PORT. Все операции записи являются операциями чтения-изменения-записи. Следовательно, запись в порт подразумевает, что контакты порта считываются, это значение изменяется, а затем записывается в защелку данных PORT (LATB).

Я разработчик прошивок и мой опыт работы в области компьютерных наук. Я все еще пытаюсь понять электронику и логику на аппаратном уровне. У меня есть только базовые знания.

Итак, я хочу понять, что происходит, когда данные записываются на аппаратном уровне.

Спасибо.

Donotalo
источник

Ответы:

19

Защелка является своего рода памятью одного бита.

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

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

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

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

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

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

Операция общего порта ввода / вывода с чтением LATx

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

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

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

Даниэль Грилло
источник
1
+1 за ссылку на место, где четко описана проблема ( чтение, изменение, запись) [ techref.massmind.org/techref/readmodwrite.htm] (и решение).
Дэвидкари
1
Вау, отличное объяснение.
Абдулла Кахраман
Две ссылки на проблему read-mod-write не работают.
Randomblue
@ Randomblue, я поставил еще одну ссылку. Проблема с другой ссылкой - это символ ']' в конце. Просто удалите его в адрес вашего браузера.
Даниэль Грилло,
6

Чтобы избежать проблем чтения-изменения-записи, следует записывать данные в порт целиком, а не устанавливать или сбрасывать отдельные биты в порту. Проблема RMW может привести к тому, что бит не будет установлен или другой выходной сигнал станет высоким, особенно если выходные контакты имеют источник питания или имеют большой ток.

Обычно используется «теневой регистр». Установите или сбросьте в нем биты и выведите их на порт, чтобы избежать проблем с RMW.

Эту проблему можно избежать с помощью PIC 18F благодаря использованию отдельной защелки, отдельные биты которой можно устанавливать и сбрасывать безнаказанно.

Леон Хеллер
источник
но я думаю, мне не нужно писать в регистр защелки, так как запись в оригинальный регистр порта будет писать в защелку, верно?
Донотало
@ Донотало, ты прав. Вы также можете написать в реестре портов. Это не имеет значения.
Даниэль Грилло,
@Donotalo: запись в регистр портов возможна, но я бы порекомендовал записывать в регистры LATx те процессоры, на которых они есть, и относиться к регистрам PORTx только для чтения. «Слепое» сохранение в регистр PORTx (например, PORTB = 0x42;) будет вести себя не иначе, как в LATBx, и чтение-изменение-запись в регистр PORTx (например, PORTB | = 0x02;) будет иметь эффект, который будет либо быть таким же, как LATx, либо отличаться наиболее вероятным нежелательным образом. Кстати, некоторые из более поздних PIC до микрочипа предлагали LATx; Я не знаю, почему Microchip потребовались годы (десятилетия?), Чтобы сделать это.
суперкат
+1 за упоминание о том, что микросхемы PIC18F (также называемые «PIC с 16-разрядными инструкциями») имеют регистр LAT, в то время как микросхемы PIC16F (иначе говоря, «PIC с 14-разрядными инструкциями») требуют моделирования регистра LAT в программном обеспечении («теневой регистр»).
davidcary