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

ace*_*mtp 25 port pic pic18

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

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

TRISCbits.TRISC6 = 1;

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

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

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

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

Mar*_*off 32

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

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

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

那个维基页面也解释了:

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

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

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

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

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


Dan*_*llo 16

我会根据电气工程调整我的答案.

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

通用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使用读 - 修改 - 写操作,这可能是一个问题,因此他们使用这个影子寄存器来避免它.


bla*_*k3r 10

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

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

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

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