读取 PORT 和 PIN 的区别

电器工程 微控制器 avr 集会 引脚 港口
2022-01-18 22:23:26

读 PORTA 和 PINA 有什么区别?端口和引脚之间有什么关系?我真的很困惑!读取端口示例:(读取引脚在这里没有用)

组装 f=1MHZ ATmega8 我需要每 1ms 补充一次 PORTB。(占空比=50%)

    LDI R16,$FF
    OUT DDRB,R16
    MAIN: LDI R16,00
    DELAY:CPI R16,200
    BREQ LOOP
    INC R16
    RJMP DELAY
    loop:IN R17,PORTB
    COM R17
    OUT PORTB,R17
    OUT R17,PORTB
    RJMP MAIN
3个回答

PORT 是 OUTPUT 缓冲区, PIN 是 INPUT 缓冲区。

当您想将引脚设置为“高”或“低”电压时,请写入 PORT 寄存器。

当您想知道当前提供给引脚的电压时,请读取 PIN 寄存器。

这些寄存器的位代表通用输入/输出端口的相应引脚。

这是连接到单个引脚的 AVR 内部电子设备的简化示意图(请点击此处查看完整的数据表)。

该电路块针对每个引脚重复。其中八个形成一个端口(例如端口 A)。

在此处输入图像描述

从最左边的正方形开始(代表与外界的物理连接),您可以看到三个路径:

  1. 最上面的路径是软件可选上拉电阻
  2. 当引脚配置为输出时使用中间路径
  3. 当引脚配置为输入时使用最低路径

应该注意的是,当引脚与内部外设共享时,可以绕过部分或全部电路。例如,模数转换器 (ADC)。

我完全同意DrFriedParts 的回答,但是,我确实想补充一点,您确实可以阅读PORT以了解端口/引脚是否配置为 OUTPUT 高或低(当DDR=时1,端口/引脚配置为输出)或内部上拉电阻被激活(当DDR=时0,端口/引脚配置为输入)。通过这种方式,端口端口可以(以一种相当愚蠢的方式)用作一般存储或传递有关输出/输入上拉的状态的信息,如下面的场景

也许您的程序的一部分向端口写入一些东西或激活/停用上拉,而程序的另一部分读取PORT以了解它是如何配置的。PORT写后立即阅读PORT没有意义:写到 后PORT,你就知道 的价值PORT是什么。

出于您的目的,从 PORT 读取实际上是有意义的:有问题的引脚是输出引脚,您只需读取您写入的最后一个值,切换它,然后将其写回。因此,您将端口寄存器用作外部可观察 RAM 的一个字节。

另一方面,对于这个特定的应用程序,您可以简单地将值保存在寄存器中,甚至不必读回 PORT 寄存器。