PIC 18F上的PORT和LATCH之间的差异

问题描述 投票:23回答:7

我已经阅读了数据表和谷歌,但我仍然不明白。

在我的例子中,我在INPUT模式下设置PIC18F26K20的PIN RC6:

TRISCbits.TRISC6 = 1;

然后我用PORT和LATCH读取值,我有不同的价值!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1给出0,其中v2给出1。

这是正常的吗?在这种情况下,我们必须使用PORT,在这种情况下LATCH?

port pic pic18
7个回答
31
投票

锁存器是写入值的输出锁存器。端口是实际引脚的电压。

在某些情况下,它们可能会有所不同。我经常遇到的一个问题是你的针脚(意外)是否短路接地。如果将锁存器设置为高电平,则锁存器将读为高电平,但端口将读为低电平,因为引脚上的电压仍接近接地。

导致您所描述的另一种情况是端口引脚未正确配置。我(和我一起工作的每个人)花了很多时间试图弄清楚为什么我们的PIC没有达到期望值,最终发现我们在关闭模拟模块时掩饰了。确保你查看I / O端口 - > PORT?,TRIS?和LAT部分?在数据表中注册。您可以在Microchip wiki page中获得更多信息,该信息解释了在连接到容性负载的引脚上写入输出后立即读取错误的值。

那个维基页面也解释了:

读取端口锁存寄存器会返回输出驱动器的设置,同时读取端口寄存器会返回引脚上的逻辑电平。

另外,这是18F14K50上I / O端口部分的片段(应该与18F系列的其余部分相同):

每个端口有三个寄存器用于其操作。这些寄存器是:

  • TRIS寄存器(数据方向寄存器)
  • PORT寄存器(读取器件引脚上的电平)
  • LAT寄存器(输出锁存器)

因此在大多数情况下,您将写入锁存器并从端口读取。


15
投票

我将改编电气工程的my answer

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

当您在I / O引脚中写入一个位时,您将此位从数据总线存储到数据寄存器(D-FlipFlop)。如果该位的TRISx为0,则数据寄存器Q的数据将位于I / O引脚中。写入LATx或PORTx是一样的。见下面的红色:

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

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

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

PIC使用读 - 修改 - 写操作,这可能是一个problem,所以他们使用这个影子寄存器来避免它。


10
投票

以下是数据表中的有用摘要。

11.2.3 LAT注册 与I / O引脚相关的LATx寄存器消除了读 - 修改 - 写指令可能出现的问题。读取LATx寄存器会返回端口输出锁存器中保存的值,而不是I / O引脚上的值。 LAT寄存器上的读 - 修改 - 写操作与I / O端口相关,避免了将输入引脚值写入端口锁存器的可能性。写入LATx寄存器与写入PORTx寄存器的效果相同。

PORT和LAT寄存器之间的差异可归纳如下:

  • 写入PORTx寄存器会将数据值写入端口锁存器。
  • 写入LATx寄存器会将数据值写入端口锁存器。
  • 读取PORTx寄存器会读取I / O引脚上的数据值。
  • 读取LATx寄存器会读取端口锁存器中保存的数据值。

4
投票

是的,阅读PORTx和LATx是正常的,偶尔会发现它们有不同的值。

当您想要读取某些外部硬件是否将引脚驱动为高电平或低电平时,必须将引脚设置为输入模式(使用TRIS或DIR寄存器),并且必须读取PORTx。该读数告诉您引脚的实际电压是高还是低。

当您想要将引脚驱动为高电平或低电平时,必须将引脚设置为输出(使用TRIS或DIR寄存器);你应该把这个位写入LATx寄存器。

(将该位写入PORTx寄存器可能看起来是正确的:该引脚最终会根据命令变为高电平或低电平。但是在很多情况下 - 例如当该端口上的某个其他引脚连接到一个开集极总线 - 写入PORTx寄存器的一位将弄乱该端口上其他引脚的状态,导致难以调试的问题)。

Open Circuits: read before write


3
投票

我的建议是将PORT值视为只读。可以读取或写入LAT值,但读取的值将是写入的最后一个值,而不是引脚的输入值。

在较旧的PIC上,LATx值不存在;写入端口的唯一方法是通过PORTx寄存器。奇怪的是,从通用仪器(Microchip早期)开始,一些非常老的PIC支持LATx,但是在PIC18x产品线之前,Microchip没有添加该功能。


0
投票

我最近经历过,当另一个PORTx Rj(例如PORTC RC0)已经设置时,PIC18F14K50的PORTx Ri(例如PORTC RC1)上的写入无效。我在PORTx Ri的示波器上看到了一眼,但我无法维持输出。我在LATx上写作时,这个问题就消失了。

在禁止PIC18和PORTx写入时,LATx写入看起来是强制性的。


0
投票

使用LATx:写入输出引脚

使用PORTx:读取输入引脚

对于具有LATx寄存器的所有PIC,所有INPUT必须来自PORTx,所有OUTPUT应该是LATx,这完全避免了在写入端口的单个位时翻转位的问题。

© www.soinside.com 2019 - 2024. All rights reserved.