将数据写入LATCH会发生什么?


9

这是我在PIC16F1947数据表中找到的:

读PORTB寄存器将读取引脚的状态,而对其进行写操作将写入PORT锁存器。所有写操作都是读-修改-写操作。因此,对端口的写操作意味着要读取端口引脚,然后修改此值,然后将其写入PORT数据锁存器(LATB)。

我是固件开发人员,我的背景是计算机科学。我仍然很难理解硬件方面的电子学和逻辑学。我只有基础知识。

因此,我想了解将数据写入硬件级别的闩锁时会发生什么。

谢谢。

Answers:


19

锁存器是一种记忆。

让我们使用手册中的图片:

通用I / O端口操作

当您在I / O引脚中写入一位时,就是将该位从数据总线存储到数据寄存器(D-FlipFlop)。如果该位的TRISx为0,那么来自数据寄存器Q的数据将在I / O引脚中。在LATx或PORTx中写入是相同的。参见以下红色:

通用I / O端口操作写

另一方面,从LATx读取的内容与从PORTx读取的内容不同。

从LATx读取数据时,您正在读取数据寄存器(D-FlipFlop)中的内容。参见下面的绿色图片:

通用I / O端口操作读取LATx

从PORTx读取数据时,您正在读取的是实际I / O引脚值。见下面蓝色:

通用I / O端口操作读PORTx

PIC使用read-modify-write进行写操作,这可能是一个问题,因此他们使用此影子寄存器来避免它。


1
+1用于链接到某个位置,可以清楚地描述(读取-修改-写入)[ techref.massmind.org/techref/readmodwrite.htm]问题(和解决方案)。
davidcary 2011年

1
哇,很好的解释。
Abdullah kahraman 2012年

指向读写修改问题的两个链接已断开。
Randomblue

@Randomblue,我放了另一个链接。另一个链接的问题是末尾的']'字符。只需在您的浏览器地址中将其删除即可。
Daniel Grillo

6

为避免读取-修改-写入问题,您应该整体写入端口,而不是设置或重置端口中的各个位。RMW问题可能会导致某位未置位,或者另一个输出变高,特别是在输出引脚拉出或吸收大量电流的情况下。

通常使用“影子寄存器”。设置或重置其中的位,然后将其输出到端口,以避免RMW问题。

通过使用单独的锁存器,使用18F PIC可以避免此问题,其中的各个位可以不受惩罚地设置和复位。


但是我想我不需要写闩锁寄存器,因为写原始端口寄存器会写闩锁,对吗?
Donotalo 2011年

@Donotalo,你是对的。您也可以写入端口寄存器。不要紧。
Daniel Grillo

@Donotalo:可以写入端口寄存器,但是出于习惯,我建议向具有它们的那些处理器上的LATx寄存器中写入数据,并将PORTx寄存器视为只读。“盲”存储到PORTx寄存器(例如PORTB = 0x42;)的行为与LATBx的行为相同,而对PORTx寄存器进行读-修改-写操作(例如PORTB | = 0x02;)将具有以下效果:与LATx相同,或以最可能不希望的方式有所不同。顺便说一句,一些后来的Microchip之前的PIC提供了LATx。我不知道为什么Microchip要花数年(数十年?)的时间。
supercat

+1提的是,PIC18F芯片(又名“16位指令PICS)有LAT寄存器,而PIC16F芯片(又名‘14位指令的PIC’)需要模拟软件中的LAT寄存器(”影子寄存器“)。
davidcary
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.